7C00.ME/houmu 2013-05-26

《Linux/Unix设计思想》阅读笔记

最近在读,随时更新。

前言

page 22

整个Unix哲学都围绕着“用户指导自己在做什么”的思想而展开。其他操作系统的设计者总是煞费苦心地去迎合各层次用户,从新手到专家;而Unix的设计者则采取了比较冷淡的态度:“如果你不能理解,那你就不属于这个世界”。

page23

商业界忙于建造阻碍Unix发展的壁垒,而学术界却张开了双臂欢迎它的到来。那些伴随着彩电、微波炉、视频游戏成长起来的年轻一代步入校园,而这些大学已经可以几乎不费分文地获得到Unix的发行版光盘。这些年轻人纯洁无瑕的内心犹如洁白画布,教授们更愿意在这样的白纸上绘制计算机世界非主流的蓝图。

第1章

Unix

Multics -> Ken Thompson’s Unix -> SpaceTravel

page 28

Thomspon的开发工作从借鉴Multics的想法入手,对于Unix开发人员而言,这样的套路可谓是驾轻就熟:良好的程序员写出优秀的软件,优秀的程序员“窃取”优秀的软件。……但正是这种在某些方面避免NIH(Not Invented Here,非我发明)综合征的意愿和基于别人的成果添加颇具创造性价值的做法,大力推动了这一款或许是历史上最精巧操作系统的出台。

page29

NIH综合征

在原有软件的基础上进行加强和拓展也是Unix哲学的核心概念之一。

第2章

page 31

Thompson 和 Torvalds两人至少有一点相似之处,那就是对事物的好奇之心。

end on page 45 at 2013-05-16 23:04

第3章

Thought:

第三章是关于快速建立原型的。按我的理解,作者提倡,当有了某个想法的时候(想法成熟到一定程度时),就应该立即开始编码了,做出一个功能简单甚至不完整但是能够体现想法的大体形式的程序;与之相反的是,在完成具有非常多的细节的设计之后才开始编码,做出一个功能“完整”的程序。后者和“软件工程”流程相似。在研究和探索等创造性的工作中,快速原型是极佳的工作方式,但是软件企业更适合“软件工程”流程,以此降低商业风险。现在很多开发者和企业再提“敏捷开发”,似乎是对“快速原型”思想的回顾。其实,“软件工程”的出现是为了解决软件规模越来越大的问题,而“敏捷开发”的出现是为了解决软件需求变化越来越快的问题。二者的着眼点一个是“规模增长”,而另一个是“需求变化”。Unix哲学是“以小为美”,所以“规模增长”可避免,“需求变化”更常见。从另一个角度来看,“快速原型”有着更多“学院派”的影子。

第三章,提出的“三种系统”很费解,初步理解是这样的。“第一系统”就是“快速原型”开发,强调尽早做出程序来,那怕是简单丑陋不完整,原型出来以后再决定是否有必要去深入开发这个程序或这套软件。“第二系统”是“软件工程”开发,强调先要设计好文档,想清楚各个细节,还要功能尽可能的丰富,在确认文档没有问题之后再开始开发程序。“第三系统”是介于二者之间,算是融合了两种“系统”的长处,但是给我的感觉就是从“第二系统”回归到“第一系统”。总之,关于“三种系统”的这几页文字,没有完全理解,或许并不重要。

end on page 66 at 2013-05-17 10:57

第4章

准则4:舍高效而取可移植性

Thought:

作者之所以提出这样的想法,我想主要是那个时代硬件的飞速发展,一个软件产品经常需要从一个硬件平台迁移到另一硬件平台。在作者看来高效的代码是利用了具体硬件特性的代码,是硬件相关的代码,可移植性低。所以这里的“高效”还是比较笼统的。现在常用的开发语言大多数是跨平台的,这也就使得普通程序员对可移植性的关注可以降低。除非是做硬件相关的开发,一般不用考虑太多平台可移植问题,把这类问题交给编程语言来解决。

end on page 75 at 2013-05-19 22:46

准则5:采用纯文本文件来存储数据

Thought:

在Linux系统中几乎所有的配置文件都是纯文本的形式,比如/etc/hostname、$HOME/.profile、$HOME/.vimrc等等。从这节来看,纯文本存储的主要优势是“可移植性”,几乎所有的主要操作系统都有文本编辑器,所以文本存储的数据“易于阅读和编辑”。当然还有个重要原因是,文本数据简化了unix文本工具的使用,在使用管道的时候文本数据是进程间通信的桥梁。

Linux中文本存储格式一般都很简单,换行符通常是重要的分隔符。xml、json是现在流行起来的存储格式,他们也都是文本文件格式的,但是应该不属于本章中作者所提到的“文本文件”,不妨称为纯文本文件。xml和json更具拓展性,表现力更强,使用起来更灵活,而且主流编程语言对xml、json都有专门的处理函数或库,所以现在很多数据存储使用的是xml或json。Linux由于历史原因很多地方用的是纯文本文件,或许不能改变。如果是现在开发的程序,为了灵活性和拓展性,应该是用xml或json(我更喜欢json)。即便是非常简单的数据存储,想想以后的拓展性,也应该使用。

Linux中使用文本文件作为系统配置文件,还有几个问题,一是文件碎片化,另一个是安全性。文件碎片化,是指配置文件散布在文件系统的目录的位置没有比较统一规范,文件名也不规范。有时候为了完成一组密切相关配置,需要cd好几次目录。Windows在这方面采用的是注册表来做统一管理,当然注册表对写操作限制太少,几乎所有程序不做区分的去写注册表,导致注册表非常混乱。二者如果能够良好结合,各取所长,会有一个不错的处理机制。

end on page 81 at 2013-05-20 09:46

第5章

准则6:充分利用软件的杠杆效应 准则7:使用Shell脚本来提高杠杆效应和可移植性

Thought:

这一章提到的“杠杆效应”,我理解就是“借势”,从实践上来说就是,使用现有程序和代码而不是重复“造轮子”。荀子一篇文章中的一句话,我一直印象深刻:“君子性非异也,善假于物也”。在本文中,作者抛出了的一个观点可以说是对这句话的在程序员的角度的解读:“良好的程序员编写优秀代码,优秀的程序员借用优秀代码”。而对于那种“事必躬亲”的程序员,作者给他们的定义是NIH综合征。实际上,我本人就有点NIH综合征,喜欢重复造轮子,所以这一章对我的启发还是很大的。对于别人写好的代码(在别人许可的前提下),大可以敞开胸怀,接受和复用。当然,如果是以纯粹的研究为目的的不在这个讨论范围之内。在实践中,做好利用杠杆效应,常见的做法是使用开源软件,基于现有程序开发。同样的作为回馈,应当为开源软件做出贡献。如今,开源的理念深入人心,也可认为是Linux哲学的普及。作者给出的一个实践建议是使用Shell脚本,我想凡是习惯上Shell脚本以后应该都会有这样的自觉。

end on page 98 at 2013-05-21 21:28

第6章

准则8:避免强制性的用户界面 准则9:让每一个程序都成为过滤器

这一章揭示了Linux程序的交互风格,即通过命令行参数控制,而不是“提示-等待用户输入-响应”的过程。当程序启动以后直到运行结束,不会出现等待用户输入或确认的中断暂停。这些操作可能会比较用户友好,但是不利于自动化。作者在第5章提到过“将一切自动化”。Linux中常用到“管道”来组合几个命令以完成一个复杂的处理功能,这也要求每个命令不应该出现强制性的用户交互,而后者也是“管道”能够大行其道的一个条件。这应该就是作者说的“拥有cui的程序难以与其他项目相结合”。我遇到过需要强制性的用户界面的Linux程序很少,一是adduser,另一个是ssh-key-gen,而这两个程序都有没有cui的替代版(useradd)或通过增加命令行参数避开cui。

end on page 114 at 2013-05-21 22:04

第7章

允许用户定制环境 尽量使操作系统内核小而轻量化 使用小写字母并尽量简写 保护树木 沉默是金 并行思考 各部分之和大于整体 寻求90%的解决方案 更坏就是更好 层次化思考

end on page 131 at 2013-05-22 10:24

第8章

第9章

今天,很多开发人员编写Linux软件就纯粹是为了兴趣。对他们来说,这是娱乐,也是一种“极客”(geek)生活方式。

Crawfold认为计算机是一个缺乏外在物理特征的职能个体,它的思维过程是“直接的、分析性的和具体的”。

Crawfold强调软件最重要的一个方面是如何与人进行沟通,而Unix程序的最高优先级是该如何与其他程序互动。

根据Crawford的说法,雅达利机器上的软件力求封闭性,或是尽量减少用户的功能选项。……Unix环境中的选择非常丰富,几乎没有什么限制。通常情况下用户至少有十几种方法来执行任何一项任务。

MS-DOS背后的哲学到底是什么呢?首先,简单是最重要的。如果想为公众设计一款操作系统,那么对于目标群体的大部分成员而言,它要易于使用。因此,MS-DOS使用了简洁有限的命令语言。……其,在限制用户输入的同时增加系统的输出信息。

第10章

end on page 170 at 2013-05-23 22:33

第11章

Thought:

这一章从猫王唱片超过滚石在于猫王“集市”般的博采众长,而滚石则是“大教堂”式的抱一守中谈起,提到拉丁语盛极一时却又最终没落,再到开源软件的成功,主要在谈一点,即Unix中“开放”的文化,开放的源代码,开放的数据格式等等。

第12章

这章对全书做了总结,并列举了在信息科技领域实践Unix哲学的典型案例。这里面有几个例子颇有前瞻性,一些预测现在已经实现。

end on page 196 at 2013-05-26 19:45