《linux/unix设计思想》真本书是程序员的必读书籍,无论是前端、后端、运维还是客户端开发人员。本书总结了 linux/unix 这些年积累的一些经验和方法,阅读了解它们对于我们日常的工作、学习帮助和启发非常大,有些甚至能颠覆自己的传统认知(如:避免强制性的用户界面)。
但是,本书已经买不到正规的纸质版书籍,pdf 也需要自己费劲去寻找。本书内容也比较多,但是笔者感觉没必要详细的阅读,只需要了解书中重点的原则和介绍即可。因此,笔者在看完之后,就记录了书中最主要的内容,供读者参考。
准则
- 准则1:小即是美
- 准则2:让每个程序只做好一件事
- 准则3:快速建立原型
- 准则4:舍弃高效率而取可移植性
- 准则5:采用纯文本来存储数据
- 准则6:充分利用软件的杠杆效应(软件复用)
- 准则7:使用 shell 脚本来提高杠杆效应和可移植性
- 准则8:避免强制性的用户界面
- 准则9:让每个程序都称为过滤器
准则1:小即是美
其实我一直有把车换成高尔夫 GTI 的冲动 —— 车小,性能还不错
其实这个和准则2(让每个程序只做好一件事)一致,“小”到什么程度呢?—— 小到只能做好一件事,这就够了。其他的事,交给其他的程序去做。书中讲到了小的好处:
- 易于理解和学习。如果你想要写出全世界都是用的程序,那这一点很重要,无论是大牛还是小白,都能轻松是用,才能推广开来。
- 易于维护。即便是自己写的代码,过半年自己都忘记当时写的是什么了,要考虑这一点。
- 消耗更少的资源。“小”到制作一件事,用多少就消耗多少,不做一点额外的开销和浪费。
- 更易于和其他工具结合。即可扩展性更好,符合开放封闭原则。
准则2:让每个程序只做好一件事
这个和准则1(小即是美)表达的意思一致,只做好一件事,说明足够小。越是大型的系统,这个原则越重要,否则越大就越乱。这让我联想到了一个哲学话题 —— 递弱代偿 —— 整体越复杂,个体就越简单、专一,通过相互补偿来完成整体功能。
书中列举了一个范例 —— ls
命令。ls
本来是很简单的一个命令,现在却搞的有 20 多个参数,而且正在逐步增加。这就使得ls
慢慢变成一个很庞大的命令,但我们日常 90% 的场景都使用它最简单的功能。理想的做法是,ls
还保持简洁的功能,另外开发新的命令来满足其他配置参数实现的功能。这就例如,cat
可查看全部内容,想看头或者尾,分别使用head
和tail
——这就分的清晰了。
准则3:快速建立原型
大教堂与集市,我们选择集市。
软件不是汽车,它可以每天都迭代更新,它可以今天发现有问题然后明天修复过来。而且,谁都无法预测它未来将会怎样变化,客户也无法通过语言清楚的描述他们需要的软件。基于以上所有原因,软件都需要先有原型,再不断慢慢完善,这也是一个降低风险、慢慢学习的过程。
- 永远不要自己猜测用户想要的软件
- 永远不要相信用户开始时描述的他们想要的软件
- 永远不要想一次做完永远不改
准则4:舍弃高效率而取可移植性
越高效的程序往往越不可移植,但是好的程序往往会被移植到各个地方使用 —— 从这里能看出,对于程序来说,最重要的是可移植性,而非高效。
至于效率问题,不用花费太多的精力去优化,它会很快因为硬件的更新而得到解决 —— 摩尔定律。
准则5:采用纯文本来存储数据
采用纯文本存储数据,可能没有二进制方式效率高,但是有以下好处:
- 方便转换格式:所有系统都支持文本编辑,而且文本的编码规范,业界都是统一标准的。但是对于二进制 —— 每个供应商都提供了自己的二进制编码,切相互不兼容
- 易于阅读和编辑:首先,文本格式人类一眼就认识;其次,可通过简单的工具进行编辑、编辑完直接保存无需转换;第三,文本格式非常适合 linux 中的管道(pipe)操作
- 易于系统处理:存储是文本格式,那么 linux 的标准输入输出就可以全部用文本格式,linux 的实用工具只处理文本格式即可。如
grep
diff
等
虽然效率不佳,但是可移植性好,而且易于阅读和操作,这些都是符合本书其他原则的。最后,效率不佳的问题,会通过明年硬件的升级而得到解决(摩尔定律)。
准则6:充分利用软件的杠杆效应(软件复用)
NIH —— Not Invent Here ,即要借用(或复用)现有的软件,而不是重造轮子
这个道理大家都明白,但是书中有两点我觉得很重要:
- 软件想要被复用,就得符合工业标准。第一,软件贡献者要熟悉标准;第二,软件使用者也要熟悉标准;第三,当某个软件在业界还没有标准的时候,要勇敢的去自己制定(如 jQuery)。
- 更多的人贡献软件,开源社区和开源文化很重要。
准则7:使用 shell 脚本来提高杠杆效应和可移植性
(这里感觉和 准则4 、准则6 重复了,大家觉得呢?)
准则8:避免强制性的用户界面
linux 系统中,GUI 都只是一个普通的软件而已,并不是强行和系统绑定的。如果软件有了强制性的用户界面,会带来各种各样的问题
- 强制要求用户是人类,但是一个软件的用户很可能不是人类
- 导致软件庞大,占用资源多
- 扩展性差
- 无法发挥杠杆效应
- ……
这种说法可能会和大家传统的意识产生冲突,但是大家仔细想一下这个道理,应该会明白这条原则的意义。
准则9:让每个程序都成为过滤器
程序不会创造数据,只有人类才会创造数据。因此,每个程序都仅仅是一个过滤器而已。
linux 的常用都是过滤器,例如ls | grep 'README.md'
,就是找出当前目录下的 README.md 文件。其中ls
grep
都是过滤器,过滤器就必须有:输入、输出。 这其实正好对应着 linux 的标准输入输出(stdio)—— stdin stdout stderr。书中简单介绍了 stdio,并不是很详细,我想找个地方单独详细写一下 stdio ,这里就此略过吧。
总结
其实书中最后还列出了一些其他的一些准则,例如允许用户自定义环境,使用小而精的内核,只寻求 90% 的解决方案,等等…… 虽然我们绝大部分读者都不会去开发操作系统,但是这些准则也同样适用于我们日常的软件开发。去详细了解和理解这些准备,会为我们的系统设计,系统扩展性提供非常大的帮助。
大家可以关注一下课程
共同学习,写下你的评论
评论加载中...
作者其他优质文章