关于软件工程,管子扳手能教给我们什么呢?

2020-10-22 22:35:49

根据万尼瓦尔·布什的说法,管道扳手能教给我们软件工程方面的什么呢?有很多。

布什是麻省理工学院的电气工程师和教授,正如他的传记作者G·帕斯卡尔·扎卡里所说,他是自本杰明·富兰克林以来美国最有政治影响力的发明家之一。在二战期间,他代表了美国的军事研究,组织了曼哈顿计划,并在盟军的胜利中发挥了关键作用。他也是信息时代之父克劳德·香农的导师。

布什作为麻省理工学院讲师生涯中的一件趣事特别鼓舞了我:他的管子扳手演讲。

布什会向坐满了有抱负的工程师的礼堂打招呼,举起一把管子扳手,向他们挑战:描述一下这件事。

他们会一个接一个地尝试,每次布什都会仔细分析描述,指出哪里含糊不清。

通过将螺母向右或向左转动,活动颌骨可以根据需要朝向或远离固定颌骨移动。活动颌骨的内面与其柄成直角,并且还设有一系列齿,这些齿倾斜或耙向它的另一个颌骨。

给出管子扳手,说出那个扳手的字样,而不是其他的;给出字样,拿出扳手。布什教他的学生们,这是工程学的开始,索尼和古德曼在“玩耍时的头脑”中写道。

布什麻省理工学院的学生是电气工程师,但软件工程师也应该学习精确度。

当用代码表示为软件领域构建模型时,精确度是最重要的。

域表示可能模糊的一种方式是,当它允许出现不一致的状态时。如果您使用强类型系统(如SWIFT)的语言,您可以使用精确类型来使您的域建模更清晰,并使不需要的状态不可表示。

例如,在对某些数据成功或因错误而失败的操作建模时,您可以使用如下类型:

这种类型完成了工作,但为错误留下了空间:没有什么能阻止您创建一个成功为true的实例,而是创建一个data为nil的实例,或者创建一个同时包含data和error中的值的实例。

使用结果枚举,您可以在编译时消除这种模糊性,从而不可能同时设置数据和错误。

从ELM编程语言借用的另一个有用的枚举是RemoteData:一种封装网络操作状态的方法。

枚举并不是使领域建模更精确的唯一方式工具。NonEmpty使用类型约束泛型来表示非空的集合。

//整数的非空数组让xs=NonEmpty<;[Int]>;(1,2,3,4)xs.first+1//`first`是非可选的,因为它保证存在

使用NonEmpty可以使您定义的值更加清晰,使其无法通过下标访问空数组,从而可能避免运行时崩溃。

如果必须表示";一个唯一正整数集合,其中顺序很重要,并且至少有一个元素";,则可以使用[Int],或者可以在NonEmpty<;OrderedSet<;UInt>;中组合NonEmpty、OrderedSet和UInt;。

使用[Int]可能会更简单,但会为各种不一致的实例敞开大门,例如空数组、具有负值的数组或多次出现相同值的数组。NonEmpty<;OrderedSet<;UInt>;>;需要更多的工作,但使用它将使编译器帮助您避免不一致的状态。

我们喜欢称自己为软件工程师,但有时忘记了工程学是一门应用科学。它是严谨和有条不紊的。当建造桥梁、集成电路或电机时,精度很重要。如果部件不合适,如果电源供应不充足,如果没有足够的材料,事情就不会正常进行。

有了软件,我们幸运地拥有了比我们在物理领域工作的同事更具延展性的媒介。这不应该成为忘记精确价值的借口。

您最喜欢的使用类型系统实现精确领域模型的方式是什么?