我在本系列中的许多示例都依赖于精益软件的概念,即将决策推迟到最后一个负责任的时刻 。 但是,您怎么知道那一刻何时到来? 您怎么知道在更好的道路出现之前您可以推动设计决策走多远? 什么样的项目从紧急设计中受益最大? 最终的Evolution Architecture和紧急设计部分将回答这些问题,然后回顾整个系列的一些要点。
首先,我从唐纳德·拉姆斯菲尔德的诗歌开始。
未知的未知数
有已知的未知数。 就是说有些事情我们现在知道我们不知道。 但也有未知的未知数。 有些事情我们不知道,我们不知道。
- 美国前国防部长唐纳德·拉姆斯菲尔德
拉姆斯菲尔德区分未知类别,从我们知道存在但尚未发现的未知开始。 但是他也承认事物的存在超出了我们的知识或经验,以至于我们甚至都不知道寻找它们:“未知的未知数”。
拉姆斯菲尔德在谈论战争的不确定性,但他本来可以谈论软件。 如果您编写了任何非同寻常的软件,则可能涉及未知的未知数问题,这是软件设计中最大的问题之一。 您认为自己对实施解决方案时会遇到的问题有深刻的了解,但是不可避免地会出现意外问题。 例如,与开源框架进行交互并不像您想的那么简单,或者一个问题比最初看起来要细微得多,需要仔细得多的思考。
意外的设计问题不断出现,因为软件的容错能力很低-远低于物理系统。 例如,考虑一下您周围的建筑物。 建造建筑物是一个多人,数月(或数年)的项目。 现在考虑在相似的时间范围内构建的多人软件项目。 这些项目的规模相似,但是物理建筑物对结构缺陷的容忍度更高。 如果电灯开关板不能完全覆盖电线容纳墙壁上的Kong,则建筑物不会倒下。 然而,软件中的小缺陷会使它崩溃。 与原子相比,位的故障容忍度是不可原谅的。 当然,软件(较软)也更容易修复:我们可以铲平漏洞(修复漏洞)并立即重新制造房屋。
如果机翼从飞机上掉下来,法医工程师将首先关注机翼在飞机上的附着位置:在物理系统中,功能误差通常很高。 但是在软件中,执行一行代码通常会引起不稳定,这种不稳定情况在成百上千个看似无关的代码行中都不会显现出来。 <