最近有个朋友问我,想学编程,是不是应该从Python开始?我愣了一下,因为大多数人都这么建议。但我的答案恰恰相反:不要从Python开始,至少不要从Python的库开始。我见过太多人用Python写了半年爬虫,却连内存泄漏是什么都不清楚。这不是语言的问题,而是学习路径的问题。他们学会了“使用”,但没有学会“思考”。
我自己的经历很狼狈。大二时我跟风报了个“零基础Python速成班”,前两周很爽,print一下就能出结果,爬个豆瓣评分还能发朋友圈。但第三周开始写项目,我彻底懵了:为什么有时候变量是None?为什么同一个函数改了个参数就慢了几十倍?我甚至不知道去搜什么关键词。我那时候才意识到,我根本不知道计算机在后台做了什么。那些教程告诉我怎么写,但没告诉我为什么这么写。
于是我从头开始啃C语言和《深入理解计算机系统》。这个过程比Python痛苦多了,指针、栈帧、内存对齐,每一个概念都像在跟我作对。但奇怪的是,当我终于搞懂了一个函数的调用栈怎么压栈、怎么返回的时候,回头再看Python,那些曾经让我困惑的“高层魔法”全都变得透明了。原来列表推导式不过是一个循环的语法糖,原来多线程的GIL、异步的event loop,都是在操作系统线程之上的玩具。这种从底层俯视上层的感觉,比刷一百道LeetCode都爽。
所以我总结出一条经验:编程入门的核心,不是学会一门语言,而是建立“代码如何被计算机执行”的心理模型。C语言是最好的载体,因为它几乎是裸机上的抽象,没有垃圾回收,没有运行时环境,逼着你直面内存和指针。但只学C又不够,容易陷在底层细节里,反而看不到全局。我的建议是:第一门语言选C,同时配一本计算机系统教材,别急着写项目,先搞懂编译、链接、进程、虚拟内存。等你理解了这些,再回到Python或JavaScript,你会发现它们的文档变得好读多了,报错信息也不再像天书。
这不是说要劝退初学者。恰恰相反,我觉得很多初学者被“快速入门”耽误了。他们花了三个月学会了用框架,却连错误堆栈都不会看。而我想说的是,编程本身就不是一件容易的事,与其在伪装成糖的迷宫里绕路,不如爬上那座最陡的山。山上的风景,绝对值得。