本文主要是 《UNIX编程艺术》的摘录,摘录的主要是我觉得对从事软件开发有用的一些原则。

对于程序员和开发人员来说,如果完成某项任务所需要付出的努力对他们是个挑战却又恰好还在力所能及的范围内,他们就会觉得很有乐趣。

UNIX的设计哲学是:一个程序只做一件事,并做好。程序要能协作,程序要能处理文本流,因为这是最通用的接口。

UNIX设计的原则:

  • 模块原则,使用简洁的接口拼合简单的部件;

  • 清晰原则,清晰胜于技巧;

  • 组合原则,设计时考虑拼接组合;

  • 分离原则,策略同机制分离,接口同引擎分离;

  • 简洁原则,设计要简洁,复杂度能低就低;

  • 吝啬原则,除非别无他法,不要编写庞大的程序;

  • 透明性原则,设计要可见,以便审查和调度;

  • 健壮原则,健壮源于透明和简洁;

  • 表示原则,把知识叠入数据以求逻辑的质朴而健壮;

  • 通俗原则,接口设计避免标新立异;

  • 缄默原则,如果一个程序没什么好说的,就缄默;

  • 经济原则,宁花机器一分,不花程序员一秒;

  • 补救原则,出现异常时,马上退出并给出足够的错误信息;

  • 生成原则,避免手工hack,尽量编写程序去生成程序;

  • 优化原则,雕琢前先要有原型,跑之前先学会走;

  • 多样原则,决不相信不二法门;

  • 扩展原则,设计着眼未来,未来总比预想来得快

罗马在燃烧,而我们还在拉小提琴;

GCC

GCC由一系列处理阶段组成,并由一个驱动程序将其紧密结合在一起。它们是预处理器、解析器、代码生成器、汇编器和链接器;

为透明性和可显性而编码

要追求代码的透明,最有效的方法很简单,就是不要在具体操作的代码上叠放太多的抽象层;

在设计良好的代码时,需要考虑以下几个问题:

  • 程序调用层次中最大的静态深度是多少?也就是说,不考虑递归,为了建立心理模型来理解代码的操作,人们将要调用多少层;

  • 代码是否具有强大、明显的不变性质;

  • 每个API中各个函数调用是否正交;

  • 是否存在一些顺手可用的关键数据结构或全局唯一的记录器;

  • 程序的数据结构或分类和它们所代表的外部实体之间,是否存在清晰的一对一映射;

  • 是否容易找到给定函数的代码部分;

  • 代码增加了特殊情况还是避免了特殊情况?每一个特殊情况可能对任何其它特殊情况产生影响;

  • 代码中有多少个 magic number(意义含糊的常量)?

代码能简单最好。但如果代码很好地解决了上述问题,则代码也可以复杂;

如果希望让代码成为活代码,则最有效的时间花费方法之一就是投入精力使代码具备可维护性

7. 多道程序设计--分离进程为独立的功能

7.1 IPC方法的分类

  • 临时文件;

  • 信号;

  • 套接字;;

  • 共享内存;在现代Unix中,共享内存的实现通常依靠 mmap

shell 脚本的惯例是在临时文件名中包含“$$”符号,这样这个 shell变量将被展开为载入 shell的进程ID,从而保证文件名的唯一性,避免程序中多个实例都使用同一个名字带来的冲突;

8. 微型语言,寻找歌唱的乐符

Unix的 makefile 是为了自动化编译过程而设计的,表达了源文件和派生文件之间的依赖关系以及从各个源文件生成派生文件所需要的命令。

m4

m4 宏处理程序解释描述文件转换的声明性微型语言。一个 m4 程序就是一套宏命令集,规定了将文本串扩展成其它字符串的形式。

10. 迈出正确的第一步

传统上,一个 Unix 程序可以在启动环境的五个地方寻找控制信息:

  • /etc 下的运行控制文件;

  • 由系统设置的环境变量;

  • 用户主目录中的运行控制文件;

  • 由用户设置的环境变量;

  • 启动程序的命令行所传递的开关和参数;

11 接口

在 Unix 接口设计的传统中,我们会反复涉及到两个主题:

  • 与其它程序通讯的前瞻性设计;

  • 最小立异原则;

11.1 接口设计评估

使用五种度量标准对接口风格进行分类:

  • 简洁: 一个事务处理需要的动作时间及复杂度有较低的上限;

  • 表现力: 接口可以触发相当广泛的行为;

  • 易用:与要求用户记忆的东西成反比;

  • 透明:用户在使用接口时,几乎没有什么问题、数据或程序的相关状态需要记忆,一个高度透明的接口,对于用户动作的效果,能够自然在给出中间结果、有用反馈和错误通知。

  • 脚本化能力 : 接口能够容易地为其它程序所使用;

11.2 过滤器设计

定义过滤器的一些原则:

  • 宽进严出,尽可能自由宽松地接受输入格式,并输出结构良好的严谨输出格式;

  • 在过滤时,不需要的信息也决不丢弃;

  • 在过滤时,决不增加无用数据

12 优化

过早优化乃万恶之源;

  • 先估量再优化;

  • 吞吐量和延迟;

12.1 吞吐量和延迟

快速处理器的另一个效应是性能经常受限于 I/O 以及网络程序--网络事务的开销。因此为得到良好性能而进行网络协议的设计是非常有价值的。

最重要的问题是尽量避免协议的往返。每个要求握手的协议事务都有可能从任何连接延迟发展到潜在的严重降速。经验法则是:尽可能低的时延设计和忽略带宽成本,

有三种常规的策略来减小时延:

  • 对可以启动共享开销的事务进行批处理;

  • 允许事务重叠;

  • 缓存;

14 C 还是非 C

14.1 语言评估

我们不仅应该具备相当数量的多种语言应用知识,并且还必须能够判断这些语言在什么地方最合适、以及怎样把它们组合在一起的经验;

14.1.1 C

要求速度快并且具有实时需求的程序,或者与 OS 内核紧密联系的程序非常适合用 C

编写;

C 语言最佳之处是资源效率和接近机器语言。而最糟糕的地方是其编程简直就是资源管理的炼狱;

14.1.2 C++

对身后兼容 C 的要求迫使 C++ 在设计 中做出了许多妥协。这个要求也阻碍了 C++完全自动化动态内存管理,从而无法解决 C 最严重的问题。 近年来,C++已经包含了一些重要的非 OO 的概念:具有和 Lisp 类似的异常; STL 提供了泛型编程;

高效的编译语言;对 C 的向上兼容,面向对象的平台,STL 和泛型等最前沿的技术工具——C++ 试图满足所有人的要求,但代价是C++ 比任何一个程序员所能处理的复杂度都高。

总结: C++ 的最佳之处是编译效率以及面对对象和泛型编程的结合。最糟之处是它非常怪异复杂,往往鼓励过分复杂的设计;

14.1.3 Python

Python 是一种脚本语言,设计本意是与 C 语言紧密集成。它既可以从动态载入的 C库程序中接收数据也可以向其传输数据,它也能在 C 中作为嵌入脚本语言调用;

Python 语言的设计非常优雅,具有非常出色的模块化特性;

**总结 : ** Python 的最佳之处在于它鼓励清晰、易读的代码,易学易用,又能够扩展到大型项目。最糟之处在于它效率低下、速度缓慢。

14.1.4 Java

Java 语言的设计目标是:"write once,run anywhere(一次编写,到处运行)"。Java 设计聪明地抓住了自动管理内存的优势,也抓住了支持 OO 设计这一优点。Java 保留了大量的类 C 语法,大多数程序员对此感觉非常舒服。

**总结 : ** 对于除系统编程以及大多数速度关键的应用程序外的一切编程而言,Java 比 C++高级

成为标准的最好方法就是发布一个高质量的开源实现;

UNIX编程艺术的更多相关文章

  1. 转《UNIX编程艺术》读书心得

    花了一段时间看完了<UNIX编程艺术>,但不是看得特别仔细,尤其是后面作者通过对工具的讲解来阐述其设计思想,因为很多工具能未曾接触过,难免就会产生一些乏味的感觉.其实就像译者姜宏在译序里说 ...

  2. 读《UNIX编程艺术》一感

    我记得早在2006年的时候就开始频繁使用awk做文本处理方面的工作,07年的时候周围有人用perl,我还感到很不解,觉得写得很复杂,没有awk one liner 那么方便和神奇.一直在了解awk的具 ...

  3. 《Unix编程艺术》读书笔记(1)

    <Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...

  4. 《UNIX编程艺术》读书笔记

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

  5. Unix编程艺术札记版本

    这本书是一位面试官告诉我,.非常感谢他的忠告.面试的说明.我写后认为,足.一方面是面试的技巧.另一方面就是学习的方法. 阅读这本书非常享受,加上之前的积累,一些疑惑,另一些基础的不足,在这本书里找 ...

  6. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  7. 学习linux/unix编程方法的建议(转)

    假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高从安装使用=>linux常用命令=>linux ...

  8. JavaScript DOM 编程艺术·setInterval与setTimeout的动画实现解析

    先贴上moveElement()函数的大纲,为了方便观看,删了部分代码,完整版粘到文章后面. function moveElement(elementID,final_x,final_y,interv ...

  9. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

随机推荐

  1. C#LeetCode刷题,走进Google,走近人生

    概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/1015 访问. 本系列博文将会向大家展示我在LeetCode上的刷 ...

  2. Windows下 Navicat Premium 15安装教程(图文,含注册)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/zhangzhicheng1996/ ...

  3. 【Floyd】珍珠

    [题目描述] 有n颗形状和大小都一致的珍珠,它们的重量都不相同.n为整数,所有的珍珠从1到n编号.你的任务是发现哪颗珍珠的重量刚好处于正中间,即在所有珍珠的重量中,该珍珠的重量列(n+1)/2位.下面 ...

  4. markdown插入表情

    找到了一个网站https://www.webfx.com/tools/emoji-cheat-sheet/,直接把表情对应的符号复制粘贴就行了. 比如:joy:显示为 部分截图:

  5. 操作系统-I/O(1)设备控制器

    I/O设备通常是物理上相互独立的设备,它们一般通过通信总线(电缆)与I/O控制器连接. 例如,图中IDE接口是通信总线而非I/O总线. I/O控制器(I/O接口)在扩展卡或者南桥芯片内,通过I/O总线 ...

  6. Word Count(C语言)

    1.项目地址 https://github.com/namoyuwen/word-count 2.项目相关要求 2.1 项目描述 Word Count    1. 实现一个简单而完整的软件工具(源程序 ...

  7. HM16.0 TAppEncoder

    参考:  https://www.cnblogs.com/tiansha/p/6458573.html https://blog.csdn.net/liangjiubujiu/article/deta ...

  8. 牛客网PAT练兵场-福尔摩斯的约会

    题目地址:https://www.nowcoder.com/pat/6/problem/4040 题意:模拟题,循环找相同的字母,但是注意题目的坑 /** * *作者:Ycute *时间:2019-1 ...

  9. 前端Web APIs 二

    day04 - Web APIs 学习目标: 能够说出常用的3-5个键盘事件 能够知道如何获取当前键盘按下的是哪个键 能够知道浏览器的顶级对象window 能够使用window.onload事件 能够 ...

  10. 焦大:seo思维光年(中)seo体系化

    http://www.wocaoseo.com/thread-56-1-1.html 光年的seo培训一直被业界公认为高端的培训,其主导的seo数据化一直对现在很多人的影响至深,比如我自己.但是也有人 ...