一直想着写一些关于如何学习编程的文章。一方面,周围一些朋友开玩笑让我开课,还在幼儿园的儿子也天真地问我什么时候教他编程(少年不识愁滋味,很傻很天真);另一方面,自己从业这么多年,似乎积累了一些杂乱无章的东西,自己也想系统地梳理一番,稍微俭省一番,似乎真有些东西,如块垒在胸,不吐不快了,索性发愿写出来,也许不够精彩、不成体系,但至少是真诚、有用,如果能够稍微表达出一丝编程之美,于己也算是善莫大焉了。
1、为什么要学首先要说明的是,科班出身的,不在此列,虽然有些人读了4年,也没想明白为什么要学,最终也没有学个明白,然后匆匆毕业、从业于编程无关之行业。
在我看来,编程不必作为谋生之手段,更可以作为个人之兴趣特长。而会编程与不会编程相比,在各行各业都能有一定比较优势,至少在数据整理、分析方面可以提高效率;至不济,至少学得了计算机思维,在日常分析、解决问题时,能多一个看问题的角度也是好的。
人工智能的发展经历了历史的三起三落,终于有了如今的如火如荼。ChatGPT之流,更是让学习编程的门槛一降再降。所以,此时不学,更待何时。
2、怎么学我觉得既然应当当做兴趣特长来学,就没有必要按照科班教学一样、把味同嚼蜡的教材从头到尾嚼一遍。
可以试着结合生活兴趣或者工作场景来学,以用代学,以学促用。反正不用考试,用到啥学啥,现在用不到的东西就以后再学,根本用不到的东西更没有必要学。
当然,虽然编程的门槛降低了,但还是有一些门槛的,我觉得门槛在于能否把握一些本质的东西,并构建起编程的框架,具体的语法、用法,之后根据实用再来填补就是了。
编程的本质把计算机工作的原理进行抽象,不外乎三步:
数据输入
数据处理
数据输出
计算机体系结构也可以按照这三步进行划分:键盘、鼠标等是为数据输入部分;控制器、处理器、内存等是为数据处理部分;显示器、外存等是为数据输出部分。
所谓编程,就是以代码的形式组织计算机能够理解、执行的指令,最终完成数据的输入、处理和最终输出的整个过程。
计算机所做的事情,其实就是把现实中的问题,理论上可解的问题,转换为数学问题,然后在计算机中高效求解。问题本身可能是社会问题,比如黑暗森林法则,也许是艺术问题,比如绘画等。这些都可以转换为数学问题,然后在计算机中得到快速解答。
框架的构建既然编程简单来说,就是数据的输入、处理与输出,最核心的部分自然就是数据的处理。
数据处理自然包含两部分,数据本身、以及对数据的处理:
数据本身如何组织、表示,就引出了编程中第一个概念:变量。可以类比数学中变量(自变量、因变量)的概念。
数据有不同的类型,比如整数、小数、一串文本等,对应到变量中,也有不同的存储形式,这些都可以成为简单变量。
此外,为了更加便于对数据进行处理,编程中还会对变量进行组合,便构成了复合变量或者称之为数据结构,也是编程中常说的集合类型。其实,最底层的数据结构,根据一组数据是连续存储在一起,还是分开存储的,分为线性表和链表。在这些基础之上,结合不同的数据访问限制,可以衍生出列表、队列、栈、散列表等。
对数据的处理,就是算法,没必要把算法这个概念妖魔化,就是数据处理的各个步骤的组合。比如最经典的把大象装进冰箱里的算法是如下三步:
把冰箱门打开
把大象装进去
把冰箱门关上
只是有些经典算法,虽然难以理解,但是效率比较高。而我们自己写的算法,则相对朴素一些、慢一些。
数据处理步骤的组合,有三种形式,顺序结构、分支结构、循环结构:
顺序结构:如同自然语言中的,首先、其次、然后、最后等;
分支结构:如同自然语言中的,如果...就...,否则...等
循环结构:我要打10个,重复1000次等。
编程很大程度上,在于将重复的工作自动化实现,从而消除重复的人工成本。循环结构是消除重复的其中一个方法,另一个方法则是函数,把可能会重复用到的多行代码封装为一个整体,这个操作成为函数定义;在需要用到这些代码的部分,直接调用该函数即可,避免每次都复制那么多行。
我们在通过编程写代码、解决现实问题的过程中,其实就是分为两步:1)问题所涉及的数据如何组织,也就是数据结构的选择或者自定义;2)数据处理的算法实现。
所以,数据结构和算法是编程的两大核心。
数据结构与算法是分离的,还是封装在一起的,又引出两个很核心的编程思想或者派系:面向过程、面向对象。
面向过程:数据结构和处理数据的多个函数是相互分离的,数据结构以函数参数、函数返回值的形式在多个函数之间传递。
面向对象:数据结构和对数据的处理被封装在一个称之为类的结构中,数据结构被称为类的属性,处理函数被称为类的方法。
暂时不需要深入,只需要先在脑海里形成一个基本概念:数据结构和算法是分离、还是封装在一起的。不必纠结其他概念,很多科班出身的,学了4年,也没有搞明白有啥区别。大部分数据处理的算法,一行行、一步步写下来就行了,及时不会面向对象也没有关系。
完备性与可扩展性:
编程语言考虑到完备性与可扩展性,会提供一些内建的模块或者三方模块,我们可以使用这些模块,类似于乐高积木的形式,快速实现我们想要的功能,这叫做“不重复造轮子”。
内建模块,一般包括多线程/多进程、网络编程等,暂时不需要了解,用到了再学就行了。
各种编程语言的三方模块的生态一般都比较完善了,可能你能想到的大部分功能,都有对应的三方模块,也是随用随学而已。
编程这门手艺,是偏向于实用的,用得多了,要学的多了,自然就学会了。只是看书,看再多的书,可能最终也是学不会。
具体的语法,可以通过ChatGPT等进行快速学习,甚至用到现查,可以说学习的条件已经极为便利了。
其实怎么学的核心,还是开头的那八个字:以用代学,以学促用。
3、学什么仁者见仁智者见智,我觉得完全是个人主观的意见了。有人说,PHP是最好的编程语言,没有必要争论。
我个人推荐学习Python,因为学起来简单,关键是用起来很方面。至于有些人说的编程语言性能的问题,我觉得大部分人的工作场景根本没有到比拼编程语言性能的地步,强实时的军工系统或者无人驾驶类似的场景,确实会对性能有所要求。
如果性能不是影响决策的因素,能用一行代码解决的问题,你干嘛非要写十行呢。
此外,既然编程的本质,是对数据的处理。如果精力足够,SQL语言,也是非常建议亲学一下的。看编程语言排行帮上的起起落落。SQL绝对是半衰期最长的一门语言,而且是只此一家,别无分号。
4、写在最后在今后的一段时间内,我会结合一些实际场景写一些关于具体使用Python的文章,尽可能地将编程好玩、有用的一面呈现出来。
编程是一门技术,也应该是一门手艺,一种兴趣特长。
人生苦短,我用Python。