2.3 为什么架构设计如此重要
一个没有做出某些设计决策或者没有足够早地做出这些决策的项目会有非常高的成本。这会通过很多不同的方式表现出来。在早期,最初的架构是项目建议书(在咨询界也被称为售前过程)的关键。没有做一些架构上的思考和一些早期的设计工作,你就不能自信地预测项目的成本、进度和质量。即使在这个早期阶段,一个架构将确定实现架构驱动因子的关键方法,总的工作分解结构,以及实现系统所需的工具、技能和技术的选择。
此外,正如我们将在第9章讨论的,架构是敏捷开发的关键实现手段。无论你的组织是否适应了敏捷开发过程,很难想象有谁愿意选择一个脆弱、难以改变或扩展或调整的架构。然而,事情往往是这样,你只能选择这些架构。这种所谓的技术债务发生的原因各种各样,但最重要的一点是把重点放在功能上——通常是被利益相关者的要求驱动,而软件架构师和项目经理无法衡量优秀的架构实践的投资回报。功能点提供直接的利益,软件架构的改善则需要短期的成本并提供长期的利益。这样说吧,为什么有人会“投资”软件架构?答案很简单:没有软件架构,系统所带来的好处将难以实现。
简单地说,如果你不在早期做一些关键的架构决策,如果你降低架构的品质,你将无法保持冲刺的速度,因为你不能很轻松地响应变更请求。然而,我们坚决不同意敏捷宣言的原创者所声称的:“最佳的架构、需求和设计出自于自组织的团队。”事实上,对于这一点的异议也正是我们写这本书的原因。良好的软件架构设计是困难的(仍然是罕见的),它不只是“浮现”。这个观点反映了敏捷开发社区内越来越多的人的共识。我们看到的技术,如“规范化大规模敏捷开发”“可运行骨架系统”和“规模化敏捷框架”得到了越来越多的敏捷思想的领袖和从业者的好评。这些技术中的每一个都提倡在大量开发(如果有)之前做一些架构的思考和设计。重申一下,是架构促进了敏捷开发,而不是其他的方法。
此外,软件架构会影响但不是决定其他决策,这些决策本身不是设计决策。这些决策不直接影响质量属性的达成。但它们可能仍然需要由软件架构师做出决定。例如,这些决策可能包括工具的选择,构建开发环境,支持发布、部署和运维,以及安排工作分配。
最后,一个精心设计的、正确表达的软件架构是团队达成一致的关键。其中最重要的是接口和共享资源上的一致。对于基于组件的开发,早期约定接口是非常重要的。这对于分布式开发极其重要。这些决策迟早要做。如果你不早做决策,系统将变得更加难以整合。在3.6节中,我们将讨论如何把定义接口作为软件架构设计的一部分——包括与其他系统的外部接口和调节元素间相互作用的内部接口。