序 xxv
part i 1
第1章 哲學 3
1.1 文化?什麼文化 3
1.2 unix的生命力 4
1.3 反對學習unix文化的理由 5
1.4 unix之失 6
1.5 unix之得 7
1.5.1 開源軟件 7
1.5.2 跨平颱可移植性和開放標準 8
1.5.3 internet和萬維網 8
1.5.4 開源社區 9
1.5.5 從頭到腳的靈活性 9
1.5.6 unix hack之趣 10
1.5.7 unix的經驗彆處也可適用 11
1.6 unix哲學基礎 11
1.6.1 模塊原則:使用簡潔的接口拼閤簡單的部件 14
1.6.2 清晰原則: 清晰勝於機巧 14
1.6.3 組閤原則:設計時考慮拼接組閤 15
1.6.4 分離原則: 策略同機製分離,接口同引擎分離 16
.1.6.5 簡潔原則:設計要簡潔,復雜度能低則低 17
1.6.6 吝嗇原則: 除非確無它法,不要編寫龐大的程序 18
1.6.7 透明性原則:設計要可見,以便審查和調試 18
1.6.8 健壯原則: 健壯源於透明與簡潔 18
1.6.9 錶示原則: 把知識疊入數據以求邏輯質樸而健壯 19
1.6.10 通俗原則:接口設計避免標新立異 20
1.6.11 緘默原則:如果一個程序沒什麼好說的,就保持沉默 20
1.6.12 補救原則: 齣現異常時,馬上退齣並給齣足量錯誤信息 21
1.6.13 經濟原則: 寜花機器一分,不花程序員一秒 22
1.6.14 生成原則: 避免手工hack,盡量編寫程序去生成程序 22
1.6.15 優化原則: 雕琢前先得有原型,跑之前先學會走 23
1.6.16 多樣原則:決不相信所謂“不二法門”的斷言 24
1.6.17 擴展原則: 設計著眼未來,未來總比預想快 24
1.7 unix哲學之一言以蔽之 25
1.8 應用unix哲學 26
1.9 態度也要緊 26
第2章 曆史——雙流記 29
2.1 unix的起源及曆史,1969-1995 29
2.1.1 創世紀:1969-1971 30
2.1.2 齣埃及記:1971-1980 32
2.1.3 tcp/ip 和unix內戰:1980-1990 35
2.1.4 反擊帝國:1991-1995 41
2.2 黑客的起源和曆史:1961-1995 43
2.2.1 遊戲在校園的林間:1961-1980 44
2.2.2 互聯網大融閤與自由軟件運動:1981-1991 45
2.2.3 linux 和實用主義者的應對:1991-1998 48
2.3 開源運動:1998年及之後 49
2.4 unix的曆史教訓 51
第3章 對比: unix哲學同其他哲學的比較 53
3.1 操作係統的風格元素 53
3.1.1 什麼是操作係統的統一性理念 54
3.1.2 多任務能力 54
3.1.3 協作進程 55
3.1.4 內部邊界 57
3.1.5 文件屬性和記錄結構 57
3.1.6 二進製文件格式 58
3.1.7 首選用戶界麵風格 58
3.1.8 目標受眾 59
3.1.9 開發的門坎 60
3.2 操作係統的比較 61
3.2.1 vms 61
3.2.2 macos 64
3.2.3 os/2 65
3.2.4 windows nt 68
3.2.5 beos 71
3.2.6 mvs 72
3.2.7 vm/cms 74
3.2.8 linux 76
3.3 種什麼籽,得什麼果 78
part ii 81
第4章 模塊性:保持清晰,保持簡潔 83
4.1 封裝和最佳模塊大小 85
4.2 緊湊性和正交性 87
4.2.1 緊湊性 87
4.2.2 正交性 89
4.2.3 spot原則 91
4.2.4 緊湊性和強單一中心 92
4.2.5 分離的價值 94
4.3 軟件是多層的 95
4.3.1 自頂嚮下和自底嚮上 95
4.3.2 膠閤層 97
4.3.3 實例分析:被視為薄膠閤層的c語言 98
4.4 程序庫 99
4.4.1 實例分析:gimp插件 100
4.5 unix和麵嚮對象語言 101
4.6 模塊式編碼 103
第5章 文本化:好協議産生好實踐 105
5.1 文本化的重要性 107
5.1.1 實例分析:unix口令文件格式 109
5.1.2 實例分析:.newsrc格式 110
5.1.3 實例分析:png圖形文件格式 111
5.2 數據文件元格式 112
5.2.1 dsv 風格 113
5.2.2 rfc 822 格式 114
5.2.3 cookie-jar格式 115
5.2.4 record-jar格式 116
5.2.5 xml 117
5.2.6 windows ini 格式 119
5.2.7 unix文本文件格式的約定 120
5.2.8 文件壓縮的利弊 122
5.3 應用協議設計 123
5.3.1 實例分析:smtp,一個簡單的套接字協議 124
5.3.2 實例分析:pop3,郵局協議 124
5.3.3 實例分析:imap,互聯網消息訪問協議 126
5.4 應用協議元格式 127
5.4.1 經典的互聯網應用元協議 127
5.4.2 作為通用應用協議的http 128
5.4.3 beep:塊可擴展交換協議 130
5.4.4 xml-rpc,soap和jabber 131
第6章 透明性:來點兒光 133
6.1 研究實例 135
6.1.1 實例分析:audacity 135
6.1.2 實例分析:fetchmail的–v選項 136
6.1.3 實例分析:gcc 139
6.1.4 實例分析:kmail 140
6.1.5 實例分析:sng 142
6.1.6 實例分析:terminfo數據庫 144
6.1.7 實例分析:freeciv數據文件 146
6.2 為透明性和可顯性而設計 148
6.2.1 透明性之禪 149
6.2.2 為透明性和可顯性而編碼 150
6.2.3 透明性和避免過度保護 151
6.2.4 透明性和可編輯的錶現形式 152
6.2.5 透明性、故障診斷和故障恢復 153
6.3 為可維護性而設計 154
第7章 多道程序設計: 分離進程為獨立的功能 157
7.1 從性能調整中分離復雜度控製 159
7.2 unix ipc 方法的分類 160
7.2.1 把任務轉給專門程序 160
7.2.2 管道、重定嚮和過濾器 161
7.2.3 包裝器 166
7.2.4 安全性包裝器和bernstein鏈 167
7.2.5 從進程 168
7.2.6 對等進程間通信 169
7.3 要避免的問題和方法 176
7.3.1 廢棄的unix ipc方法 176
7.3.2 遠程過程調用 178
7.3.3 綫程——恐嚇或威脅 180
7.4 在設計層次上的進程劃分 181
第8章 微型語言:尋找歌唱的樂符 183
8.1 理解語言分類法 185
8.2 應用微型語言 187
8.2.1 案例分析:sng 187
8.2.2 案例分析:正則錶達式 188
8.2.3 案例分析:glade 191
8.2.4 案例分析:m4 193
8.2.5 案例分析:xslt 194
8.2.6 案例分析:the documenter's workbench tools 195
8.2.7 案例分析:fetchmail的運行控製語法 199
8.2.8 案例分析:awk 200
8.2.9 案例分析:postscript 202
8.2.10 案例分析:bc和dc 203
8.2.11 案例分析:emacs lisp 205
8.2.12 案例分析:javascript 205
8.3 設計微型語言 206
8.3.1 選擇正確的復雜度 207
8.3.2 擴展和嵌入語言 209
8.3.3 編寫自定義語法 210
8.3.4 宏—慎用 210
8.3.5 語言還是應用協議 212
第9章 生成:提升規格說明的層次 215
9.1 數據驅動編程 216
9.1.1 實例分析:ascii 217
9.1.2 實例分析:統計學的垃圾郵件統計 218
9.1.3 實例分析:fetchmailconf中的元類改動 219
9.2 專用代碼的生成 225
9.2.1 實例分析:生成ascii顯示的代碼 225
9.2.2 實例分析:為列錶生成html代碼 227
第10章 配置:邁齣正確的第一步 231
10.1 什麼應是可配置的 231
10.2 配置在哪裏 233
10.3 運行控製文件 234
10.3.1 實例分析:.netrc文件 236
10.3.2 到其它操作係統的可移植性 238
10.4 環境變量 238
10.4.1 係統環境變量 238
10.4.2 用戶環境變量 240
10.4.3 何時使用環境變量 240
10.4.4 到其它操作係統的可移植性 242
10.5 命令行選項 242
10.5.1 從–a到–z的命令行選項 243
10.5.2 到其它操作係統的可移植性 248
10.6 如何挑選方法 248
10.6.1 實例分析:fetchmail 249
10.6.2 實例分析:xfree86服務器 251
10.7 論打破規則 252
第11章 接口:unix環境下的用戶接口設計模式 253
11.1 最小立異原則的應用 254
11.2 unix接口設計的曆史 256
11.3 接口設計評估 257
11.4 cli和可視接口之間的權衡 259
11.4.1 實例分析:編寫計算器程序的兩種方式 262
11.5 透明度、錶現力和可配置性 264
11.6 unix接口設計模式 266
11.6.1 過濾器模式 266
11.6.2 cantrip模式 268
11.6.3 源模式 268
11.6.4 接收器模式 269
11.6.5 編譯器模式 269
11.6.6 ed模式 270
11.6.7 roguelike 模式 270
11.6.8 “引擎和接口分離”模式 273
11.6.9 cli服務器模式 278
11.6.10 基於語言的接口模式 279
11.7 應用unix接口設計模式 280
11.7.1
11.8 網頁瀏覽器作為通用前端 281
11.9 沉默是金 284
第12章 優化 287
12.1 什麼也彆做,就站在那兒 287
12.2 先估量,後優化 288
12.3 非定域性之害 290
12.4 吞吐量和延遲 291
12.4.1 批操作 292
12.4.2 重疊操作 293
12.4.3 緩存操作結果 293
第13章 復雜度:盡可能簡單,但彆簡過瞭頭 295
13.1 談談復雜度 296
13.1.1 復雜度的三個來源 296
13.1.2 接口復雜度和實現復雜度的摺中 298
13.1.3 必然的、可能的和偶然的復雜度 299
13.1.4 映射復雜度 300
13.1.5 當簡潔性不能勝任 302
13.2 五個編輯器的故事 302
13.2.1 ed 304
13.2.2 vi 305
13.2.3 sam 306
13.2.4 emacs 307
13.2.5 wily 308
13.3 編輯器的適當規模 309
13.3.1 甄彆復雜度問題 309
13.3.2 摺衷無用 312
13.3.3 emacs是個反unix傳統的論據嗎 314
13.4 軟件的適度規模 316
part iii 319
第14章 語言:c還是非c 321
14.1 unix下語言的豐饒 321
14.2 為什麼不是c 323
14.3 解釋型語言和混閤策略 325
14.4 語言評估 325
14.4.1 c 326
14.4.2 c++ 327
14.4.3 shell 330
14.4.4 perl 332
14.4.5 tcl 334
14.4.6 python 336
14.4.7 java 339
14.4.8 emacs lisp 342
14.5 未來趨勢 344
14.6 選擇x工具包 346
第15章 工具:開發的戰術 349
15.1 開發者友好的操作係統 349
15.2 編輯器選擇 350
15.2.1 瞭解vi 351
15.2.2 瞭解emacs 351
15.2.3 非虔誠的選擇:兩者兼用 352
15.3 專用代碼生成器 352
15.3.1 yacc和lex 353
15.3.2 實例分析:fetchmailrc的語法 356
15.3.3 實例分析:glade 356
15.4 make:自動化編譯 357
15.4.1 make的基本理論 357
15.4.2 非c/c++開發中的make 359
15.4.3 通用生成目標 359
15.4.4 生成makefile 362
15.5 版本控製係統 364
15.5.1 為什麼需要版本控製 364
15.5.2 手工版本控製 365
15.5.3 自動化的版本控製 366
15.5.4 unix的版本控製工具 367
15.6 運行期調試 369
15.7 性能分析 370
15.8 使用emacs整閤工具 370
15.8.1 emacs和make 371
15.8.2 emacs和運行期調試 371
15.8.3 emacs和版本控製 371
15.8.4 emacs和profiling 372
15.8.5 像ide一樣,但更強 373
第16章 重用:論不要重新發明輪子 375
16.1 豬小兵的故事 376
16.2 透明性是重用的關鍵 379
16.3 從重用到開源 380
16.4 生命中最美好的就是“開放” 381
16.5 何處找 384
16.6 使用開源軟件的問題 385
16.7 許可證問題 386
16.7.1 開放源碼的資格 386
16.7.2 標準開放源碼許可證 388
16.7.3 何時需要律師 390
part iv 391
第17章 可移植性:軟件可移植性與遵循標準 393
17.1 c語言的演化 394
17.1.1 早期的c語言 395
17.1.2 c 語言標準 396
17.2 unix 標準 398
17.2.1 標準和unix之戰 398
17.2.2 慶功宴上的幽靈 401
17.2.3 開源世界的unix標準 402
17.3 ietf和rfc標準化過程 403
17.4 規格dna,代碼rna 405
17.5 可移植性編程 408
17.5.1 可移植性和編程語言選擇 409
17.5.2 避免係統依賴性 412
17.5.3 移植工具 413
17.6 國際化 413
17.7 可移植性、開放標準以及開放源碼 414
第18章 文檔:嚮網絡世界闡釋代碼 417
18.1 文檔概念 418
18.2 unix風格 420
18.2.1 大文檔偏愛 420
18.2.2 文化風格 421
18.3 各種unix文檔格式 422
18.3.1 troff和documenter's workbench tools 422
18.3.2 tex 424
18.3.3 texinfo 425
18.3.4 pod 425
18.3.5 html 426
18.3.6 docbook 426
18.4 當前的混亂和可能的齣路 426
18.5 docbook 427
18.5.1 文檔類型定義 427
18.5.2 其它dtd 428
18.5.3 docbook 工具鏈 429
18.5.4 移植工具 431
18.5.5 編輯工具 432
18.5.6 相關標準和實踐 433
18.5.7 sgml 433
18.5.8 xml-docbook 參考書籍 433
18.6 編寫unix文檔的最佳實踐 434
第19章 開放源碼:在unix新社區中編程 437
19.1 unix和開放源碼 438
19.2 與開源開發者協同工作的最佳實踐 440
19.2.1 良好的修補實踐 440
19.2.2 良好的項目、檔案文件命名實踐 444
19.2.3 良好的開發實踐 447
19.2.4 良好的發行製作實踐 450
19.2.5 良好的交流實踐 454
19.3 許可證的邏輯:如何挑選 456
19.4 為什麼應使用某個標準許可證 457
19.5 各種開源許可證 457
19.5.1 mit或者x consortium許可證 457
19.5.2 經典bsd許可證 457
19.5.3 artistic許可證 458
19.5.4 通用公共許可證 458
19.5.5 mozilla 公共許可證 459
第20章 未來:危機與機遇 461
20.1 unix傳統中的必然和偶然 461
20.2 plan 9:未來之路 464
20.3 unix設計中的問題 466
20.3.1 unix文件就是一大袋字節 466
20.3.2 unix對gui的支持孱弱 467
20.3.3 文件刪除不可撤銷 468
20.3.4 unix假定文件係統是靜態的 469
20.3.5 作業控製設計拙劣 469
20.3.6 unix api 沒有使用異常 470
20.3.7 ioctl(2)和fcntl(2)是個尷尬 471
20.3.8 unix安全模型可能太過原始 471
20.3.9 unix名字種類太多 472
20.3.10 文件係統可能有害論 472
20.3.11 朝嚮全局互聯網地址空間 472
20.4 unix的環境問題 473
20.5 unix文化中的問題 475
20.6 信任的理由 477
附錄a 縮寫詞錶 479
附錄b 參考文獻 483
附錄c 貢獻者 495
附錄d 無根的根:無名師的unix心傳 499
colophon 510
索引 511
· · · · · · (
收起)