我的眼睛看世界

2012年07月23日

Linux/Unix设计思想:关于世界观,是不是程序员又如何

Filed under: 感悟 — gcd0318 @ 00:41

这本书从头到尾都在回答两个问题:为什么Unix类操作系统(包括但不限于各种Unix、Linux以及BSD,以下没有特殊说明或者对比时,都只用Unix来表示所有Unix类操作系统)无法成为主流,以及,为什么我会这么喜欢Unix
在开始说这本书之前,且容我先讲一段个人往事
多年之前的一次面试,我被问到,是否用过Linux,我说用过,但是更熟悉Unix。这是实话,因为以当时我的知识水平,对Linux的认识还停留在,这是一个很像Unix的东西而已,但是至于具体到底有多像,是不是皮像肉也像,则不大了解。于是对方问我对Unix熟悉到什么程度,我说上学的时候通读了Lions的代码——那是我们当时很流行的一本书,没可能没读过的。对方仿佛瞬间来了精神,脸上写满了各种字体的难以置信和不以为然,于是挑衅的让我描述一下Unix的文件系统实现
其实我大可按照操作系统课上作为例子讲解的系统5的套路随便吹吹,反正大同小异,反正那些家伙们也肯定不懂,不过我想了想,还是忍住了,告诉它们,我说不出。于是,正中那些家伙们的下怀,一个个很得意的长出了一口气,互相看看,猥琐的笑笑,然后靠在椅子里开始找别的话题
面试嘛,很自然的就往下进行,到了某个标准的环节,自我总结优点和缺点。其实这类问题我一向是拒绝回答的,因为我根本不觉得人有优点或者缺点什么的,人只有特点,之所以被认为是优点或者缺点,那是没有被正确的利用。所以一般我都说些莫名其妙的答案,比如,我是早上5点55出生的,我爱吃红烧肉,之类之类。不过这次,由于之前那些猥琐的笑让我很不爽,我决定发泄一下,因此我说,我读书善于抓住重点,这是我的优点,缺点就在于,对于不是重点的问题往往容易忽略。理所当然的,它们自然是要追问我,让我拿个例子出来。于是我说,就比如我当年读Lions的源代码,我只记住了重点问题,比如Unix的设计到底遵循着什么样的原则,才能够让它在几十年里长盛不衰,而文件系统实现之类这些细枝末节的问题,我是不怎么在乎的,当时看看,需要用的时候去查,这种数黑弄黄寻章摘句的事,我不怎么在行
那些人脸上出现了让我看着很爽的尴尬,也许他们听不懂最后一句,但是前面的话应该还是理解得了的
习惯性的跑个题
面试里有几个最白痴的问题,比如就前面这种优点缺点的问题,还有比如很多人都和我一样遇到过的,当我还在做开发的时候,问我解决过的印象最深刻一个难题是什么,当我转做测试之后,问我发现的最有价值的一个bug是什么,这类问题基本上,我的回答都是看心情,要是心情不好,对这群面试的家伙或者这个公司没什么好印象,那么也许我就随便说一个案例,然后胡诌几句深刻的影响和意义之类,要是很想得到这个职位,那么我就会明确的说,其实我解决的每个问题,每个我发现的bug,我都印象很深刻,没有最深刻。所以呢,列为看官,若是有朝一日面试到我,这种白痴问题就不问也罢了——当然了,也可以问问看,看我当时的心情怎样
习惯性跑题暂时告一段落
呵呵,赌气归赌气,Unix的伟大,绝对不在于文件系统进程调度之类的具体细节问题,至少这不是最主要的亮点,至于到底为什么,我也想过,但是说不清楚
一直到,遇到了这本书的作者
作者Mike Gancarz,我大概听说过,因为他更早的一本The Unix Philosophy在GNU乃至整个程序员界都太有名了。不过很不幸的是,我至今没有通读过原本,只是支离破碎的看过一些节选,以及其他程序员的读书笔记。所幸这些读者都还算是有些眼界和智慧的,因此那些读书笔记和广为流传的片段节选都抓住了一些最核心的精神,所以我的损失也并不太大。这次读Linux/Unix设计思想,算是第一次和这个作者接触——当然了,还不能算是直接接触,因为毕竟,我读的是译本而不是原文
凡是自称程序员的,哪怕再不名副其实,应该也都不至于不知道Unix,哪怕不是从事和它相关的工作。Unix的名头在程序员的圈子里,那是怎么夸张都不过分的响亮——不过,Unix的知名度和影响力,大概也就是只局限于这个圈子了,其他领域知道Unix的人恐怕凤毛麟角,那些人也许接触的更多的,还是Windows或者Mac OS
不得不说,Unix是优秀甚至伟大的,但是为什么酒香还怕巷子深,问世几十年以来,始终就不能成为主流呢
Linux/Unix设计思想就回答了这个问题:因为一般人都是惧怕计算机的,它们不理解计算机复杂的内部结构和原理,因此也就排斥和恐惧,不愿意接触到太多的细节,对于它们来说,最好就像Windows那样,一切都只需要按照明确的操作指令按一下,甚至连按一下都不需要,就都被安排好了
我和我那个同样对计算机充满了恐惧的妻说起,妻说没错,就是要这样。这也是普通用户的典型需求,程序员,尤其合格称职的程序员(而不是仅仅有个程序员的职业标签,实际上绝大多数做着所谓的程序员工作的,都不是合格称职的程序员。欢迎对号入座)毕竟属于稀有动物,所以真正热爱Unix的,也只可能是少数派
其实就算是程序员,也对Unix的某些思想有很大的排斥。我记得我在很多次面试的时候都被问过一个问题,让我实现一个strcpy,但是我的答案总会被挑剔,问我,如果传入的是无效指针怎么办。起初我也很老实谦虚的说,哦,应该加上一个assert。但是当我真的打开ANSI C的库时,我却看到,strcpy也没有判断指针是否有效。这就让我觉得理所当然了,因为我每次要使用strcpy的时候,我确实是都要确认一下指针有效的。既然如此,为什么当我要实现一个strcpy的时候,必须验证一下指针呢
又比如Unix著名的“没有消息就是好消息”,就曾引起某些年龄较小接触Unix之前接触过MS系操作系统的程序员很不习惯。就如书中提到的查询文件但是没找到,Unix拒绝提供类似DOS的那种“File(s) not found”的提示,就让这类程序员很不习惯。其实这还不是最被诟病的。Unix删文件是没有提示的,不会像Windows那样去确认,就如作者在书里所说的,重置一个分区,这么大的动作,Unix给出的最强烈的警告,也不过就是一句“Are you sure what you are doing”而已——Unix在这方面,可以说残缺的简直到了极限。但是我觉得这么做可以理解,也理所应当,用户当然要为自己的行为负责,用户应该知道自己正在做什么,文件误删了怎么办?下次吸取教训吧,毕竟这个世界上,不能重新来过的事很多,不差这一件
我和一位师兄说起,他却说,因为很多程序员觉得,由自己来保证指针的有效性,让用户自己来保证每次删除文件都不是误操作,太麻烦了,还经常忘——啊哈,原来如此哦,就是因为懒惰的人愚蠢的人太多,所以我就要为它们考虑,这就是典型的Windows所传播的价值观
没错,Unix就是这样,它给使用者尽可能多的自由,让每个人可以按照自己喜欢的方式来支配计算机,操作一切。因此Unix从不限制用户的行为,而是让用户随心所欲,默认用户有勇气同时有能力而且愿意并且渴望用计算机做到更多的事,所以就把一切都交给用户,让用户自己来做各种决定,同时当然也就要为自己负责,这就是Unix。其实作者列举的所有所谓的设计思想,都可以归结在这下面,因此才会提供了无数的小工具,而不是一个一揽子的解决方案,所以才会减少交互的信息,而不是没完没了的罗嗦确认
高手当然都喜欢这样,少限制,多自由,信息简单但是准确,而这对于一般的使用者来说,则是天大的麻烦,人们会觉得,为什么我要知道那么多,这些应该是计算机替我做好的,出了问题为什么要我来负责,难道我有错计算机就不能替我承担一部分责任吗——可以说,Windows恰恰是在迎合着普通用户的这种需求,低三下四的取悦着这些用户,既然用户怕麻烦,那么就让计算机来做各种简化操作的工作,所有的危险操作,都要承担起审核的责任,和用户反复的确认(不过即便如此,依然有很多白痴做出愚蠢的操作)
若干年前微软曾经假模假式的搞了一次学术界的合作活动,请高校研究所的学者去读源代码。我的老师恰好就在应邀之列,据他说,就是弄了一间大屋子,在里面放满了打印出来的代码,然后给两天时间随便看,但是不许复印不许抄写。这可真是要多虚伪有多虚伪啊。老师告诉了我们他大致通览之后所留下的印象:其实真正有用的代码没多少,和用户之间的交互信息倒是很多很多——看吧,果然如此,怪不得Windows系列产品越来越占磁盘吃内存呢,大概也只有硬件厂商会喜欢这样的东西吧,而且微软还把这种设计叫做“对用户负责”——天可怜见啊,为了一群对自己都不负责的用户,微软的工程师们真是殚精竭虑,要知道,Windows的用户那么多,这里面谁知道会有多少神经病,就凭一个微软的那么点工程师,肯定是防不胜防啊,累死也不可能堵死所有的窟窿
我也和妻说起过这个事,因为我是很喜欢Unix这个风格的,有事说事,没事闭嘴,妻则说,就是很“鸟”嘛,摆酷。诶,对呀,这就是妻一贯的典型风格,总是能够一语中的:大部分人就是受不了别人当面摆酷,哪怕其实人家的确真的就是很酷
其实看完了这些,Unix为什么在圈内圈外都不能百分之百的受到欢迎,就很明显了。试想如果这是一个人,虽然才华横溢无所不能,但是就喜欢摆酷,从不取悦周围的人,无论谁要接近它,都要先证明自己够资格进入它的交际圈,那么它必然是缺少朋友的——但是这种人身边如果有朋友,一定是素质超群的,就像Unix世界,在这个世界面前,微软的Windows帝国就仿佛是一群乌合之众,是那么的微不足道。也是因此,虽然Unix也是一群人七手八脚攒出来的东西,但是却有最接近完美的质量
话说到此,就回到了我最开头的那句话——这本书从头到尾都在回答两个问题:为什么Unix类操作系统无法成为主流,以及,为什么我会这么喜欢Unix