形式永远服从功能。 —Louis Henry Sullivan
“设计之城”软件项目表面上与“混乱大都市”非常相似。它也是用C++写的消费音频产品,运行在Linux操作系统上。但是,它的构建方式有很大不同,所以内部结构也非
常不同。
我从一开始就参加了“设计之城”项目。我们用有能力的开发者组成了一个全新的团队,从头开始构建这个产品。团队很小(开始有4名程序员),像“大都市”项目一样,团队的结构是扁平的。幸运的是,没有出现“大都市”项目中的个人对抗,在团队中也没有出现任何争权夺利的事。在此之前,团队成员之间并不非常熟悉,不知道我们在一起可以配合得多好,但我们对这个项目都很热心,喜欢这项挑战。
这样很好。
Linux和C++是项目早期的决定,这项决定确定了团队成员的组成。从一开始,项目就有清晰定义的目标:具体的首个产品和将来功能的路线图,代码集必须能够支持这些功能。这将是一个通用目标的代码集,可以适用于多种产品配置。
开发过程采用了极限编程(XP)(Beck和Andres 2004),很多人相信这种开发过程避开了设计:直接开始编码,不要想太远。实际上,一些旁观者对我们的选择感到震惊,并预言项目将以泪收场,就像“大都市”一样。但这是一种常见的误解。XP没有贬低设计,它贬低的是不必要的工作(即YAGNI原则,You Aren’t Going To Need It)。但是,如果需要前端设计,XP就要求你进行设计。它也鼓励使用快速原型(所谓的“spike”),快速展现并验证设计的有效性。这些都非常有用,对最终的软件设计产生了极大的影响。
2.2.1 设计之城的第一步
在设计过程的早期,我们确定了主要的功能领域(这包括核心的音频通道、内容管理和用户控制/界面)。我们考虑了它们如何在系统中适配,推出了初步的架构,包括了实现性能需求所必需的核心线程模型。
系统中各独立部分的相对位置关系体现为传统的分层结构,图2-2展示了简化后的结果。请注意,这并不是庞大的前端设计。它是有意为之的“设计之城”的简单概念模型:图中只有一些大块,这是一个基本的系统设计,可以随着功能模块的添加而轻松地增长。虽然很基本,但这个初始架构为增长提供了坚实的基础。“大都市”没有总体规划,在“方便”的地方嫁接(或修补)功能。
我们在系统的核心上花了额外的设计时间:音频通道。它实际上是整个系统的一个内部子架构。为了确定它,我们考虑了穿过一系列组件的数据流,最后得到了一个“过滤器和管道”音频架构,如图2-3所示。根据产品的不同物理配置,它包含了这样一些管道。同样,开始时这些管道只是一个概念,即图中的一些方块。我们当时还没有决定如何将所有模块拼装在一起。
2.3 说明什么问题
等那完全的来到,这有限的必归于无有了。 —《哥林多前书》第13章10节
这个关于两个软件系统的简单故事当然不是软件架构的全面介绍,但我已展示了架构如何对软件项目产生深远的影响。架构几乎会影响所有与之相关的人和事,它决定了代码集的健康,也决定了相关领域的健康。就像一个繁荣的城市会为当地带来成功和声望,好的软件架构将帮助项目获得发展,为依赖于它的人带来成功。好的架构是很多因素的结果,包括以下方面(但不限于此):
? 确实进行有意为之的前端设计。(许多项目甚至还没开始,就因为这一点而失败了。)
? 设计者的素质和经验。(以前犯过一些错误是有帮助的,这能在下一次为你指出正确方向!“大都市”项目肯定教会了我一些东西。)
? 在开发过程中,保持清晰的设计观点。
? 授权团队负责软件的整体设计,而团队也承担起这一责任。
? 不要害怕改变设计:没有什么是一成不变的。
? 让合适的人加入到团队中,包括设计者、程序员和经理,确保开发团队的规模合适。确保他们具有健康的工作关系,因为这些关系将不可避免地影响代码的结构。
? 在合适的时候做出设计决定,当你知道所有必要信息时再做出决定。延迟那些暂时不能做出的决定。
? 好的项目管理,以及合适的最后期限。
2.4 轮到你了
绝不要失去神圣的好奇心。 —阿尔伯特·爱因斯坦
你正在读这本书是因为你对软件架构感兴趣,而且你对改进自己的软件感兴趣。所以这里就有一个极好的机会。对于你目前的软件经验,请考虑以下简单的问题:
1. 什么是你看到过的最好的系统架构br> ? 你怎么知道它是好的br> ? 这个架构在代码集之内和之外带来了什么结果br> ? 你从中学到了什么br> 2. 什么是你看到过的最差的系统架构br> ? 你怎么知道它是差的br> ? 这个架构在代码集之内和之外带来了什么结果br> ? 你从中学到了什么br>
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!