Skip to content

《天才程序员》 陈章鱼解读

《天才程序员》| 陈章鱼解读

你好,欢迎每天听本书,我是陈章鱼。今天我要为你解读的这本书叫《天才程序员》,副标题是《技术狂人如何改变世界》。

其实,程序员如何改变世界,已无需多说,我们的工作、娱乐,通过手机或电脑做的每一件事,背后都有程序员的努力。按照这本书的说法,“程序员已经不声不响地成为世界上最具影响力的一群人”。

但我们真的了解程序员吗?我们能说清楚他们是一群什么样的人吗?

说起程序员,你可能想到的是格子衬衫,不善言谈,一个人盯着屏幕,屏幕上是一大串闪烁的字符。但是,这些可能只是表象,程序员这个群体,有更多值得我们好奇的地方。

比如,程序员都是一群高智商,情商却不太高的人吗?代码写多了,和计算机在一起工作的时间长了,人也会像机器一样逻辑缜密,但在生活中处理具体事情的时候,不知道灵活变通,缺乏创意吗?除了编程,设计程序,程序员还会通过什么其他“不插网线”的方式,影响我们生活的世界呢?

这本《天才程序员》,就带着我们走近程序员这个群体,了解这群正在改变世界的人。

这本书的作者是美国科技作家克莱夫·汤普森。他是一位自由撰稿人,他的文章除了出现在《纽约时报》《纽约客》等报刊杂志以外,他还为著名科技杂志《连线》撰稿。在这本书中,汤普森的采访对象,既有全球最顶尖的程序员,比如谷歌人工智能开发团队的成员,也包括普通的程序员。

接下来,我会分成两个部分,为你解读这本书。

第一部分,我们从宏观的视角,看看程序员这个职业的历史,还有程序员的职业共同体是怎样形成的?

第二部分,我们深入这个群体,从微观的角度看,程序员有什么典型特征?程序员这份工作是如何影响他们性格的?他们典型的思考方式又是如何影响世界的?

我们先从宏观的角度,看看程序员这个职业的历史。

程序员这个职业其实很年轻,满打满算也就不到80年的历史。以至于有人开玩笑说,这个行业的“祖师爷”们,好多还在世。书里将程序员的发展划分成了四个阶段。

1946年世界上第一台电子计算机ENIAVC(埃尼阿克)出现,初代程序员也随之诞生了。只不过,在20世纪50时代,对刚刚踏入这个行业的初代程序员来说,他们并不清楚程序员到底是一种什么样的职业,那时候的计算机只是一种高级计算器,完全是为了复杂计算。人们用它来破解敌方加密信息,还有计算炸弹轨迹。

这批最早的程序员也并不是直接就在电脑上写代码,他们甚至根本接触不到计算机,因为计算机有专门的操作者。程序员需要在纸上写下程序,交给打字员,打字员把命令打到打孔卡上,然后再交给计算机操作员,操作员把打孔卡导入计算机之后,才能输出最终结果。整个流程非常繁琐。想要提高效率,程序员写的程序就得尽可能简洁,这样才能节省之后打字员将纸上的程序打到打孔器上的时间,还有操作员根据命令操作计算机的时间。而且这个过程中,只要一个程序出错,整个流程就得重来一遍,所以程序员写的程序也要尽可能精炼。汤普森说,程序员就像是用比特来作诗的文人,他们必须字斟句酌,写出的程序才能简洁、优雅。

那个时候,计算机的运行速度也很慢,程序员必须耐心等待计算结果。人们觉得女性工作更细心,而且更有耐心,所以第一批程序员,大多是女性。今天如果我们回头看的话,第一代的程序员,更像是在一条流水线上按部就班工作的工人。

随着计算机的体积越来越小,运算速度越来越快,电子信息技术成了大学专业之一。这个时候,不再需要专门的打字员和计算机操作员,高校学生可以直接接触到计算机。20世纪60年代和70年代初,这批在高等院校,受过良好教育的学生就是第二代程序员。但是,对他们来说,程序员也并不是一个明确的职业,他们进入编程行业更多是出于热爱。编写指令,计算机运算之后,他们马上就能看到自己构思的成果,这种成就感让他们着迷。他们对计算机甚至达到了痴迷的程度,可以不眠不休,连续工作。汤普森采访了一位程序员比尔·高斯珀,他为了编程,会全然忘记时间。他说,昼夜不停地工作让他觉得骄傲,并不觉得辛苦。

这是因为,对第二代程序员来说,编程不再是一种枯燥乏味的计数,而成为了一种充满乐趣的艺术。他们可以用代码,把大脑中构思的东西变成现实,比如世界上第一款电子游戏《太空大战》就是这个时期出现的。游戏很简单,就是两名玩家各自操作一艘太空船,互相射击消灭对方。但是,这个电子游戏,是在12万美元一台的机器上被设计出来的。你可能会觉得用这样的机器打游戏听起来有点荒谬,当时公司也这样想。不过,当时的程序员设计游戏的目的并不是为了挣钱,他们是能看到自己能用代码创造出了作品,哪怕只是最简单的游戏,也会感觉快乐。

这些人还会免费提供代码给所有对编码感兴趣的人。跟初代程序员相比,他们不仅挣脱了机构的束缚,而且还成为了权威的反叛者。比如,“黑客”就是第二代程序员中的典型代表。虽然,我们提到“黑客”的时候,似乎总带几分贬义,觉得他们破坏网络安全。但实际上,“黑客”这个群体最早出现的时候,并不会恶意攻击网站,也并不是为了谋利,他们就是不满企业不愿意公开分享代码的行为,希望打造一个开放的网络环境。在这些黑客眼中,每个人都有检查、修改代码的权利。

第二代程序员主要是生活中就可以接触到计算机的高等院校学生。他们大多时间都泡在实验室,沉浸在代码的世界里。他们对现实世界不太感兴趣,也没兴趣与别人交往。这个时候,实验室中大多是男性,也就是从这时开始,女性在编程的世界逐渐被边缘化。

到了20世纪80年代,计算机的成本一降再降,价格也越来越便宜,一些中产家庭也能买得起了,青少年们有了更多机会接触到编程。与此同时,电子游戏逐渐发展起来,网络论坛BBS出现,青少年可以下载免费游戏和软件,自学编程。这些爱玩电脑的青少年后来成了第三代程序员。但是这个时候,编程仍不算是一个真正的行业,人们也并不清楚编程究竟能不能挣钱,那些喜欢捣鼓编程的青少年也只是觉得编程有意思,才踏入编程的世界。

在这个阶段,进入计算机行业的是一群什么样的人呢?他们上大学之前,没有接触过计算机课程,想学编程,就得自学,所以逻辑能力要强。写代码必须专注,一个字符出错,整个程序就运行不了。所以,他们也不喜欢别人打扰。

对他们来说,和计算机相处要比和人打交道容易得多,因为计算机的反馈是确定的,而人的反应根本没法预测。想象一下,如果你告诉别人一件事,你没法预测别人听到这件事的反应。但是,编程就不同了,你只需要一台计算机,编写代码,它就会立马反馈给你确定的结果。正因为不需要跟人打交道,他们还能在编程中获得快乐,编程行业吸引了很多性格内向的人,这群人看起来可能跟群体格格不入,但是一进入编程的世界,就如鱼得水。在这里,他们既能避开自己不擅长的人际交往,又能在自己成功运行的代码中获得成就感。

同样值得关注的是,这代程序员从小开始接触电脑。当时,家长们对电子游戏远没有今天警惕,他们反而认为玩电子游戏能让男孩们安静地坐在电脑前,不再调皮捣蛋,编程还能培养他们的逻辑思维能力,所以他们也就比较鼓励男孩们接触电脑。不过,那时候,家长们对女孩接触电脑的态度就完全相反,他们希望女孩们多参与社交活动,而不是一个人坐在电脑前。所以,随着个人电脑长大的第三代程序员大多是男性,整个编程行业里男性的比例就越来越大,女性的身影就逐渐减少。

时间来到20世纪90年代,互联网高速发展,伴随着互联网成长起来的就是第四代程序员,这也是最新一代程序员。1994年,世界上第一款网络浏览器“网景”诞生时,网景的程序员就想,如果人们想知道网页是怎么用代码写成的,怎么办呢?所以,他们就给浏览器增加了一个新功能,给网页添加来源。用户只要点开一个网站,查看源代码,浏览器就能展示当前网页的原始代码。直到现在,网页浏览器中还有这个功能。

正是有了“查看源代码”这个功能,自学编程也变得更容易,对编程感兴趣的人不用专门寻找学习资料,他们点开网页就可以学习。这种自学编程的传统也逐渐培养了程序员的实践精神,程序员们往往会先编写程序,发现问题,再不断解决问题,迭代程序。比如,“照片墙”(Instagram)的创始人之一迈克·克里格,就是自学的编程。刚开始设计这个软件的时候,这个软件还不叫“照片墙”,也不是为了用户们分享照片。它的功能很多,但是用户们并不买账。不过,克里格发现一个很有意思的事情,就是用户特别喜欢在软件上发布照片,即使当时照片上传过程特别复杂。后来,克里格决定砍掉软件其他功能,专注发展分享照片这一个功能,把软件名也改成了“照片墙”。

你可能发现,这时的编程行业跟之前好像有些不同了,我们提到了程序员直接面对的另一个群体,“用户”。之前,我们一直说程序员沉浸在代码的世界中,不喜欢跟别人打交道。但是现在,编程不再是程序员自己的事情,程序需要直接面对用户,满足他们的需求。也就是说,编程从程序员的个人创作变成了他们与用户的双向互动。开发一个软件也不再是由程序员写好代码,发给用户,用户只能接受,而是代码发布之后,程序员根据用户指出的问题,或是用户偏好再进行调整。扎克伯格在脸书的墙上挂着的那句话,“快速前进,打破常规”,这种传统也是从这里开始的。快速迭代也让编程行业迅速发展壮大。

从这个时候开始,编程才正式成为一个行业。人们发现它可以挣钱,越来越多的人开始进入这个行业。随着行业规模越来越大,初创企业迅速发展,促进了工作效率急速提升。反过来,这种快节奏迭代,也孕育出编程行业中“无暇寒暄,直入主题”的文化氛围。

说到这,你能很明显感觉到,程序员这个工种的发展像是走了一个圆,第一代程序员更像是科研工作的一个辅助岗位,流水线上的一环。第二、三代程序员因为热爱进入到编程行业,编程带给他们的更多是自我满足。他们可能性格内向,不够合群,在别人眼中是个奇怪的人,但是,编程却让他们能够完成心中的构想,获得成就感。所以,他们进入到编程世界中时,编程还算不上一个真正的行业,他们也并不指望靠编程赚钱。但是,到第四代程序员的时候,情况就完全不同了,他们是成长于互联网的一代人。伴随互联网的规模扩大,编程成了一个成熟行业,也变成一种人们挣钱的工作。程序员身上崇尚效率、追求不断优化的特点也正好与企业发展的理念相契合。

说完了程序员这个群体的发展,我们再走近这个群体,看看他们有什么典型特征?他们是怎样思考问题的?

如果说程序员身上有一个最突出的特点,那就是注重逻辑。在解读这本书时,我专门找一位程序员朋友聊了聊,想印证一下书里的结论。我的这位程序员朋友之前本来是学土木工程的,后来转了行,当了4年程序员。我问他说,如果只用简单几个词概括,你觉得程序员这个群体最突出的特点是什么?他说的第一个词就是注重逻辑。

注重逻辑这个特点为什么在程序员群体中尤其突出呢?你想,要解决程序错误,可不是只盯着那几行代码就能找出问题在哪的。程序员必须思考整个系统,出问题的那几行代码跟其他代码之间到底有什么关联,每个环节都需要反复斟酌。这也让程序员培养起了系统思考的习惯。

而且越优秀的程序员,他们系统思考的特点就越突出。因为代码编写的软件最终还是要面向用户,他们会有系统规划,什么是用户的核心需求?到底哪些能做,哪些不能做,怎样更好地完成项目、实现目标。有一位叫詹姆斯·考林的程序员,他曾经负责过一个大型编程项目,在接受汤普森采访时,他就打了一个比方说:“程序员就像泥瓦匠,编程就像‘搬砖’。在建造摩天大楼的时候,你可不会说‘快去给我找个世界上最棒的泥瓦匠’,你会说‘给我找个建筑师,找个能领导团队工作的人’。”所以,程序员中往往会出现一个现象:编程编得越好的程序员,他们规划大型项目的能力也就越出色。他们会拆分任务,分配给不同的团队完成。

除了会系统性思考问题之外,程序员们还特别注重精确。程序员中有一句行话:“编程天才与编程傻瓜的距离,可能就是一个标点。”哪怕只是一个很细微的错误,就可能引来很大的麻烦。2017年,亚马逊的云计算服务就经历过一次系统崩溃,持续了三个多小时,影响了上千个网站。后来调查发现,事故的原因只是一个代码拼写错误。

程序员的工作要求精确,但很多问题并不明显。怎么办呢?所以他们往往会先预设手头的所有东西都有问题。和计算机呆在一起的时间久了,他们也会很难忍受模糊的问题,毕竟他最亲近的工作伙伴“计算机”完全不近人情,它不会告诉你只错了一个字符,它只会显示两种结果,要么顺利运行代码,要么直接显示程序错误。所以,有时候程序员在面对一些不够明确的需求时,他会强调“请把问题阐述清楚”。

阐述清楚问题,能让程序员们尽快找到问题所在,哪里还需要改进,这能帮他们节省重新核查代码的时间,提高效率。而对程序员们来说,效率是最重要的。这也是我们要提到的程序员第二种典型思考方式,效率至上。

汤普森说,只要有可能让一件事情让事情变得简单,程序员就一定会抓住机会。比如,我们会觉得用鼠标很方便,但是程序员却不这么觉得。因为使用鼠标,他们在写代码的时候就要把手从键盘上挪开,这个多余的动作就会打断他们的工作状态,降低效率。

代码也是越简洁越好,因为简洁的代码出错的概率更小。你想,程序员们面对的是整屏密密麻麻的代码,想要迅速找出问题在哪,代码就得尽量简洁。他们在讨论代码效率的时候,常常会夸那些高效整齐的代码“干净”“漂亮”,那些低效代码,他们就会用嗅觉上的形容词描述,比如说它们是“恶臭代码”,把这些代码标记为“恶心”“垃圾”。汤普森采访过一位程序员,他在Facebook工作了3年,写了39万行代码,但是他给公司删除的代码更多,有50万行。如果单从数量上看,他对公司代码库的贡献是个“负”值。但是,他却对这个成果很自豪,觉得自己提升了公司代码的效率。

认真思考一下“效率”,你会发现,效率本来是指单位时间内完成的工作量,它是工作总量和所用时间的比值。而程序员提高效率,不是增加自己的工作量,写更多更复杂的代码,而是写简洁的代码,帮自己和别人节省时间。要知道,到今天,编程早就不是个人的事了,想要完成一个大型编程项目,需要很多人共同合作。写简洁的代码提高的不再是一个人的工作效率,而关系到整体。

为了提高效率,他们还会想各种办法,用程序来把重复的事情自动化。书中还提到了一个很有意思的观点,说程序员一个重要的优点,是 “懒惰”。不过,他们不是懒得写代码,而是懒得做千篇一律的事情,而写代码,让重复的事情自动运行,就是他们更好偷懒的一种工具。

比如,代餐饮料就是程序员发明的。有位程序员发现每天自己在吃饭上至少得花两个小时,而且要花不少钱,他觉得吃饭是一种为身体提供能量的低效方法。如何更高效地为身体供能呢?他就想,既然身体只需要特定的营养物质,那就直接补充这些身体必需的营养成分就行了。他就找到了身体需要的三十多种营养成分,编制了一份营养物质清单。然后自己捣鼓食材,把这些营养物质融合成液体,做出了第一批代餐饮料(Soylent)。接下来,他就一直以用这种代餐饮料代替食物。这款代餐饮料推出市场之后,也受到了那些工作繁忙的上班族的追捧,改变了他们的饮食方式。像发明代餐饮料一样,程序员们在尽一切可能将这种既省时又省力的逻辑,通过他们编写的程序,维护的平台,不断优化的算法,带入到我们的日常生活中,这直接推动了网购、外卖、打车等等各类应用软件的出现,实实在在地改变了我们身处的世界。

还有一个问题,你可能会觉得有点奇怪,如果说程序员奉行效率至上,那为什么有些还经常996呢?万维钢老师在《精英日课》“发现效率的眼睛”中对这个问题有一个解释,说程序员大多并不认为工作真的做不完,而是认为这是公司对工作的评估方式有问题,并不是程序员效率不高。

但是,程序员追求效率至上可不只是为了用更少的时间赚更多钱,很多程序员追求提高效率,是为了让自己开心。他们忍受不了低效,一想到要做重复性的事就特别难受,所以想把一切优化。而每次优化的过程,就是寻找更高效的解决办法的过程。

所以,热衷于解决问题也是程序员身上的第三个典型特征。他们希望解决困扰人们的问题,一位程序员,科恩说:“我希望我开发的产品是人们真正能够使用的。”

汤普森还采访了利娅·珀尔曼,她是社交软件脸书(现在更名为“元宇宙”)“点赞”功能的设计师之一,当初她在设计这个功能的时候就觉得,人们看到网络帖文的时候,回复并不是很多,他们更多就是随手一点。所以,珀尔曼的团队就决定在所有贴文下边增加一个“好棒”的按钮,点一下,就可以表示自己的肯定,后来他们把“好棒”改为了“赞”。这个功能也逐渐改变了人们的使用行为,用户开始关注自己发布的内容获得的认可,发布一条内容,过一会就会查看自己有没有获得更多人点赞,这一定程度上改变了人们使用手机的习惯。

尽管程序员试图预测人的行为,提供相应的产品来解决问题,不过,他们也没法准确预料问题什么时候会出现。因为相对于线性思考的机器来说,人行为的不确定性要大很多。尽管程序员前期已经全面地思考了可能出现的问题,可是他们还是没办法预料到用户会做些什么,他们总能发现程序员意料之外的问题。有时候,程序员好不容易写了一个能够成功运行的程序,但是用户东点一下,西点一下,程序的不足就会暴露得彻彻底底。

汤普森在书里讲了个真事。2013年,有程序员帮助旧金山政府优化食品券申请的在线系统,让低收入居民能更方便地申请公共福利。居民直接用短信发送卡号,或者在平台上输入卡号,电话机器人就能告诉用户卡上的余额。一般来说,系统每天的电话查询也就100多次。但是,有一天,几个小时之内,系统就收到了5000多条信息。问题出现在哪呢?他们排查发现有一位用户,他把自己的卡号误发成了电话机器人的服务号码,结果程序就陷入了循环,自己给自己不断发信息。程序员当初设计软件的时候,根本没想到过用户会犯这个错。

程序员们面对的一个重大挑战,就是没法预测用户用程序做什么,他们只能不断解决问题,在原有软件上进行迭代。没有哪一个程序第一次运行就能成功,每个程序往往都要经过多次调试。程序最初版本只能看成发现问题的工具。对程序员来说“完成比完美更重要”。但是,这可不是说程序员们想赶快把活干完,然后甩手不干了,而是他们解决问题的态度,遇到一个问题再解决一个问题,这是一个长期过程。所以,你会发现程序员往往特别务实,他们不会想着一口气把问题全都解决了,给大家一个完美的程序,而是会在程序运行中不断解决新出现的问题。

不过,面对接连不断产生的问题,程序员也会产生挫败感。因为计算机不会指出到底哪有问题,运行失败也只会告诉你“语法错误”。程序员只能自己寻找错误,直到修正错误之后,才能顺利运行程序。和很多人想的可能不太一样,程序员大部分时间并不是在写新代码,而是在寻找程序错误。计算机科学家威尔克斯就曾说,“我余生的很大一部分时间将花在寻找自己程序中的错误上。”

即使程序运行得好好的,程序员们也没法预料它什么时候会突然崩溃,因为用户可能不知道什么时候就点了一个按钮,导致程序崩溃。火狐浏览器的联合创始人布雷克·罗斯就说,用户难以预测的行为让程序员变成了“悲观又偏执的疯子”。

程序员每天都要跟失败做斗争,还要消化这种挫败感。所以,只有那些面对接连的挫折还能坚持下来的人,才能成为优秀的程序员。所以,超强的忍耐力是程序员第四个特点。

你可能会问,为什么编程的过程这么痛苦,还是有程序员痴迷其中呢?这是因为一些程序员的确能从写代码中获得巨大快乐,这超过了程序错误给他们带来的沮丧。这种快乐一部分来自代码的不可预测性,你不知道什么时候就找到那个错误代码。这有点像赌博,你不知道自己什么时候会赢,就会忍不住期待。还有一些快乐,恰好相反,它来自确定性,编程总是边测试边写,边写边测试。每个功能测试的成功都是一次小小的胜利,它都会人产生安全感。当他们把这些小代码块连起来的时候,就会产生巨大的成就感。这时候,他们就像福尔摩斯一样,耐心地追溯证据,发现真凶,还原犯罪现场,凭借高智商最终成功破解了谜题。

所以,程序员的自尊可能会在两个极端之间大幅波动,这和代码运行是否顺利密切相关。汤普森说,如果一个程序员很长时间都还没解决程序问题,他可能很郁闷,开始否定自己。但是,一个小时后,问题突然解决了,他瞬间就会成为一个很骄傲的人。一位程序员说,“你在失败的时候如同遭受一记重创,在成功的时候就会有足够强烈的快感去补偿之前的疼痛。”

在一些影视剧中,你可能会看到程序员写起代码来行云流水,但在现实生活里,他们大部分时间都是坐在计算机前,盯着屏幕,皱着眉,时不时叹一口气,然后敲一下键盘。好不容易取得了一些微小进展之后,他们才悄悄露出一丝笑容。很多时候,程序员只有专注在代码中,才可能找出系统出现的漏洞。所以,编程也给了性格内向的人,一个逃避人际交往,还能展现才华的机会。

如果你到一家公司的市场部,会发现市场部的人遇到问题,大家常常会凑在一起交谈。但是,如果你路过编程部门,就会发现那里可能是公司中最安静的一个部门。写这篇稿子的时候,我还到我们公司程序员同事的工位那边,观察过几次,发现确实如此。大多时候,他们都对着电脑屏,虽然偶尔同桌之间也会讨论,但和其他部门相比,整个部门要安静得多。

说到这,你会发现,程序员们的性格和他们的工作其实是一个相互塑造的过程。在工作中,程序员形成了自己独特的思考方式。首先,编程需要程序员必须逻辑严谨,这让程序员逐渐形成系统化的思考方式。但是同时,他们也把一切问题按逻辑解决,这也让他们看起来有些不近人情。其次,对程序员来说,效率是最重要的事情,所以他们不喜欢跟人寒暄,总会想着把事情自动化,形成了优化思维。编程就是他们不断寻找解决问题的过程,这也形成了程序员务实的思考特点,对他们来说“完成比完美更重要”。最后,对程序员来说,程序错误是最单调、最难熬的考验。程序员必须忍受接连不断的挫败,所以超强的忍耐力成了他们性格中的一部分。

说到这,这本《天才程序员》的精华内容我就为你解读完了。

第一部分,为你简单介绍了程序员这个群体从出现到形成职业共同体的过程。第二部分,我们说了程序员这个群体的四个典型特点和思考方式。首先,他们注重逻辑,形成了系统思维;其次,他们崇尚效率,形成了优化思维;再次,他们热衷于解决问题,在实践中形成了务实的思考方式;最后,他们需要不断忍受挫败,形成了超强的忍耐力。

最后,还想分享一个我自己的个人感受。程序员这个群体最初是希望将重复的工作自动化,用更高效的方式解决问题。代码只是服务人的一种工具。但是,环境与人往往是相互塑造的,人在和机器的长期互动中,也慢慢学会了像机器一样思考生活的现实问题,为了追求效率,将人类社会中的复杂问题简化,比如人与人之间的交流。而当人像机器一样思考问题时,他们其实也在塑造现实世界。但是,要注意的是,人是多元而复杂的,自动化运作的机器取代不了人与人之间的真实交往,我们不应该只追求高效,失去人的独特情感,失去我们对周围世界的感知,以及对他人的关怀。

好,以上就是本期听书的全部内容。你可以点击音频下方的“文稿”按钮,查收我们为你准备的全文和脑图。也欢迎你点击右上角“分享”按钮,把这本书免费分享给你的朋友。

恭喜你,又听完了一本书。

划重点

  1. 程序员们的性格和他们的工作其实是一个相互塑造的过程。在工作中,程序员形成了自己独特的思考方式。

  2. 人是多元而复杂的,自动化运作的机器取代不了人与人之间的真实交往,我们不应该只追求高效,失去人的独特情感,失去我们对周围世界的感知,以及对他人的关怀。