《UNIX编程艺术》学习笔记
序 摘录
知识和专能差异巨大,凭借知识可以推断出该做什么,而专能让你甚至在无意之间,条件反射似的把事情做好。
这本书确实关于“知识”,但更着眼于”专能“。你将学到那些Unix专家们都不自知的Unix开发知识。少一点技术,多一些共享文化:显见和隐微的,直观和潜流的——这是本书和大多数Unix书籍不同的地方——不至于方法,更重乎理念。
理念于实用大有裨益,有太多设计不良的软件:体积臃肿,难于维护、移植和扩展——这些都是蹩脚设计的症候。我们希望本书读者能品出什么是Unix所教示的良好设计。
本书分为四部分:场景、设计、工具和社群。第一部分(场景)设计哲学和历史,为后续内容埋下伏笔。第二部分(设计)将Unix哲学的原理细分为有关设计和更细致的建议。第三部分(工具)着眼于Unix所提供的工具,可助你解决问题。第四部分(社群)则讲述人与人之间的事物和约定,而这正是Unix文化拥有高效能的原因。
第一部分 场景
1.1 哲学
Unix哲学的一个特性(由Xwindow设计者首先明确提出):提供一套机制,而不是策略。
Unix的遗风:原本是为技术人员设计的操作系统;同时也表明设计的信念:最终用户永远比操作系统设计人员更清楚他们究竟需要什么。
Unix之得:开源软件、跨平台可移植性和开放标准、Internet和万维网、开源社区、灵活性(Unix提供众多的程序粘合手段,这意味着Unix基本工具箱的各种组件连纵开合后,将收到单个工具设计者无法想象的功效)、Hack之趣
Unix哲学基础:K.I.S.S :Keep It Simple,Stupid!
- 模块原则:使用简洁的接口拼合简单的部件。
- 清晰原则:清晰胜于机巧。
- 组合原则:设计时考虑拼接组合。
- 分离原则:策略同机制分离,接口同引擎分离。
- 简洁原则:设计要简洁,复杂度能低则低。
- 吝啬原则:除非确无它法,不要编写庞大的程序。
- 透明性原则:设计要可见,以便审查和调试。
- 健壮原则:健壮源于透明与简洁。
- 表示原则:把知识叠入数据以求逻辑质朴而健壮。
- 通俗原则:接口设计避免标新立异。
- 缄默原则:如果一个程序没什么好说的,就沉默。
- 补救原则:出现异常时,马上退出并给出足够错误信息。
- 经济原则:宁花机器一分,不花程序员一秒。
- 生成原则:避免手工hack,尽量编写程序去生成程序。
- 优化原则:雕琢前先要有原型,跑之前先学会走。
- 多样原则:决不相信所谓“不二法门”的断言。
- 扩展原则:设计着眼未来,未来总比预想来得快。
1.2 历史
起源及历史:1969-1995
-
创世纪:1696-1971
-
出埃及记:1971-1980
-
TCP/IP和Unix内战:1980-1990
1.3 对比
操作系统最重要的不同之处
1、操作系统的统一性理念
如UNIX上“一切皆文件”模型及在此基础上建立的管道概念。总的来说,任何特定操作系统的开发风格均受到系统设计者灌注其中的统一性理念的强烈影响——由系统工具和API塑造的模型将反渗到应用编程中。
2、多任务能力:Unix系统拥有抢先式多任务的能力。 多任务和多用户不是一回事。
3、协作进程:UNIX的IPC(进程间通信方式)很灵活。
4、内部边界: Unix是相信程序员的,但是程序员不能破坏其他人的数据,所以Unix设立了内部边界来防范恶意用户或者有缺陷的程序。
5、文件属性和记录结构
6、二进制文件格式
7、首选用户界面风格:CLI、GUI
8、目标受众
9、开发的门槛:Unix将编译器和脚本工具放在默认安装中,支持了一种跨越众多机器的玩家开发文化。
第二部分 设计
1、模块性:保持清晰,保持简洁
2、文本化:好协议产生好实践
- 设计将应用数据存储在永久存储器中的文件格式,和在协作程序中(可能会通过网络)传递数据和命令的应用协议
- 设计文件格式和应用协议需要考虑的重要方面:互用性、透明性、可扩展性以及经济型
- 应用协议如果是文本格式的,凭肉眼可以很容易地分析,很多事情变得容易。可以看看SMTP、POP3和IMAP三种经典的应用协议
3、透明性
- 如果实际上能够预测到程序行为的全部或大部分情况,这个程序就是透明的
- 如果程序可以帮助人们建立“做什么、怎样做”,这个软件系统就是可显的。比如对用户来说,文档有助于可显性; 对程序员而言,好的命名规范有助于提高可显性。
- 要追求代码的透明,最有效的方法很简单,就是不要在具体操作的代码上叠放太多的抽象层。
4、多道程序设计:分离进程为独立的功能
5、微型语言
- UNIX班有个长期传统,存在小型的、为专门应用领域特制、大量减少程序行数的语言。 比如无数Unix排版语言(troff/pic)、shell使用程序(awk/sed/dc/bc)和软件开发工具(make/yacc/lex等)。 微型语言与脚本语言之间的界限都很模糊。
6、生成:提升规格说明的层次
- 数据比程序逻辑更易驾驭
- 数据驱动编程,将代码和数据结构划分清楚,在改变程序逻辑时,只要改变数据结构而不用修改代码
- 专用代码的生成,比如用工具生成HTML代码。尽可能少干活,建设性的懒惰是大师级程序员的基本美德之一
7、配置:环境配置
8、接口:Unix环境下的用户接口设计模式
- 与其他程序通讯方式的前瞻性;最小立异原则
9、优化
10、复杂度
第三部分 工具
3.1 语言
-
C和C++的中心问题在于它们要求程序员自己完成内存管理——声明变量、显式管理链表、设置缓冲大小、检测或防止缓冲溢出,以及分配和回收动态存储。
-
C语言很厉害、很经济。但是要求程序员自己完成内存管理,很复杂,并且随着硬件设备的性能提升,主要瓶颈集中在I/O事件等待、网络延迟以及缓存列填充等限制上,所以Python、Java等语言慢慢兴起。
C、C++、shell、perl、tcl、python、java、emacs lisp
3.2 工具
编辑器:vi、emacs
专用代码生成器:yacc、lex
编译:gcc、make
3.3 重用
不要重新发明轮子
第四部分 社群
可移植性:软件可移植性与遵循标准
文档规划
开放源码
个人总结
这是一本讲述UNIX文化和哲学的书,通过UNIX历史和UNIX程序实例揭示了UNIX强劲生命力的来源、设计哲学。理念至上,需要深度使用、开发过UNIX才能理解表述的UNIX的设计理念。