最近这段时间比较忙,利用业余时间看完了这本书。虽然书中讲到的很多例子都是上古文物,我没有用过,不过原理都是相通的,对我的启发很大。比如无所不在的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. [Oracle] - 性能优化工具(2) - ASH

    ASH和AWR的关系 ASH以V$SESSION为基础,每秒採样一次,记录活动会话等待的事件.不活动的会话不会採样,採样工作由新引入的后台进程MMNL来完毕. ASH内存记录数据始终是有限的,为了保存 ...

  2. MySQL中部分系统变量介绍

      have_symlink                             DISABLED                                   YES 用以支持在表定义中指 ...

  3. 索引节点inode

    在Linux的文件系统中,索引节点是文件的标识,并且这个值是唯一的,两个不同的文件的索引节点值是不同的,索引节点相同的文件它们的内容是相同的,仅仅文件名不同.修改两个索引节点值相同的文件中的一个文件, ...

  4. jQuery的如何捕捉回车键,改变事件标签

    我希望有一个jQuery的解决方案,我必须接近,有什么需要做的? $('html').bind('keypress', function(e) { if(e.keyCode == 13) { retu ...

  5. C# mvc--EF中查询的本质

    UI层我直接用了窗体程序. 好了 不罗嗦 直接上代码…… private void button1_Click(object sender, EventArgs e) { //1.0创建EF上下文容器 ...

  6. 【源码】初探C#爬虫,持续更新中。。。

       最近看到园子里有人用python做的爬虫软件并且上传的源码,苦于不懂python,便想着用C#也实现一个简易的爬虫软件.于是昨晚花了一个多小时的时间实现了一个简单的爬虫软件,功能十分简单,但是觉 ...

  7. AJAX全套

    AJAX概述 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 Java ...

  8. html&css&js随笔-问题集锦

    1.IE6/7不支持display:inline_block属性:(解决办法) ;*display:inline;} 给元素增加*zomm和*display即可: 2.IE监听事件与W3C标准不一致: ...

  9. nginx 反向代理设置

    假设对本机80端口的访问为一台服务器,对本机8000端口的访问为另一台服务器,下面这样写一个nginx的反向代理配置,就可以实现所有请求都转移 server {listen 0.0.0.0:80;se ...

  10. linux中crontab和at

    1. Red Hat的发行版本中,通常还可以使用工具ntsysv设置服务的自启动状态. #类似chkonfig 服务名 on|off 2.系统服务脚本目录:/etc/init.d 3.ps: -a:显 ...