原始Unix

fleuria » 11 Oct 2010

最近在看两本书,《Unix操作系统设计》和《设计中的设计》。同样是“设计”,后者显然更重“设计”本身。作者在开头简单谈了下设计的起源及定义,大意是工业革命提高了人类生产的速度,但是工业化量产的东西远却不如需要长时间打磨的手工产品精细,于是有一段时间,粗糙的工业产品随着高速发展的资本主义进入千家万户,手工产品则成了高级的象征。现代的 “设计”理念正从这时诞生,从日常生活的细节出发,在工业的量产与产品的品质之间寻找一个平衡,做让人感觉“这样就好”的产品。

原野哉留下一句名言“设计不是一种技能,而是捕捉事物本质的感觉能力与洞察能力”。其实换成我们自己的话,无非就是“用心做”。

谈到Unix的设计,KISS自然不必多说。尽可能简单的机制和接口,尽可能薄的胶合层,宁花机器一分不花程序员一秒,简约却不简单。简单的东西,自然容易理解。可是当拿出来《深入理解Linux内核》《Linux源码完全剖析》之类的大部头想一探究竟的时候却发现满篇都是精妙繁杂的设计,Keep It Simple又到哪里去了呢?Unix is Not Simple Any More。Linux内核几百万行的代码早已不在人类可以理解的范畴,拿文件系统来说,你会叹服于VFS精妙的抽象机制,然而每个文件系统的具体代码却不那么直观——与硬件之间相隔了太多东西。KISS的口号过于响亮了,而《Unix编程艺术》里提到另一条同样重要的准则却从没怎么起眼过,那就是“没有准则”。对于linux、Windows NT这样拥有庞大用户群的系统来说,开发者必须做出巨量的trade off,这时“最简单的”方案往往不一定顶用,代码是否“好看”反倒应该是最后考虑的因素。

原始的Unix应该是更好的入手点。看过Unix v6的代码才知道,原来找缓存也可以用穷举遍历链表的来。满地都是“拿不准就穷举”。面对性能的质疑,Richie曾经写文辩解:在数据量不大的情况下,穷举可能不会比各种精妙算法低效多少;而内核中的数据量往往并不多,这时优先考虑的应是代码的正确性。在《Unix操作系统设计》中作者为了规避AT&T的版权条例,只能使用伪代码表示系统的逻辑,反而避免了代码中繁复的细节,使得描述更为清晰。每章的内容都不长,就描述清楚了Unix中大部分基础机制的轮廓。与《莱昂氏Unix源码分析》中全索引的V6代码(9000行出头)相配合,阅读起来绝对是酣畅淋漓。不妨拿当年的这些代码与现在的linux做下比较,体会下这些活到今天的活化石在当年是什么样子。

策略易变,机制长存。这就是设计的不朽之处。

hosted on github, and powered by jekyll. (rss)