作者:章亦春
来自:图灵访谈(ID:ituring_interview)
春哥的编程之旅起于抄书,就算如今已是罕见的编程高手,春哥依然逢人大力推荐他的抄书学编程之法。春哥先后在中国雅虎、淘宝、Cloudflare就职,但开源世界是他如一的眷念。如今,春哥已全身心投入OpenResty的崭新蓝图,期待OpenResty未来能在工业界、互联网行业引领“机器编程”革命。很荣幸这次图灵访谈可以对话春哥,让我们来一起了解一下春哥的快意程序人生。
春哥,本名章亦春,开源项目OpenResty创建者和推动者。
春哥的时间线(毕业之后)
年也就是我大学一毕业,加入中国雅虎搜索技术部。当时的中国雅虎已经是阿里旗下的一家公司了。那次工作机会源于我在毕业前夕受邀在PerlChina北京大会上作的开源分享,而那次大会正好是在中国雅虎总部举行的,当时有幸认识了中国雅虎的搜索团队(又称4E团队)。
年被调到淘宝数据产品与平台部,集中力量和同事们一起基于OpenResty开发淘宝量子统计这款产品,主要面向淘宝卖家。
年我离开阿里,和夫人(当时还是我的女朋友)一同前往一个陌生的南方小城福州,过了一年所谓的“田园生活”,在家里全心从事OpenResty等开源项目的工作。
年我受Cloudflare公司邀请,举家来到美国湾区,全职从事OpenResty开源开发,以及基于OpenResty的全球CDN网络的软件系统的研发和完善。
年晚些时候我离开了Cloudflare,并于年初在美国创办了OpenRestyInc.公司。
母亲、赛扬与抄书
我的编程起点
我最早和编程结缘,说起来还是托我妈的福。上初中那会儿,记得是年的时候,她正在准备计算机二级自考,于是家里买了一台赛扬MHzCPU的机器,装的Windows98。她也弄了一本谭浩强的《C语言程序设计》教材,经常放在家里。自然,我经常去玩机器,系统里唯一一个打开来不知道该干嘛的应用程序,就是那个奇怪的TurboC编程环境。双击打开后,蓝色的屏幕上光标一闪一闪的,我完全不知道该干嘛。这激发了我强烈的好奇心,一心想着也能把它玩转,就像使用MSWord、AutoCAD这些不用人教就能熟悉的应用程序那样。
初中毕业之后,我就“偷”走了那本《C语言程序设计》,仔细研读起来。我妈当时是强烈反对我学习编程的,她认为我这是“不务正业”。当时,身边除了我妈没有人懂编程,我便只能靠自学。由于完全没有编程的概念,即使从第一页开始一个字一个字地手抄,也还是一头雾水,不知所云,感觉很郁闷。年,我刚刚高一开学,当时我所在的高中——镇江一中,发给我们的一本《计算机基础》教材,里面有讲解VisualBasic(VB)的章节。我觉得貌似比C语言容易很多,于是又开始手抄这本教材里的VB章节。我每抄完一段,就反复研读。这样折腾了几周,终于明朗起来,有了编程的基本概念。于是,又回过头来继续手抄那本C语言教材,抄到一半左右的时候,我终于感觉到可以不用继续手抄了。然后,我就陷入琢磨如何用C实现各种链表和其他复杂数据结构的细节中去了。高一寒假的时候,我又开始手抄ThinkinginC++。寒假结束时,我对C++语言算是比较熟悉了,也就不再满足于TurboC,开始玩更高级的IDE,像BorlandC++和VisualC++。
回过头看,抄书是我自学编程的法宝。话说抄书这种学习方法是我意外间发现的。初三时,我酷爱化学,总是缠着当时的初中化学老师提各种奇怪的问题,老师拗不过,借给我一本他当年大学时用的课本《分析化学》。我如获至宝,爱不释手,但借的书总要还,但又不能立马消化,于是我便抄书,抄了整个暑假,结果意外地发现了抄书的奥妙——那就是延缓阅读速度,不至遗漏每一个重要的细节:眼到,手到,心到。
其实不仅书抄得,代码也抄得。记得我刚进入淘宝时,想学习Nginx源码。于是白天上班就对着Kindle抄C源,同时就已暗记于心;晚上回家在房子里来回踱步,在脑海中反复回放白天抄过的源码,直至融会贯通,深得其奥妙。这段日子持续了一两个月后,便大彻大悟了。
教机器解题
编程和高考之间的平衡木
入门以后,我就对编程越来越有兴趣。只要不上课,我就会跑到新华书店去看一些编程类的书。整个高中三年,那里都是我最爱待的地方。同时,以高考为目的的学校教育也愈发让我反感,我觉得完全是在浪费时间。虽然我上的是当地的重点高中,学校也倡导所谓的“研究性学习”和“素质教育“,但高考的压力从高一就开始了。一方面是编程的巨大乐趣,另一方面是高考为指向的应试教育,这让我非常痛苦,甚至都动过辍学的念头。
我于是和爷爷讨论解决的办法,因为我俩既是祖孙也是朋友。他当时帮我出了个主意,就是想办法把编程和高中学习结合起来。具体怎么结合,只能我自己去想了,我爷爷也完全不懂计算机。认真想了很久,我决定亲自教机器去解答各科的高考题。而要教机器解题,我自己首先得学会如何解题。这给了我继续应试教育的理由。
当然,教机器解高考题对于一个没有人指点的高中生而言,显然是一个很大的挑战。那些高考题即使对于人类也是很有难度的。我不得不拼命自学了很多艰深的计算机专业的课程,像编译理论、自动机理论、专家系统、人工智能,还阅读了一些论文,比如定性推理之类的研究成果。
机器解题与人类解题的一大区别是,机器不能运用人类直观来辅助解题。比如几何题里作辅助线,或者其他基于视觉的解题方法,这些对于机器都是不适宜的。机器需要精确的推理方式,需要把一切都形式化。我不得不研究了很多反常规的解题方法,因为其中一些方法运用了高等数学的知识,在真正的高考中也是不宜使用的。记得高三时,我还自己定义了一种简单的数学系统,可以漂亮地证明任意立体几何的定性证明问题,而不依赖于任何人类直观或辅助线。可惜的是,以当年的数学素养,我只能证明数学系统的内部相容性,却无法证明完备性。不过,当时搜集到的高考题都可以用那个自动证明系统证明。(上了大学,我才有时间完成证明系统的代码实现)。
高中三年对我来说是极为丰富的三年,也是非常辛苦的三年。当然,高考成绩并没有那么理想,我想,是因为追求的深度和广度无法很好的兼顾吧。幸运的是,高考分数还是超过了本一线,应该也是当时班上的倒数了吧。我在江苏大学的四年也是非常充实和享受的,自认为真正实践了高中母校“研究性学习”的口号,走出了一条适合自己的路。
我非常感谢爷爷当年的鼓励和启发,让我坚持完成了学校的教育,也从人工智能和机器解题的角度发掘了学校教育动人的一面,优美的一面。这是我最初无论如何也无法预见的。
大学,步入开源世界
大学时代,最成功的事情有两件。
一件是继续高中时的学习方式,教机器自动求解和证明大学课程的各种题目和问题,比如非线性电路的自动分析、离散系统的仿真引擎、实现x86CPU指令集的指令译码器的硬件设计、计算机程序的自动形式化证明,等等。另外,在计算机上编码并测试那些高中时设计好但一直没空实现的高考题求解系统。
另一件事情是,接触并融入到开源世界。直到现在,我还记得第一次给一个开源网站写电子邮件时的激动心情。虽然只是报告了一处笔误,没想到网站的维护者很快回复了并感谢我的报告,一下子整个人都欣喜若狂了。大三时,我开始