《程序员》于2000年创刊,其理念为技术改变世界,创新驱动中国。2021年,全新的《程序员》2.0重新起航,以专业的内容为立足点,以音视频、图文专栏等丰富的多媒体形式为载体,立足当下,放眼未来,为读者带来全方位的技术和产业解读。
本文为《程序员》2.0第一期内容,与UNIX的开发者之一、UNIX命名者布莱恩·克尼汉(Brian W. Kernighan)畅谈技术与人生。
作者 | 《程序员》编辑部
在软件历史中,UNIX是一个传奇。自1969年在贝尔实验室的阁楼中诞生以来,UNIX的发展远远超出了创造者们的想象。它带动了许多创新软件的开发,影响了无数程序员,如果没有它,Linux、macOS和Android系统可能不会存在,人们依赖的导航软件、智能家电、智能手机、物联网也会缺失。
近日,《程序员》采访了UNIX的研发者与命名者布莱恩·克尼汉(Brian W. Kernighan)教授,他也是AMPL(数学编程语言)与AWK(文本处理工具)的共同创造者之一,曾和C 语言之父丹尼斯·里奇(Dennis MacAlistair Ritchie)共同写作了C语言的第一本著作《C程序设计语言(The C Programming Language)》。我们和布莱恩·克尼汉教授聊了聊UNIX的成功之道,以及操作系统的未来走向。在访谈中,我们惊讶于这位大师的真实和坦诚,也为这跨越半个世纪的史诗般的程序人生所深深感动。
重点速览:
《程序员》:你曾说是理查德·汉明(Richard Hamming)启发你写了《UNIX传奇:历史与回忆》(UNIX:A History and a Memoir)这本书。那么,在你的职业生涯中,哪个人对你的影响最大呢?
Brian:我主要想提三个人。首先是迪克·汉明(Dick Hamming,汉明码发明者,“迪克”是“理查德”的非正式称呼),是他激发了我写这本书的灵感,并给我提供了各种各样的好建议,他是我的人生挚友。
其次是道格·麦克罗伊(Douglas McIlroy,著名数学家,UNIX 开发者),他是我见过的最聪明的人之一(我见过非常多的聪明人)。1967年,我在贝尔实验室第一次实习时就是在他的手下,他曾对我的博士论文的内容和写作提出了很好的优化建议,我们一起共事了近30年,他在任何领域都是我的“智多星”——编程、写作、科学、技术、数学等等。
第三个人是林申(Shen Lin)。1968年,我在贝尔实验室第二次实习期间,和林申一起研究了“图划分问题”(Graph Partitioning Problem),这后来也成为了我博士论文的基础。1969年,当我以正式员工的身份回到贝尔实验室时,我又和林申一起研究了“旅行商问题”(Travelling Salesman Problem)、以及其他组合优化的问题,甚至还一起完成了一些网络设计工具。他具备一种惊人的能力,在上手一些小例子之后,就能总结出普适的方法论。如果没有他,我是无法顺利完成论文的。
《程序员》:从实习到退休,你在贝尔实验室工作了30年,那里最吸引你的是什么?如今在技术领域,跳槽已然成为一件十分普遍的事情,你对此有什么看法呢?
Brian:在贝尔实验室的时候,我先是实习,然后转为全职。那是个神奇的地方,在那里,有数以千计的一流科学家和工程师在研究多个领域中有趣又有关联的各类问题。公司(AT&T,贝尔实验室的母公司)具备开放、合作的环境和长远的眼光,所以我们可以用很长的时间(甚至数年)去完成自己想要完成的任何事。因此,大家自然而然地就会在那里一直工作下去,没有理由要离开。
如今,这种环境已经不存在了,但同时工作机会却很多,尤其是对于程序员来说,所以人们在短时间内频繁地更换工作就不足为奇了。虽然这并不是我个人的工作风格,但似乎对很多人而言都是理所应当的。我倒是觉得,尽管这种工作流动性在短期内有一定的好处,但可能也会带来一些长期的负面影响,比如许多公司内部都缺乏连续性,丧失了一以贯之的企业文化和传承。
《程序员》:谈到企业文化(Organization Culture),这也是UNIX成功的一个重要原因。在这方面,你认为其他企业和实验室可以从贝尔实验室中学到什么?假设现在你带领的团队工作量很大,并且员工都分散在不同的时区,你将如何确保代码质量?
Brian:贝尔实验室研究环境的独特之处在于没有“繁重的工作量”,大家都在做自己认为有趣或重要的事情,没有要求、没有产品,也没有可交付的成果,所以一切进度压力都是员工自己给自己的。因为所有人都生活在同一个地区,因此不存在时区问题。当然,有些人习惯于传统的白天工作,而有些人则习惯在夜间工作,还有一些人的工作时间很长(比如Ken Thompson),所以他们有时会和白天的人同步,有时会和夜间的人同步。因为所有的程序员都很优秀,所以代码本身的质量也很高,而且所有的代码都在文件系统中,任何人都可以读取并修改;但唯一的要求是,如果你修改了一个程序的代码,那么你就要对这个程序负责,从而提醒大家要谨慎。
《程序员》:你曾说,贝尔实验室创造的所有伟大发明都得益于其开放的氛围和充足的资金支持,但如今的公司往往只注重短期效益。这是否意味着将越来越难以见证UNIX这样伟大发明的诞生?目前,公司在研发方面还有其他可行的方式吗?
Brian:我确实认为,过多地聚焦在短期目标和钱上是现金企业的一个问题。当然,企业必须要完成特定的工作并交付相应的产品,这样才能有收入维持企业的运转。但是,如果一切都以短期目标来衡量的话,就没有办法去充分地仔细考虑其他选择,或者寻找更好的行事方式以及为未来投资。然而,和很多事情一样,这是一个权衡利弊的过程,我们不难发现,许多优秀甚至伟大的产品都来自研发风格截然不同的公司。
《程序员》:你在书中提到,伟大的项目往往是由个人建立起来的,然而现在的公司往往都更强调合作和头脑风暴。你认为两者之间是否存在“矛盾”?还是说前者是只适用于“天才”的行事方式?
Brian:在UNIX的早期阶段,程序规模要小得多,所以对团队的关注度并没有那么高。同一个项目可能会由两个人共同完成,但如果三人一组的话就有点多了。工作中必然会产生合作,合作的过程是有机的,而不是由管理层刻意创造的。现在所说的头脑风暴在过去也有:人们探讨各自的想法,在黑板上写写画画,编写程序来测试想法。
如今的系统规模和环境都庞大且复杂,因此独行侠式的天才能发挥的作用是十分有限的。但许多大型系统在开始时的规模都非常小,核心贡献者也非常少。我们可以想一想编程语言及其编译器、Linux或各种主要开发工具。不难发现,我们大多数的编程语言都是由一两个或两三个人创建的。Linux也是从一个人开始发展起来的。
《程序员》:UNIX在发展过程中经历了版本分叉、标准竞争和诉讼,这些也是当今企业不得不面对的成长之痛,你对这些企业有什么建议吗?
Brian:我认为一个企业总是会很自然地想要通过创造新的、有用的系统、工具、语言和功能来吸引客户,并且用这些东西来留住自己的客户。从短期来看这没什么错,但从长远来看,我认为选择合作会更好。
《程序员》:作为一位“传奇程序员”,你也曾和许多同样具有传奇色彩的程序员合作过,那在你看来,一名优秀的程序员应该具备什么样的素质呢?
Brian:其实说实话,我是一个非常普通的程序员,但我有幸与一些十分杰出的程序员合作过,比如肯·汤普森(Ken Thompson,UNIX 创造者)和丹尼斯·里奇(Dennis Ritchie,C 语言创始人)。尤其是肯(Ken),他似乎具备一种发现事物的统一性和通用性的天赋,这使他的代码简单、干净且功能强大。他的工作效率高得令人难以置信,能够在短时间内写出大量优秀的代码,而且他可以把这些东西全都记在脑子里。他是我认识的最好的程序员。
《程序员》:肯(Ken)用3周的时间创建了UNIX,道格(Doug)在几天内就提出了“管道(pipe)”的想法,是什么让你们有如此高的工作效率?
Brian:因为他们是“别人家的程序员”,我从来没有这么高效过!当然,肯(Ken)和道格(Doug)(以及其他一些人)确实是有天赋的,但我认为,他们的生产力有一部分来自于他们过去大量的工作经验,对于一些工作他们已经形成了条件反射,从而可以非常有效地创造新事物。
《程序员》:在遇到麻烦或新问题时,你的解决风格是怎样的?是如何建立自己的思维体系的呢?
Brian:这个问题很笼统。我没有什么特别的方法,但如果可能的话,我会尽可能地拖延,祈祷问题消失或自行解决。当然,这种方法也不一定总会奏效,但它确实让我的潜意识有机会来消化这个问题,这对编程是非常有帮助的。
《程序员》:对于软件工程师来说,在职业生涯的不同阶段需要培养什么样的技能或心态呢?
Brian:下面这两个技能,不仅仅是对软件工程师,对每个人而言都很重要。一是学习如何写,二是学习如何说。如果你能写好、说好,并且能有效地把技术语言传达给非技术人员的话,这将在你一生的职业生涯中发挥难以想象的价值。同时,我还认为,要对“有趣”或“值得学习”的事物保持开放的心态。不要让自己变得狭隘,要保持广泛的兴趣。法国伟大的科学家路易斯·巴斯德(Louis Pasteur)曾说过:“机会是留给有准备的人”。所以,你看的东西越多,想的东西越多,探索的东西越多,你就越有可能在某件事上变得越幸运。
《程序员》:一般来说,我们将MULTICS和UNIX的诞生看作是现代操作系统的起源。你认为操作系统发生了哪些变化?你对现在的主流操作系统,比如Windows、macOS、Android、iOS等有什么看法?
Brian:对这个问题我其实没有什么看法。但是由于现代操作系统确实需要服务一个更加复杂的世界,所以它们相应地也会更加复杂。例如,现在的处理器通常都是多核的,所以多处理成为了操作系统的一部分,这与50年前截然不同。现在内存比以往要大得多,外设也更多。网络也逐渐凸显了其重要性。就我个人而言,因为我用的是MacBook,所以使用macOS系统,但我大部分时间只用它来运行标准的UNIX命令。我有一部Android手机,但是手机编程太不好玩了,所以我也就没怎么尝试了。
《程序员》:随着云计算、人工智能和量子计算的发展,会不会对操作系统提出新的要求和挑战?会不会出现新的操作系统概念?
Brian:因为我不是很了解量子计算,所以可能没办法给出有价值的看法。但我认为人工智能并不会改变我们对操作系统的看法。如果云计算使用起来更容易一些的话,人们可能会说它只是50、60年前出现的MULTICS和UNIX等分时操作系统的现代实现。所以我想说,这并不是一个新概念,只是一个旧概念的新版本。
《程序员》: 你曾预言,对于编程而言,语言将会更容易且更安全。就这一点而言,这特定的“语言”会是什么呢?Rust或者是更多面向应用程序的语言,比如JavaScript、TypeScript、Dart、Swift、Julia或其他语言?
Brian:如今的大部分编程语言都更安全、简单,这是批量的而非单一的。每种语言都有其最适合的任务类型,比如适合嵌入式系统和高效库实现的C语言,适合大型系统的C++,以及适合作为简单通用语言的Python,等等。我想,专业的程序员应该可以熟练掌握几门语言,并且熟悉5~10种其他的语言。旧的语言永不会消亡,它们中的大多数都还在继续发展,当然,有一些程序的嵌入式系统基础太大、太复杂,难以重写。但是,人们在创造新语言方面有着无穷的创造力,他们希望这些新的语言能够取代旧的语言,但这从未实现过。
《程序员》:指针(Pointer)是C语言的重要组成部分,程序员需要对内存进行管理,这对于初学者甚至是高级程序员都是十分困难的。ALGOL的创建者之一东尼·霍尔(Tony Hoare)称,空指针(null-pointer)是他的一个“10亿美元的错误”,你认为它在语言设计上是一个错误吗?
Brian:在1972年前后C语言被创造出来的时候,计算机的速度比今天慢了一百万倍,内存也比今天少了一百万倍。此外,C语言的目的是取代汇编语言来编写关键的系统程序,最终取代操作系统本身。因此,这种语言必须简单且高效,它必须使程序员能够表达所有的计算,包括访问位置为0的内存。当然,大多数程序员从来不会刻意这么做,都是不小心做的(我们都做过很多次)。所以空指针可以说是一个“错误”,但我认为,更应该说这是一个在当时很合理的设计选择。只不过随着计算机的功能越来越强大,当然,也随着越来越多天赋不如丹尼斯·里奇(Dennis Ritchie)和肯·汤普森(Ken Thompson)的程序员编写C代码,最终证明,这种设计选择的代价极其高昂。
《程序员》:你曾提到过:“在计算领域中只有两个真正的问题:计算机太难使用和太难编程”。你认为人工智能(自动生成代码)的进步会让编程变得更简单吗?
Brian:现在谈论现代人工智能的发展还为时过早,但我猜想利用AI自动生成代码在某些情况下会有帮助。当我们对某些特定的计算任务理解得足够透彻,以至于可以自动化生成代码时,我们就已经取得了很大的进步,编译器就是一个很好的例子。所以我想也会有类似的情况,一个程序可以从程序中学习如何编写新的程序。但是!别问我细节。
《程序员》:你是否能预见面向对象编程(Object-Oriented Programming)未来的发展?或者说它是否已经进入了稳定停滞期?
Brian:面向对象编程只是组织计算的一种方法,但肯定不是唯一的方法。它在许多语言中得到了很好的支持,在一些语言中得到了部分支持,而在有的语言中则完全没有支持。但我并不认为它是一种独立的事物,仅仅是一种编程技术,它适合解决某些类型的问题,但或许并不是解决其他问题的正确方法。当然,当人们真的要使用它时,仍然要好好地加以利用,以避免深度且脆弱的类层次结构,这需要技巧和练习。
《程序员》:你如何看待“开源”的发展及其对世界的影响?它在未来将走向何方?在这个过程中,特别是对于中国的开发者来说,有哪些值得期待的呢?
Brian:开源是一件非常好的事情,并且对软件行业的发展至关重要(现在几乎所有东西都和开源有关)。如今我们其实已经取得了很大的进步,主要的软件系统,如操作系统、编译器和工具都可以作为高质量商品免费提供。开源使我们可以在他人的工作基础上进行构建,实现共同进步。虽然我无法准确地预测未来,但我希望开源可以继续成为世界的重要组成部分。而且,我强烈希望中国的程序员们能够为现有的项目作出贡献,并创建出更多的新项目。
《程序员》:《UNIX传奇:历史与回忆》(UNIX:A History and a Memoir)一书写于2019年,该书的中文版业已问世,你写这本书一共花了多长时间?有什么想对中国读者说的吗?
Brian:这本书的大部分内容是我在2019年夏天的一个长假期间在英国写的。写作的过程其实很快,因为我很了解这个主题,而且我还得到了多年来参与UNIX开发的各位朋友和同事的宝贵支持。整个写作过程都非常有趣,既可以追忆过去的美好时光,也可以和很久没接触的朋友联系。
我衷心希望中国的读者能在这本书中收获乐趣。今天的世界与UNIX早期的世界已经大不相同了,但人还是一样的。书里总结了很多经验:UNIX是如何产生的、富有创造力的人该如何合作、以及公司该如何有效地管理他们。我认为,这些经验教训同样适用于今天,也或多或少地适用于不同国家的开发者。
《程序员》:关于UNIX的历史,你还有什么要补充的吗?
Brian:我很幸运。UNIX早期的日子对我而言是非常美好的。贝尔实验室的环境很好,我身边有很多了不起的同事,他们在各个领域不断地创新。UNIX就是在这种独特的环境中诞生的。从这个意义上来说,我认为UNIX是独一无二、不可复制的,但在其他地方一定有人也同样幸运,可以像UNIX那样为改变世界作出贡献。我希望我的读者都是这样的幸运儿。
从Unix开发者Brian W. Kernighan,到OpenCV创始人Gary Bradski,再到Vue.js作者尤雨溪……《程序员》2.0第一期以「开发者的黄金十年」为主题,与多位国内外知名的技术领袖和新锐代表进行了深度对话,希望为中国开发者打开新时代的「机遇之窗」。
除了技术引领,我们也希望透过技术对行业进行深入洞察。因此,《程序员》2.0第一期也邀请到了来自快手、滴滴、贝壳找房、作业帮等知名企业的技术负责人,用案例实践为读者阐述直播、出行、居住、在线教育等多个行业变革背后的技术架构和技术引擎。
扫描下方二维码,添加小助手,即刻加入《程序员》2.0「读者群」,抢先一步获取杂志最新资讯,精彩内容不再错过。