有人会说,设计不是真正的构建活动。但在小项目中,包括设计在内的许多活动都被认为是构建。有些设计更关注系统级问题,许多设计工作留给构建。有些大型项目设计非常详细,导致编码成为一项机械性劳动。小型项目的设计更多的是程序员坐在电脑前完成的,不管是小项目还是大项目都会在精心的设计中获益的。
1.设计的挑战
设计是一个棘手问题,定义为只有通过解决它或解决它的一部分才能明确定义的问题。这个悖论意味着,必须“解决”一次问题才能清晰地定义它,然后再解决一次才能创建有效的解决方案。塔科马海峡吊桥问题就是典型的棘手问题,这艘桥在设计时主要考虑的是有足够的强度来支持设计的负载,在建成使用时,因为大风产生的侧向谐波导致的大桥梁坍塌。
设计没有章法,设计之所以没有章法,是因为你会采取很多不恰当的步骤,走入死胡同,会犯很多错,越早意识到错误并且修正错误是很重要的;另外就是很难知道自己的设计是不是“足够好”,由于设计永无止境,最常见的衡量办法就是“当你时间不够的时候”。
设计关乎取舍,设计工作的关键是权衡相互竞争的设计特性,并从中取得平衡。什么样的目标决定什么样的设计。
设计是不确定的和启发式的,不同的人设计相同的程序,方案都是不同的。由于设计师不确定的,所以设计技术都是启发式的,需要用到“经验法则”或者“试行”的策略。
设计是水到渠成的,设计是一个自然浮现,需要通过设计评审、讨论、写代码和修改代码的过程中逐渐完善和改进的。
2.关键设计概念
管理复杂性: