零基础同学自学编程的正确姿势

编程这件事现在有点热门了,经常能在网上看到有人问该怎么学编程。不用说,问这种题的同学都是对编程没啥经验的,有不少甚至是完全零基础的。

要搞清该怎样学编程,先得问自己一个问题:为什么要学编程?学来想干什么?
道理很简单,因为编程语言五花八门、编程知识丰富浩瀚,专业人员都不可能穷尽,所以要根据目的来选择学习内容。

这个贴子主要是给没打算成为专业程序员的同学看的,所以先看这类人群的学习目的,大部分在网上问如何学编程的同学应该都是这种状态,至少目前一定是(也许学会了之后有可能向专业程序员方向发展)。
这类人群的主要目的,应该是能通过编程提高工作效率,让日常工作更加自动化。确实有相当多日常事务如果使用程序来解决是非常轻松的,而手工去做就非常麻烦,比如把一堆 Excel 表格合并起来、用花名册生成员工卡片表格等等。街上有很多培训班在鼓吹学完 XX 语言后工作速度一日千里云云,这当然会令很多职场人士心动。

这种目的,需要学习两层内容:
1. 程序的基本逻辑
这是几乎所有程序语言都会有的内容,比如变量、分支、循环等等。不理解这些,几乎是什么程序都不可能写得出来。不过这部分内容并不复杂也不算很多,有 Excel 公式使用基础的同学,稍加努力就可以学会了。而且,几乎所有程序语言在这方面的能力都很接近,学会一种再去看其它种也很容易,甚至大部分程序语言使用的关键字和语法规则都很像,容易举一反三。
但是,只学会这一层内容,我们只会做一些中小学的算术题,比如解个鸡兔问题、分解个质因数什么的,练练脑筋没问题,对日常工作的协助几乎毫无用处。
不幸的是,面对非专业人员,很多教程书籍甚至培训也只教到这里(或者说只能教到这里,看到后面就明白了)。

要想学以致用,还必须学习第二层内容:
2. 结构化数据及其运算
希望编程来解决的日常工作,其实也就是处理手头的数据,而日常工作中面对的数据,绝大多数都是 Excel 表格或者能填入 Excel 表格里的数据,这种数据有个学名叫结构化数据。必须要学会结构化数据的概念以及常见运算,比如表、记录、字段、分组、连接等等,懂了这些才可能真正应对日常工作。结构化数据通常都是批量出现的(表格里通常会有很多行数据),这样理解结构化数据时还需要熟悉集合相关的概念和运算。
日常表格数据处理任务都是些啥,可以看这里 帮你早下班 - esProc 桌面版与 Excel 数据处理 感受一下。

再说一遍不幸,和第一层基本逻辑会有无数的课程在讲述的情况不同,面向非专业人员的教程很少涉及结构化数据的知识。大概只有数据库开发的同学才会专门去学习这些内容,大概也只有数据库课程才会系统地讲述这些东西。但这玩意儿却是日常工作的基础,而且也没那么难,非专业人员也能掌握。比如你是不是经常用 Excel 做筛选、汇总甚至也会做连接(这词可能不懂,其实就是 VLOOKUP 干的活),但没有系统学习的话,碰到复杂些的情况就会糊涂了。
这两层知识都掌握之后,非专业人员就真地可以得心应手地对付日常工作了,工作效率嗖嗖的。

说完非专业人员,再简单说说希望成为专业程序员的同学,其中有两类人群在编程时也是以上面这两层知识为基础的(主要是第二层,第一层是所有程序的基础,就不用说了)。

1. 数据科学家
这类人群面对的数据大部分也是结构化数据。当然,数据科学家更重要的任务是做算法建模型,这些工作也是用结构化数据,但涉及的运算和上面讲的表格数据运算不太一样了,一般不会再称为结构化数据的运算了。不过,算法模型的工作量通常只占二到三成,数学科学家的大部分时间都在准备数据,而这个工作主要运用的就是上面说的第二层知识了。
有很多数据科学家只熟悉算法模型,并不太熟悉结构化数据的常规运算,结果准备数据的效率很低(代码写得慢,程序执行也慢),耽误很多时间。掌握结构化数据知识不会让你的模型建得更好,但能让你有更多时间来搞算法。

2. 开发行业信息系统的程序员
这大概是最广泛的程序员群体了。这些人天天要折腾数据库,特别是要做报表统计工作的那部分人,全部都是在搞结构化数据。掌握完善的结构化数据知识之后,设计运算和处理的方法要顺手得多。不过,这个人群应该会认真学习数据库知识,也就会把这一课给补上了。

有没有编程人员不需要掌握这第二层知识呢?
有的。反而那些很专业的系统程序员(做操作系统、网络传输),或特定领域的算法工程师(视频音频等),对结构化数据的知识要求比较少。不过,这类人群属于重度编程人员,根本不会来看这个贴子,所以用不着理这群人。
所以,能来看这个贴子的同学,几乎都是需要这两层知识。

知道了该学什么,然后就是怎么学,这里首当其冲的一个问题是,学哪种程序语言?
对于第一层知识,理论上应该选择余地很大,甚至是选什么都可以,因为这是所有程序语言都有的内容。那么只要找哪种程序语言擅长处理结构化数据,这样方便学习第二层知识,而且也可以学以致用。
道理上是这样,但别忘了现在面对的是零基础同学,不能搞出太复杂的环境配置,那同学们会晕掉的。零基础同学需要即装即用,甚至就不用安装更好。

早期(30 几年前)机器上都有 BASIC 语言(我们都是当年学过谭老师那本著名的书),确实是不用安装直接可用的,但是搞不清为什么现在都没有了,也说不清这是进步呢还是退步呢。
现在不需要安装的语言也有,主要有两种,一个是浏览器会都会自带的 JavaScript,另一种是有 Excel 自带的 VBA(Office 组件都有)。但是,JavaScript 功能比较专一,学会了也干不了啥事,没啥意思;VBA 好很多,但结构化数据处理的能力也有限。而且关键是,这两种东西虽然免安装,但真要用起来,得理解浏览器和 Excel 内部的许多概念(专业术语叫做对象),这些东西比程序逻辑本身还难,其实不适合初学者。
有时候很怀念当年的 BASIC 语言。

满大街都是培训班的 Python 怎么样?看上去很美。
如果用只来学习第一层知识,Python 可以说基本没问题,除了没有象样的中文版会制造一点点小麻烦外,其它基本没障碍,只安装基础功能包并不困难,在开发环境中写代码运行也问题不大。
但如果来学习结构化数据的话,对于大多数非专业选手来讲,可以踏踏实实地说:你就学不会!更谈不上学以致用。

原因有三:
1.Python 用来处理结构化数据需要有一个叫 pandas 的开源包,这东西可不是直接被装进 Python 安装包的,你得自己再下载安装,过程也没有那么简单了,要配一堆让初学者晕死的东西。当然还可以借助一些第三方的程序来协助安装,但这些第三方程序本身的安装又是个问题,启动起来又有一堆工程环境配置(人家设计出来是做大型应用的)让人不知所措。
2. 关键问题在于,pandas 本来就不是为结构化数据设计的,它并不是我们熟悉的表格(一行行数据的集合),而是个矩阵。用来处理结构化数据时,做些过滤合并这些简单运算还好吧,碰到分组有序等复杂一些运算,就会让初学者摸不着头脑了。而且它的设计还不一致,集合就有很多种,各有不同的语法,基本上靠死记硬背,到处找例子,很难举一反三。Python 的不适应,这里 其实你就学不会 Python 有更详细的解释,前面列的那个日常表格数据处理的目录中,有相当一部分问题用 python 写起来都很困难。
3. 还有调试,你不可能一下子就把代码写对,调试对于学习程序语言也是特别有用的工具。Python 开发环境的调试功能本来就不太好,pandas 又不是 Python 的原生内容,调试就更费劲。

Python 根本就不是面向非专业人员设计的语言,对于非专业人员来讲,Python 的强大和方便,只存在于培训班。把人忽悠去了,学完第一层就结束了。日常工作中能用 Python 干点活的,基本上都是专业人员了,你很少见到周围有什么人在用 Python 倒腾 Excel(要搞也是简单格式的 Excel 做简单处理),Python 真正的使用者都是重度专业人员(主要是搞人工智能的那群人)。

Python 都不行,那其它还有啥?
Java、C/C++ 这些就不用提了。面向对象本来是个高级玩意儿,不适合初学者去理解;结构化数据处理能力却几乎为 0,学了也用不起来;开发环境还搞得很复杂,毕竟这些东西是让专业人员来搞大型软件的,复杂有复杂的道理。
话说有些中学作为计算机启蒙课在教 Java,真是匪夷所思。

SQL 呢?其实做结构化数据处理还不错。这是一个奇葩,可以不用学第一层而直接跳第二层(所以我们前面都说“几乎”,没说死),不用理解变量循环这些概念也能做出还挺复杂的查询。
SQL 的问题是,基本上只能在数据库中运行,而安装配置一个数据库又是个专业的事情了,这又把人挡住了。而且,就算学会了,以后你要算算 Excel 文件,还得先给倒腾进数据库,烦死个人。

说来说去,都不合适,那岂不是没有了?
老实说,如果看这几个主流的程序语言,真地是这样。这些程序语言都太难了!而够简单的又没什么用。
也正因为如此,虽然编程概念炒得火热,但零基础的非专业人员始终用不起来,不停地有人问该学啥。这事,开再多培训班也没有用,培训班又没有能力去改进或发明程序语言。这本质上是没有米的问题、不是会不会煮的事。

这个世界上大概只有 SPL 是适合零基础非专业人员的程序设计语言了。
作为程序语言,SPL 有完整的程序基本逻辑(第一层知识);SPL 全名是 Structured Process Language,发明它就是为了对付结构化数据的,其结构化数据处理能力超强,可以说当前程序语言这方面能力最完整的,远远超过 Python 和 SQL。分组连接有序等运算、甚至大数据都不是问题(Python 碰到大数据就歇了,SQL 碰到有序运算会让人晕死),精心设计的语法易学易通;直接计算 Excel 文件,还能对着文件执行 SQL(SPL 提供了 SQL 大部分能力,学 SQL 可以不用安装数据库);一键式安装,特色网格代码很容易调试,中英文双语版本,…。还有很重要的,它开源免费!
不过,SPL 也不是为了初学者特意发明的,而是为了解决 SQL 难写和 SQL 跑不快的问题。但真用起来会发现,它的体系简单易用,很适合初学者来学编程,关键是真能学以致用。

这里有 SPL 程序设计图书 【程序设计】 前言及目录 ,其中就有一些可以实用的例程,这里还有更多实用的例程 帮你早下班 - esProc 桌面版与 Excel 数据处理

学完了 SPL,绝大多数日常工作都不在话下了,到乾学院可以找到很多用 SPL 处理日常数据任务的例子。

如果想把 Excel 控制得更细致一点,可以再学点 VBA,毕竟它是 Excel 的原生语言,有些本事是外部的程序语言无论如何也没法拥有的。可以用 VBA 来调用 SPL,弥补它结构化数据处理能力不足的问题。
非专业选手,到此就够了。

最后再说说专业选手可能的发展方向:
1. 继续搞 SPL。
SPL 还适合行业应用软件中的计算(其实大部分也是结构化数据计算,而 SQL 对于复杂运算并不方便,而且有时候就没有 SQL 可以用),以及大数据计算(这需要学习不少高性能算法,这是真地有点难了)。

2.Python
Python 是个面向专业人员的语言,它拥有大量的人工智能算法库,这方面除了 MATLAB 和 SAS 这类卖得很贵的东西外,基本上无其它语言可及了。如果立志要当数据科学家,目前看大概率是要来学 Python 的。

3.SQL
数据库开发还是离不了 SQL,虽然它的计算能力不够强,但兼容性好,到处都是。学了 SPL 后再理解 SQL 的运算就太容易了。

4.Java,C#
目前行业应用大都是 Java 和 C# 开发的(Java 更多)。这时候就要理解面向对象的东西了,这是 SPL 里没有需要再认真学习的内容了。

5.JavaScript
浏览器里的开发主要还是这东西,它的语法很简单,难点在于要理解浏览器和网络本身的很多机制。

6.C/C++
这种资深程序员干的系统级开发的事情,轮不着这个贴子来说了