图灵奖获得者演讲系列(1972):谦逊的程序员(埃德斯加·迪杰斯特拉)

煤油灯科技2022-12-20 11:57

【摘自美国计算机学会图灵奖委员会主席麦克罗伊(M.D,McIlroy)在1972年8月14日在波士顿举行的美国计算机学会年度会议上的演讲中所读的图灵奖引文。】

世界各地程序员的工作词汇中充斥着由艾兹格·迪科斯彻(E.W.Dijkstra)发明或强制颁布的词语:显示、致命拥抱、信号灯、无障碍编程、结构化编程。但他对编程的影响比任何词汇表都能表明的更为广泛。本次图灵奖承认的宝贵礼物是迪科斯彻的风格:他将编程视为一项高度智力挑战;他雄辩的坚持和实践证明,程序应该正确编写,而不仅仅是调试成正确的;以及他对程序设计基础问题的启发性认识。他发表了大约十几篇论文,既有技术性的,也有反思性的,其中特别值得注意的是他在IFIP上的哲学演讲,他已经是关于合作顺序过程的经典论文,以及他对go-to声明的令人难忘的控诉。Dijkstra的一系列有影响力的信件最近作为一本关于编写程序艺术的专著浮出水面。

我们对好的产品的评价与我们对好的文学作品的评价基本相同。而在这场运动的中心,创造和反映出的模式不亚于实用的美丽,这就是E.W. Dijkstra。

由于一连串的巧合,我在1952年春天的第一个早上正式进入了编程专业,据我所知,我是我国第一个这样做的荷兰人。现在回想起来,最令人惊讶的是,至少在我这个世界上,编程专业的发展速度很慢,现在很难相信。但我很感激那段时期的两次生动回忆,它们毫无疑问地证明了这种缓慢。

编程大约三年后,我与当时我在阿姆斯特丹数学中心的老板van Wijngaarden进行了一次讨论,在我有生之年,我都会感谢他。重点是我本应该同时在莱顿大学学习理论物理,但当我发现这两项活动越来越难结合时,我不得不下定决心,要么停止编程,成为一名真正的、受人尊敬的理论物理学家,要么以最小的努力将我的物理研究正式完成,然后成为……,是什么?一个程序设计师?但这是一个值得尊敬的职业吗?毕竟,编程是什么?哪里有健全的知识体系可以支持一个在知识上值得尊重的学科?我清楚地记得我多么羡慕我学习硬件的同学,当被问及他们的专业能力时,他们至少可以说出他们对真空管、放大器以及其他等等了如指掌,而我觉得当我面对这个问题时,我两手空空。我满怀疑虑地敲开了van Wijngaarden的办公室门,问他我能不能和他谈谈;当我在几个小时后离开他的办公室时,我成为了另一个人。因为在耐心地回答了我的问题之后,他同意到那一刻为止,编程学科还不多,但随后他又直截了当地解释说,自动计算机是要留下来的,我们才刚刚开始,难道我不能成为在未来几年里让编程成为一门值得尊敬的学科的人之一吗?这是我人生中的一个转折点,我以最快的速度正式完成了我的物理学习。当然,上述故事的一个寓意是,当我们向年轻人提供建议时,我们必须非常小心。有时候人们会盲目跟从!

两年后,1957年,我结婚了,荷兰的结婚仪式要求陈述职业,我说我是一名节目主持人。但阿姆斯特丹市的市政当局不接受它,理由是没有这样的职业。不管信不信,但在我的婚姻记录显示了荒诞的一个标题——“沉默的物理学家”!

我看到编程专业在我自己的国家出现的速度太慢了。从那以后,我看到了更多的世界,我的普遍印象是,在其他国家,除了可能的日期变化之外,增长模式几乎是一样的。

让我试着更详细地描述一下过去的情景,希望能更好地了解今天的情况,在我们进行分析的同时,我们将看到许多关于编程任务的真实性质的常见误解可以追溯到遥远的过去。

“第一批自动电子计算机都是独一无二的单拷贝机器,它们都是在一个令人兴奋的实验环境中发现的。一旦有了自动计算机的愿景,它的实现对当时可用的电子技术来说是一个巨大的挑战,但有一点是肯定的:我们不能否认那些决定建造如此神奇设备的团体的勇气。对于那些神奇的装备来说,他们是:回想起来,人们只能奇怪,那些第一代机器竟然能工作,至少有几次。压倒一切的问题是使机器保持工作状态。对自动计算物理方面的关注仍然反映在该领域中较老的科学机构的名称中,如计算机械协会或英国计算机协会,这些名称中明确提到了物理设备。

那糟糕的计划呢?老实说,他几乎没被注意到。首先,第一批机器非常笨重,几乎无法移动它们,此外,它们还需要进行大量的维护,因此人们使用机器的地方很自然就是开发机器的实验室。其次,程序员在某种程度上看不见的工作没有任何亮点:可以向访客展示机器,这比一些代码更壮观。但最重要的是,程序员本人对自己的工作有着非常谦虚的看法——他的工作的所有意义都源于那台奇妙机器的存在。因为那是一台独特的机器,他非常清楚自己的程序只具有本地意义,而且,由于这台机器的寿命非常明显,他知道他的工作很少有持久的价值。最后,还有另一种情况对项目经理的工作态度产生了深远的影响:一方面,除了不可靠之外,他的机器通常速度太慢,而且它的内存通常太小,也就是说,他面对的是一只不合脚的鞋子,而另一方面,它通常有点奇怪的顺序码可以满足最意想不到的构造。在那些日子里,许多聪明的程序设计师通过巧妙的技巧获得了巨大的智力满足,通过这些技巧,他设法将不可能的东西塞进设备的束缚中。

关于程序设计的两种观点从那时起就有了,我现在就提出来; 一种观点是,一个真正有能力的程序员应该是一个充满好奇心的人,并且非常喜欢聪明的技巧; 另一种观点是,编程只不过是在某个方向上优化计算过程的效率而已。

后一种观点频频出现的情况,即可用的设备确实是一只不合脚的鞋子,而在那些日子里,人们常常会有一种天真的期望,即一旦有了更强大的机器,编程就不再是问题,因为那时,将机器推向极限的斗争将不再是必要的,这就是编程的全部内容,不是吗?但在接下来的几十年里,发生了完全不同的事情:出现了更强大的机器,而不仅仅是一个数量级的更强大,甚至是几个数量级的更强。但是,我们并没有发现自己在所有编程问题都得到解决的情况,而是发现自己已经陷入了软件危机中!怎么会这样?

有一个次要的原因:在现代化机器的一两个方面,基本上比旧机器更难操作。首先,我们得到了I/O中断,发生在不可预测和不可再现的时刻;与假装是完全确定性自动机的旧顺序机相比,这是一个巨大的变化,许多系统程序员的白发见证了这样一个事实,即我们不应轻率地谈论该特性所产生的逻辑问题。其次,我们的机器配备了多层次的存储,这给我们带来了管理策略的问题,尽管有大量关于这一主题的文献,但这些问题仍然很难解决。由于实际机器的结构变化而增加的复杂性就到此为止。

但我称之为次要原因;主要原因是……机器变得更强大了几个数量级!坦率地说:只要没有机器,编程就完全没有问题;当我们有几台较弱的计算机时,编程成了一个轻微的问题,而现在我们有了巨大的计算机,编程也成了同样巨大的问题。从这个意义上说,电子工业并没有解决任何问题,它只是制造了这些问题,它制造了使用其产品的问题,换言之:随着可用机器的功率增长了一千倍以上,社会对应用这些机器的野心也在增加,而正是这位可怜的程序员在这个极端和手段之间紧张的爆炸性领域找到了工作。硬件功率的增加,加上可靠性的可能更大的提高,使得解决方案成为可能,这是程序员几年前不敢想象的。几年后的现在,他不得不梦想着他们,更糟糕的是,他不得不将这些梦想变成现实!我们发现自己陷入了软件危机,这是一个奇迹吗?不,当然不是,正如你可能猜到的,这甚至是提前预测的;但是预言家的问题在于,五年后才真正知道他们是对的。

然后,在60年代中期发生了一些可怕的事情:所谓的第三代计算机出现了。官方文献告诉我们,它们的性价比是主要设计目标之一。但是,如果将机器的各种部件的工作周期视为“性能”,那么最终的设计将是通过内部内务活动实现性能目标的主要部分,而这些活动的必要性令人怀疑。如果对价格的定义是要为硬件支付的价格,那么几乎不会阻止最终得到一个非常难以编程的设计:例如,订单代码可能会强制执行,无论是对程序员还是对系统,早期的约束性决定都会带来真正无法重新解决的冲突。在很大程度上,这些不愉快的可能性似乎已经成为现实。

当这些机器被宣布,它们的功能特性被人们所知时,我们中的许多人一定变得非常痛苦;至少我是这样认为的,这样的机器将充斥计算机社区是合理的,因此,更重要的是,它们的设计应该尽可能合理。但这一设计体现了如此严重的缺陷,以至于我觉得计算机科学的进步一下子就被推迟了至少十年;就在那时,我度过了职业生涯中最黑暗的一周。也许现在最令人痛心的是,即使经历了这么多年的挫折,仍然有那么多人不自觉地遵守了自然法则,告诉我们机器必须这样做。他们通过观察这些机器已经售出了多少台,来平息他们的疑虑,并从中得出一种错误的安全感,毕竟设计不可能那么糟糕。但仔细观察,这一防线与吸烟必须健康的论点具有同样的说服力,因为吸烟的人太多了,

正是在这方面,我感到遗憾的是,计算机领域的科学期刊通常不会以与我们审查科学出版物大致相同的方式发布新发布的计算机的评论:审查机器至少同样重要,在这里,我要坦白一点:在60年代初,我写了这样一篇评论,打算将其提交给《Communications》,但尽管为数不多的同事要求我这样做,但我不敢这样做,因为我担心无论是对自己还是对编辑委员会来说,困难都会太大。这种压制对我来说是一种懦夫行为,我越来越自责。我预见到的困难是缺乏普遍接受的标准的结果,尽管我确信我选择的标准是有效的,但我担心我的审查会被拒绝或被认为是“个人品味的问题”。“我仍然认为这样的评论。这将是非常有用的,我渴望看到它们的出现,因为它们被接受的外观将是计算机社区成熟的肯定标志。

我之所以关注硬件场景,是因为我觉得任何计算工具最重要的一个方面都是它对那些试图使用它的人的思维习惯的影响,而且我有理由相信这种影响比人们普遍认为的要强大很多倍。现在让我们将注意力转移到软件场景。

这里的多样性如此之大,以至于我必须把自己局限在几个垫脚石上。我痛苦地意识到我的选择是武断的,我请求你不要对我赞赏的许多努力作出任何结论,这些努力将不得不保持不提。

一开始在英国剑桥有一个EDSAC,我认为很令人印象深刻的是,从一开始,子程序库的概念就在机器的设计和使用方式中发挥了核心作用。现在已经过去了将近25年,计算场景发生了巨大的变化,但基本软件的概念仍然存在,封闭子程序的概念仍然是程序设计中的关键概念之一。我们应该承认封闭子程序是最伟大的软件发明之一;它已经延续了三代计算机,而且还会延续几代,因为它满足了我们的一种基本抽象模式的实现。令人遗憾的是,在第三代计算机的设计中,它的重要性被低估了,其中算术单元的大量显式命名寄存器意味着子程序机制的大量开销,但即使这样也没有扼杀子程序的概念,我们只能祈祷变异不会被证明是遗传的。

我想提到的软件领域的第二大发展是FORTRAN的诞生。当时,这是一个非常冒失的项目,对此负责的人值得我们高度赞赏。如果将其缺点归咎于他们,而这些缺点在十年左右的广泛使用之后才变得明显,那将是绝对不公平的:拥有十年前成功展望的群体非常罕见!现在回想起来,我们必须将FORTRAN评为一种成功的编码技术,但由于对概念的有效帮助非常少,现在迫切需要的帮助已经过时了。我们越早忘记FORTRAN曾经提供过帮助,就越好,因为它作为一种思想工具已经不足够了:它“浪费了我们的脑力,风险太大,因此对USC来说太昂贵了。”。FORTRAN的悲惨命运是它被广泛接受,在思想上把成千上万的程序员与我们过去的错误联系在一起。我每天都在祈祷,希望更多的程序员同事能够找到方法,让自己从兼容性的魔咒中解脱出来。

第三个项目是Lisp,这是一个性质完全不同的迷人企业。在其创立之初就有了一些非常基本的原则,它显示出了非凡的稳定性。除此之外,在某种意义上,Lisp已经成为我们最复杂的计算机应用程序的载体,Lisp被戏称为“滥用计算机的最智能方式”。“我认为这是一个伟大的赞美,因为它传递了解放的全部味道:它帮助了我们许多最有天赋的同胞思考以前不可能的想法。

第四个要实施的项目是ALGOL 60。尽管到目前为止,FORTRAN程序员仍然倾向于从他们正在使用的具体实现方面理解他们的程序设计语言,因此八进制或十六进制转储的盛行——而LISP的定义仍然是语言含义和机制工作方式的奇怪混合,著名的《算法语言ALGOL 60报告》是一项真正的努力的成果,它将抽象化推进了一个重要的步骤,并以独立于实现的方式定义了编程语言。有人可能会说,在这方面,它的作者是成功的,他们对它是否能够实现产生了严重的怀疑!该报告光荣地展示了BNF(现在被称为Backus-Naur-Form)的正式方法的威力,以及精心措辞的英语的威力,至少在一些像Peter Naur这样才华横溢的人使用时是如此。我认为可以公平地说,只有极少数如此简短的文件对计算社区产生了同样深远的影响。近年来,ALGOL和ALGOL-ike这两个名字被用作一个不受保护的商标,为一些有时几乎不相关的年轻项目带来荣耀,这是对ALGOL地位的一种令人震惊的赞扬。BNF作为一种定义工具的优势是我认为该语言的弱点之一的原因:过于复杂且不太系统的语法现在可能被塞进很少的页面中。有了像BNF这样强大的设备,算法语言ALGOL 60的报告应该更短。除此之外,我对ALGOL 60的参数机制非常怀疑:它允许程序员如此多的组合自由,以至于它的自信使用需要程序员严格的纪律。除了实施成本昂贵之外,使用起来似乎也很危险。

最后,虽然这个主题很热门,但我必须提到PL/I,这是一种编程语言,其定义文档的大小和复杂性都令人恐惧。使用PL/I必须像驾驶一架有7000个按钮、开关和手柄的飞机,以便在驾驶舱中操纵。我绝对看不到,当编程语言以其更为强大的力量成为我们的基本工具时,我们如何才能将不断增长的程序牢牢地控制在我们的智力控制之下,请注意-已经摆脱了我们的智力控制。如果我必须描述PL/I对其使用者的影响,我脑海中最接近的隐喻就是药物。我记得在一次关于高级编程语言的研讨会上,一位自称是PL/I忠实用户的人为PL/I辩护。但在一个小时的演讲中赞扬了PL/I,他设法要求增加大约50个新的“特征”,几乎没有想到他的问题的主要来源很可能是它已经包含了太多的“特征。演讲者表现出了上瘾的所有令人沮丧的症状,因为他已经到了精神停滞的状态,他只能要求更多、更多、更多......当FORTRAN被称为“婴儿期障碍”时,完全pL/I,其生长特征是一种恶性肿瘤,可能会成为一种致命的疾病。

过去的事就这么多了。但是,除非我们能够从中吸取教训,否则犯错误是没有意义的。事实上,我认为,我们已经学到了很多东西,在几年内,编程可能会成为一种与迄今为止截然不同的活动,如此不同,以至于我们最好做好应对冲击的准备。让我为你描绘一个可能的未来。乍一看,也许在不久的将来,这种编程愿景可能会让你觉得非常奇妙。因此,我还要补充一些考虑因素,这些考虑因素可能会导致人们得出这样的结论,即这一愿景可能是一种非常现实的可能性。

我们的愿景是,早在七年计划完成之前,我们就能够设计和实现这样一种系统,这种系统现在正在使我们的编程能力捉襟见肘,而其代价仅为我们现在花费的百分之几,而且除此之外,这些系统将几乎没有bug。这两项改进是相辅相成的。在后一方面,软件似乎与许多其他产品不同,通常质量越高,价格越高。那些想要真正可靠的软件的人会发现,他们必须找到避免大多数bug的方法,因此编程过程将变得更便宜。如果你想要更有效的程序员,你会发现他们不应该浪费时间调试,他们不应该引入bug。换句话说,两个目标都指向相同的变化。

在如此短的时间内发生如此巨大的变化将是一场革命,对于所有把对未来的期望建立在对最近的过去进行顺利推断的人来说——迎合社会和文化惯性的一些不成文的规律——这种巨大的变化发生的机会必须看起来可以忽略不计。但我们都知道,有时革命确实会发生!这次机会有多大?

关于对提高软件可靠性的需求的认识,我希望不会再有异议。仅仅几年前,这是不同的:谈论软件危机是亵渎。转折点是1968年10月在Garmisch召开的软件工程会议,该会议在第一次公开承认软件危机时引起了轰动。到目前为止,人们普遍认识到,任何大型复杂系统的设计都将是一项非常困难的工作,每当人们遇到负责此类工作的人时,就会发现他们非常关注可靠性问题,这是正确的。简而言之,我们的第一个条件似乎得到了满足。

现在是为了经济需要。如今,人们经常会遇到这样的观点:在60年代,编程一直是一个收入过高的职业,未来几年,程序员的工资可能会下降。通常,这种观点是与经济衰退有关的,但这可能是一种不同的、相当健康的症状,即过去十年的程序员可能没有做好他们应该做的工作。社会对程序员及其产品的表现越来越不满。但还有另一个更重要的因素。在目前的情况下,对于特定的系统来说,社会或多或少接受这一点,但硬件制造商。告诉我们,在未来十年,硬件价格预计将下降十倍。如果软件开发继续像现在一样笨拙和昂贵,事情就会完全失去平衡。你不能指望社会接受这一点,因此我们必须学会更有效地规划一个数量级。换一种说法:只要机器是预算中最大的项目,编程专业就可以摆脱其笨拙的技术;但那把伞会很快折叠。简而言之,我们的第二个条件似乎也得到了满足。

现在是第三个条件:技术上可行吗?我想可能是这样,我将给你六个论据来支持这一观点。

一项对程序结构的研究表明,即使是用于相同任务和相同数学内容的替代程序,其智能可管理性也可能存在巨大差异。已经发现了一些规则,违反这些规则将严重损害或完全破坏程序的智能可管理。这些规则有两种,第一种规则很容易被机械地强加,即通过适当选择的编程语言。例如,排除goto语句和具有多个输出参数的过程。对于第二类语句,我至少是这样做的,但这可能是由于我的能力不足——看不出有什么办法机械地强加它们,因为它似乎需要某种自动定理证明器,而我对此没有存在证明。因此,就目前而言,也许是永远,第二类规则本身就是程序员所要求的纪律要素。我心目中的一些规则是如此清晰,以至于可以教授,并且不需要争论给定的程序是否违反了这些规则。例如,要求在不提供终止证明,或不说明其不变性不会因执行可重复语句而被破坏的关系的情况下,不应记录任何循环。

我现在建议我们将自己局限于设计和实施智力可控的程序。如果有人担心这种限制如此严重,以至于我们无法忍受,我可以向他保证:智能可管理程序的种类仍然足够丰富,可以包含许多非常现实的程序来解决任何能够用算法解决的问题,我们决不能忘记这不是我们的事。制作节目;我们的业务是设计能够显示所需行为的计算类。将自己局限于智力可控的项目的建议是我宣布的六个论点中的前两个的基础。

论点一是,由于程序员只需要考虑智力上可管理的程序,他所选择的替代方案要容易得多。

论点二是,一旦我们决定将自己限制在智力可控的程序子集上,我们已经一劳永逸地减少了需要考虑的解决方案的空间。而这一论点与论点一不同。

论证三基于对程序正确性问题的建设性方法。今天,一种常见的技术是制作一个程序,然后测试它。但是:程序测试可以是一种非常有效的方式来显示bug的存在,但它不足以显示bug的缺失。要显著提高程序的置信水平,唯一有效的方法是对其正确性提供令人信服的证明,但不应先制作程序,然后再证明其正确性,因为这样一来,提供证明的要求只会增加糟糕的程序员的负担。相反地程序员应该让正确性证明和程序一起成长。论证三基本上基于以下观察。如果一个人首先问自己一个令人信服的证明的结构是什么,并且发现了这一点,然后构建一个满足这个证明要求的程序,那么这些正确性问题就变成了一个非常有效的启发式指导。根据定义,这种方法只适用于我们局限于智力可控的程序,但它为我们在其中找到一个令人满意的解决方案提供了有效手段。

第四个论点与设计一个程序所需的智力努力取决于程序长度的方式有关。有人认为,有某种自然规律告诉我们,所需的智力努力随着程序长度的平方而增长。但谢天谢地,没有人能够证明这一定律。这是因为这不一定是真的。我们都知道,一个非常有限的推理能够涵盖无数案例的唯一心理工具叫做“抽象”;因此,有效利用他的抽象能力必须被视为一个称职的程序员最重要的活动之一。在这方面,也许值得指出的是,抽象的目的不是模糊,而是创建一个新的语义层次,在这个层次上可以绝对精确。当然,我已经试图找到一个根本原因来阻止我们的抽象机制变得足够有效。但无论我怎么努力,我都没有找到这样的原因。因此,我倾向于迄今为止没有被经验证明的假设,即通过适当运用我们的抽象能力,构思或理解程序所需的智力努力不必与程序长度成比例地增长。这些调查的副产品可能具有更大的实际意义,事实上,这是我第四个论点的基础。副产品是识别了许多抽象模式,这些模式在编写程序的整个过程中起着至关重要的作用。关于这些扭曲模式的知识已经足够多了,你可以针对每一种模式进行一次演讲。当我意识到,如果这些抽象模式在15年前就已经成为常识,那么从BNF到语法定向编译器的步骤可能需要几分钟而不是几年,我对这些抽象模式的熟悉和有意识的了解意味着什么。因此,我将我们最近对重要抽象模式的了解作为第四个论点。

现在是第五个论点。这与我们试图使用的工具对我们自己思维习惯的影响有关。我观察到一种文化传统,它很可能起源于文艺复兴时期,忽视这种影响,将人类的思想视为其人工制品的最高和自主主人。但是,如果我开始分析我自己和我的人类同胞的思维习惯,无论我是否喜欢,我都会得出一个完全不同的结论,即我们试图使用的工具以及我们用来表达或记录我们思想的语言或符号是决定我们能够思考或表达什么的主要因素!分析编程语言对用户思维习惯的影响,认识到到目前为止,脑力是我们最稀缺的资源,这些都为我们提供了一套新的标准来比较各种编程语言的相对优势。这位电脑程序员充分意识到自己头骨的大小是严格限制的;因此,他非常谦逊地完成编程任务,并且在其他事情中,他避免了诸如瘟疫之类的巧妙技巧。就一种著名的对话式编程语言而言,我从各个方面都被告知,一旦编程社区为其配备了终端,出现了一种特定的现象,甚至有一个众所周知的名字:它被称为“单线”。它采用两种不同的形式之一:一个程序员将一个单行程序放在另一个程序员的桌子上,要么他自豪地告诉它做什么,然后加上一个问题,“你能用更少的符号来编码吗?”-就好像这与概念相关一样-或者他只是说,“猜猜它做了什么!”从这一观察中,我们必须得出结论,这种语言作为一种工具,是一种对聪明技巧的公开邀请;虽然这可能正是它的一些吸引力的原因,即对于那些喜欢展示自己有多聪明的人来说,我很抱歉,但我必须把这看作是编程语言最糟糕的事情之一。我们应该从最近的过去中学到的另一个教训是,开发“更丰富”或“更强大”的编程语言是一个错误,因为这些巴洛克式的怪物,这些特质的组合,无论是在机械上还是在心理上都是无法管理的。我看到了非常系统和非常温和的编程语言的巨大未来。例如,当我说“谦虚”时,我的意思是,不仅是ALGOL 60的“for子句”,甚至FORTRAN的“DO循环”也可能会被认为过于巴洛克。我曾与经验丰富的志愿者进行过一次编程实验,但出现了一些意想不到的事情。我的志愿者中没有一个人找到明显的、最优的解决方案。经过仔细分析,结果发现这有一个共同的来源:他们的竞争观念与一个相关的受控变量的概念紧密相连,以至于他们在心理上无法看到显而易见的东西。他们的解决方案效率较低,不必要地难以理解,他们花了很长时间才找到解决方案。对我来说,这是一次启示,但也令人震惊的经历。最后,在一个方面,我们希望明天的编程语言将与我们现在所习惯的语言有很大的不同:比以前更大的程度上,他们应该请我们反思我们写下的所有抽象的结构,在概念上应对我们设计的复杂性。第五个论点的基础就是我们未来工具的更充分性。

作为一句题外话,我想向那些认为编程任务的困难与我们当前工具的不足之处作斗争的人发出警告,因为他们可能会得出结论,一旦我们的工具变得更加充分,编程就不再是问题。编程仍将非常困难,因为一旦我们摆脱了环境上的麻烦,我们就会发现自己可以自由地解决目前远远超出我们编程能力的问题。

可以反驳我的第六个论点,因为收集实验证据来支持它并不容易,这一事实不会阻止我相信它的有效性。到目前为止,我还没有提到“层次结构”这个词,但我认为可以公平地说,这是所有系统的一个关键概念,体现了一个精心设计的解决方案。我甚至可以再往前走一步,用它来写一篇信念文章,即我们真正能够以令人满意的方式解决的问题,只有那些最终承认了一个很好的解决方案的问题。乍一看,这种对人类局限性的看法可能会让你对我们的困境感到相当沮丧,但我不这么认为。相反,学会适应我们的局限性的最好方法是了解它们。当我们足够谦虚,只尝试分解的解决方案时,因为其他努力逃脱了我们的智力控制,我们将尽最大努力避免所有这些界面损害我们以有益的方式分解系统的能力。T不能不期待,这将反复导致人们发现,一个最初无法检测到的问题最终会被分解。任何人如果看到了如何将被称为“代码生成”的编译阶段的大部分问题追溯到订单代码的有趣属性,就会知道我心目中的一个简单例子。精心设计的解决方案更广泛的适用性是我第六个也是最后一个论点,这是在当前十年内可能发生的革命的技术可行性。

原则上,我让你自己决定你会给我的想法多大的权重,因为我非常清楚,我不能强迫其他人分享我的信仰。正如在每一次严重的革命中,它都会引发激烈的反对,人们可以问自己,在哪里可以期待保守势力试图抵制这种发展,我不认为那主要是在大企业,甚至在计算机行业;我更希望他们在提供今天培训的教育机构,以及那些认为自己的旧程序如此重要以至于不值得重写和改进的保守计算机用户群体中。在这方面,令人遗憾的是,在许多大学校园中,中央计算设施的选择往往是由少数已建立但昂贵的应用程序的需求决定的,而忽略了这些问题,有多少愿意编写自己程序的“小用户”将遭受这种选择的痛苦,例如,高能物理学似乎以其维护实验设备的价格勒索了科学界。当然,最简单的答案是对技术可行性的断然否认,但我恐怕你需要非常有力的论据来证明这一点。唉,从今天的普通程序员的智力智能将阻止革命的发生这一言论中,我们无法得出任何理由:其他人的编程效率如此之高,无论如何,他都有可能被排除在外。

也可能有政治方面的影响。即使我们知道如何培养未来的职业程序员,也不能肯定我们生活的社会是否会允许我们这样做。传授方法论而不是传播知识的第一个效果是提高已有能力者的能力,从而扩大智力差异。在一个教育系统被用作建立同质化文化的工具的社会中,精英阶层无法上升到顶层,对有能力的程序员的教育在政治上可能是不令人满意的。

让我总结一下。自动计算机已经陪伴我们四分之一个世纪了。他们以其工具的能力对我们的社会产生了巨大的影响,但在这种能力下,他们的影响将只是我们文化表面上的一个涟漪,相比之下,他们将以其智力挑战的能力产生更深远的影响,这在人类文化史上是没有先例的。分层系统似乎具有这样的性质,即在一个层次上被认为是不可分割的实体的东西,在下一个更详细的较低层次上被视为复合对象;因此,当我们将注意力从一个层次转移到下一个层次时,适用于每个层次的自然空间或时间颗粒会减少一个数量级,因此,在分级系统中可以有意义地区分的级别的数量与最大和最小粒度之间的比率的对数成正比,因此,除非这个比率非常大,否则我们不能期望有很多级别。在计算机编程中,我们的基本构建块具有小于一微秒的相关时间粒度,但我们的程序可能需要数小时的计算时间。

我不知道有任何其他技术可以覆盖I/O“或者更多:计算机凭借其惊人的速度,似乎是第一个为我们提供一个高度分层的人工制品既可能又必要的环境。这一挑战,即与程序设计任务的对抗,是如此独特,这种新颖的体验可以教我们很多关于自己的知识。它应该加深我们对设计过程的理解。”设计和创作;它应该让我们更好地控制组织思想的任务。如果它没有做到这一点,按照我的口味,我们根本不配拥有电脑!

它已经给了我们一些教训,而我在本次演讲中选择强调的是以下内容。如果我们充分认识到这项任务的巨大困难,如果我们坚持使用温和优雅的编程语言,我们将做得更好,只要我们尊重人类思维的内在局限性,并以非常谦逊的程序员的身份来完成任务。


---煤油灯科技victorlamp.com翻译整理---

完整附件下载:The humble programmer.pdf

你可能也喜欢这些文章

科技互联网,科技,资讯,动态,洞察,量子,计算,AI,人工智能,机器人,区块链,Web3,分布式,操作系统,OS,芯片,视频,深度,论文