设计的“工程性”主要体现为对高质量的追求,设计的“艺术性”则主要体现为对审美的追求。优秀设计师的作品应该是功能和质量兼备的,卓越设计师的作品还应该是有美感的。
人们会认同伟大的工程作品都是有美感的,却很难给美感下一个准确的定义。常见的设计美感特质有:简洁性、结构清晰和一致性。
1.简洁性
对于人类来说,处理复杂事物并不是一个轻松的工作。反过来说,人们更适应掌握简单的事物。简洁就是在完成一个工作时使用简单的方式。
简洁不是绝对的简单,因为毕竟还需要完成工作。但在完成工作的诸多选择中,最简单的那个就是简洁的。
复杂的事物更容易让人们困惑,更容易产生不安全的后果,更容易激发人们的消极情感。简单的事物很容易掌控,让人们感觉安全,更容易激发人们的积极情感。所以简洁被认为是具有美感的。
例如,为一个简单的事情写绕来绕去的代码,晦涩难懂,就绝非优雅的设计,因为它让读者难以产生对代码正确性的掌控力,难以对设计师产生信任;反之,使用简单明了的语句实现功能则是优美的,因为程序易懂,读者可以很有把握地相信代码会产生良好的效果。再例如,使用一大段的代码表达某个功能是复杂的,相比之下使用一个简单的函数接口表达同样的功能就是简洁的,因为阅读和理解更容易。
实现简洁的首要要求就是能够从纷乱复杂中直击事物本质,能够去芜存菁,具备良好的归纳、总结和概括能力。例如,图1-5b就归纳和提升了图1-5a中的多条代码。
实现简洁还需要学会隐藏细节:提取简洁的表现,将复杂的现象隐藏于表现之后。好的隐藏是自然的归纳,会留下发现的痕迹和线索,不至于显得过于生硬。例如,将一段复杂的代码包装为一个简单的函数接口就是一种隐藏,包装过程符合语义内聚分割就是自然的归纳,机械地规定将每50行代码封装成一个函数就过于生硬了。
总结上述两条可以发现,抽象是实现简洁的理想手段:首先,抽象可以去除无关信息,识别事物本质;其次,抽象将认知停留在适当的层次,屏蔽底层的差异。
2.结构清晰
结构清晰是简洁性的另一种表现,与简洁性有着同质的原理。
简洁性是针对单个事物而言,最为简单的实现方式。结构清晰是指针对一个组织结构而言,最为简单的组织结构。
结构清晰的组织方式易于理解,一眼看去“显而易见是正确的”。最为清晰的结构应该是隐喻的,是自然的,是理所当然的。
可以用一个事例说明“隐喻”:要从一个杂乱的房间中找到一个物件,对于外人来说困难无比,但是房间的主人却易如反掌,其中的区别在于房间主人的脑海中有一个房间的布局图,此即为隐喻。
例如,冒泡排序就是排序算法中最清晰、最自然的,从大到小逐个点名的方式最符合自然“隐喻”,相比之下快速(希尔)排序就不够自然[当然冒泡排序的坚固性(性能)不足]。又如使用堆栈接口(pop、push)表达后进先出结构就是自然的,它符合自然“隐喻”,相比之下使用数组(每次存取都指向数组最后一位)就不够自然。再例如,使用结构化方法的逐步精化、逐层分解方法建立的模块结构就是清晰的,大大促进了软件正确性的提升,反之没有任何规划纯粹堆积代码而成的结构就不够清晰。
面向对象方法和结构化方法相比,结构化方法建立的设计结构更加清晰,只是出于对坚固性(主要是可维护性)的考虑,人们才更多地使用面向对象方法。人们越来越多地在面向对象设计中抽取出类似于结构化设计的控制层(controller)也是为了更多地实现结构清晰。
3.一致性
一致性又被称为概念完整性(conceptual integrity),就是要求用相似的方法做相似的事情。
一致性比较重要是因为人们喜欢规律而不是杂乱无章的世界。在杂乱的世界中人类无法预测下一刻的事件,更无法掌握和驾驭事件。所以,人类在认识世界的过程中,总是在不断地追求规律性。科学家称规律性为美感,而对称则是最大的美感。在对称的世界中,人们只要看到了一面,就可以推测另一面,很多事情都会变得容易。
具有一致性的系统设计就是一个具有对称美的世界,人们只要掌握了一个设计的思想,就可以很好地预测其他类似设计的思想。而很多不协调片段组成的系统设计就是一个杂乱无章的世界,它阻碍人类对它的预测和掌控,人们需要花时间去分析每一个设计决策,否则永远无法理解和掌握下一个设计的思想。
以建筑为例,假设有两个建筑群,一个由欧美式、中式、拜占庭式等各种不同风格的建筑组成,另一个是由完全相同风格的建筑组成。相比之下,即使第一个建筑群的每个建筑都比第二个建筑群的单个建筑出色,整体效果上也是第二个建筑群更具美感。这正如Brooks(1975) 所说的:“设计的一致性和那些独到之处一样,同样让人们赞叹和喜悦。”
Brooks首先在软件系统设计中明确提出了一致性(概念完整性)规则:“我认为概念完整性是系统设计中最重要的考虑因素。一个为反映一组设计思想而省略不规则特性及改进的系统,要好过一个包含很多虽然好但独立、不协调的设计思想的系统。”也就是说系统设计的首要原则是要反映一致的设计思想,很多好但不协调的片段集合起来并不一定就是一个好的整体。