0、一篇文章搞定编程学习的问题,你也可以学会这门手艺、特长

0、引言

一直想着写一些关于如何学习编程的文章。一方面,周围一些朋友开玩笑让我开课,还在幼儿园的儿子也天真地问我什么时候教他编程(少年不识愁滋味,很傻很天真);另一方面,自己从业这么多年,似乎积累了一些杂乱无章的东西,自己也想系统地梳理一番,稍微俭省一番,似乎真有些东西,如块垒在胸,不吐不快了,索性发愿写出来,也许不够精彩、不成体系,但至少是真诚、有用,如果能够稍微表达出一丝编程之美,于己也算是善莫大焉了。

1、为什么要学

首先要说明的是,科班出身的,不在此列,虽然有些人读了4年,也没想明白为什么要学,最终也没有学个明白,然后匆匆毕业、从业于编程无关之行业。

在我看来,编程不必作为谋生之手段,更可以作为个人之兴趣特长。而会编程与不会编程相比,在各行各业都能有一定比较优势,至少在数据整理、分析方面可以提高效率;至不济,至少学得了计算机思维,在日常分析、解决问题时,能多一个看问题的角度也是好的。

人工智能的发展经历了历史的三起三落,终于有了如今的如火如荼。ChatGPT之流,更是让学习编程的门槛一降再降。所以,此时不学,更待何时。

图1 ChatGPT编写2048小游戏

2、怎么学

我觉得既然应当当做兴趣特长来学,就没有必要按照科班教学一样、把味同嚼蜡的教材从头到尾嚼一遍。

可以试着结合生活兴趣或者工作场景来学,以用代学,以学促用。反正不用考试,用到啥学啥,现在用不到的东西就以后再学,根本用不到的东西更没有必要学。

当然,虽然编程的门槛降低了,但还是有一些门槛的,我觉得门槛在于能否把握一些本质的东西,并构建起编程的框架,具体的语法、用法,之后根据实用再来填补就是了。

编程的本质

把计算机工作的原理进行抽象,不外乎三步:

  • 数据输入

  • 数据处理

  • 数据输出

图2 计算机数据处理

计算机体系结构也可以按照这三步进行划分:键盘、鼠标等是为数据输入部分;控制器、处理器、内存等是为数据处理部分;显示器、外存等是为数据输出部分。

所谓编程,就是以代码的形式组织计算机能够理解、执行的指令,最终完成数据的输入、处理和最终输出的整个过程。

计算机所做的事情,其实就是把现实中的问题,理论上可解的问题,转换为数学问题,然后在计算机中高效求解。问题本身可能是社会问题,比如黑暗森林法则,也许是艺术问题,比如绘画等。这些都可以转换为数学问题,然后在计算机中得到快速解答。

框架的构建

既然编程简单来说,就是数据的输入、处理与输出,最核心的部分自然就是数据的处理。

数据处理自然包含两部分,数据本身、以及对数据的处理:

图3 编程的核心

数据本身如何组织、表示,就引出了编程中第一个概念:变量。可以类比数学中变量(自变量、因变量)的概念。

数据有不同的类型,比如整数、小数、一串文本等,对应到变量中,也有不同的存储形式,这些都可以成为简单变量。

此外,为了更加便于对数据进行处理,编程中还会对变量进行组合,便构成了复合变量或者称之为数据结构,也是编程中常说的集合类型。其实,最底层的数据结构,根据一组数据是连续存储在一起,还是分开存储的,分为线性表链表。在这些基础之上,结合不同的数据访问限制,可以衍生出列表、队列、栈、散列表等。

对数据的处理,就是算法,没必要把算法这个概念妖魔化,就是数据处理的各个步骤的组合。比如最经典的把大象装进冰箱里的算法是如下三步:

  • 把冰箱门打开

  • 把大象装进去

  • 把冰箱门关上

只是有些经典算法,虽然难以理解,但是效率比较高。而我们自己写的算法,则相对朴素一些、慢一些。

数据处理步骤的组合,有三种形式,顺序结构、分支结构、循环结构:

  • 顺序结构:如同自然语言中的,首先、其次、然后、最后等;

  • 分支结构:如同自然语言中的,如果...就...,否则...等

  • 循环结构:我要打10个,重复1000次等。

编程很大程度上,在于将重复的工作自动化实现,从而消除重复的人工成本。循环结构是消除重复的其中一个方法,另一个方法则是函数,把可能会重复用到的多行代码封装为一个整体,这个操作成为函数定义;在需要用到这些代码的部分,直接调用该函数即可,避免每次都复制那么多行。

我们在通过编程写代码、解决现实问题的过程中,其实就是分为两步:1)问题所涉及的数据如何组织,也就是数据结构的选择或者自定义;2)数据处理的算法实现。

所以,数据结构和算法是编程的两大核心。

数据结构与算法是分离的,还是封装在一起的,又引出两个很核心的编程思想或者派系:面向过程面向对象

面向过程:数据结构和处理数据的多个函数是相互分离的,数据结构以函数参数、函数返回值的形式在多个函数之间传递。

面向对象:数据结构和对数据的处理被封装在一个称之为的结构中,数据结构被称为类的属性,处理函数被称为类的方法

暂时不需要深入,只需要先在脑海里形成一个基本概念:数据结构和算法是分离、还是封装在一起的。不必纠结其他概念,很多科班出身的,学了4年,也没有搞明白有啥区别。大部分数据处理的算法,一行行、一步步写下来就行了,及时不会面向对象也没有关系。

完备性与可扩展性:

编程语言考虑到完备性与可扩展性,会提供一些内建的模块或者三方模块,我们可以使用这些模块,类似于乐高积木的形式,快速实现我们想要的功能,这叫做“不重复造轮子”。

内建模块,一般包括多线程/多进程、网络编程等,暂时不需要了解,用到了再学就行了。

各种编程语言的三方模块的生态一般都比较完善了,可能你能想到的大部分功能,都有对应的三方模块,也是随用随学而已。

编程这门手艺,是偏向于实用的,用得多了,要学的多了,自然就学会了。只是看书,看再多的书,可能最终也是学不会。

具体的语法,可以通过ChatGPT等进行快速学习,甚至用到现查,可以说学习的条件已经极为便利了。

图4 ChatGPT编写游戏运行效果

其实怎么学的核心,还是开头的那八个字:以用代学,以学促用。

3、学什么

仁者见仁智者见智,我觉得完全是个人主观的意见了。有人说,PHP是最好的编程语言,没有必要争论。

我个人推荐学习Python,因为学起来简单,关键是用起来很方面。至于有些人说的编程语言性能的问题,我觉得大部分人的工作场景根本没有到比拼编程语言性能的地步,强实时的军工系统或者无人驾驶类似的场景,确实会对性能有所要求。

如果性能不是影响决策的因素,能用一行代码解决的问题,你干嘛非要写十行呢。

此外,既然编程的本质,是对数据的处理。如果精力足够,SQL语言,也是非常建议亲学一下的。看编程语言排行帮上的起起落落。SQL绝对是半衰期最长的一门语言,而且是只此一家,别无分号。

4、写在最后

在今后的一段时间内,我会结合一些实际场景写一些关于具体使用Python的文章,尽可能地将编程好玩、有用的一面呈现出来。

编程是一门技术,也应该是一门手艺,一种兴趣特长。

人生苦短,我用Python。

  • 41
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
自学是门手艺是指通过独立自主的学习方法和技巧来获取知识和技能的过程。自学的过程中,个体需要根据自己的兴趣和需求,确定学习的目标和方向,并通过查找资料、观察、思考、实践等方式进行知识的积累和理解。 自学的优势在于可以自主决定学习的进度和深度,根据自己的时间安排和能力进行灵活的学习安排。自学还可以培养独立思考和问题解决的能力,提高自主学习和自我管理的能力。 然而,自学也存在一些挑战和困难。首先,自学需要具备良好的自律性和坚持性,需要能够克服学习的困难和挫折,保持学习的持续性。其次,自学的学习资源需要通过不同的渠道获取,需要有一定的信息获取和筛选的能力。最后,自学的效果还需要自主评估和调整学习策略,保证学习的质量和效率。 为了提高自学的效果,可以采取以下策略和方法。首先,明确学习目标和计划,合理安排学习时间和任务,制定学习计划和目标的具体细则。其次,提高信息获取和利用的能力,选择适合自己的学习资源和工具,例如图书、网络课程、学习社区等。再次,培养积极主动的学习态度和习惯,克服拖延和学习困难,保持对学习的热情和动力。 总而言之,自学是一门需要学习和掌握的技艺,通过科学合理的学习方法和策略,可以提高自学效果,实现个人知识和能力的全面提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫理的日知录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值