03. 吸积与持续迭代
吸积与持续迭代
复杂度是递增的,并不是某些特定事物让系统复杂,而是数十或数百个小事物的积累。吸积效应,即一个事物的生成过程,就是从一个核心开始,逐步吸附新的资源,渐渐积累而形成的。这本来是天文学上的一个词,用来解释星体的形成。比如太阳是从一个核心,逐渐吸收周围的宇宙物质逐渐形成的。
从字面上我们可以理解为吸附和积累。每次加一点,每次加一点,最后就有了一大堆。这句话来描述吸积效应最好不过,出自
软件本身如此易变(Malleable

不幸的是,瀑布流开发模型很少在软件开发中有效。软件系统比其他实体系统内在(Intrinsically)复杂性更高
因为有这些问题,今天大部分软件开发项目采用了增量式开发模式
这种增量式开发模型之所以有效,是因为软件系统具有足够的可塑性(Malleable
增量式设计意味着软件设计永不结束。设计在系统的生命周期中持续发生
腐败的软件系统
大项目的陷阱是,随着时间的推移,它们会变得非常复杂,以至于重写比培养新人来理解代码然后修改要容易得多。软件是纯粹脑力劳动的结果,极度依赖软件工程师本人。因此,软件的交接就不简单是生产工具的交接,更是知识的传递。而只要有知识的传递就必然有丢失,有变形。因此一个离职频繁的团队,知识的反复交接,必然会丢失大量的细节,以致于到最后,接手的程序员对系统的理解是面目全非。
而且最严重的不仅是知识的丢失,更有责任心的丢失。如果一个模块是由某个软件工程师一手开发并维护。在感情上,他自然的倾向于爱惜羽毛,认真对待。在责任上,他也无可推卸,因为这一切都源于他。但是,在一个离职率高的团队,一个软件反复转手,后来者除了感情不深外。出了问题,也自然的会把所有的缺陷归罪于前人,包括设计和开发。一个反复转手的软件,必定会出现经典的“破窗效应”
瀑布与增量
由于软件具有很好的延展性,因此软件设计是一个贯穿软件系统整个生命周期的连续过程。这使得软件设计与诸如建筑物,船舶或桥梁的物理系统的设计不同。但是,并非总是以这种方式查看软件设计。在编程的大部分历史中,设计都集中在项目的开始,就像其他工程学科一样。这种方法的极端称为瀑布模型,该模型将项目划分为离散的阶段,例如需求定义,设计,编码,测试和维护。在瀑布模型中,每个阶段都在下一阶段开始之前完成;在许多情况下,每个阶段都由不同的人负责。在设计阶段,立即设计整个系统。
不幸的是,瀑布模型很少适用于软件。软件系统本质上比物理系统复杂。在构建任何东西之前,不可能充分具象化出大型软件系统的设计,以了解其所有含义。结果,初始设计将有许多问题。在实施良好之前,问题不会变得明显。但是,瀑布模型的结构此时无法适应主要的设计更改(例如,设计师可能已转移到其他项目
由于这些问题,当今大多数软件开发项目都使用诸如敏捷开发之类的增量方法,其中初始设计着重于整体功能的一小部分。设计,实施和评估此子集。发现和纠正原始设计的问题,然后设计,实施和评估更多功能。每次迭代都会暴露现有设计的问题,这些问题在设计下一组功能之前就已得到解决。通过以这种方式扩展设计,可以在系统仍然很小的情况下解决初始设计的问题。较新的功能受益于较早功能的实施过程中获得的经验,因此问题较少。
增量方法适用于软件,因为软件具有足够的延展性,可以在实施过程中进行重大的设计更改。相比之下,对物理系统而言,主要的设计更改更具挑战性:例如,在建筑过程中更改支撑桥梁的塔架数量不切实际。增量开发意味着永远不会完成软件设计。设计在系统的整个生命周期中不断发生:开发人员应始终在思考设计问题。增量开发还意味着不断的重新设计。系统或组件的初始设计几乎从来都不是最好的。经验不可避免地显示出更好的做事方式。作为软件开发人员,您应该始终在寻找机会来改进正在开发的系统的设计,并且应该计划将部分时间花费在设计改进上。
如果软件开发人员应始终考虑设计问题,而降低复杂性是软件设计中最重要的要素,则软件开发人员应始终考虑复杂性。这本书是关于如何使用复杂性来指导软件设计的整个生命周期。