张琪
张琪
Chief Engineer
8 个月前
大约需要 22 分钟阅读

计算笔记本

文学化编程的前世今生

计算机程序设计艺术
计算机程序设计艺术

硅谷的尤达

有一本书,每个软件工程师都声称自己读过,但是几乎没有一个人能够读完,请问这本书叫什么?
没错,这就是The Art of Computer Programming,简称TAOCP,中文译作「计算机程序设计艺术」,是图灵奖获得者高德纳(Donald Knuth)编著的关于计算机程序算法的著作。
高德纳其实是个地地道道的中文名字。1977年动身访问中国之前,华裔美国理论计算机科学家储枫女士特意给他起了这个雅致的中文名字。高,是指他接近两米的身高;德纳,是Donald的谐音。高德纳非常喜欢这个名字,他认为这个名字可以拉近与中国计算机开发者之间的距离。说起储枫你可能不熟悉,但是她先生你也许很熟悉:姚期智,出生上海,中国理论计算机科学家,2000年图灵奖得主,是目前唯一一位获得此奖项的华人。姚期智回国后创办了清华大学计算机科学实验班,也就是著名的「姚班」,对我国的计算机科学做出了卓越的贡献。
据说,储枫还给高德纳的儿子John和女儿Jennifer取了中文名字,分别是高小强和高小珍,这两个名字起得非常接地气……
高德纳出生于威斯康星州,中学时候便显示出超人的解决问题的能力。在八年级时他参加了一个竞赛,目标是寻找Ziegler's Giant Bar中字母重新排列组合而得到的单词数量。把自己关在地下室中,高德纳系统性地翻阅了家里那本两千多页无删节版的词典,标注了以Aa、Ab、Ba等可能的单词前缀字符串,并将它们做成了索引卡片。之后,他开始检索词典中满足条件的条目。他还发现词典中有些部分可以完全跳过,比如以字母C或BU开头的单词部分。为了把足够的时间投入到了这个问题上,高德纳还假装胃痛,因为表演到位而翘了整整两周的课。功夫不负有心人,赛事官方预计赢家最多能找到约2500个单词,没想到高德纳居然找到了4500多个!高德纳不仅为学校赢得了一台新电视,也为同学赢回了足够的糖果棒供每个人享用。
进入凯斯理工学院(Case Institute of Technology)后,高德纳并没有把心思放在科学上,管风琴、大号、萨克斯管和索萨风琴倒是样样拿手。有一次,他不小心错过了去乐队练习的公共汽车,索性利用这段时间解开了一道数学难题。这道题是如此之困难,以至于教授承诺任何解决它的人可以自动获得A的评分。从此他对数学开始痴迷,到年底他成了班上数学专业GPA最高的学生。
然而,高德纳对数学的好感与对计算机的迷恋相比又是小巫见大巫了。与校园里的IBM 650一见钟情后,他便重写了IBM 650的汇编和编译部分的代码,因为他相信他的代码更优秀。不仅如此,高德纳还运用IBM 650为学校篮球队编写了一个电子教练程序,把比赛中实时收集到的罚球次数、罚球命中、投篮次数、投篮命中、进攻犯规、防守犯规等等近二十项数据通过穿孔卡片输入后,这个程序就可以通过一个回归函数为球员评估出当场比赛的得分贡献值,帮助篮球教练做出实时决策,最终学校篮球队以11-3的成绩一雪前耻赢得联赛冠军!IBM还专门拍摄了纪录片🔗The Electronic Coach来纪录高德纳的事迹。
今天业界流行的商务分析、特征工程、机器学习,高德纳半个世纪之前就玩得很溜了。
用计算机辅助判断运动员状态
用计算机辅助判断运动员状态
高德纳还花了一个暑假为伯勒斯(Burroughs)公司编写了Algol编译器,获得了5500美元的报酬,这差不多是当年大学教授的年薪。之后,高德纳一直保持着对编译器的热爱,他编写的🔗Man or Boy Test的程序最为有名,江湖人称「是男人就算得出-67」,专门用来检测Algol编译器能否正确支持递归以及非局部变量,如果执行结果是-67,那么这个Algol编译器才是纯爷们儿,否则就只能算小屁孩。
高德纳的下一站是加州理工学院,在那里攻读数学博士学位。他很快发现自己处于一门新学科的最前沿:计算机科学将丰富和振兴数学,就像物理学在十九世纪拓宽数学一样。高德纳是第一个把严谨和优雅引入计算机编程之中的数学家。所谓严谨,是指通过数学证明程序的正确性;所谓优雅,就是简单直观而令人愉悦的,就像质能方程一样。这就是计算机编程的艺术。
1962年,著名出版商艾迪生韦斯利(Addison-Wesley)邀请高德纳写一本关于编译器设计的书。高德纳迫不及待地手写了3000多页,出版社却告诉他内容太多了,所以被重新构想为七卷本的《计算机程序设计艺术》(The Art Of Computer Programming,简称TAOCP)。没想到,这将成为他一生的工作。
高德纳和计算机程序设计艺术
高德纳和计算机程序设计艺术
《计算机程序设计艺术》前三卷分别于1968年、1969年和1973年出版。前三卷几乎在一夜之间创造了计算机科学这个课题。人们开始把高德纳被描述为计算机科学的欧几里得。《美国科学家》杂志把《计算机程序设计艺术》列为二十世纪最佳十二部学术专著之一,与狄拉克的《量子力学》、爱因斯坦的《相对论》、罗素的《数学原理》、冯·诺伊曼的《博弈论》、费曼的《量子电动力学》等科学史上的重要著作并列必读经典。
如果你认为自己是一个出色的程序员,那么就应该去读一下高德纳的计算机编程艺术。如果你能读完整本书,你绝对应该给我发一份简历。
——比尔·盖茨
高德纳因此书获得美国计算机协会1974年的图灵奖。这一年他只有36岁,直到现在仍然保持着获奖年龄最小的纪录。

文学化编程

获得图灵奖之后,高德纳宣布暂停写作!高德纳并非江郎才尽,当时出版界正在从铅字印刷逐步过渡到数字排版,由于软件系统的不成熟导致印刷质量滑坡,技术书籍更是重灾区。
为了不让印刷破坏了这套书的美,高德纳辍笔十年完成了两个重量级成果:
  1. 在系统性地学习了艺术设计课程之后,高德纳学会了用程序员的思维去模仿艺术家,把美学问题转换成组合数学问题,独立编写了全新的数字排版系统:Metafont用来设计字体、Tex用来科学排版。
  2. 在开发TeX时,高德纳创造了一种新的编程方法,他称之为文学化编程(Literate Programming),因为他认为程序员应该将程序视为文学作品。「与其想象我们的主要任务是指示计算机做什么,不如让我们专注于向人类解释我们希望计算机做什么」,高德纳如是说。
高德纳在WEB系统中充分体现了文学化编程的思想。同一份WEB源代码既可用于编织TeX文件以渲染成可以阅读的说明文档,又可以缠结成Pascal(后来也支持了C等更多语言)源文件生成最终的可执行二进制文件。
WEB文件的双重用法
WEB文件的双重用法
文学化编程主张程序应该同时为人和编译器而创作,迫使程序员显式描述程序背后的思路,让不充分的设计决策无所遁形。文档不仅能帮助作者将来能重新找到自己的思路,也能使其他程序员更容易理解程序的建构过程。
或许是文学化编程的功劳,从TeX第三版开始,每次升级后的版本号是在小数点后加入一个新数位,使之越来越接近圆周率π的值。TeX目前的版本是3.141592653,表示TeX已经十分稳定,任何的升级都十分细微。
高德纳还悬赏任何能够在TeX中发现程序漏洞的人,金额从1美分开始,每找到一个漏洞赏金就翻倍。我们知道几何级数增长是非常恐怖的,然而高德纳从未因此而损失大笔金钱,因为TeX中的漏洞少之又少。即使有人发现了漏洞,在获得支票后宁愿将其裱起来留作纪念也不愿拿去兑现,因为「发现了高德纳的代码缺陷」绝对可以吹一辈子:
高德纳亲笔签名的奖励支票
高德纳亲笔签名的奖励支票
为什么要叫文学化编程呢?在🔗Literate Programming论文中高德纳提到,1970年代结构化编程(Structured Programming)思想逐渐占据主流,也就是推崇用子程序、块结构、循环等结构来取代传统的goto语句,希望借此来改善计算机程序的可读性和质量。这样一来,包括高德纳在内的许多人被迫接受结构化编程的思想,因为他们无法忍受被打上编写低人一等的「非结构化程序」的标签。通过创造文学化编程(Literate Programming)这个词,高德纳就可以冠冕堂皇地把道德枷锁强加给每个听到这个词的人——没有人愿意承认自己有技术没文化吧?

计算笔记本

回想在北大数学系的那些岁月,师兄弟们最喜欢开的玩笑就是自嘲数学学院是全校最穷的院系,因为校领导一向认为搞数学的给一些纸和笔就足够了,你们足够聪明连十几块的电子计算器都用不上……
可以想象,我们第一次接触到Mathematica的时候激动得热泪盈眶——一直以为计算机只能用来做近似的数值计算,没想到Mathematica居然可以用于机器学习、统计、符号计算、数据操作、网络分析、时间序列分析、自然语言处理等等,通过软件来辅助数学研究,这不就有可以创造需求申请预算了?
Mathematica是文学化编程的典型应用,其界面就是一个计算笔记本,分为前端和内核两部分:前端可以让用户创建和编辑包含代码、文本、图形和图像的计算笔记本,而内核用来解释用Wolfram语言编写的表达式并返回计算结果:
Mathematica的笔记本体验
Mathematica的笔记本体验
Mathematica是由沃尔夫勒姆(Stephen Wolfram)开发。沃尔夫勒姆是一位英裔美国人,杰出的计算机科学家、物理学家和商人。他以计算机科学、数学和理论物理学方面的工作而闻名。他后来还宣布了Wolfram Alpha的发布,一个基于知识图谱的新型搜索引擎。如果你觉得对计算的本质感兴趣的话,他名为🔗Computing a Theory of all Knowledge的TED演讲一定不会让你失望。对了,他的兄弟康拉德·沃尔夫勒姆(Conrad Wolfram)对数学教育改革有独特见地,推荐他的名为🔗Teaching Kids Real Math with Computers的TED演讲。
Mathematica是Macintosh应用程序的又一个突破性应用,可以让你吸收似乎不可能从教科书中理解的代数和微积分知识。
——BYTE杂志
我在读研究生学习计算代数(Computational Algebra)的时候又接触到Maple软件,由加拿大滑铁卢大学开发,也是一种符号和数字计算环境,涵盖了符号数学、数值分析、数据处理、可视化等。
Maple同样体现了文学化编程以及基于计算笔记本的交互界面:
Maple的笔记本体验
Maple的笔记本体验
Maple有个特性非常有特色,当你在文本中嵌入一个计算结果后,但凡计算结果被更新了,这段文本也会跟着被刷新。现如今的Jupyter Notebook却因为没有这个功能而被人诟病。
高德纳文学化编程思想最早是在英国《计算机期刊》发表的。有人问他为什么不在美国发表,他说美国人没文化,他们不好理解这个东西。果然高德纳是对的,英国人和加拿大人先领会了他的精神 😂
Mathematica和Maple都是非常优秀的文学化编程的商业产品,但是它们的授权费用实在是太贵了,导致文学化编程相当一段时间内都停留在学术圈里而孤芳自赏。
随着开源软件的日益流行,以及数据科学的蓬勃发展,文学化编程也迎来了文艺复兴。2001推出的SciPy提供了基于Python的科学计算类库,同年的IPython提供了基于命令行的交互式Python体验以及数据可视化,2003年发表的Matplotlib又给IPython带来了类似MatLab风格的绘图功能。
IPython的作者佩雷斯(Fernando Pérez)当时还只是个本科生,如今已经成为伯克利大学统计系教授,之前是伯克利数据科学研究所的资深院士。佩雷斯发布IPython第一版的时候在GitHub的注解中写到,「只有产生输出的操作才会产生新的带有序号的IN和OUT,这个体验与Mathematica类似」。由此可见,IPython也是深受Mathematica启发的文学化编程工具。更多详情,可以参考佩雷斯的🔗IPython: A System for Interactive Scientific Computing论文。
2011年,IPython计算笔记本(IPython Notebook)横空出世,数据科学家终于可以通过浏览器来完成开发、文档、执行、分享等完整的计算过程,从命令行时代跨入了互联网纪元。软件包含两部分:
  1. 网页应用,用来交互式编辑文本和代码,并产生富媒体输出。
  2. 笔记本文档,用来表示网页应用中所有可见的内容。
2014年,佩雷斯把IPython计算笔记本从IPython中拆解出来,独立创建了Jupyter计算笔记本(Jupyter Notebook)项目,不仅保留了笔记本的界面,而且还提供了语言无关的内核接口。Julia、Python和R这三个语言是最早被支持的,Jupyter这个单词本身就是它们的名字拼接而成。
Jupyter的笔记本体验
Jupyter的笔记本体验
随着大数据和人工智能的兴起,Jupyter计算笔记本逐步从学术圈走进了工业界,许多大数据产品都提供Jupyter计算笔记本作为开发者环境,而人工智能框架更是无一例外需要支持Jupyter计算笔记本。道理很简单,一方面数据科学家大多来自数学和计算机相关院系,读书的时候或多或少接触过开源免费的Jupyter笔记本;另一方面,数据分析最终目的是在数字王国中去芜存菁并逐步找到规律,并向管理层传达了所学到的知识并建议新业务的发展方向。对数据科学家而言,「与其想象我们的主要任务是指示计算机做什么,不如让我们专注于向人类解释我们希望计算机做什么」,这正是高德纳告诉我们文学化编程的优势所在。
人与人交流的最佳方式是通过故事。我从来无法抗拒一个好故事。我不认为自己是先驱,而只是一个记者。
——高德纳
若干年前我们在设计百度云大数据和人工智能产品线的时候,就很意外地发现相当比例的项目都是以Jupyter计算笔记本的形式交付给客户的。现如今,计算笔记本形态的产品又有了长足的发展,不仅仅有提供托管Jupyter Notebook服务的Amazon SageMaker、Binder、Kubeflow,更有Google Colab、Datalore、Deepnote这样尝试重新定义计算笔记本形态的产品。道理很简单,Jupyter计算笔记本源自学术界,有广泛的数据科学家的群众基础,但是从工业界的角度来看,仍然有许多地方需要改进才能适合大规模的企业应用,这也是我们努力的方向。
Stay young. Stay simple.
祝冬安。
2022/12/7
张琪
张琪
Chief Engineer
求学多年于北京大学数学系,身为产品经理设计过大数据和人工智能服务,转职开发工程师也撸得了微服务和前端;待过外企也混过民企,做过个人贡献者也当过研发部总经理;英语说得流利普通话也有京腔;享受过朝九晚五也体验过有福报的日子。经历比较复杂,阅历还算丰富。最喜欢的就是跟家人旅游,读万卷书、行万里路。