《UNIX编程艺术》读书笔记
最近这段时间比较忙,利用业余时间看完了这本书。虽然书中讲到的很多例子都是上古文物,我没有用过,不过原理都是相通的,对我的启发很大。比如无所不在的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编程艺术》读书笔记的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- FlatUI博皮制作
Bootstrap3出来了,抛开内部框架结构和css命名的变化,bs3最大的改变莫过于扁平化. 扁平化UI中的典范,除了Metro,就是Flat了.目前本人FlatUI中毒中,于是开始慢慢的开始将博皮 ...
- Ubuntu目录
1. java.io.FileNotFoundException: ***(Too many open files) 2. 在Ubuntu 12.04 桌面上设置启动器(快捷方式) 3. 解决Ubun ...
- 如何保护你的linux操作系统
如何保护你的linux操作系统 导读 在现在这个世道中,Linux操作系统的安全是十分重要的.但是,你得知道怎么干.一个简单反恶意程序软件是远远不够的,你需要采取其它措施来协同工作.那么试试下面这些手 ...
- kafka的一些名词
broker.id 区kafka集群中每台机器的标识 log.dirs 日志的存放目录,这个最好不要放到/tmp目录下,因为kafka的已被消费和未被消费的数据也被当成“日志”存放到了日志目录,: l ...
- spark1.2.0安装
standalone 安装SCALA 下载.解压.加入环境变量 安装spark1.2.0 下载.解压.加入环境变量 tar zxvf spark--bin-.tgz export SPARK_HOME ...
- Sql 使用备份还是使用脚本
对sql使用并不熟悉,但是通过项目接触总结出的经验 什么样的场景下选择使用脚本或者备份: 1:当需要创建相关的库的时候使用脚本 2:当需要还原至某个时间点的状态的或者前进至某个版本的数据库的时候就使用 ...
- Redis客户端Java服务接口封装
最近在学习Redis并集成到Spring中去,发现Spring的RedisTemplate并不好用,还没有MongoTemplate好用. 而且发现Jedis和ShardedJedis的方法非常多,覆 ...
- 1.4.8 拼凑在一起(putting the pieces together)
putting the pieces together 在最高的级别,schema.xml结构如下, <schema> <types> <fields> <u ...
- 3. Android框架和工具之 xUtils(BitmapUtils)
1. BitmapUtils 作用: 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象: 支持加载网络图片和本地图片: 内存管理使用 ...
- uva 10474 Where is the Marble? 计数排序
题目给出一系列数字,然后问哪个数字是从小到大排在第几的,重复出现算第一个. 数据范围为10000,不大,完全可以暴力,sort不会超时. 但是由于以前做比赛时也遇到这种题目,没注意看数据范围,然后暴力 ...