年龄从来不是界限,除非自己拿过来为难自己。
今年 80 岁的 UNIX 核心开发者之一、UNIX 命名者 Brian W.Kernighan,在夏季很多人都在开启学术休假之际,找到了一些空闲时间。
在这个时间段,他闪现了 1977 年时与好友一起开发的文本处理工具、Linux 及 UNIX 环境中最强大的数据处理引擎 AWK 在 GitHub 的仓库上(https://github.com/onetrueawk/awk),潇洒地写了数百行代码,提交了最新的 pull request,留言告诉开发者这些代码可以让 AWK 实现 Unicode 的支持。
然后事了拂衣去,深藏功与名。
直至近日国外的一个专门聚焦于计算机领域的 Computerphile 频道在采访 Brian W.Kernighan 问及他最近主要在干什么时,这位普林斯顿大学计算机科学系教授才低调地分享了近况。
在今年 5 月,他给一位老朋友发了一封邮件,提及自己正在进行在 AWK 工具支持 Unicode 的一些尝试,Kernighan 说道,“我已经做了相当多的测试,但显然还需要更多的测试……一旦我找到了方法,我将尝试提交一个 pull request。我希望我能更了解 Git,但尽管有你的帮助,我仍然没有正确的理解,所以这可能还需要一段时间。”
UNIX 的开发者之一、UNIX 命名者布莱恩·克尼汉(Brian W. Kernighan)
AWK 是一种数据驱动的脚本语言,它与 grep、sed 一起被称为 Linux “三剑客”,它也是 UNIX 管道功能和系统间互操作性的关键。在功能上,AWK 能为开发者带来极大的便利,如通过创建非常简短的程序来读取输入的文件、为数据排序、处理数据、对输入进行计算、生成报表等。
正如上文提及的,AWK 诞生于 1970 年代的贝尔实验室,其名称源自研发它的三位计算机科学家,分别是 Alfred Aho、Peter Weinberger、Brian W.Kernighan,其中 K 指的就是 Brian W.Kernighan。
“AWK 只适用于 ASCII,或者 8 位输入,但它根本没有真正处理 Unicode,这一直是一个尴尬的问题,” Kernighan 在 Computerphile 的采访中无奈的说道,“直到几个月前,我花了一些时间来处理一个令人难以置信的老程序。我把这个问题又翻了出来,并解决了它,如今它可以处理 UTF-8 的输入和输出,这样你就可以有正则表达式。”
这一波连续的操作,惊呆了所有的开发者,不仅让 AWK 这款在更新上沉寂许久的工具再度出现在大众视野,登上 GitHub Trending 的第 8 位,同样 Brian W.Kernighan 对技术追求的精神更让人钦佩。
对于 Brian W.Kernighan 本人,被外人所熟知的是,他还是开发者入门必须敲下的 Hello World 示例代码的发明者,连 UNIX 的名字也是他取的。在《新程序员 001》中,我们与 Brian W. Kernighan 畅谈技术与人生,整个过程中,我们惊讶于这位大师的真实和坦诚,也为这跨越半个世纪的史诗般的程序人生所深深感动。
以下是 CSDN 的《新程序员》与布莱恩·克尼汉(Brian W. Kernighan)教授访谈记录:
50 年程序人生
《新程序员》:你曾说是理查德·汉明(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:开源是一件非常好的事情,并且对软件行业的发展至关重要(现在几乎所有东西都和开源有关)。如今我们其实已经取得了很大的进步,主要的软件系统,如操作系统、编译器和工具都可以作为高质量商品免费提供。开源使我们可以在他人的工作基础上进行构建,实现共同进步。虽然我无法准确地预测未来,但我希望开源可以继续成为世界的重要组成部分。而且,我强烈希望中国的程序员们能够为现有的项目作出贡献,并创建出更多的新项目。
One More Thing
《新程序员》:关于 UNIX 的历史,你还有什么要补充的吗?
Brian:我很幸运。UNIX早期的日子对我而言是非常美好的。贝尔实验室的环境很好,我身边有很多了不起的同事,他们在各个领域不断地创新。UNIX就是在这种独特的环境中诞生的。从这个意义上来说,我认为UNIX是独一无二、不可复制的,但在其他地方一定有人也同样幸运,可以像UNIX那样为改变世界作出贡献。我希望更多人都是这样的幸运儿。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至605152901@qq.com 举报,一经查实,本站将立刻删除。