最近这段时间比较忙,利用业余时间看完了这本书。虽然书中讲到的很多例子都是上古文物,我没有用过,不过原理都是相通的,对我的启发很大。比如无所不在的KISS原则,实践中慢慢体会到的SPOT原则,无不产生共鸣。下面是这些原则的一些笔记和个人理解。

1. 模块原则

为什么要模块化?计算机编程的本质就是控制复杂度。而模块化可以降低整体复杂度,即使出现问题也只是局限于局部,方便维护。

紧凑性和正交性是模块化的两个重要特性。对于现代项目来说,跨度一般都很大,完全达到紧凑性是非常困难的,只能尽量采用。

正交性是指程序中每个动作有且只有一个方法,正交性的程序不但会减少程序中的副作用,而且从另一个方面达到紧凑性。SPOT(single point of truth)是指任何知识点在系统内应当只有一个唯一明确权威的表述。不要重复自身。重复会导致前后矛盾。重构的原则性目标就是提高正交性。

2. 清晰原则

所谓大巧不工,重剑无锋。程序的清晰性比奇技淫巧更重要。选择算法和实现时应考虑可扩展性和可维护性,复杂的bug容易产生bug,难以阅读维护。同时在项目中养成注释代码的良好习惯。

3. 分离原则:

策略同机制分离,接口同引擎分离。策略是易变的,灵活的;机制是稳定的。策略与机制混在一起会有两个负面作用:1.使策略死板,难以适应用户需求变化。2.任何策略的改变都极有可能动摇机制。而分离开来可以在探索新策略时不去改变已有机制。

实现策略与机制分离的常用方法就是用脚本语言驱动的c语言实现机制,打包成库。整个应用程序的控制流程则有脚本语言来控制,这就是策略。比如我们公司的产品就是策略机制分离的典型应用。底层引擎由c和c++实现,lua做接口,上层流程用lua脚本实现,用户可以在一定范围内自己设计流程。

不过上层策略和下层机制分离并没有那么容易,不管是从上到下还是从下到上的设计方向都有弊端。当上层的策略与下层的机制产生冲突时就可能需要中间胶合层来匹配。胶合层应该尽可能薄,薄胶合层是分离原则的升华。C语言是薄胶合层的典型范例,而面向对象语言则属于厚胶合层,特别是继承层数太多时,会严重增加复杂度。

4. 简洁原则

出现越复杂,产生bug的概率就越高,排错也越困难。以简洁为美,拒绝花哨臃肿的程序。Keep it simple, stupid!

5. 透明性原则

透明性是针对程序的行为而言的,如果程序行为在一定程度上可以预测,那么程序就是透明的。可显性指的是程序的功能很清楚,容易明白做了什么,怎么做的。比如Linux内核具有透明性,我们知道具有什么行为,但是不具有可显性,因为源码太复杂难懂了。

6. 健壮原则

健壮性指程序不仅在正常情况下运行良好,而且在超出设计者设想的意外条件下也能运行良好。尽量让程序的内部逻辑更易于理解,使其透明化和简洁化,最好避免程序出现过多特例和边界条件。

7. 表示原则

数据比代码逻辑更清楚明了,设计时主动将代码的复杂度转移到数据中去,选择偏于维护和操作的数据。数据驱动编程是unix编程的重要组成部分。

8. 通俗原则

接口设计避免标新立异。最易用的程序就是用户需要学习东西最少的程序,一定避免表面相似但内部却不同的情况,比如重载函数内部行为变化太大。

9. 缄默原则

设计良好的程序将用户的注意力视为有限的宝贵资源。信息内容应该符合最大惊奇原则,只对确实是异常的情况加以说明。如果调试需要,可以添加多级开关,发布时启用最高级别开关。

10. 补救原则

出现异常时,马上退出并给出足量错误信息。软件在发生错误时如果没有及时发现,将会埋下严重的隐患。软件应该能够从容应付各种错误,如果做不到,就应该明确终止。有些时候程序不应该去容错,比如输入为空时最好直接退出并保留恢复机制和错误信息,处理输入后再重启,而不是检查输入是否为空,当数据出现问题却恰好不为空时将会产生非常隐晦的错误。

11. 优化原则

过早优化是万恶之源。先制作原型,再精雕细琢,优化之前先确保能用,不要为蝇头小利投入过量时间。

《UNIX编程艺术》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. IOS UIView子类UIScrollView

    转自:http://www.cnblogs.com/nightwolf/p/3222597.html 虽然apple在IOS框架中提供了很多可以直接使用的UI控件,但是在实际开发当中我们通常都是要自己 ...

  2. 果然还是SB了

    编译原理的龙书和虎书,各看了两章之后,¥……&……*……@%¥ 好吧,既然是码农,就要从基层做起,我尝试handwritten一下C或者C的极小子集的one-pass编译器先,等有了深切的体会 ...

  3. excel,access常用公式函数VBA代码汇总文章

    批量将CSV导入access alt+f11 打开access的vbe环境 Sub test() Dim SQL As String Dim MyPath As String Dim MyPathDb ...

  4. api 翻译之AsyncTask

    AsyncTask 类的简介: AsyncTask可以使UI线程更合理更简单的使用.这个类允许执行后台操作,而且可以在不使用多线程或handlers的情况下给主线程传输数据. 异步任务 被定义为在后台 ...

  5. find中的 time 参数

    find手册中对time的解释:以 atime 为例: -atime n File was last accessed n*24 hours ago. When find figures out ho ...

  6. sourcetree下回退

    上篇 最后展示了再命令行下回退的功能,再来看看sourcetree下如何操作 新建 新建文本文档.txt,添加一行"第一次“,并提交 1.添加一行"第二次",现在修改只在 ...

  7. jQuery选择器之表单对象属性过滤选择器Demo

    测试代码: 08-表单对象属性过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  8. ARM嵌入式整理

    填空 1指令含义 列出文件列表的ls命令 切换目录的cd命令 创建目录的mkdir命令 删除目录的rmdir命令 复制文件的cp命令 删除文件或目录的rm命令 让显示画面暂停的more命令 连接文件的 ...

  9. BZOJ 3043

    Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一.问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最 ...

  10. MacOS显示和不显示隐藏文件

    defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder //显示隐藏文件 defaults wr ...