大约是在 2018 年,我逛新华书店时看到了一本《从零开始学 Python3.6》,心头一动就买了下来。事后证明这本书就是垃圾中的垃圾,全文几乎照搬菜鸟教程,简直不忍卒读。但当时的我哪里知道这些,硬是抱着它啃了半年。是的,就是干读,那半年内我连 Hello World 都没写过。当然,最后我也没能读透,死活无法理解面向对象(OO,Object Oriented)那部分的内容,但这不妨碍我写些最基础的代码。

  OOP 是自学者的最大门槛,这是很正常的事。从学习一种工具到学习一种思想,说不难是骗人的。David Parnis 曾对此有过精彩的论述:

“答案很简单,因为[OO]和各种复杂语言的联系已经很紧密。人们并没有被告诉 OO 是种设计的方法,并向他们讲授设计方法和原理,大家只是被告知 OO 是一种特殊工具。……”

  更何况,理解 IS-A,HAS-A,类,封装,继承,多态之类的概念是一回事,实际编写起来又是另一回事。而大部分语言教学书籍在讲解 OO 时用的都是现实生活的例子,这就导致在实际编写代码时会觉得无从下手,无法抽象出一个本就抽象的类出来,这也是通病。而这病唯一的解药就是多写,让 OO 思想内化成为你自己的思考逻辑,编写代码时才能得心应手。就我自己而言,直到 2021 年我才写出了第一个令我满意的基于 OO 的项目。

  有天晚上,我同我朋友讨论最适合新手入门的语言,最终得出的结论果不其然的,是 Python。就我自己的看法来说,新手比起积累知识的喜悦,可能更追求做出什么的成就感,也就是 I know 与 I can 的区别。著名开发者 vczh 讲过一句话,大意是一开始学 C 的时候感觉什么都写不了,学了几年之后发现自己啥都能写。但这“什么都写不了”的状态对初学者而言是最致命的,高投入低产出的模式会让很多人中途放弃。就这一层面来看 Python 的确是最适合初学者的语言。

  我的第一个程序当时其实超出了我的能力范围。那是一个记录 Bilibili 直播间弹幕的程序,所使用库的 Example 涉及重写和异步,当时的我别说会不会,就连听都没听过。没办法,只好硬着头皮写,最后写出来的东西虽然很丑,但也不是不能跑。之后我投身于 QQ 机器人的开发当中,当时 mirai 才刚刚有语音消息支持,Graia 也不叫 Graia,叫 python-mirai。也是因为对 OO 的不熟悉(当时甚至不怎么会用点运算符),还闹出过直接读 __root__ 的笑话。但在这一时期内,我写出了第一个中型项目,尽管代码依旧是坨屎山,但编写这一项目带给我的经验远比阅读基础书籍来得多。

  这一时期充满着许多不言之秘,甚至可以说标记着一个编程语言学习者真正成为了程序员。而这一阶段所发生的事情,一言以蔽之就是“熟练”。开始摆脱工具书与资料,只凭IDE就能完成小型程序的开发;逐渐可以感受到代码中的bad taste(坏味道,这个形象的比喻出自经典Refactoring);逐渐适应命名风格和代码风格……这些改变是从新手到中手的必由之路,但你会发现你将在这一阶段长期裹足不前。为了打破这一僵局,或许需要一块鲜红的贤者之石来敲敲脑袋。

  当然,这时候写出的代码会让半年后的我宁愿找台时光机把写出这段垃圾代码的键盘给砸掉。但此乃必然,每一个开发者都是从这一阶段发展出来的。这时最重要的应该是培养习惯,例如不靠IDE 提示也能遵守PEP-8,有意识的提交等等。这些编程习惯会陪伴我们一辈子,切不可小视。

  配套工具的学习也是在这一时期开始。Git,Pip,Npm,WebPack,IDE/Editor……它们或许不是学习编程的必需,但却是成为一个合格程序员的必需。为工具而服务的工具将成为不可或缺的依赖。对于具体的学习过程,我的建议是多用,毕竟不可能把每一条参数给背下来。不要强求自己搞什么“三天掌握Git”,都是假的,一眼就忘,还不如天天用来得真切。

  由于那个项目的代码实在是写得太烂了,我不得不寻找一种方式来提高我的代码力。这也就是上文所提及的“贤者之石”-阅读。我开始死命的去啃一些谈论如何编程的书籍。坦白来说,这一时期我并没有写多少代码,但阅读这些书籍可以让我明显感觉到能力的提升,“眼界始大,感慨遂深”。我不再是能感觉到bad taste却写不出好代码的程序员了。

  在学习编程之前,MCBBS软件资源版和编程开发版版主Yanbing Zhao在知乎上的一篇回答让我印象深刻,铭记在心:

什么叫“降低门槛”?要我说,我已经很久没见到比国内MC圈的开发门槛还要低的圈子了,软件版和编程版的门槛已经低到不能再低了。至少对于我而言,我已经在无数个场合说过无数次了,学开发插件/Mod的时候,先花上几个月把Java学了,然后再学会很轻松。实际上呢?我接触过的连Java基本语法都没了解清楚就去学写插件/Mod的人,实在是太多太多了。Java实际上,甚至可以说是最简单的现代编程语言之一。至于多了解了解其他的编程语言,多学习学习一些计算机科学的知识,什么数据结构啊,设计模式啊,组成原理啊,这些本来应该是程序猿提升自我理应做的事情,对于他们来说,我真是想都不敢想。

犀利的言语足以指出这个阶段提升自我的重要性。

  到了这个时候,普通的技术书籍已决然无法满足我的需求,我需要一种高于单一语言,能够像一种思维方式般作用于所有语言的书籍。这三本书就是我当时所阅读的:《程序员修炼之道》《Unix编程艺术》和《代码大全》。先讲讲《程序员修炼之道》,书名虽然俗,但内容绝对是字字珠玑。书中提供了70条Tips,而其中的许多都是在这个阶段可以直接上手的。如提示35:要有始有终,讲的是资源分配的事;提示33:如果它不可能发生,用断言确保它不会发生,讲的是意外情况的处理;提示23:总是使用源码控制,讲的是代码管理的重要性……这些Tips看似简单,却可能需要数万甚至数十万行的代码编写经验才能领悟,更何况将其娓娓道来。也因此,这类书籍才显得弥足珍贵。借用徐宥老师的话来说,这些作品“都是高手所写,属于高手指导中手的典范”。我优先推荐给初学者的永远只有这本《程序员修炼之道》。《Unix编程艺术》这本书非常有意思,大可以把它看成是一本程序员的故事书,即使里面所讲述的思想一时半会无法理解,其中的故事也可使人大开眼界,培养出作为程序员的常识。而《代码大全》则是本极其重量级的书,我甚至不推荐购买。它可以看成是《程序员修炼之道》的高级增强版,大约有300+Tips。尽管这些内容以现在的眼光来看略显老旧,但当你拥有足够的代码编写经验时,这本书将对你有所裨益。

  选购编程书籍是门艺术活,国内图书市场编程书籍鱼目混珠,质量参差不齐,并且普遍价格畸高。在被坑过机会后,我总结出了一些经验:

  • 认准出版社。机械工业出版社与电子工业出版社在编程书籍界绝对是响当当的金字招牌,值得信赖。而清华大学出版社的编程书籍,尤其是近几年出版的是雷区中的雷区,连买电子版的资格都没有。我在文章开头提到的那本书就是清华的。

  • 认准标识。如果书上有O’Reilly,Boardview(博文视点)之类的文字,那这本书的质量再差也不会差到哪去。

  • 认准国外作者。一本外文编程书籍能够引进大陆,其质量必然受到同行的认可,平均质量会比国内作者的书高很多。

  • 买全新不如买二手,买二手不如借阅。编程书籍价格昂贵,普遍都在五十元以上,尤其是译制书籍,没有张百元大钞几乎买不到。而一些早年出版的书籍在淘宝上很容易买到盗版,远不如二手实惠。而有的书籍几乎不会再看第二遍,借阅无疑是最好的选择。

  《代码大全》中有句Tip我觉得讲得很好:深入你所使用的语言。这是让代码变得优雅的关键。当然,这绝不是说什么都要来点魔法,如果你真的打算这么干,之前在某篇教程里看到的一句话很适合你:“你有点太聪明了”。但适度使用高级特性能够有效减少代码中的bad taste,提高代码质量。总之,深入学习一门语言是绝对没错的。

  框架的学习作为深入语言的一部分,同样重要。框架这种东西说直白点就是要求你用一种既定的方式编程,用框架开发者的思考方式来思考。现在很多框架的学习成本其实不怎么高(如Flask),但有的框架由于其设计就是用来构建大型应用的,就需要花费更多时间学习(如Django)。使用什么取决于你的实际需求,所谓“杀鸡焉用牛刀”,为了实现一个小小的事件系统而去部署Apache Kafka 简直就是浪费生命。

  另一方面,用Python搞Android 开发或者Minecraft开发绝对是噩梦,甚至是不可能的任务。语言是有极限的,尤其是跨语言编程。这就是我学习新语言的理由。术业有专攻,语言也是如此,每种编程语言都有它的适用范围,试图越过这道界线不会带来什么好结果,且付出的代价比学习一门新语言要大得多。

  学习一门新语言真的是什么难事吗?绝非如此,并且还是在拥有编程经验的前提下。现代高级编程语言都有其共同的基础。条件语句,循环语句,赋值,函数,类……这是大部分编程语言所共通的。到了这一阶段,你完全可以在菜鸟教程的帮助下用一门不熟悉的语言编写程序。实际上这才是菜鸟教程真正的用法,它并不是给完全的新人用的,它是为了那些已经有编程基础的人而设计的。真正决定语言差异的不是表层的语法,而是深层的实现。这是菜鸟教程所无法提供的。

  以下就是现在进行时了:每天刷刷业界新闻,打开WebStorm然后破口大骂JavaScript的神奇设计,冥思新创意,构想提高效率的方法,每周去图书馆借点编程书籍阅读,同朋友为了Go的错误处理到底是不是一团糟而对喷。总之,技术上来了,想怎么过都是可以的。

  我能够为这一阶段所奉上的最好建议就是:保持好奇心与求知欲。学习是程序员的 Daily Work,绝非是等到需要时才学习。编程技术日新月异,保持好奇心不仅能永立潮头,还能永远保持对编程这一行为的最原初的热情。

  最后,以Fred Brook的不朽名著《人月神话》后记的一段文字作结吧。即使两年已经过去,这些文字仍旧熠熠生辉:

在计算机技术进步的同时,计算机相关学科知识也在飞速发展。当我在20世纪50年代中期刚从学校毕业的时候,能看完当时所有的期刊和会议报告,掌握所有的潮流动向。而我现在只能对层出不穷的学科分支遗憾地说“再见”,对我所关注的东西也越来越难以全部掌握。兴趣太多,令人兴奋的学习、研究和思考的机会也太多-多么不可思议的矛盾啊!这个神奇的时代远远没有结束,它依旧在飞速发展。更多的乐趣,尽在将来。

世界观察日志

作于2022.11.9 午

录入于2022.11.13 晨

感谢各位关注者的支持