在软件开发的过程中,我们常常面临着一个悖论:一方面需要追求卓越和完善,另一方面又要防止过度设计。特别是在完成了第一个系统之后,当着手开发第二个系统时,更应当警惕这种倾向。此时,我们很容易因为对已有成果的信心而陷入过度自信的陷阱,从而忽视了最初的设计理念和目标。
结构师的交互准则与机制
尽早沟通和持续交流能够帮助结构师提高成本意识,并使开发人员对设计充满信心,同时明确各自的职责。
结构师需要遵循以下准则:
-
尊重开发人员的创造性责任:结构师只能提供建议,不能支配具体实现(前提是开发人员是真正的开发人员,不是滥竽充数者)。
-
提供多种实现方案:准备好为特定设计提供实现方法,并愿意接受其他可行的方案。
-
保持低调和平静:以专业态度提出建议。
-
准备放弃建议:有更好的方案或建议,则应准备放弃原方案。
自律——开发第二个系统所带来的后果
第一个系统:结构师倾向于精炼与简洁,因对自己正在处理的任务还不够熟悉,因此会更加谨慎。
第二个系统:这是最危险的阶段,结构师倾向于过度设计,加入许多在第一个系统中被推迟的功能和想法,结果往往成为一个臃肿的“大馅饼”。
第三个及后续系统:随着经验积累,结构师能够更好地识别出通用特性以及经验中的不足之处,从而做出更合理的设计。
实例说明:
IBM 704 到 709 的演进:
704:成功且简洁的系统。
709:作为 704 的升级版,设计上过于丰富,导致仅一半的操作被实际使用。
7090:进一步演化,吸收了之前版本的经验教训。
结构师如何避免“画蛇添足”——第二系统效应(Second-System Effect)
结构师的策略
-
意识到风险:尽管无法跳过第二个系统,但结构师可以通过有意识地关注其特有的风险来规避不必要的复杂性。
-
自我约束:制定特别的自我约束准则,避免不必要的功能添加。
-
量化小功能:为每个小功能分配一个具体的值,例如每次改进的功能 X 不得超过 M 字节的内存和 N 微秒的时间消耗。这些值可以作为决策的向导,并在整个物理实现过程中充当指南和警示。
项目经理的角色
-
依赖经验:项目经理应坚持采纳至少拥有两个系统开发经验的结构师的决策。
-
保持警惕:时刻对特殊诱惑保持警觉,避免陷入过度设计的陷阱。
-
持续提问:不断提出正确的问题,确保基本原则和目标在详细设计中得到完整体现。