我们并不特别

2021-01-21 06:04:15

没有人考虑过在施工过程中移动桥梁的起点或终点。 -贾斯汀·凯夫(Justin Cave)

卡尔曾担任机械验证工程师:他对石油钻机进行了测试,以查看它们的振动程度。人类在石油钻塔上工作和生活很长一段时间,如果它们振动太大,就无法入睡。尽管钻机的设计要保持在阈值以下,但设计和最终版本通常会有所不同。

目前,他正在解释他们如何找到石油。他说,在钻完一个孔之后,“您可能还想添加其他添加剂,例如酸或榛子壳,但还要-”

他笑了。 “您的储油罐不像是一个充满油的气球。它更像是岩石中的多孔结构。”钻进时,您可能会突然遇到管道压力损失。这是非常危险的,因为您不知道自己是闯入大海还是刚撞到局部空隙。在后一种情况下,进一步挖掘并突然撞击高压区域可能会损坏管道。通过泵入榛子壳,它们可以逐渐填充小的空隙并测试它们是否仍在结构中,并逐渐平衡压力。

关于传统工程与软件工程的争论围绕着使我们与众不同的原因。这里的陈词滥调与“什么造就了工程师”陈词滥调来自不同的阵营。人们尝试定义“工程”的方式通常会使软件边缘化。诸如“我们没有许可证”或“我们不严格”之类的区别是说软件比传统工程学没有那么负盛名,也没有“好”。正如我们在上一篇文章中看到的那样,其中大多数并没有解决,跨界工程师认为这两项工作本质上比只完成一项工作的人要亲密得多。

相比之下,当人们谈论基本差异时,他们通常不打算使软件开发合法化。相反,隐含的重点是使软件“特殊”。使软件成为工程学无法理解的东西。

我认为这是一种防御机制。如果软件与传统有很大不同,那么我们可以“不做工程师”。我们可以肯定地说,我们并没有计划,但这是因为软件需求的变化比其他任何地方都快得多。我们不应用工程技术,因为我们不应该应用工程技术。一个很好的例子是NoEstimates运动:由于估计难以在软件中进行,这与传统的工程学不同,因此我们应该完全取消它们。

这只有一个问题:作为软件工程师,我们深刻误解了传统工程的本质。我们并不特别。我们认为与软件有关的几乎所有事物都出现在工程的其他各个领域。这样做的好处是,我们并不特殊。我们认为几乎所有关于软件的事情都是其他人都在苦苦挣扎的事情。

将“传统”(涵盖不同的工程学科)与软件进行比较存在一个谬论。有关工程的大多数论点并没有超出“软件与工程”范围,也没有将“工程”与土木工程混为一谈。所有子字段都是不同的,一个子字段的质量不能反映其他子字段的质量。经过几次采访后,我解决了一系列“普遍性”差异,以讨论:

传统工程最好以瀑布样式完成,而软件最好以敏捷样式完成。

工程主要与制造有关,而代码主要与设计有关,因为“代码就是设计”。

这些并非全都错了。稍后我们将看到,软件和交易之间绝对存在一些差异。但是大多数差异是“错误的”,或者至少缺乏关键的细微差别。

如果我们认为只有一件事是软件,那就是敏捷。

众所周知,敏捷是对“瀑布”(Waterfall)的拒绝,它是1970年温斯顿·罗伊斯(Winston Royce)的老范例。罗伊斯想出了瀑布模型来模仿“真正的”工程师如何建造建筑物。 Waterfall表示您应该严格执行所有操作,只有在当前阶段完成后才进入下一个开发阶段。您只能在完成设计后进行开发,仅在完成开发后进行测试,等等。这适用于“实际”工程,但对于软件来说完全是失败的,因为需求会发生变化,并且客户在构建之前通常都不知道他们想要什么。因此,这在2001年的《敏捷宣言》中遭到拒绝,从此以后每个人都过着幸福的生活。

当然,这个故事比事实更虚构。虽然Waterfall在一段时间以来一直是主导模型,但它从来没有像我们今天想象的那么严格。也不是无所不在:70年代和80年代的大多数开发人员要么是临时计划,要么是使用许多时尚的“增量”模型之一,例如Spiral Model和V Model 。敏捷并不是根本性的转变,而不仅仅是当时趋势的自然结果。

但是,所有与核心主张相切的东西是:软件工程是敏捷,而传统工程是瀑布。毫不奇怪,这是一个过分的简化。

的确,与软件工程师相比,传统工程师要进行更多的前期设计,并在专用测试上花费更多的时间。但这并不意味着它们具有瀑布级的刚性,也不意味着我们的敏捷与他们格格不入。相反,分阶段花费大量时间是经济模型的自然结果。当迭代时间更长且成本更高时,花更多的时间进行规划就更有意义。但是人们以不同的方式使用“设计”和“实现”。土木工程师进行比例建模时,是设计还是实施?当汽车工程师为汽车制作完整的粘土复制品以测试其美观性和空气动力学性能时,该设计或实现是吗?

当涉及到制作电路板之类的事情时,第一次不工作很普遍。您必须再次执行此操作,并且必须将其发送到工厂并再次执行。您知道它要另外花1000英镑,另外还要花两周时间。 -迈克(机械)

我们在每个行业都看到类似敏捷的创新。如今,许多隧道都是通过“奥地利隧道”建造的,这取决于迭代开发和大量的即兴创作空间。 《工业工程手册》强调交叉合作和快速的客户反馈。一旦开始施工,即使是最瀑布形式的工程,即土木工程,也逐渐过渡到更像敏捷的过程。人们需要开放的沟通和适应能力,以解决建筑中的地面问题。

为什么我们认为软件需要敏捷而不是瀑布?不可预测性。仅当我们可以准确地预测和估计项目中固有的障碍时,瀑布模型才有意义。由于软件是不可预测的,因此争论不休,我们无法使用Waterfall。可能是计划的一半,我们决定需要重新开始。对工程师有什么不同吗?他们的工作比我们的工作更可预测,更确定吗?

这种误解的部分原因是我们看到了工程过程的结果,而不是过程本身。我们看不到任何摩擦,超支,由于有人在左侧左一英寸处建造隔离墙或重要供应商停业而导致的延误。假定软件具有独特的不可预测性是一种特殊的傲慢。

另一部分来自软件变化的速度。好像每两年或每两年都有一个新的主导性框架或语言可供大家尝试使用。我们希望传统的工程技术不会持续不断地在工具和范例方面流失。在一定程度上,它不是。但是,减少客户流失与避免客户流失并不相同,并且还有许多其他方式可以使事情变得不可预测。一位芯片设计师史蒂夫(Steve)发现这一点特别有趣:

在软件世界中,人们正在思考“本月新的JavaScript捆绑器是什么?”在硬件世界中,“本月硅晶圆厂的人能为我们做些什么。”如果铸造厂拥有制造芯片的新设备。 ,您的计划就会改变。速度不如库快,但仍然非常快。 -史蒂夫(电)

轶事太多了,无法一一列举。领土声称在施工过程中发生了变化,程序突然变硬并永久失效,新发现不断涌入开发中。有人谈论在桥基上开始工作是多么令人沮丧,却发现这种特殊的土壤以一种怪异的方式冻结,使它在地震中液化过多。回到绘图板。

[代码就是设计]对那些认为“哦,如果我们只是在UML中构建漂亮的模型,然后从UML中自动生成所有代码,那么一切都会很好。”

来自尼克·科格兰(Nick Coghlan)。他伸手去采访时,我感到很惊讶。我知道他是CPython的核心开发人员。在此之前,他曾是波音公司的系统集成工程师。他称其为“系统体系结构的外交风格”。波音公司将有多个独立的系统-在他的例子中,飞机,空中交通管制和天线阵列。他必须与所有三个团队合作,以确保他们构建了兼容的界面。集成工作,本质上。他认为“软件就是设计”是他以前的工作与现在的工作之间的根本区别。

其他人不太确定。一个人说:“从我的角度来看,这全是设计,从最初的CPU示意图到铸造厂推出的最终芯片。就像软件一样,他们所有的时间都花在了设计上。施工是最简单的部分:只需将设计移交给铸造厂,然后取回完成的芯片。

当然,这些芯片将返回有缺陷的缺陷,这意味着设计将发生变化。设计和构造并没有我们软件工程师所认为的那么分散。许多机械工程师对此深有感触。构造的产品可能在设计中显示问题,或者在构造情况下可能显示问题。机械工程师迈克(Mike)称其为“点胶”。调整设计以应对施工过程中的轻微缺陷。每种构造都会更改设计,从而改变构造。

除此之外,还有另一个问题:“设计”的定义不明确。我们在谈论架构概述吗?正式规格?详细的设计图?如果代码是设计,那么我们代码的正式规范是什么?对于复杂的项目,存在许多不同种类的设计,并且具有不同的详细程度。如果查看桥梁平面图,您会发现分形细节层很多。

我认为这是另一种情况,在不同类型的工程之间,我们的设计和构造含义实际上有所不同。是的,在土木工程中,建设阶段花费大量时间和金钱,但这就是土木工程。而且,只有某些类型的土木工程也可以使用“桥梁和建筑物”。我们基于刻板印象的同类工作。

我发现自己必须解释一下,土木工程的许多方面您不会特别考虑。 […]我告诉别人,它指的是建造这座城市所需的一切。 -仁(民事)

与传统工程技术相比,软件中的制衡能力要高出1万亿倍。 […]每当有人发推文时,例如Excel恐怖故事*(笑声)*我都会惊叹于Excel恐怖故事[…]有时候,我感到震惊的是,摩天大楼没有倒塌,飞机也没有坠毁。 -垫

人们说,交易工程比软件更为严格。传统工程师从第一原则出发要谨慎地推理,而不是复制粘贴。这通常表示为软件问题,我们需要对其进行更改才能成为“实际”工程。这也是错误的。

首先,我们所拥有的不那么严格并不完全是文化上的,因为软件的本质使它成为可行的折衷方案。尼克将其解释为“验证假设”的不同之处:“您可以通过最简单的方法来检查您的假设是否正确,即进入并执行此操作。”软件使我们可以更轻松地收集经验信息,这本身就是一种严格的要求。

但是有关严谨性的陈述是基于软件的最终结果有所不同而得出的,即,交易产品更加连贯,更少打扰。这不是真的。例如,我们保留更好的记录并使用更全面的验证。我听到了很多可怕的故事,这些故事中的关键信息存储在Excel工作表和旧的文件柜中,变得过时和腐败。要获得与我们给定的相同的自动化测试,大量的测试将会失败。

软件是完全合成的。它完全受逻辑限制。它不会像春天一样磨损,对吗?它确实可以完成预期的工作。唯一可能真正出错的是规格。该软件很差。 -内森

软件比任何其他类型的工程都更加一致。我们通常认为软件是一团糟,相互依存且硬件不兼容,但实际上我们感觉还不错。如果我给您排序功能,您可以期待它进行排序。您不希望它仅在95%的时间内对给定的(非病理性)数字列表进行排序。那太荒谬了。

相比之下,让我们看一下物理材料。在电气工程中,核心组件是电阻器:减少电流流动的导线。电阻的测量单位为欧姆,现成的商用电阻的范围可以从一个欧姆到数亿欧姆。许多商品电阻器遵循颜色图表,以轻松识别电阻:

因此,绿色,蓝色,红色的频段将具有5600欧姆。但是,请注意最后一个频段:指定公差。颜色代码仅描述了理论电阻:如果公差带为金色,则意味着电阻可以相差5%。如果您有一批此类电阻,其中有100个,一些电阻为5320欧姆,一些电阻为5880欧姆,唯一的知道哪种方法就是分别测试每个电阻。而且,这与磨损或电阻随温度的变化等无关。

所有物理材料都是如此。在我开始这个项目之前,我最喜欢的互联网发现之一就是Fastenal实验室页面。紧固件制造螺丝。他们的其中一页警告不要在铝板上使用不锈钢螺钉。

该代码是有关硬件应如何运行的规范。在传统工程中,我们必须做所有相同的工作来共享规格,但是随后我们必须等待,例如让晶圆厂或机械车间完成该死的事情。然后我们必须坐在那里自己安装或雇用某个人。然后,我们必须对其进行几周的测试,以查看其是否有效。 -马特(化学)

这是无可辩驳的。我们可以比任何人都可以更快地更改软件。几位工程师告诉我,变更的价格是可量化的:每次您需要进行调整时,您都知道自己从预算中拿走了5000美元。而我可以更改一些代码并在几秒钟内运行所有测试。

在其他任何领域,我发现最接近的是化学工程。 “我早上去看看昨晚出了什么问题,”前化学工程师拉贾(Raja)说。一分钟的周转率是闻所未闻的,这已经是最快的非软件工程领域。

这就是我们材料的本质。这也是为什么其他工程领域通过创建这些设计工具和仿真来逐步使用更多软件的原因,工程师可以在实现它们之前用软件对他们的想法进行原型制作。

这也有一个黑暗的一面。由于软件的迭代速度比trad更快,因此trad通常依靠软件来补偿物理设备中的问题。

其余的团队都在挤压软件工程师。通常要求他们保存所有人的培根。如果在电子学或机械学方面工作不正常,通常可以使用软件库解决它。 -麦克风

有时这种依赖会带来灾难性的后果。 2019年,两起737 MAX飞机失事导致300多人死亡。调查将其归因于“飞行特性增强系统”(MCAS)中的一个错误,该系统是自动飞行控制系统之一。但是,波音公司仅是首先添加了MCAS,以弥补飞机的空气动力学特性在后来发现的问题。波音公司没有解决传统技术的传统问题,而是选择了软件组合,然后人们丧命。

他们有一个[筹码]时间预算,你有一个时间预算,你说'我做不到。你那里有一点儿水吗?我能得到几分之一秒的时间吗?’-史蒂夫(Steve)

在所有采访中,一个隐性的暗流是约束的概念。他们的产品需要遵守严格的物理限制。它必须足够轻,足够坚固,足够耐力或足够凉爽。他们必须最大化或最小化已知数量。

约束也存在于软件中。代码必须适合嵌入式硬件设备的内存,传感器需要准确地在10个周期内做出响应,API必须保持在速率限制之下。但是软件中的约束往往是软约束。越过它们是不好的,我们越越越过越糟。如果这样做会给我们带来其他好处,我们可以稍加改动,例如更快的开发时间或更简单的算法。在传统工程中,大多数约束是硬约束。如果您的盒子区域太宽,那么它将不适合放入门中。

有时这会导致异常的解决方案。一次,卡尔的团队不得不在抽油装置中安装螺旋输送机,然后发现它对于房间来说只有几英寸高。他们无法收缩设备,也无法升高天花板,因为天花板上方还有另外四层。团队的解决方案?在天花板上切一个洞,将设备放进去,然后在下一层的洞周围放一个盒子,以便没人绊倒。现在,更改已永久成为钻机结构的一部分,以后的每一次更改都必须永久保留这些内容。这就带来了另一个差异:软件工程师可以消除他们的烦恼。传统工程师不能。

尽管我们有很多不同的方式,但“与众不同”与“特殊”之间会有区别。是的,机械工程师和化学工程师不必像我们一样处理安全问题。他们也不必以土木工程师所需要的程度来处理天气模式,这三者中的任何一个都不需要处理化学工程中固有的问题。每个工程领域都有独特的挑战,软件也不例外。

但是它们之间的相似性远大于差异。每个领域都重视前瞻性,抽象的思维,整洁的工作以及在正确的位置进行的良好尝试。每个领域都面临着变化的要求和未知的未知数。每个领域都与其他领域隔离开来:与化学工程师一样,我们对机械工程师的工作知之甚少。在我的访谈中,很多次人们问工程的其他领域是什么样的。没有人有机会离开他们的泡沫。

没什么特别的软件是一件好事。这意味着我们可以从其他领域中学到很多有关如何使软件更好的知识。这意味着他们需要向我们学习很多东西。因为令人惊讶的是,在某些方面我们比传统工程师更擅长工程。下次,我们将介绍我们可以学习和可以教到的东西。

第三部分,《工程学可以教给我们(和向我们学习)》,将发布在Frida上

......