软件设计:先整体后细节
| 技术《黑客与画家》(Hackers and Painters)一书作者保罗·格雷厄姆(Paul Graham)提出了一个重要观点:如果一开始就纠结细节而看不到整体,往往花费大量时间却达不到预期效果。正确的做法是先有一个整体的轮廓,再逐步完善各个部分。
来自绘画的启示
“无数古代油画放在 X 光下检视,就能看出修改痕迹,四肢的位置被移动过,或者脸部的表情经过了调整… 可以发现通常一幅画开始通过一张草图,然后再逐步填入细节,如果发现构想是错的,那你就必须重新动手修改。”
画家学习绘画的方法是动手去画,黑客学习编程也理应如此。
“你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程之时,就可以根据需要随时修改规格,最终会有一个更好的结果。”
为什么整体优先?
软件开发应该像艺术创作一样:
- 油画:先画轮廓,再逐步上色完善
- 素描:先确定比例关系,再刻画细节
- 建筑:先搭框架,再砌墙装修
- 把握全局:一开始就能看到系统的全貌,避免走弯路
- 便于调整:方向不对可以及时修正,代价较小
- 提高效率:团队成员清楚自己的位置,减少重复工作
- 降低风险:整体方案经过评审后再投入开发
优秀设计原则
《黑客与画家》中总结了 14 条优秀设计原则:
- 好设计是简单的设计 - 简洁是美的精髓
- 好设计是永不过时的设计 - 经得起时间考验
- 好设计是解决主要问题的设计 - 抓住核心需求
- 好设计是启发性的设计 - 让人产生新想法
- 好设计是有点趣味性的设计 - 注入创造性思维
- 好设计是艰苦的设计 - 精益求精
- 好设计是看似容易的设计 - 大巧若拙
- 好设计是对称的设计 - 平衡与和谐
- 好设计是模仿大自然的设计 - 师法自然
- 好设计是一种再设计 - 迭代优化
- 好设计是能够复制的设计 - 可复用性
- 好设计是奇特的设计 - 突破常规
- 好设计是成批出现的 - 优秀设计常扎堆出现
- 好设计常常是大胆的设计 - 敢于创新
实践方法
- 画架构图:用 UML 或简单框图画出系统模块、依赖关系
- 确定接口:先定义模块间的接口,再实现具体逻辑
- 迭代完善:先跑通流程,再优化细节
“做出用户喜欢的产品,保证开支小于收入。” —— 保罗·格雷亚姆
这才是正确的软件设计方式。