UNIX编程的艺术
花了3天的时间略读了一下UNIX编程艺术这本书,对某些概念有了了解,对某些方法有了认识。
1、软件模块之间的正交性,模块之间要做到相互无影响,也就是要尽量解耦
2、软件的透明性,我的理解就是代码的层次很清晰,层次尽量少,尽量薄
3、软件的紧凑性,按照作者的说法,就是要围绕一个中心来组织代码,比如一个强大的算法
4、程序之间的通信协议尽量采用文本数据而不是二进制数据,这样有几个好处,容易理解、扩展方便、调试方便。如果认为效率较低占用更多带宽,可以压缩。
5、 尽量避免使用多线程的方法。UNIX的工程哲学是采用多个进程,多个进程间通过管道、文本协议、标准输入输出来相互协作完成工作,就好像一条流水线。在单个进程内,可以利用select、poll这类多路复用技术避免多线程(还有就是nonblock操作)。
6、脚本语言的妙用,perl、python、ruby,可以在c/c++不擅长的领域发挥作用,有效提高生产率,还可以作为领域语言发挥作用
7、 数据驱动编程的模型。采用文本数据+领域语言+基础模块来完成工作。文本数据描述复杂任务本身,领域语言(由脚本语言编写)构成逻辑层用来解释文本数据并 将复杂任务分解为多个基础任务并调用负责完成基础任务的模块(由c/c++语言编写)。当领域逻辑较简单时也可以省略逻辑层。
8、遵循简单但不能太简单(不能简单到无法完成任务)的原则,尤其是由多个简单的模块而不是由一个复杂的模块来完成任务。
9、复杂度的分类,偶然复杂度--由开发人员的素质决定,比如偶然犯的错误,不好的编程习惯等;选择复杂度--由开发人员所选择的编程语言、建模方法、设计方法所决定;本质复杂度--由任务自身的数据结构、功能需求决定。
10、使用yacc和lex(gnu版本bison、flex)来根据BNF做解析器,对于设计标准协议、解析标准协议十分有效。
11、好好利用emacs的强大功能(今天才知道emacs可以很好的结合cvs使用)。