受访者 | John Ousterhout:Tcl 的发明者,美国国家工程院院士
在计算机科学的浩瀚星空中,John Ousterhout 宛如一颗熠熠生辉的恒星。他不仅是 Tcl 语言的缔造者,更是美国国家工程院院士、斯坦福大学计算机科学的领军人物。从工业界的前沿探索到学术界的深度耕耘,他的职业生涯跨越了多个领域,见证了技术的飞速发展与变革。
从大学时偶然接触编程,到在工业界和学术界的纵横驰骋,再到对软件设计的深刻洞察,John Ousterhout 教授的经历堪称一部计算机科学的“成长史诗”。
通向完美的道路必然充满失败,他曾说:“对我来说,失败是根本性的、必要的、具有建设性的。我在各个层面都在不断经历失败。”9 岁时父亲的去世,生活教会他,“失败不一定摧毁你,反而让你变得更强大。”如今在计算机科学领域,他已成大师。他热爱教学,最自豪的是他在斯坦福创建的“软件设计”课程。这门课从根本上改变了学生对编程的思考方式,也促成了《软件设计的哲学》一书的诞生。
如今,这位计算机科学的大师已走过丰富的人生之路,在与 CSDN《新程序员》的对话中,他分享了自己的传奇经历,深入探讨了失败与挫折的价值、软件设计的哲学以及对未来的展望。全面回顾了自己的技术人生。
什么样的软件设计才算成功?如果重新设计 Tcl,他又会做出哪些改变?这些看似简单的问题,背后却隐藏着计算机科学的深刻哲学。《新程序员》带你一探究竟,听听这位计算机科学大师的独家分享。
![](https://mmssai-1331437701.cos.ap-shanghai.myqcloud.com/images/2025-02/VeJKXItpwPXVJaiae7mhXKt6wtjSlJE6Olcv9R94fkeTK8Hp5Tg13kKh0hykkuupbT4j1CEoR4OIRok91FKjgAA.jpg)
John Ousterhout Tcl 的发明者,美国国家工程院院士,斯坦福大学计算机科学教授。
John:这完全是偶然的。1960 年代时,我成长的地方并没有很多计算机,而且当时的计算机都很庞大,放在机房里;在上大学之前,我从未见过或使用过计算机。在高中时,我非常喜欢物理,打算上大学时主修物理学,大学第一年暑假,有幸在密歇根州立大学的回旋加速器实验室找到了暑期工作,实验室里有一台共享的主机计算机,我的工作需要学习 Fortran 来分析物理实验的结果。学习编程是一次震撼的体验,从未有过如此有趣和充满力量的感觉。几周后,我意识到这就是命运。最终物理学本科毕业的我,在研究生阶段转向了计算机科学。
《新程序员》:职业生涯中,您决定从学术研究转向工业界的契机是什么?这一转变对个人和专业发展产生了怎样的影响?
John:我的职业生涯结合了工业界和学术界。我喜欢在学术界自由探索新想法,也喜欢教学。但同时也热爱编程,喜欢构建他人能实际使用的系统。获得计算机科学博士学位时,我认为自己可能会在学术界和工业界度过一部分时间,结果这也成了职业发展的轨迹。
在加州大学伯克利分校度过了职业生涯的前 14 年非常精彩,但我也想亲身参与商业软件的构建,所以离开了伯克利,在 Sun Microsystems 工作了几年,随后创办了两家公司。工业界经历是一次很好的学习体验,也非常有趣。但在工业界工作了 14 年后,开始想念教学和学术界的创造性自由。那时我们已经住在 Palo Alto,有幸获得了斯坦福大学的职位,自此便留在了斯坦福。虽然我很享受在工业界的时光,但最终学术界才是我的“真正归宿”。学术界能带给我最大的影响力:除了教学和研究的影响外,还可以编写开源软件,获得广泛使用。
再回首人生成败:通向完美的道路必然充满失败
《新程序员》:作为一位成功的计算机科学家,您如何看待失败?有没有过重大的失败或挫折?在你看来什么样的软件设计是失败的或者成功的?
John:对我来说,失败是根本性的、必要的、具有建设性的。我在各个层面都在不断经历失败。例如,失败在教学中是根本的:学生犯错并从中学习是最强大的学习方式。在我的软件设计课程中,学生们通过从零开始构建一个系统,犯很多错误,接受批评,然后通过修改使软件变得更好,从而学会软件设计。
编程时我们也时刻都在经历失败。在程序能成功编译之前,谁能不经历几次编译错误?当然,我们的程序也充满了 bug,必须找出并修正这些问题,才能让程序正常运行。设计一个复杂系统时,根本不可能一开始就设计出完美的方案。得到一个好的设计的唯一途径,就是意识到第一次尝试中的问题并进行重新设计来修复它们。
通向完美的道路必然充满失败,在最令人兴奋和具有挑战性的环境中,即使是最优秀的人也会犯错。优秀的人的区别在于他们能够认识到自己的错误并加以纠正。
我人生中有过许多挫折。最初也是最具创伤性的挫折是 9 岁时父亲的去世。对我们家庭来说,这是一大打击(当时我的母亲是 1960 年代的家庭主妇,既没有工作又有四个调皮的儿子要抚养)。母亲回到学校,获得了历史学博士学位,并成为了密歇根州立大学的教授。全家都必须为渡过难关而努力,在这个过程中我们都变得更加坚强。这教会我,失败不一定摧毁你,反而让你变得更强大。
《新程序员》:在斯坦福大学的教学过程中,您最引以为豪的成就是什么?您觉得教授下一代计算机科学家最有成就感的地方在哪里?
John:我最自豪的是我在斯坦福创建的“软件设计”课程。这是一门教学生如何设计软件的课程,这门课从根本上改变了学生对编程的思考方式,也促成了《软件设计的哲学》一书的诞生。教学非常有意义,因为我能看到它对学生的深远影响。大学生的思想就像未凝固的湿泥,稍微用手指触摸,就能留下深刻的印象!
《新程序员》:最近很火的一篇博客文章:“认知负荷才是最重要的”,在 X 平台上得到了 Elon Musk 的点赞,并表示,“这大概是最真实却最少被实践的观点。”其中的理念就来自《软件设计的哲学》。您认为认知负荷是软件复杂性的 3 大原因之一,在当下,为什么它依然在困扰着开发者?
John:是的,认知负荷是一个大问题。它很可能是软件复杂性的最大原因之一。它将永远是一个问题,因为它很难避免。编写程序时最简单、最自然的方法往往会增加复杂性,从而导致更高的认知负荷。
《新程序员》:您认为信息隐藏是减少复杂性的关键之一。但在实践中,确保信息不泄露并正确地封装是一项艰巨的任务。您能分享一些关于如何更好地实现这一目标的具体策略吗?
John:总的来说,获得良好的软件设计是很困难的。问题在于,它与人类的基本本能相冲突。程序员的自然倾向是专注于快速完成当前任务,无论是修复 bug 还是添加新功能。但几乎每次为了快速完成当前任务,我们都会增加一些复杂性,这会让将来编程变得更加困难。如果你想实现信息隐藏(或任何其他良好的软件设计元素),你必须采取一种更具战略眼光的长远思维。这意味着你不能采取捷径来完成当前任务。你必须在今天花一点额外的时间,去创造一个更加清晰、易于未来工作的系统。
《新程序员》:在您的著作中提到模块应该“深”,即拥有简单的接口和复杂的实现。然而,随着系统的发展,保持这种深度变得越来越难。您有什么建议可以帮助开发者维持这种理想的模块化结构?
John:随着系统的发展,你必然会发现其结构中存在问题:早期设计中的某些假设可能不再成立。当发生这种情况时,与其围绕问题进行补丁修改(这会增加复杂性并破坏模块化),不如重新调整设计,以干净、模块化的方式处理新需求。每次对系统进行更改时,都要问自己一个问题:“假如我们从头开始重写这个系统,知道了现在的所有情况,它是否会采用目前的设计?”如果答案是“不是”,看看你是否能对系统进行重构,接近理想的设计。虽然这并不总是可能的,因为重构可能超出可用资源,但在有限的时间内尽力而为。如果你是经理,尽量为这些重构安排一些时间。
《新程序员》:软件设计哲学中的很多原则看起来简单明了,但在实际项目中却难以执行。您认为团队领导应该如何引导团队成员将这些原则应用于日常工作中?
John:应用这些原则的最好方法是鼓励开发人员更多地思考并讨论软件设计,而不仅仅是修复下一个漏洞。一种方法是进行专注于设计问题的代码审查;另一种技巧是鼓励开发人员始终为每个问题提出至少两种解决方案,然后使用设计原则来比较这些解决方案。
《新程序员》:近两年人工智能的发展火爆,您认为它们将如何改变未来的软件设计?有哪些特别的机会或者挑战?您是如何适应技术发展的周期性变化的?
John:很难预测人工智能的长期影响。如果几年前有人问我,我会说大型语言模型(LLMs)不可能获得惊人结果,但它确实做到了。展望未来,很难相信人工智能会在软件设计方面取代人类,但我可能在这方面也错了。
在较低的层次上,LLMs 将通过越来越智能的“自动补全”功能加速编程,开发人员可以用模糊的术语描述所需的代码,而 LLM 工具会填充细节。LLMs 还能帮助人们更好地理解现有的代码库。例如,我在研究 Linux 内核时发现,ChatGPT 能够比传统的网络搜索更好地回答关于内核的问题。虽然它并不总能给出完全正确的答案,但即使它错了,也能提供线索,把我引向正确的方向。这节省了很多时间。
《新程序员》:Tcl 以其嵌入性和“万物皆字符串”的理念而闻名。如果重新设计 Tcl,您会做出哪些改变以适应当前的编程环境和需求?
《新程序员》:对于 Tcl 所试图做的事情(作为一种可嵌入的脚本语言),“万物皆字符串”的哲学工作得相当好。没有其他语言能够像 Tcl 那样实现如此的灵活性、可嵌入性和可扩展性。同时,“万物皆字符串”的哲学导致了一个非常独特的语言语法,需要一些时间才能适应。而且,为 Tcl 构建高效的解释器也非常困难。总体而言,我认为像 Python 那样更传统的语法可能更适合大多数用途。传统语法无法达到 Tcl 的嵌入性和可扩展性,但这对大多数应用来说可能并不必要。
《新程序员》:您曾说过编程语言往往不是由编程语言研究人员创造出来的,而是由构建系统的实践者所发明。这对今天的编程语言研究有何启示?
John:我认为这种分化是很好的。编程语言研究者正在尝试新的编程语言想法。研究的性质决定了许多这些想法可能不会奏效,即使奏效了,它们可能也不会以易于使用的形式呈现。实际使用语言构建系统的从业者更容易认识到哪些新特性是有用的,并围绕它们构建易于使用的语言。
《新程序员》:如今有许多新的编程语言出现,但很少有像 Python 或 Go 那样获得广泛的应用。一种新语言要成功需要满足哪些条件?
John:过去,每隔 5 到 10 年就会出现一种令人兴奋的新主流编程语言,但事情似乎已经放缓了,很难指出在过去 20 年里出现了哪种令人兴奋的新语言。我不知道原因是什么,也许我们已经达到了语言设计是一个成熟学科的地步,从新语言中获得的好处不多了?
《新程序员》:您在书中提出了许多关于软件设计的原则和建议。在实际编写这本书时,您如何确保这些理念不仅理论上有意义,而且对于实践中的开发者来说也是切实可行的?
John:我为这本书设定的一个规则是,除非我有足够的个人经验使用过这些观点,并相信它们具有实际价值,否则我不会推荐任何东西。书中提出的每一条原则都是我在多种情境中看到过并行之有效的。人们经常向我推荐一些新想法,希望我将其加入书中,但我告诉他们,除非我亲自使用过这些想法,否则我不会这么做。
《新程序员》:可以概括表达一下您的软件哲学观和人生哲学观吗?
John:我最基本的原则是“决定什么是重要的,并专注于它”。这在软件设计和生活中都是关键。
《新程序员》:《软件设计的哲学》的目标读者是谁?对那些想要深入理解并应用书中概念的读者,您有什么具体的建议吗?
John:《软件设计的哲学》的目标受众是专业软件开发人员,特别是那些从事大型项目开发的人员,良好的软件设计在这些项目中至关重要。这本书对那些至少有几年工作经验的开发人员影响最大,因为他们能够理解书中试图解决的问题。但年轻的开发人员也可以使用这本书来指导他们的职业发展。我认为这本书最适合用作代码审查的工具。例如,在我的软件设计课上,学生们最初没有足够的经验来欣赏书中的原则。然而,当我审查他们的项目时,我可以指出哪些代码过于复杂,展示他们的设计如何违反了书中的原则,以及如何通过应用这些原则使代码更简洁、更简单。这个过程帮助学生理解设计原则,并开始以不同的方式思考他们的代码。
![](https://mmssai-1331437701.cos.ap-shanghai.myqcloud.com/images/2025-02/VeJKXItpwPXVJaiae7mhXKt6wtjSlJE6O2ZT4Zf06HPicUfIGMPbVwhia9pWT01mib3m5n2kgibt1iasrCd6bIRrJ0nw.jpg)
![](https://mmssai-1331437701.cos.ap-shanghai.myqcloud.com/images/2025-02/VeJKXItpwPVibOSMQeyaGwgUuVlcQvxkGpJiaozYcoDqdicBtIND9d4IpGGEDk1TYx9khYV1lE1EZMEXiaGxnr1Gkw.gif)
“AI 会取代程序员吗?”——随着 DeepSeek 在全球爆火,这个问题如今愈发令人困扰。面对日新月异的技术,不少开发者感到迷茫:未来的程序员究竟该何去何从?是被 AI 取代,还是与 AI 共舞?
理解 DeepSeek 的意义,仅仅是洞察 AI 变革的第一步。CSDN 特别企划「DeepSeek 暨 AI 进化论十日谈」系列直播,正式为此而生。今天晚上,“DeepSeek 暨 AI 进化论十日谈”第八期直播即将开始,解答开发者内心的灵魂之问。欢迎扫描下方二维码预约,相约线上:
![](https://mmssai-1331437701.cos.ap-shanghai.myqcloud.com/images/2025-02/VeJKXItpwPVqgz3HnibmMQnsRDDhx9ZRgzvGLViaQu2c3iazpb9D2PMQsBicK7icdnqvhWHoiaxpZLpJSGNO4lfAzGoA.jpg)
观看直播不迷路,也可以直接点击下方按钮即可预约直播
(文:AI科技大本营)