这篇博客摘取于《代码大全》第5.1章节——“设计是个了无章法的过程”。由于作者在讲述这一部分内容时诙谐有趣,语言简洁却很有道理,因此忍不住给各位分享。几乎完全是原文照搬,无任何个人加工成分。
--------------------正文分割线------------------------
软件设计的成果应该是组织良好、干净利落的,然而形成这个设计的过程却并非如此清爽。
说设计了无章法,是因为在此过程中你会采取很多错误的步骤,多次误入歧途——你会犯很多的错误。事实上,犯错正是设计的关键所在——在设计阶段犯错并加以改正,其代价要比在编码之后才发现同样的错误并彻底修改低得多。说设计了无章法,还因为优、劣设计之间的差异旺旺非常微妙。
另外,说设计了无章法,还因为你很难判断设计何时算是“足够好”了。设计到什么细节才算够?有多少设计需要用形式化的设计符号完成,又有多少设计可以留到编码时再做?什么时候才算完成?因为设计永无止境,因此对上述问题最常见的回答是:“到你没时间再做了为止”。
- 设计就是确定取舍和调整顺序的过程
在一个理想的世界中,每一套系统都能即刻完成运行,不消耗任何存储空间,不占用任何网络带宽,没有任何错误,也无须任何成本即可生成。而在现实世界里,设计工作者的一个关键内容便是去衡量彼此冲突的各项设计特性,并尽力在其中寻求平衡。如果快速的反应速度比缩减开发时间更重要,那么设计者会选区一套设计方案。而如果缩减开发时间更重要,那么好的设计者又要巧妙地形成另一套不同的设计方案。
- 设计收到诸多限制
设计的要点,一部分是在创造可能发生的事情,而另一部分又是在限制可能发生的事情。如果人们在建造房屋时拥有无限的时间、资源和空间,那么你会看到房屋不可思议地所以蔓延,每幢楼都有上百间房子,一只鞋子就可以占用一间屋子。如果毫无约束,软件最后也会是这样的结果。正是由于建造房屋时有限资源的限制,才会促使产生简单的方案,并最终改善这一解决方案。软件设计的目标也是如此。
- 设计是不确定的
如果你让三个人去设计一套同样的程序,他们很可能会做出三套截然不同的设计,而每套设计都很不错。剥猫的皮可能有不止一种方法,但设计计算机程序却通常有数十种方法。
- 设计是一个启发式的过程
正因为设计过程充满了不确定性,因此设计技术也趋于具有探索性——“经验法则”或者“试试没准能行的方法”——而不是保证能产生预期结果的可重复的过程。设计过程中总会有试验和犯错误。在一件工作或一件工作的某个方面十分奏效的设计工具或技术,不一定在下一个项目中适用。没有任何工具是放之四海而皆准的。
- 设计是自然而然形成的
把设计的这些综合特性归纳起来,我们可以说设计是“自然而然形成的”。设计不是在谁的头脑中直接跳出来的。它是在不断的设计评估、非正式讨论、写试验代码以及修改试验代码中演化和完善的。