程序开发界名人一览
2022-06-25 08:01:55 阿炯

本文对2020年的开发界的大牛做了一番介绍,并在文后附上了对吴军的编程生涯的自述与北欧程序员基本情况,供各位开发朋友参考。

1. Jon Skeet

个人名望:程序技术问答网站Stack Overflow总排名第一的大神,每月的问答量保持在425个左右。

个人简介/主要荣誉:谷歌软件工程师,代表作有《深入理解C#(C# In Depth)》。

网络上对Jon Skeet的评价:
“他根本不需要调试器,只要他盯一下代码,错误之处自会原形毕露。”
“如果他的代码没有通过编译的时候,编译器就会道歉。”
“他根本不需要什么编程规范,他的代码就是编程规范。”

2. Gennady Korotkevich

个人声望:编程大赛神童

个人简介/主要荣誉:年仅11岁时便参加国际信息学奥林比克竞赛,创造了最年轻选手的记录。在2007-2012年间,总共取得6枚奥赛金牌;2013年美国计算机协会编程比赛冠军队成员;2014年Facebook黑客杯冠军得主。截止目前,稳居俄编程网站Codeforces声望第一的宝座,在TopCoder算法竞赛中暂列榜眼位置。

网络上对Gennady Korotkevich的评价:
“一个编程神童。”
“他太令人惊讶了,他相当于我在白俄罗斯建立了一支强大的编程队伍”
“彻底的编程天才”

3. Linus Torvalds

个人名望:Linux之父

个人简介/主要荣誉:

Linux和Git之父,一个开源的操作系统;
1998年EFF(电子前沿基金会)先锋奖得主;
2000年英国计算机学会Lovelace奖章得主;
2012年千禧技术奖得主;
2014年IEEE(电气和电子工程师协会)计算机学会先锋奖得主;
2008年入选计算机历史博物馆名人堂;
2012年入选互联网名人堂。

网络上对Linus Torvalds的评价:
“他简直优秀得无与伦比。”

4. Jeff Dean

个人名望:谷歌搜索索引技术的幕后大脑。

个人简介/主要荣誉:谷歌大规模分布式计算系统的设计师,例如:站点爬行,索引与搜索,在线广告,MapReduce,BigTable以及Spanner(分布式数据库)。2009年进入美国国家工程院;2012年美国计算机协会SIGoPS Mark Weiser Award以及Infosys Foundation Award奖项得主。

网络上对Jeff Dean的评价:
“使数据挖掘取得了突破性发展。”
“能够在各项工作都已安排得满满的情况下,仍能构思、创作、发布出MapReduce以及BigTable这些令人赞叹不已的工具。”

5. John Carmack

个人名望:第一人称射击游戏经典师祖《Doom》(毁灭战士)之父

个人简介/主要荣誉:id Software公司联合创始人,制作了很多脍炙人口的游戏,如:《德军司令部》(Wolfenstein 3D,又名《刺杀希特勒》)、《Doom》(毁灭战士)、《Quake》(雷神之锤)。引领了很多计算机显示领域的新技术,包括:adaptive tile refresh(切片适配更新)、binary space partitioning(二元空间分割)、surface caching(平面缓存);2001年进入互动艺术与科学学院名人堂;2010年收获游戏开发者精选奖终身成就奖殊荣。

网络上对John Carmack的评价:
“制作了很多革命性的第一人称射击游戏,影响了一代又一代的游戏设计者。”
“他能在一周内就完成任何的基础设计工作。”
“他是会编程的莫扎特。”

6. Richard Stallman

个人名望:Emacs文本编辑器,多种语言编译器GCC的创造者。

个人简介/主要荣誉:GNU项目发起人,开发出很多核心工具,例如:Emacs,GCC,GDB和GU Make Free Software公司创始人。1990年获得美国计算机协会Grace Murray Hopper奖项;1998年获得EFF(电子前沿基金会)先锋奖。

网络上对Richard Stallman的评价:
“曾独自一人与一众Lisp黑客好手进行比赛,那次是Symbolics对阵LMI。”
“尽管我们对事物有不同看法,但他一定是最有影响力的程序员,无论现在还是将来。”

7. PetrMitrechev

个人名望:最有竞争力的程序员之一。

个人简介/主要荣誉:分别在2000年与2012年收获国际奥林匹克信息竞赛金牌;2011年与2013年赢得Facebook黑客杯赛;在2006年赢得谷歌Code Jam程序设计大赛以及TopCoder算法公开赛;截止目前,暂列TopCoderPetr算法竞赛首位,在Codeforces中排行第五。

网络上对PetrMitrechev的评价:
“即使在印度,他都是程序设计竞赛者心中的偶像。”

8. FabriceBellard

个人名望:开发出模拟处理器的自由软件QEMU。

个人简介/主要荣誉:开发了许多著名的开源软件,例如:QEMU硬件模拟虚拟平台,FFmpeg多媒体数据处理软件,Tiny C编译器,LZEXE解压缩软件。在2000年与2001年赢得国际C语言混乱代码设计大赛冠军;2011年赢得谷歌O’Reilly开源设计奖;前圆周率计算精度世界纪录保持者。

网络上对FabriceBellard的评价:
“他的作品总是令人印象深刻和光芒四射。”
“世界上最有创造力的程序员。”
“他是软件工程领域的尼古拉·特斯拉。”

9. Doug Cutting

个人名望:开发出开源全文检索引擎工具包Lucene。

个人简介/主要荣誉:除了Lucene,还开发了著名的网络爬虫工具Nutch,分布式系统基础架构Hadoop,这些大师级作品都是开源的。目前任职Apache软件基金会主席。

网络上对Doug Cutting的评价:
“他开发出卓越超群的全文检索引擎工具包(Lucene/Solr)以及为世界打开了一扇通往大数据的大门。”
“开源的Lucene以及Hadoop为全球创造了无数的财富以及就业机会。”

10. Donald Knuth

个人名望:《计算机程序设计艺术》(The Art of Computer Programming)一书的作者。

个人简介/主要荣誉:著有数本影响深远的程序设计理论书籍;发明了TeX数字排版系统;在1971年成为首位获得美国计算机协会Grace Murray Hopper奖项的人士;1974年获得美国计算机协会A.M. Turning奖项;1979年被授予国家科技奖章;1995年被授予电气和电子工程师协会John von Neumann奖章;1998年入选计算机历史博物馆名人录。

网络上对Donald Knuth的评价:
“我曾经有幸使用过一款无限接近零错误的大型软件,它就是TeX。”

11. Anders Hejlsberg

个人名望:创造了Turbo Pascal

个人简介/主要荣誉:Turbo Pascal的原作者,Turbo Pascal是最受欢迎的Pascal编译器之一,也首次为Pascal带来整合的开发环境。主导开发了Turbal Pascal继承者Delphi。首席C#设计师与架构师;2011年获得Dr.Dobb’s Excellence in Programming荣誉。

1960年,安德斯海尔斯伯格(Anders Hejlsberg)出生于北欧小国丹麦的哥本哈根,后来在丹麦技术大学学习工程,但是他却并没有毕业。北欧是个神奇的地方,诞生了好几位软件行业的大神。C++之父Bjarne Stroustrup也是丹麦的。

安德斯在高中时第一次接触到了计算机,老师教他们学会了ALGOL编程语言。学校期间展示出了自己的天赋,他学得飞快,两个星期以后,他就可以反过来帮助回答老师的疑问了。上了大学以后,他和同学开了哥本哈根第一家电脑商店。近水楼台先得月,安德斯在这些电脑上写了很多程序。他最早用Basic,可很快就觉得Basic太简单、太无趣了,他便开始目光转向最底层的编程。说干就干,安德斯很快就用汇编语言写了一个,只有12K,他把它放到了ROM中,开机可用。

1982年,安德斯又把它移植到了CP/M 和 DOS上。这个编译器被称为Poly Pascal,因为此时安德斯的公司叫做Poly-Data microcenter。可惜,安德斯是个技术天才,在商业这一块儿并不擅长,Ploy Pascal一直没有火爆起来。直到他遇到了一生的挚友Philippe Kahn,他在安德斯写的编译器的基础上,又添加上了编辑器,做成了一个IDE,这就是传奇的Turbo Pascal,只需要33K内存就能运行!更厉害的是,Philippe Kahn给它制定了一个击穿底线的价格。伴随着Turbo Pascal 的大卖,安德斯版税分成也拿到手软,也成为了百万富翁。可以说,安德斯凭借Turbo Pascal 一战封神!

1989年,安德斯的公司PolyData遭遇了严重的财务问题 ,这再次证明,他不是搞商业的料。他决定前往美国加州,加盟好友Philippe Kahn创立的Borland公司,成为首席架构师。在Borland,安德斯继续开发Turbo Pascal的编译器,累计销售了数百万套。但随着C/C++和Windows的流行,Turbo Pascal逐渐走上了下坡路。这时候安德斯看到了微软Visual Basic的成功,他召集了一个小组,决定对Turbo Pascal做一番脱胎换骨的改造。这个战斗力超强的小分队很快就把第一个版本给开发了出来,1995年,经过大规模的Beta测试以后,Delphi 1.0 正式上市并一炮走红,全球狂卖50多万套。

有人的地方就有江湖,有江湖的地方就有分歧。时间来到了1981年,Anders把该编译器核心授权给了Borland;他作为雇员加入公司,并且是后来所有Pascal版本与Delphi前3个版本的架构师。作为 Borland 的首席体系结构设计师,Hejlsberg 秘密地将 Turbo Pascal 变成一种面向对象的、拥有真正可视化的环境和卓越的数据库访问特性的应用程序开发语言Delphi。

在Delphi后续版本的规划中,安德斯和其他成员产生了不同的意见。很不幸,Zack的想法得到了公司更多的支持,在Delphi 3.0 开发的中后期,安德斯逐渐边缘化了。加上好友Philippe Kahn的离职,安德斯感到自己在Borland并不是无可或缺的人物了。于是安德斯决定加入可以让自己任意发挥的微软。虽然此前微软曾多次企图挖走Anders,但都没有成功。据信anders去微软(主要)不是钱的问题,虽然MS的开价也相当有吸引力:130万美元年薪外加股票期权和分红,总计超过300万美元。主要原因是Anders和Delphi开发组的其他成员在修改编译器的问题上发生了争执;还有据Borland内部人讲,Anders认为自己不再是“不可缺少的人”。

1996年的微软正是如日中天,刚刚发布革命性的Window 95,其轰动程度不亚于Apple发行iPhone,微软当年对程序员的吸引力,就像如今的Google,Facebook那样。在牛人堆中,安德斯迅速展示了高人一筹的实力,他带领团队进入Java IDE领域,开发出了Visual J++。后来由于在Java开发工具授权问题上和Sun公司产生了法律纠纷且明显败诉,微软被迫停止Visual J++的开发。在1999年,安德斯海尔斯伯格被授予“distinguished engineer“,这样的荣誉在微软也仅有16人获得过。

比尔·盖茨决定另起炉灶,建立和Java竞争的生态系统:.NET;在.NET中,安德斯制造了一个重磅炸弹:C#。在微软公司把视窗操作系统和软件向网络迁移的新市场战略中,C#语言是最重要的环节。Anders担任了C#语言的首席设计师,同时也是微软.NET战略构架的重要参与决策者。现在经过几年时间的埋头苦干,C#已成为微软反击Java语言的最有力武器。平心而论,安德斯设计的C#在很多方面都优于Java,但是Java有着开放的生态,众多厂商的支持,还是占据了优势。大概在2010年左右,微软出现了新的危机:专注于Web标准,V8 JavaScript引擎 + Chrome 彻底击败了微软的IE,赢得了浏览器大战。

安德斯发现,JavaScript这门动态类型的语言对于IDE来说并不友好,缺乏静态类型让JavaScript开发大项目的体验并不好。这个新的语言就是著名的TypeScript,它是JavaScript的超集,在编译时,TypeScript会删除所有类型并将代码还原成JavaScript。

从Turbo Pascal ,到Delphi ,再到C#, TypeScript,安德斯的每一个作品几乎都是别人的终生成就。夸张一点说,他的作品养活了四代程序员。他是Turbo Pascal编译器的主要作者,是Bill Gates亲自挖到微软的大牛,Delphi、C#和TypeScript之父

有人说,安德斯没有原创性的发明,他只是个编程语言的改进者,但是安德斯精通程序语言、编译器技术、开发工具、Framework以及系统架构,软件界有很多重要的人物和好手,但是尚不知有任何人能像Anders一样在这么多领域都能成为大家。

网络上对Anders Hejlsberg的评价:“我崇敬的程序大师,是我通往专业软件设计师道路上的领路人。”

12. Ken Thompson

个人名望:创造了Unix

个人简介/主要荣誉:与Dennis Ritchie一起创造了Unix。

同时也是B程序语言,UTF-8编码,ed文本编辑器的创造者、设计者。Go程序语言的开发者之一。1983年与Ritchie一起被授予美国计算机协会A.M. Turning奖项;1994年IEEE(电气和电子工程师协会)计算机学会先锋奖得主;1998年被授予国家科技奖章;1997年入选计算机历史博物馆名人录。

网络上对Ken Thompson的评价:

“世界上最杰出的程序员。”

13. Adam D'Angelo

个人名望:问答SNS网站Quora的创办人之一。

个人简介/主要荣誉:前Facebook CTO、研发副总裁,创建了news feed(信息流)的基础架构。SNS网站Quora的创办人之一。2001年以高中生身份参加美国计算机奥林匹克竞赛,最终取得第八名的佳绩。2004年帮助加州理工学院摘下ACM国际大学生程序设计大赛团体银牌。2005年进入Topcoder大学校际算法竞赛决赛。

网络上对Adam D'Angelo的评价:
“一位程序设计全才。”
Mark Zuckerberg的评价:
“我做的每一个好东西,他都能做出六个。”

14. Sanjay Ghemawat

个人名望:Google架构师团队中的核心人物。

个人简介/主要荣誉:帮助Google设计并推出了大型发布式计算系统,包括:MapReduce、BigTable、Spanner以及Google文件系统。开发出Unix ical日历系统;2009年进入国家工程院;2012年美国计算机协会Infosys Foundation Award奖项得主。

15. Elixir的发明人José Valim(何塞)


16、Edsger Wybe Dijkstra(艾兹赫尔·韦伯·戴克斯特拉)


1x.吴军亲述编程生涯:不用低效率的算法做事情

作者 | 吴军,责编 | 田玮靖

世界上总有一些IT难题,需要有经验的人解决。如今已55岁的吴军,认为年龄与能力共同成长才是应对“35岁危机”之道,在过去的职业生涯中,吴军正是这样做的。本文,吴军通过讲述从大学学习计算机课程到留校做科研,到出国深造,再到入职Google的经历,分享了他的工作经验与技术感悟。

吴军:博士,著名自然语言处理专家、作家、投资人,曾在Google研究院、腾讯等公司任职,现为丰元资本(Amino Capital)合伙人。著有《数学之美》《浪潮之巅》《计算之魂》《文明之光》《见识》《态度》等畅销书。

初识计算机

和如今大城市里的学生不同的是,我在进大学校园之前完全不会编程,因为那时计算机是个稀罕物。第一次见到计算机是在小学二三年级的时候,在父亲任教的学校里有一个计算机房,里面的计算机有十几个冰箱大。而那么大的计算机一秒钟也就运行10万次左右,不及如今手机速度的万分之一。我对计算机是如何工作的毫无了解,那时的计算机不仅非常精贵,而且操作复杂,会使用计算机的都是专家。而如此精贵的计算机也只能用于解决国家非常重要的问题,一般的工程问题只能拉计算尺计算。到了20世纪70年代末,我父亲的实验室里有了一台机械的计算器,今天想来大概相当于莱布尼茨的计算器加上打字机吧,能做运算,但无法编程。即便是电子计算器在中国出现,也是改革开放后的事情。

虽然我在上大学前没有碰过计算机,但还是选了那个专业,主要是那时受了刚开始的信息革命的影响。比我低一年级的学弟学妹们,就有机会在中学接触计算机了,他们中间有四个人因为参加计算机竞赛得了奖,被直接保送到清华大学(以下简称“清华”)和北京大学(以下简称“北大”)了。不过这四个人后来也没有再从事和计算机相关的工作。

我正式接触计算机编程是从一个可编程的计算器开始,那个计算器带有BASIC的解释器,可以用BASIC编写一些很简单的小程序。当时我虽然在清华大学计算机系,但是第一年并没有学任何计算机的课程,学的都是基础课,因此我在寒假拿了一本书自学BASIC,假期做了些统计、整理全班平均分之类的小事情。再往后,我有时到父亲的实验室,帮他编写小程序,那时IBM PC已经进入了科研单位。

特别要指出的是,自学一门编程语言不是难事,因为计算机的语言比人的语言容易多了。但是,如果完全靠自学来掌握计算机的技能,最多成为一个“二把刀”,要想在计算机领域走得远,就必须系统性地学习。而且,如果要获得较深的领悟,光看书是不够的,甚至向一些水平不高的老师学习也会有欠缺。

与编程结缘

我正式系统地学习计算机是在大学二年级,有一门程序设计的课程教授Pascal语言。这种语言今天已经没有人使用了,甚至当时在工业界用得也不多,主要是它的执行效率并不高,而且业余人士学起来也比较麻烦。

在任何时代,使用频率最高的编程语言都不是最好的编程语言,而是最容易学,最容易实现当时各种应用软件所需要的最基本功能的语言。不过,如果学习计算机从那些语言入手,最后通常是“二把刀”,因为他们会对整个计算机的世界有一种片面看法。Pascal语言在过去对系统学习计算机的人来讲是一门好的编程语言,它的结构和描述计算机算法所用的伪代码是一致的,可以帮助大家培养起计算机的思维方式,改掉人一些不好的思维方式。比如,帮助大家从跳来跳去的思维,变成模块式思维。当我在大二学的这门课时,编程语言只是内容的很小一部分,主要内容是算法,懂算法才能解决那些比较难的问题。

在随后的一年里,我大约又学习了四门编程语言,包括FORTRAN、LISP、PROLOG和C,虽然这些语言今天少用了,但在历史上它们有存在的理由,如LISP和PROLOG是为了处理人工智能问题。我列举这些语言是为了说明学习编程语言真的很容易,在工作中如果需要学习一门新的编程语言,自学就好,学会了也没有什么可喜的,因为它们并不是很难。我后来用到的C++、Perl、Java、Python等,都是自学的。对于从事计算机专业的人来讲,重要的是数据结构、算法和计算机系统结构基础,其次是对计算技术的全面了解。会写代码,就如同建筑工人会砌砖头,生产线上的工人会插元器件一样,不是什么了不得的事情。

到了大三,我学习了数据结构。这门课很重要,有了对数据结构的全面了解,编写出来的程序才是专业水平。这不仅是因为建立在好的数据结构基础上的程序执行效率高,不容易有Bug,而且这样的代码也容易被读懂,能够重复使用。

与编写代码看似无关,但却非常重要的两门课是系统结构和编译原理。

系统结构可以让大家对计算机从处理器到系统有全面了解,做产品深入后,不了解它们是做不好的。缺乏这方面的知识,成不了系统级的工程师,更成为不了架构师。通常在美国,系统结构被分为计算机原理和系统结构两门课,这里面还包括了机器语言和汇编语言。在清华上学时,这门课被拆成了三门课。编译原理不仅让大家知道为什么程序可以在计算机上运行,而且可以清楚如何写程序能让运行效率更高。不了解编译的原理,靠工作经验改进自己写程序的效率几乎是不可能的,因为世界上各种各样的问题如果一点点总结经验,是总结不过来的。

编译原理通常不好学习,它完全建立在嵌套和递归基础之上,学习这门课要求人完全从常人的思维彻底转到计算机思维上,而且学好它还需要大量的练习。因此,很多学校计算机专业并不要求所有人都学这门课。不过,如果想做一个超越“码农”的计算机工程师,我还是建议学好这门课。我在清华的毕业设计,做的就是一个PROLOG编译器。真正做过一个编译器,就知道计算机的程序如何运行,写程序时也知道该如何提高效率了。

相比美国计算机系的学生,中国学生平时的作业不少,但在学校里使用计算机做工程项目的训练却少很多。如果美国的学生一门课工程项目的负担是10分,清华的学生可能只有3~4分。这带来的结果是中国的大学毕业生如果没有参加过实习工作,很难一毕业就上手工作。

我在腾讯时,就发现很多成绩不错的毕业生需要再培训才能正式工作。我在学校里并不属于最喜欢写程序的学生,但如果有时间,还是想在计算机上做点事情。于是从大三开始,我就在教研组参加一些科研工作。当时即便是教研组的实验室,晚上10点多钟也要熄灯。所幸,学校有一个通宵机房,我们可以在那里工作到零点,这是夏天最令我高兴的事情。回宿舍时天气已经凉快下来,在宁静的夜里骑车是一件很舒服的事情。后来读到高德纳和比尔·罗伊(太阳公司创始人,Solaris的发明人)等人的经历,发现他们在大学时对计算机的兴趣比我浓多了,他们经常通宵工作。对于一份职业,如果一个人不是感兴趣而是为了糊口,成绩永远做不到前5%。

到了大四暑假时,我和十来位同学在宁波实习,为当地的工厂开发了一个财务管理系统。这次实习有件事让我此生难忘。同组的一个同学当时因为偷懒,在对账的程序中用了平方复杂度的算法,结果当这家企业积攒的数据越来越多后,对账变得越来越慢。这个问题其实有一个很简单的线性复杂度算法,但那位同学一时偷懒就忽略了,而测试时并没有多少数据,看不出性能上的差异。修补这个Bug只需要写十几行代码,但为此我们不得不派一位学生出差去专门解决这个问题。此后,我非常注重算法质量,从来不去用那些低效率的算法做事情。

做到领域内最好

毕业后,我的第一份工作极其无聊,就是通过反汇编把机器语言改成汇编语言,然后把微软原本只支持英文的操作系统汉化。这并不难,只要把处理键盘的中断程序和处理显示的终端程序修改为支持汉字即可。但当时的操作系统都没有源代码,只能通过Debug把二进制的机器代码逆向还原出汇编语言的程序,然后修改那些程序。这项工作既枯燥,又侵犯知识产权,于是在完成任务后,我就再也不愿意做这种事了,即使这让我后来Debug的水平非常高。

工作两年后,我发现在中国做计算机相关的技术工作很难开展,毕竟像操作系统、数据库系统以及常用的软件都是世界上少数几家大型跨国公司在做。由于做计算机生意,我接触了大量用户,发现有很多和具体产业相关的问题得不到解决,甚至在信息、图像和语音处理等方面,计算机都使用得不好。遗憾的是,我并没有信息处理的经验,这些钱自然就挣不到。

我在本科毕业时已被保送研究生,这个资格在几年内有效。因此当我工作两年觉得钱挣够之后,就决定回清华读研究生了。在离开学校之前,有两个系都给了我研究生的资格,除了我原先学习的计算机系,电子工程系(当时叫无线电系)也录取了我。但我并不知道该选哪个,只是图新鲜,觉得该换个系读一读,选择了电子工程系。等到我研究生入学的时候,又有两个研究方向很相近,课题组都希望我去,一个做图像识别,一个做语音识别,我也必须二选一。图像识别比较直观,我在本科时也有一些这方面的经验,因此对我更有吸引力。不过最后分配的结果是让我做语音识别,而我对此一无所知。但考虑到很多基础的技术都是相通的,便安心在这个课题组学习和做研究了。当时并没有想到,后来的我居然很喜欢这个领域的研究,而且做了大半辈子。

别看从计算机系转到电子工程系,两个专业似乎很相近,但在中国跨专业并不是易事,因为国内本科生选课的方向都比较窄。我在读研究生前,对信号处理和语音技术毫无了解,因为计算机系几乎没有这方面的课程。因此读研究生的前半年,我花了很多时间补课,那是我从本科到博士10年中最辛苦的半年。我同组的同学本科就是读信号处理的,因此他们上手比我快。不过,半年后我就赶上来了。

第一学期结束后,我就可以读文献了,很快完成了选题和开题。到暑假结束时,我已经完成了一半研究工作,最后从学习基础课,到完成硕士论文,我只花了一年半时间。当然学校没有惯例让研究生那么快毕业,于是第二年的后半年我就到一家清华的合作单位工作了。我周围的老师和同学其实很惊讶于我读书和做研究的速度。实际上,这得益于我的计算机专业基础比较好。当时的计算机都很慢,资源也有限,今天看似很容易做的事情,如统计大文本中常见的二元组(bigram)频率,在当时几乎做不了。而在电子系的研究生中,我可能是唯一个本科读计算机专业的人,因此,在他人看来非常难处理的问题,我却能找到适合的算法解决方案。

由于我在研究生期间发表了一些论文,我自觉喜欢做科研,加上工作时攒了一笔钱,当时并没有生活压力,便决定留在清华当老师。那时大学老师的薪酬很低,大多数人希望出校门挣大钱。而当老师最大的好处是时间灵活,这对我很重要。我每周都会到图书馆看文献,白天做研究,晚上整理数据、写论文。我在清华当了三年老师,语音识别和信息处理的水平大有提升,也发表了很多论文,在我所研究的领域,我已经做到最好了。不过计算机水平并没有提高。

他山之石,潜心攻玉

关于我到约翰霍普金斯大学读博士这个选择,对今天很多人来讲是难以想象的,因为要放弃很多既得利益。不过我那时还年轻,眼睛是往前看的,知道要想从国内一流做到世界一流,去世界顶级的实验室学习是捷径。

我所在的约翰霍普金斯大学语言与语言处理中心(CLSP)是世界上规模最大的语言识别和自然语言处理实验室之一,这是一个跨了很多学科的大实验室,教授来自电子工程系、计算机系、认知科学、生物医学等学科。博士生必须选择一个系,在我申请学校时,教授们根据我的材料把我划分到了计算机系。而由于我的研究经费来自电子工程系,因此在约翰霍普金斯,我就在电子工程系做研究,从计算机系获得学位。这种跨系拿学位的做法,也为我带来了麻烦。

为了取得计算机系的学位,我就要学习足够多计算机系的课程。我挑选了一些在国内没有开设的课程,如计算机算法课、信息和网络搜索课,还大量选修了自己感兴趣的课程,像并行计算这种当时不知道有什么用的课程,后来在Google做云计算时,就派上了用场。在美国读书,每一门课的工程量都非常大。例如,操作系统课,几个工程项目拼到一起,就是一个可以运行的操作系统。类似地,学完语音处理课后就能搭建一个语音识别系统。我在到Google之前,关于网页搜索的全部经验就来自信息和网络搜索课的工程项目,加上我暑假在AT&T实习的经历。这些经验已经足以让我应付Google的各种工作了。

语音识别的研究人员,通常来自电子工程(特别是通信)和计算机两个领域。通常前者的系统准确率高但不讲究运行效率,后者的系统速度快但准确率要差一个百分点。在21世纪初,世界上语音识别做得最好的两家公司是IBM和AT&T,前者是计算机公司,后者是通信公司。它们的系统就有上述特点。能否兼顾准确性和效率呢?通常很难,因为不同领域的研究人员都受限于自己的专业。通信和信息处理出身的人,会把注意力放到改进信息处理的方法上,而计算机出身的人会更重视系统的效率。

我的研究是在电子工程系做的,从导师到周围的同学,每天都在讨论如何改进哪怕是一点点的准确性。到了第四年,我已经完全达到了毕业要求,当时我做的语言模型在NIST(美国国家标准与技术局)的评测中取得了最好的成绩,也获得了世界上最有影响力的语音大会的最佳论文奖。可以说我已经达成了去美国的目的——做到世界第一。当时校报还专门报道了我的研究工作。在此之前我的师兄、师姐们平均毕业时间是6年。不过当我提出论文答辩请求时,委员会里大部分教授认为我在计算机领域的贡献不足,毕竟我是要计算机的学位,而不是电子工程的学位。于是,他们建议我再花一年时间在计算机算法上做出点成绩。显然他们觉得我离学生毕业的平均时间还早,再用一年时间,可以把论文做得更好。当时,我内心非常不舒服,因为我觉得靠自己省下了一年时间,却不得不接受这个现实。

在接下来的几个月,我的工作状态就是一沓纸,一支笔,推导数学公式,试图减少计算量,提高速度。彼时机器学习的算法训练稍微复杂一点的模型要几个月的时间,我希望找到一种至少能把计算量降低一到两个数量级的算法。如今,绝大多数算法已经被优化,不太可能像快速排序的发明人托尼·霍尔那样把一种算法的复杂度降低很多。不过,依然有三个可以降低算法复杂度的方向:一是通过数学变换,用等价的计算替代原有的计算;二是通过存储一些中间计算结果,确保没有任何重复性的计算;三是用抽样近似的方法,避免对全部数据进行计算。我在改进机器学习算法的过程中,这三种方法都采用了。

终于有一天,我和我的导师讲,我发现了新的、非常快的算法。然后我在白板上推导公式。我写完一屏时,他就用扫描器打印一幕,就这样我写了十几屏,他打印出了一沓纸。我放下笔说,计算量至少可以降低几百倍。他盯着白板又思考了一会儿说,“好像是对的,不过我得回去仔细检查一下。”几天后,他告诉我,我的推导无误,我成功了,我把那种机器学习算法的运行时间降低了两到三个数量级。然后我又用这种方法把之前很多人想做却做不了的工作一一完成了。后来想起来,这一年时间让我在算法领域有了一点点贡献。因为有了足够让人信服的成果,接下来的论文是很好写的,不过这项额外的工作让我晚毕业一年,而这也改变了我对工作的选择。如果是早一年,我会选择在IBM或AT&T做研究。因为晚了一年,让我无意中考虑了Google的机会。因此,很多时候早一点晚一点,还真不知道是福是祸。

在Google的两件事

到了Google,工作的性质就变了。当时的Google非常小,没有做研究的可能性,每天要处理大量的工程问题。思路与做研究时差距极大。例如,对于算法的复杂度,我们通常认为在大O概念下相同的算法没有再改进的必要,因为提高一倍速度在计算机科学中毫无意义。不过,在工程领域,这还是有意义的。比如提供一项服务需要1000台服务器,它一年的运行成本是100万美元,如果能降低10%的计算量,这就意味着一年节省10万美元的运行成本。10万美元对Google这样的公司当然不是大钱,但如果所有的服务成本都降低10%,那就不单单是成本问题,而是竞争力的问题。试想一下,如果有两家公司,提供的服务质量完全相同,其中一家公司的报价低10%,那么它将获得更大的市场份额,并通过市场优势逐渐确立它的市场垄断地位。当时同样的服务成本,Google的价格大约是雅虎的1/3、微软的1/10以 下,因此Google可以用价格优势完全限制另两家公司的发展。后来亚马逊也用同样的方法确立了在云计算方面的垄断地位。在Google,我写的最常用的一批代码被用在几百个项目中,这些代码如果没有优化到极致,很多服务的效率都会受到影响。在Google有两件事可以举例给大家参考。

第一件事是关于工作节奏。我到Google时,Google还是一家小公司,人少工作多,我几乎没有在零点之前回家的印象,然后第二天早上9点多就到了办公室,周末也需要加一天班。我从来不赞同公司逼着员工“996”,不过,如果想做成伟大的公司,996是远远不够的。当时大家在Google,每周至少工作80小时。在美国的公司中,提交程序代码之前都需要进行代码审查,在Google代码写得最规范,对Google的贡献也最大的工程师是Craig Silverstein(斯尔福斯坦),他是Google第一位员工,一个人完成了第一版Google的几乎全部代码,而且Google的代码规范就是斯尔福斯坦制定的。由于我的代码绝大部分是系统代码,因此按照Google的惯例,一定要由斯尔福斯坦审核批准。斯尔福斯坦工作很忙,一般在零点之后审核我的代码。因此,我们在零点之后通过邮件讨论代码的问题,直到他批准了,我提交了,我才回家。我到Google一年后,贡献了代码库中0.5%的代码,当时Google已经有300个工程师了,而且很多人工作了好几年,因此我的产出还是比较高的。当时,斯尔福斯坦一个人贡献了Google多达8%的代码。我的朋友朱会灿贡献了1%,是贡献最多者之一。

第二件事是关于专业人士和业余工作者的区别。到了Google几年后,我放慢了工作节奏,很多项目都交了出去,开始做顾问。当时中国的工程团队有一个项目,第一个版本做得很不好,引起了大家的批评,于是,公司让我去重新做那个项目。

据我了解,该项目的所有问题出自一个根源,就是事情做得粗制滥造。比如,它占用了很多存储和计算资源,却没有给用户提供足够好的性能,显然项目组的态度就是应付差事。我接手这个项目后,估算产品应该能够节省80%的存储资源和2/3的计算资源,提供至少2~3倍的体验。当我提出要求时,得到的反馈是,“这怎么可能呢?”我说:“从你们使用的信息总量上来讲,就需要这么多的存储容量,用多了就是没设计好。另外,由于有几个子程序非常占用计算时间,因此它们必须优化,优化好了就能加速好几倍。如果这些问题不难,还要你们这些学计算机的干什么?我们从大街上找几个人培训一下也能写代码,计算机科班出身的,就是要解决别人解决不了的问题。”李开复在一旁听着,插嘴说,“你说得对,比尔·盖茨也经常讲类似的话。”随后我又讲,“作为一个计算机的工程师,就要有信心做到世界最好,你们按我说的思路去做,做到我要求的性能指标,我向公司申请,送你们去夏威夷度假。”后来大家真做到了,而且获得了去夏威夷度假的奖励。专业人士和业余人士都能实现基本功能,但既然是专业人士,就要努力做出世界级的产品。

2008年之后,我在Google的工作比较轻松,有时间重新开始做研究。我把一件原来在约翰霍普金斯大学想做而没做的事情给做了——写一个自然语言的语法分析器,能够分析并初步理解各种英语的句子和段落。我做这件事时并没有什么商业目的,只是出于兴趣。

几年后我再回到Google,发现Google的人用这种方法把网络上能找到的所有英语文章都分析了一遍。Google后来的计算机自动问答系统就是在这项工作的基础上实现的。很多时候,做研究不能太功利,做研究需要为大家解决一些基础性的问题。我很喜欢3M公司的一个说法“科学就是把钱变成知识,技术是把知识变成钱,两者不是一回事”。

《计算之魂》肋IT从业者突破瓶颈期

程序员到了一定瓶颈期时,除了觉得自己没有进步之外,还有以下特点:失去了主动学习的热情,不再刻苦专研技术,长时间消息闭塞,对新技术、新领域不了解等等。

吴军博士也有这样的观点:因为我自己观察发现,在IT行业,很多人经常到35岁就开始困惑了。就是我们现在经常说的,这行业吃青春饭。但那些顶级的IT从业者,他们的年纪都很大,有的可能五六十岁还在工作。为什么会有这么大的差异?人怎么能够突破这个瓶颈?

结合多年的经验和观察,他将自己从业三十多年的经历与心得整理出来,出版了这本豆瓣评分9.3的《计算之魂》。根据他的观察发现,之所以出现这种现象,主要是从业人员对计算机科学的理解不够深刻,不光是对技术的理解不够深刻,对这产业的理解也不够深刻。他曾作为资深研究员和副总裁分别任职于Google 公司和腾讯公司,有丰富的实践经验。并著有《数学之美》《浪潮之巅》《大学之路》《文明之光》《全球科技通史》等多部畅销书,多次获得包括文津图书奖、中国好书奖、中华优秀出版物奖在内的图书大奖。在这本书中我们可以与智者对话,看他对IT从业者的建议。

01、信息科学在IT领域的发展

到目前为止,虽然每天股票的价格会变,各大公司市值也会变动,但是变动幅度不会太大,全世界最值钱的两家公司是苹果和微软。在接下来的排名中,有一家是沙特阿拉伯的石油公司,然后是Google、Amazon和Facebook。

石油公司其实是一个全国的财富,这个不去做对比。那么你可以看到,就单从市场上来讲,世界上最值钱的公司都是IT公司,在中国最值钱的公司是腾讯。虽然跟苹果、微软、Google这些公司比,还有差距,但是在中国也是很了不起了,有超过5千亿美元的这样一个市值。由此可以看出这个产业是一个兴兴向荣、蓬勃发展的一个产业。


但接下来就有了矛盾,产业发展的很好,人发展的却不太好。这好像是一个矛盾的情况,也就是大家经常看到媒体讲的35岁的瓶颈期。

那么为什么是这样的?

吴军博士说到:因为很多人随着年龄增长,能力没有同步增长,这是很大的一个问题。

全世界都最缺乏的人其实是一些高级的专业人士。法国当时有一个空想社会主义家圣西门曾经说过,法国如果失去了100个最好的科学家、艺术家、作家、工程师等等,那么法国的文明将大倒退。但要是失去了100个贵族的话,这没什么影响。这也说明了全世界需要的其实都是专业人士,但是很多人在成为专业人士的道路上走不高。

02、吴军博士的五级人才标准

既然专业人士如此稀缺,假设他们处于顶级水平,那普通从业者处于什么位置?

得过诺贝尔奖的前苏联著名物理学家朗道,他有一个观点,专业人士每级之间是差一个数量级的,他把专业人士分成了五级。当时,他主要是给物理学家分级,在物理学领域最顶级的,即一级,就是像波尔和发现正电子的迪拉克等。这一级很少人,一个巴掌就数的过来。接下来是二级的人,二级人的水平和贡献就比第一级差了一个数量级。如果你只是一个在大学教物理学的教授,你可能是五级。吴军博士借用朗道的这个概念,把计算机科学领域的科学家量化,划分一下计算机科学家(工程师)。


●第一级,就是能开创一个产业,或者说开创一种新的理论的人。

比如,自冯诺依曼以后就有计算机这个产业。算法这一行实际上算是算法老祖宗——高德纳开创的。

●第二级,就是能够解决世界难题的人。

这个问题在以前是没有人解决,因为有你的出现,把这个问题解决了。世界上大部分图灵奖的获得者都是处于第二级的人。当然有些图灵奖获得者成就更大一些,介于第一级和第二级之间,不过我认为他们和高德纳之间还是有差距的。

●第三级,就是做的产品能达到世界最高水平的人。

比如抖音就达到了世界最高水平,微信也是如此。如果你是这些产品的负责人,你就是第三级计算机科学家(工程师),虽然比图灵奖获得者差一些,但在世界上还是响当当的。

●第四级,就是能完成或领导一个大工程的人。

比如咱们国内有好多负责视频网站的负责人,虽然水平达不到世界级,达不到工程级,但是他自己有能力把一个大网站搭建起来,比如流量很大的优酷或者爱奇艺。能把这种服务量大的网站搭建起来,水平还是很好的。

这是一个全方位的技术专家,差不多是第四级的计算机工程师。

●第五级,就是大公司里头,能够独当一面的高级工程师。

如果你需要人指导,还需要人给你派活,严格来讲就连第五级都算不上。

●如今,我们有两种对计算机工程师的称号,一个是“程序猿”,还有一个是“码农”。这其实已经是第六、七级了,大学刚刚毕业可能差不多到第七级。

这是从贡献上来讲,从收入上讲,差别也是很大的啊。像安东尼·莱万多夫斯基(Anthony Levandowski),解决Google无人驾驶问题的工程师,他曾估计过,他工作多年,从Google得到的收入超过1亿美元。这比很多上市公司的创始人挣得还多。

由此可见,回报是很高的。有人觉得说码农很辛苦,这是因为你的贡献还不够大,同样的时间,你的收入却不高。但是一旦你真是做到上面那种比较高的级别,你的收入会相当可观。每个人通过努力,第一、二级很难达到,但是第三级,你还是有可能达到的。

03、如何才能到达第3级?

吴军博士认为,普通人只靠努力,可能最多能到达第3级,或者2.5级。这本《计算之魂》可以帮助大家达到这种程度,这也是这本书的目的之一。

第五级的人可以用计算机的知识,用计算机这个工具解决实际问题。

即你给他一个问题,他能解决。比如你对他说“我要做一个IoT的监控系统,你来帮我把计算机这一部分做好。”这样一个工程师会对你说“你交给我就好了,剩下的事我能做。”这是第五级人的要求之一。如果他说他还不会做,还得到处去找你,那么他连第五级别都还没达到。


第四级的人就需要对计算机科学有比较精深的了解。

因为你做成一个东西,它有好有坏。可能它工作的效率很低,用了人家十倍的机器达到同样效果,这就不太好。所以要对计算机科学有精深的理解,这样你做出来的产品在同行里就特别有竞争力,你的运营成本可能只有人家的一半。那别的公司挣不着钱,你就挣着钱了。有些时候很多人问我“我这公司挣不着钱啊”。为什么挣不着钱?那很容易解释。

你做的东西里连现有的,比如我们现在叫大厂(计算机的大厂)还不如,你的效率比别人低,那你肯定挣不着钱。因为他基本上设置了这个行业能够盈利的一个线,你达不到这个线就挣不着钱。你做比他差,你肯定挣不着钱;你做比他好,有可能挣不着钱,因为他还有一些商业上垄断性;但是做得差,一定挣不着钱。

第三级的人就要能想到一些常人想不到的方法。

你不能满足于教科书上已有的这些方法,因为你需要解决人家没有解决的问题,你要做到世界上最好的。当然这都是一层层的基础,再往上搭的。

第二级的人要能探索未知,我在书中讲述的不多。

第一级的人更了不起,要能构建知识体系。

比如,我们说计算机算法整个体系就是高德纳构建的。这个一般人达不到,咱们也就不过多讨论。也就是说,从大学毕业的你一般是七级水平,能够经过一辈子的努力达到三级,那你可能就比世界上99.9%的人已经好很多了。

每一位IT从业者,可能都会或多或少遭遇职场瓶颈期,而想要摆脱这种情况,就要努力让自己成为第3级及以上的人。第1、2级可能只有极少数人能做到,对于普通人,想要达到3级,核心就是努力解决人家没有解决的问题。在本书中,《计算之魂》不仅仅有吴军博士从业30多年的经验,同时还能通过本书了解计算机科学,更有助于了解 IT 产业的技术特点,培养一些特殊的思维方式,并掌握信息时代特殊的做事方法。


《计算之魂》

作者:吴军

对计算机科学的掌握程度,决定了一个计算机行业从业者能走多远。在本书中,作者将人文历史与计算机科学相结合,通过一些具体的例题,分10个主题系统地讲解了计算机科学的精髓。这些例题是作者面试求职者时用到的考题,或是头部计算机公司和金融企业的面试题。

作者在书中结合自己对计算机工程师的五级分级标准,详细讲解了每类题目不同层次的解决方法、不同水平的人大约能思考到什么样的深度,深度阐述题目背后的计算机科学精髓。通过对比优化解题思路,读者不仅可以衡量自己的水平,在职业的发展道路上走得更快,更可以深刻理解并掌握计算机科学和计算思维,逐渐把握计算机科学这门艺术,获得重复性成功。

对于所有有志于了解或学习科技,特别是计算机科学的人来讲,本书不仅有助于了解计算机科学,更有助于了解 IT 产业的技术特点、培养一些特殊的思维方式、掌握信息时代特殊的做事方法,通过具体的例子,从“术”的层面获得“道”的层面的提升。

小结

人们通常会觉得从事IT行业生命周期很短,主要是因为一些人的能力没有和年龄同步增长。世界上总有一些IT难题,需要有经验的人解决。我在Google时,汤普森(UNIX的发明人,图灵奖获得者)和我都在研究部门,他每日的工作就是和大家闲聊,看看有什么问题需要解决,然后能碰撞出什么想法。一段时间之后,他和两位IT老兵发明了Go这种新的编程语言,当时他已经60多岁了。很多人会问我现在还写不写代码。我现在偶尔还会写,但只是出于兴趣,不会写任何产品的代码了。这就如同一个老兵,后来当上了将军,不用亲自扛枪上战场了,但还会出于兴趣玩枪,还会去靶场射击一样。实际上,图灵奖获得者都有这个习惯,在硅谷的图灵奖获得者甚至还自己发起编码比赛。过去,通常冠军都是高德纳。上面主要讲了对个体的情况,下面来看看区域性或团体的信息技术情况。

为什么北欧更容易出顶级程序员

说起北欧,很多人会想到寒冷的冬天,漫长的极夜,童话王国和圣诞老人;北欧(挪威、芬兰、丹麦、瑞典),很多人会想到寒冷的冬天,漫长的极夜,白雪皑皑漫长的港湾以及童话王国和圣诞老人.....下面罗列一些诞生于北欧的令人惊羡计算机技术。

Linux:世界上最流行的开源操作系统,最早的内核由Linus Torvalds开发,芬兰人。Linus 出生于1969年,毕业于芬兰赫尔辛基大学计算机科学专业,他的学业成绩一直非常优秀,甚至被称为“计算机科学天才”。1991年当时大学生的Linus创建了Linux操作系统的第一个版本。

MySQL:世界上最流行的开源数据库,主要的开发者是Monty,芬兰人。

Chrome V8 :世界上最流行的JavaScript引擎,主要作者Lars Bak ,丹麦人。

MineCrfat:世界上最流行的沙盒游戏,主要作者Markus Persson,瑞典人。

cURL :世界上最流行的,支持各种网络协议的数据传输工具和库,被全球有100亿台设备使用,作者Daniel Stenberg,瑞典人。

SSH:世界上最流行的加密的网络传输协议,最早由Tatu Ylönen开发,瑞典人。

QT:流行的跨平台GUI框架,最早由Haavard Nord和Eirik Chambe-Eng联合开发,Chambe-Eng为挪威人。Qt 支持桌面应用程序开发、嵌入式开发和移动开发,覆盖了现有的所有主流平台。你只需要编写一次代码,发布到不同平台前重新编译即可。

Unity:世界流行的游戏引擎,由3个丹麦人发明。2004 年,Unity的三位创始人David Helgason、Nicholas Francis、Joachim Ante 在丹麦哥本哈根一间地下室中开发出来。

cURL:世界上最流行的,支持各种网络协议的数据传输工具和库,被全球有100亿台设备使用,作者Daniel Stenberg,瑞典人。

面向对象技术:Dahl 和 Nygaard 于上世纪60年代发明, 挪威人。

这些技术哪怕在中国出现一个,绝对会吹上天。更不用说北欧还诞生了Turbo Pascal(丹麦),即时通信软件Skype(瑞典+丹麦),在线流媒体平台Spotify(瑞典),浏览器Opera(挪威)......

要知道,北欧包括丹麦(587万人)、芬兰(554万人)、冰岛(37万人)、挪威(540万人)和瑞典(1042万),合计2760万人,还没有中国一个省人多。北欧为什么能诞生这么多改变世界的计算机技术?

难不成是因为身处高纬度地区,长夜漫漫,总想着搞点儿发明创造?这个问题我很好奇,搜索了一番,发现了这些可能的原因:

1. 教育优势
北欧的教育非常发达,拥有高质量的教育体系,许多人接受了高质量的教育,包括计算机科学和软件工程领域。2018年,各国公共财政教育支出占GDP比例,按从高到低排名,前五名是挪威,丹麦,芬兰,冰岛,瑞典,北欧5国霸榜,遥遥领先。尤其是挪威和丹麦,超过了7%, 其他三国也在5.5%以上。不仅投入高,北欧的教育特别注重学生的自主学习和实践能力培养,同时也致力于为学生提供多元的学科背景和跨学科研究的机会。例如瑞典,从小就注重提高公民科学素质,小学课程设置以培养兴趣为主,除语文、数学和自然等必修课外,还有家政课和手工课等培养动手能力的课程。高中毕业后的学生一般先工作1-4年后再读大学,由于学生具有了一定的工作经验和社会经验,知道自己需要学习什么,对什么感兴趣,所以学习起来思路和灵感就会很多。

2. 重视IT技术
像Linux之父,MySQL之父,还有很多其他北欧大佬,都是十几岁就有了自己的电脑,开始玩游戏,玩不过瘾自己写游戏,从此走上编程之路。要知道这是在七十年代末,八十年代初,电脑还属于贵重物品,北欧发达的经济为孩子们提供了接触最前沿IT技术的机会。对于一些不富裕家庭,政府会承担起责任,例如瑞典在1998年推出了“每个家庭至少一台电脑”的政策,对推动IT技术发展影响极为深远。政府鼓励企业付费给员工买家用电脑,就能减免税费,员工不论职位高低,连清洁工都包含在内。这个计划实施了3年,到2001年已经有85万个家庭购买了电脑,涵盖了瑞典将近25%的家庭。

Klarna(网络支付公司)的创始人西米亚特科夫斯基对此非常感慨,他说:像我们这样的低收入家庭,根本负担不起买电脑的开支,但是当政府一推出改革措施,我母亲第二天便买了一台电脑。西米亚特科夫斯基在16岁起就可以在家中学习编程,20多年后,他的Klarna网络支付公司估值达到460亿美元。

瑞典还积极投资建设网络基础设施,1995 – 2005短短十年间,网络渗透率由5%暴涨到85%,手机渗透率由22%到超过100%(意思是平均每个人拥有超过一只以上的手机)。相比发明网络与手机的美国,在2005年的网络及手机渗透率却分别只有68%和69%。网络的普及,成为信息科技创新企业的温床,这一点中国也应该深有体会,4G普及以后,中国移动互联网产业大爆发,一下子涌现出了大量的互联网公司,深入生活的方方面面。

3. 社会福利兜底
北欧五国是全世界著名的高税收高福利国家,丹麦72%的税收用于各种福利,挪威和瑞典社会福利支出占GDP的34%和38%,高支出建立了让人羡慕的福利体系,我这里不想再列举枯燥的数字了,总结来说就是:不用担心生孩子,国家每月发钱,产假极长,亲子假机多。不用担心上学,教育免费,还有补贴。不用害怕生病,医疗完全免费或者费用极少。不用害怕失业,失业补助非常可观。在这样的环境中,人们不会那么焦虑,可以把更多的精力和时间投入到自己真正喜欢的领域,而没有后顾之忧。

新创业的太阳能公司 Trine 的创办人 Sam Manaberi 说:“良好的社会福利制度就像安全网,让我更能无后顾之忧地投入创业之中。(创业失败)最坏的情况就是我没有薪水,但是我的小孩还是能享有医疗及教育。”Klarna的创始人西米亚特科夫斯基表示,自己的巨大成功可以归功于国家的福利制度。如果生意失败或者失业,也不用担心破产。我时常会想,如果中国也能提供这样的福利,以中国的人口数量,会不会有大量的天才追随自己的兴趣,实现发明创造呢?

4. 鼓励创新的文化氛围
“创新者需要有独立的人格,而不是对权威惟命是从;他要有独立的思考能力和判断能力,而不是人云亦云;他要有平常心,而不是患得患失;他是一个安宁的、踏实的人,而不是心情浮躁,急于求成。”---易纲。北欧尤其是瑞典的教育从小学开始就是讲究和谐、平等,一切都任由天性和本能,从小就树立和培养出放松心态,让有创新能力的人基于个人兴趣,而不是带有功利思想,从容地进行发明创造。

瑞典上大学免费,基本想上就能上,但是瑞典青年上大学的比例在欧美国家并不算高,很多人更喜欢去职业学校学习自己喜欢的东西,当然这种心态也需要高水平的社会经济做支撑,需要和民族的文化积淀联系在一起,别的国家不一定有这样的土壤,更不能全盘照搬。


欧洲的编程语言三巨头

这三位都是图灵奖获得者,他们的名字和发明散布在各种教科书中,从左到右,依次是:


尼克劳斯·沃斯(Niklaus Wirth)
瑞士人,一生发明了8种编程语言,其中最著名的是Pascal,提出了著名的“程序=数据结构+算法”,1984年沃斯因开发了一系列创新的计算机语言而获得图灵奖。

迪杰斯特拉(Edsger Dijkstra)
荷兰人,发明了“最短路径算法”,“信号量”,提出了“Goto是有害的”,1972年因对结构化编程的贡献获得图灵奖。

霍尔(Tony Hoare)
英国人,发明了“快速排序算法”,发明了霍尔逻辑来验证程序正确性,提出CSP解决并发过程的交互,发明了null这个引发“数十亿美元”损失的错误,1980年因为对编程语言的定义和设计的基本贡献获得图灵奖。


他们三人都在欧洲,都是从学工程学开始,后来转到了计算机领域。他们年龄相仿(沃斯和霍尔同岁,比迪杰斯特拉小4岁),共同的兴趣让他们走到一起,不但在暑期活动,学术会议上经常碰面,密切合作,在私下里,也建立了深厚的友谊,经常来回走动,互相拜访。


迪杰斯特拉率先登场

在上世纪六七十年代,是编程语言发展的黄金时代。第一个高级编程语言Fortran已经出现,但是主要应用在工程界,和硬件密切相关。

1960年1月,Fortran之父约翰·巴克斯,Lisp之父约翰·麦卡锡,第一位图灵奖获得者Alan Jay Perlis等一大批顶尖科学家在巴黎聚会,经过一番唇枪舌战的讨论,他们推出了ALGOL 60,这是一种和计算机硬件无关的编程语言,方便算法的描述。

ALGOL 60有很多创新,递归、本地变量、begin end 代码块都是由它率先推出。现代大多数编程语言的语法,都是类ALGOL的。从下图中,就可以看到ALGOL的江湖地位,是很多编程语言的老祖宗。


迪杰斯特拉对Algol-60非常欣赏,他不止一次说道,这是计算机科学成为一个学科的重要时刻。仅仅7个月以后,迪杰斯特拉就在荷兰实现了第一个ALGOL60的编译器,比其他小组早了一年多。为了实现ALGOL60中的递归,迪杰斯特拉第一次引入了Stack这个概念。

迪杰斯特拉等人还举办了一个ALGOL 60的培训班,来培训的就有霍尔,霍尔刚刚发表了快速排序算法,他上完培训班,也在自己公司机器上实现了ALGOL 60,霍尔的实现效率高,可靠性强,受到国际学术界的关注,进入了IFIP工作组,开始维护和发展ALGOL。


Pascal的诞生

1966年,霍尔和沃斯一起做了一个提案,希望对ALGOL做出一次改进。但是ALGOL小组认为他们的提案太保守,改动太小,拒绝了。

“一气之下”,沃斯和霍尔退出了ALGOL小组,自己把提案的想了做了实现,即编程语言ALGOL W。正是在ALGOL W 中,霍尔发明了那个被“无数人诟病”的空引用null。在2009年的一个软件会议上,霍尔为发明null夸张地道歉:

“我当时正在设计ALGOL W 的类型系统,我忍不住想把null放进去,因为它很容易实现......没想到它导致了无数的错误,系统崩溃......在过去的40年,引发了数十亿美元的损失。”

1970年,沃斯进一步改进了 ALGOL W,成为了大名鼎鼎的Pascal。

为了帮助在各种计算机上实现Pascal, 他创建了一种新型的编译器,该编译器不会直接生成机器码,而是生成一种中间的代码形式,在虚拟机上运行。

1976年,沃斯写了一本书介绍基本的数据结构和算法,也捎带着介绍了Pascal语法。


这本书的名称也很神奇,叫做《程序=算法+数据结构》,从此这个公式开始名扬世界。

Pascal的流行

虽然 Pascal 很快就得到了大学的认可,但它又花了几年时间才成为主流。这得益于Philippe Kahn,是沃斯在瑞士苏黎世联邦理工学院教学期间的一个学生。


Philippe Kahn看到了沃斯教授在Pascal上的开创性工作,1982年成了一家叫做Borland的公司,从事软件开发工具的开发。1983年,Borland推出了革命性的集成开发环境,Turbo Pascal ,仅卖49.95美元。


Turbo Pascal 除了价格低廉以外,另外一个杀手锏就是编译速度飞快。操刀编译器的就是上文提到的丹麦人Anders Hejlsberg,他很大程度上受到了《程序=算法+数据结构》这本书中Tiny Pascal编译器的启发。


Goto是有害的

1968年,迪杰斯特拉向ACM提交了一篇论文,尖锐地批评了当时编程中过度使用Goto语句的情况,以及对结构化编程的拥护,他提议,在高级语言中废除Goto语句!

论文的标题平淡无奇:A Case Against the Goto Statement。

沃斯正好是当时的编辑,他顺手把标题改成了Goto语句是有害的(Goto Statement Considered Harmful)。

如果放在如今的自媒体时代,沃斯绝对是一个擅长抓热点的标题大师。这个标题就像一个重磅炸弹,很多大牛跳出来,或支持或反对。

高德纳写了一篇叫做《使用 Goto语句进行结构化编程》的文章,分析了一些常见的编程场景,指出一些场景中Goto是最适合的语言结构。

K&R在《C语言编程》中,也指出Goto可以用于函数结束错误处理程序和循环的多级中断。

即使在多年以后,Linus之父Linus Torvalds和《代码大全》的作者Steve McConnell还反对迪杰斯特拉的观点,指出Goto可以是一种有用的语言功能,可以提高程序速度、大小和代码清晰度。据统计,2013年的Linux内核代码中约有 100,000 个 goto。

“XXX是有害的”成为了计算机的时尚用词,在随后的几十年中不断出现:
“全局变量是有害的”
“Unix风格,或者cat -v 是有害的”
“MD5被认为是有害的”
“以人为本的设计是有害的”
“Java的新特性是有害的”
“‘被认为有害’的文章是有害的”
......

沃斯,迪杰斯特拉和霍尔都在欧洲,获得图灵奖都和编程语言有关,可以称为欧洲编程语言的三巨头。他们都是结构化编程的先驱,他们的工作深刻地影响了我们现在的编程。2002年8月6日,迪杰斯特拉和癌症斗争多年以后,不幸离世,享年72岁。2024年1月1日,沃斯去世。享年89岁。

三巨头中,只剩下霍尔一位了。其实除了这三位之外,欧洲还有一对编程语言双子星,挪威的Ole-Johan Dahl和Kristen Nygaard,他们发明了面向对象的语言Simula,两人也都于2002年去世。

我们现在使用的编程语言的概念和特性,差不多都在上世纪六七十年代就已发明,那一批编程语言的先驱,都在逐渐老去。编程语言的黄金时代已经过去了。


结语:写公众号这几年,遇到过不少小天才,有的在六年级就开始读《计算机程序设计艺术》,谈起C++编译优化头头是道;有的在初三写虚拟机,手搓操作系统...... 考虑到中国庞大的人口基数,这样的孩子应该还有很多,如果在成长的过程中如果有良好的环境,未来的生活没有后顾之忧,一定会迸发出强大的创造力,可以像北欧的程序员那样开发出众多世界流行的软件。如果他们长大后还像如今程序员那样,被繁重的工作、高昂的房价、被医疗、教育等问题压得喘不过气来,恐怕我们只能继续去羡慕别人了。

俄罗斯程序员为什么这么优秀

先看他们做的世界级软件

俄罗斯这个国家没诞生互联网巨无霸公司,但是它的程序员却开发了一大批世界知名的软件:
比如世界上最流行的Web服务器Nginx

世界上流行的压缩软件7-zip

世界知名的杀毒软件卡巴斯基

全世界活跃用户达到5亿,提供端到端加密语音和视频通话的IM软件Telegram

深受程序员喜爱的集成开发环境IDEA

(JetBrains总部在捷克,创始人是俄罗斯人)

用于OLAP的列式数据库管理系统ClickHouse

世界顶级的交互式反汇编商用软件IDA Pro

另外还有最著名的俄罗斯方块

没错,这个国家就是俄罗斯。不仅如此,俄罗斯的程序员在ACM主办的国际大学生程序设计竞赛中对其他国家呈现碾压之势,从2012年到2020年,他们连续9年获得冠军!国内的著名的院校被远远甩在后面。其程序员为什么会这么厉害?

有人开玩笑说这是因为俄罗斯有着漫长的冬天,冬天大部分时间都在下雪,困在家里没事干,只能思考,这正是写小说和代码所需要的,所以俄罗斯出现了很多伟大的文学家,也有很多伟大的程序员。想想也有几分道理,长夜漫漫无心睡眠,写作不需要多少资源,只需要纸和笔,编程也不需要多资源,有电脑行,不仅是俄罗斯,上面说的北欧不也出现了Linux 和 MySQL 吗?

迈克尔·刘易斯在他的畅销书《高频交易员》(Flash Boys)中提到,高盛有一半程序员都是俄罗斯人,他们是在EC1030和EC1040这些大型机上长大的,由于这些计算机的计算能力非常有限,这些程序员不得不编写极其高效的代码。由于没有充足的上机时间,他们需要先把程序写到纸上,考虑周全,尽可能地降低错误。所以在这样的环境中成长起来的程序员无疑是非常厉害的。实际上这些俄罗斯程序员杰出的成就,可以追溯到苏联时期留下的扎实的理科教育体系。苏联希望在核竞赛中超越美国及其盟友,需要优秀的技术专家,所以对数学、物理极其重视,投入大量精力打造了一套非常有效的人才培养机制。在其大城市,开设了专门研究数学和物理的学校,对有才华的孩子进行的精心培养。除了学校,还有俱乐部和专业杂志。

编程最需要逻辑思维,而那些经过严格数学训练的人转到编程领域,基本上就是碾压。这种良好的传统被俄罗斯所继承,知乎答主W-Pwn的回答中说道:俄罗斯中学的信息教育非常扎实,在其小学里,信息学的基本内容就被掺杂在核心科目“数学”和“技术”中教授。到了中学,信息学则是强制的学科,需要学习的内容包括:计算机功能原理、信息技术、网络技术、算法、语言和编程方法、建模等。结果就是,十年间俄罗斯有60万中学生参加计算机科学考试,是美国的两倍多。

值得一提的是,信息学还是俄罗斯高中生进入大学的必考科目。在这种情况下,编程的天才们肯定会被挖掘出来。不过虽然俄罗斯程序员非常厉害,但是精英人群不能代表整个国家的IT水平。

现在的俄罗斯是个非常依赖能源的国家,石油和天然气的出口是主要收入来源,缺乏扶持的IT产业发展不起来。其知名的互联网公司很少,一个是Mail.ru,俄罗斯最大的门户网站,它的月活跃用户数达到1.2亿,这已经占到了俄罗斯总人口的80%以上了。另外一个是俄罗斯的本土搜索引擎Yandex。其市值是160亿美元,Mail.ru只有18亿美元,别说和美国的互联网巨无霸比了,放到中国也只是中小型互联网公司的水平。俄罗斯对互联网企业监管比较严格,偏保守,导致多位互联网大佬跑到海外。如VKontakte创始人杜罗夫在离开俄罗斯的时候说:俄罗斯现在不适合做互联网生意(The country is incompatible with Internet business at the moment.)”。杜罗夫后来又创立了Telegram,2018年莫斯科一家法庭裁决:封杀即时通讯应用 Telegram。

多年以来,西方一直对俄罗斯进行围堵,这导致大量天才俄罗斯程序员流失,其中大部分去了美国,为外国做出重大贡献。相比而言,中国情况还不错,虽然有不少精英出国,但是国内互联网高速蓬勃发展,提供的高端的职位、创业机会,还能吸引不少人回流。但相比俄罗斯,中国的顶级程序员太少了,产出的有世界影响力的软件更少。最有可能的原因是:中国的互联网和软件公司都是在应用层激烈竞争,程序员整天被需求压得喘不过气来,业余时间被996榨干,回到家中,累得根本没有时间和精力去折腾自己的兴趣和爱好了。丝毫不怀疑中国有很多天才程序员,只是绝大多数都被房子、医疗、孩子教育等几座大山压着,为生活所迫的情况下,怎么可能发挥自己的聪明才智去搞发明创造呢?