最近读完《unix编程艺术》,一本不错的书,值得好好读一下。
书中提到了一些非常有启发性的设计概念,这里和大家分享一下。
模块性:要编写复杂软件又不至于一败涂地的唯一方法,就是用定义清晰的接口把若干简单的模块组合起来。模块性可以说是听到的最多的一个,它已经深入程序员的心中。它的本质其实就是用分而治之的方法来分解复杂度。关于模块的大小,本书有精彩的论述,有兴趣可以详读。
紧凑性:就是一个设计能否装进人脑的特性。我把它理解为设计的可读性。紧凑不等以薄弱:如果一个设计构建在易于理解利于组合的抽象概念上,则这个系统能够在具有非常强大、灵活的功能同时保持紧凑性,典型的如Eclipse的插件体系结构。紧凑不等于易于学习:对于某些紧凑设计而言,在掌握其精妙的内在概念模型之前,要理解这个设计有些困难;但是一旦理解了这个模型,则学习相对简单。
紧凑性目前对我来说是一个“可以意会,不可言传”的特性。书中用开发语言的设计做例子也许非常好理解:lisp就是一个典型的紧凑性的设计:特性非常简单,几十行代码就可能写一个解释器。但是,它可以做很多复杂的东西。c和Python是半紧凑的,perl,java,shell则不是。c++是反紧凑的,但是他的子集是半紧凑的。
提高紧凑性的一个方法就就是设计过程中保持概念的一致性,并且紧紧的围绕它来定义问题和解决问题。
正交性:是有助于使复杂设计也能紧凑的重要特性之一。在纯粹的正交设计中,所有的操作均无副作用;每一个动作(无论是API调用,宏调用或者语言运算)只改变一件事情,不会影响其他。无论你控制的是什么系统,改变一个时期的方法有且只有一个。正交性的障碍在于便利性,人们经常为了便利性牺牲正交性。正交性教给我们:做,并且只做好一件事情。
单点性:每一个知识点在系统中只有一个唯一,明确,权威的表述。在它的指引下,你编程的时候会遵循下面的建议:不要重复你自身(Don’t Repeat Yourself)——《程序员修炼之道》。数据结构的SPOT原则:无垃圾,无混淆。数据结构不要太通用,太面面俱到。数据驱动编程,代码生成在一定程度是也是遵循的SPOT原则。
透明性:如果没有阴暗的交流和隐藏的深度,软件系统就是透明的。如果实际上能够预测到程序的大全部或大部分情况,并能够建立简单的心理模型,这个程序就是透明的:因为可以看透程序在干什么。
要追求代码的透明,最有效的方法很简单,就是不要在具体操作的代码上叠放太多的抽象层。不要建造过分精细的抽象城堡。
可显性:如果软件系统所包含的功能是为了帮助人们对软件建立正确的做什么,怎么做的心理模型而设计的,这个系统就是可显的。良好的帮助有助于提升可显性,良好的变量名和函数名有助于提升可显性。
我的理解:可显性是指是否容易入门(比如有没有相关文档);透明性是指入门后是否容易理解(比如程序结构是否模型是否容易理解)。
更深入的内容可以详细阅读《unix编程艺术》。