为什么编写软件不像工程

https://blog.parr.us/2014/12/29/why-writing-software-is-not-like-engineering/

谷歌翻译

这篇文章出现在redditnews.ycombinator.com上。请参阅罗马尼亚语版俄语版爱沙尼亚语版葡萄牙语(我无法证实它们都说同样的话)。

虽然我的天赋在于软件,但我的研究生学习是计算机工程(设计和构建数字计算机)。一个观察总是让我印象深刻:计算机工程似乎比计算机科学(构建软件)更简单。有一套工程设计规则需要遵循,工程项目比软件项目更有可能成功。是的,有一些引人注目的工程失败,但从经验上看,可靠和有用的软件更难实现。为了说明我的观点,请考虑我们在整个太阳系中发送的惊人的太空探测器。航天器本身工作得非常好,通常寿命超过其设计寿命。另一方面,他们的控制软件必须在飞行中不断调整和修补,以保持任务一致。我并不是说工程很容易。它不是。我的目标只是解释为什么软件比一般的物理建设项目更难做好,以及为什么“软件工程”是一个不恰当的术语。

《经济学人》杂志(2004 年 11 月 27 日,第 71 页)引用了 Standish Group 的估计:

...所有软件项目中有 30% 被取消,近一半超出预算,60% 被发起这些项目的组织视为失败,10 个中有 9 个迟到。

文章接着指出,虽然很少有大型基础设施项目能够按时并按预算完成,但最终您通常会有所收获。您必须进入软件(或军事)领域才能花费数十亿美元而一无所获。造成这种挥霍浪费的最大原因在于,虽然部分完成的有缺陷的建筑或基础设施项目仍然有用,但软件要么工作要么不工作。因为软件很难正确处理,所以我们常常一无所获(例如,FBI Dumps Botched Computer OverhaulFBI Faces New Setback in Computer Overhaul)。

为什么编写软件不像工程?答案在于一个具有深远影响的根本区别:工程受到现实的物理世界的限制,而软件则不受。虽然很明显,但这是解释为什么软件开发更难正确的关键区别。接下来的几节将探讨这些后果。

工程组件存在于现实世界中


物理工程项目更容易可视化,因此更容易构建;哎呀,您实际上可以用手触摸组件和最终产品。你越远离我们在日常生活中所经历的牛顿对物理世界的看法,这个项目就越困难。量子物理学很困难,因为粒子的行为不像岩石。弦理论是建模量子物理学的最有希望的方法,主要是难以理解,因为它处理的维度超出了通常的三个空间维度。想象一下尝试在Calabi-Yau 歧管上设计和建造房屋(右图是 3-D 投影)。

软件甚至没有维度的概念。您可能会说没有可以着色的线条。至少对于量子水平以上的工程项目,没有人期望找到“违反物理定律”的结构。这限制了您可以物理构建的内容以及构建它的方式,但至少它提供了一个定义明确的工作世界。软件的空灵世界没有这种奢侈,但我们的工具正在变得更好。发明面向对象的编程是为了让我们的狩猎采集者的大脑更熟悉编写软件;也就是说,使软件组件具有类似于现实世界中的对象的属性和行为。

工程组件以更可预测的方式交互

工程比软件的风险更小,因为工程经历的组成组件交互更少。虽然汽车结构某一部分的微小变化很容易影响另一部分的碰撞稳定性,但车顶灯的设计缺陷导致间歇性发动机熄火是不寻常的。在家庭建设项目中,每次有人按门铃时,您都必须非常努力地冲马桶。

另一方面,在构建软件时,您必须高度警惕以避免这些不良交互。许多程序员喜欢纯函数式编程的原因之一是它没有副作用——当门铃响起时,马桶根本不可能不小心冲水。

在没有固有缓冲区溢出保护的 C++ 等语言中,情况更糟。远程代码片段可以更容易地无意中改变整个应用程序的行为。事实上,大多数黑客利用的正是这个特殊的弱点。通过导致缓冲区溢出,攻击者可以强制程序在其防御中打开一个漏洞。

工程中的基本设计变更较少

软件比工程项目更难做好的最后一个原因是中途设计变更。物理世界不像软件的非实体世界那样具有延展性,因此,客户的期望值较低。国会不会在登月计划中途去 NASA 并要求他们去火星。大多数工程项目都能够实际使用瀑布设计方法:确定功能需求、设计、实施、测试。对于大多数软件项目来说,这是灾难的根源。

不幸的是,软件设计的中途变化一直在发生——每次客户看到正在运行的软件时。事实上,敏捷软件开发方法是对不断变化的设计需求的直接响应。程序员被要求将变化视为一个机会。尽管如此,设计的不断变化阻碍了开发工作,开发人员必须不断地重构软件,以防止它变成一个纠结的、无法维护的烂摊子。

您可能会问,如果软件很难做到正确,为什么飞机不会从天上掉下来。事实证明他们偶尔会这样做,而糟糕的软件通常是罪魁祸首。例如,观看空中客车 320 的电传飞行坠毁然而,大多数情况下,飞机、汽车和医疗设备的硬件控制软件都按预期工作。提高可靠性的原因有三方面。首先,有生命危险,人们可能会更加小心。其次,软件开发人员在开发过程中不被要求从根本上改变软件。例如,螺旋桨驱动的飞机不会成为处于开发过程中的喷气式飞机。工程团队会重新开始,而软件团队通常被要求在中途进行彻底的改变。最后,此类软件处理控制物理设备并开始获得物理工程项目提供的一些优势。

软件开发是一门科学吗?

那么,如果软件开发不像工程,那又是什么呢?我们称这门学科为计算机科学,但我也不确定这个术语是否完全合适。您可能还记得一个古老的笑话,“如果一门学科的标题中有‘科学’,那可能不是。” 在我看来,科学就是用科学的方法发现和描述物理现象。Merriam-Webster 将科学方法描述为:

系统地追求知识的原则和程序,涉及问题的识别和表述,通过观察和实验收集数据,以及假设的制定和检验。

这种描述更像是调试而不是编写软件的行为。计算机科学是关于构建工程之类的东西,但没有从物理世界中获取的工具箱和组件的奢侈。没有人像工程师为物理项目所做的那样,制定出可靠和有效的程序来构建大型软件。正如 Alan Kay 所说,软件是“一种工程......但只是通过蛮力完成的”。与艾伦·凯的对话

如果你从工程历史的角度来看今天的软件,它肯定是一种工程——但它是没有拱门概念的人所做的那种工程。今天的大多数软件非常像埃及金字塔,数百万块砖相互堆叠,没有结构完整性,而是通过蛮力和成千上万的奴隶完成的。

编写软件与其说是一门工程学科,不如说是一门艺术

写作软件最类似于写小说。写小说也是一种在不受约束和空灵的媒介中创作的行为,几乎没有完善的构建规则。当我们看到它时,我们就知道好的写作,但很难教。写作经验和来自更好作家(编码员)的反馈是成为一名优秀作家(编码员)最可靠的方法。如果没有一个很好理解的过程,软件将更多地是一门艺术而不是一门科学。术语“软件工程”更多的是一个目标,而不是我们实际编写软件的方式。

posted @ 2022-02-22 14:29  悠哉大斌  阅读(41)  评论(0编辑  收藏  举报