2012年6月23日 星期六

開卷有益: 我的書, 我的生活

轉載的...尚未閱畢全文


前言

這是在 ARGO 的 programming 版用 debian 這個 ID 發的系列短文, 整理後重
發在這里.

閱讀是人生的一個很重要的經歷, 我外公的話記得最清楚的就是這句: 任何時候書
都是最便宜的, 因為書是有價的, 而你能在書中學到的東西是無限的. 如果把外公
的話從另一個角度分析的話, 就是著書者的勞動是無價或及其高價的(按照馬克思
的理論的話), 由於書的可分發特性, 所以我們買書的價格只是在分攤很小部分的
版稅以及書的印刷成本而已, 用這個價格去換作者寶貴的知識永遠是賺的.

這是在文革其間讀書無用論泛濫時外公對我媽媽他們說的, 外公沒有見到圖書市
場的繁榮, 沒有見到爛書的泛濫, 沒有見到精裝書的價格, 沒有見到沒有內容的
書殼可以當裝修材料賣個好價錢. 但是無論怎么樣, 書仍然是最有價值的.

寫這些文章的時候, 我也把寫到的書一本一本地翻出來, 又重新回味一遍, 桌面
也因此變得凌亂不堪. 好了, 要去收拾了, 也要擦擦書架了, 181 的灰塵真恐怖.
關於書, 我可以一直寫下去, 不過很多都不是 programming 的內容了, 這個系
列就此完結, 如果以後再看到好書, 仍會繼續向大家推薦.


* 語言學習類

** SICP (Structure and Interpretation of Computer Programs)

首先最喜歡的當然是 SICP (Structure and Interpretation of Computer
Programs) 啦, 這本 MIT 計算機的入門教材當然不僅僅是 scheme 語言學習的
最好教材那么簡單啦, 它的編排跟普通的語言教學書是完全不同的, 第一章: 過
程抽象, 第二章: 數據抽象, 第三章: 模塊化, 對象與狀態, 直到第四章: 元語
言抽象, 它是在講一種程序設計方法學乃至一種思維模式, 而不僅僅是一種語言
.

對語言的使用介紹穿插在這樣的方法學介紹中, 它的基本思路是: 提出一個問題
或一個程序的需求, 介紹一種方法, 介紹在 scheme 中用什么特性來實現這種方
法, 接着不斷地對這個程序進行優化. 用這樣的方法帶動讀者一起思考, 並且鼓
勵讀者嘗試, 效果非常好.

而且這本入門書提出的問題一點都不簡單, 例如第三章, 直到這里它才介紹了賦
值語句, 賦值語句我們看來很簡單, 但是筆鋒一轉: 賦值語句本質是把一個對象
與一個名稱綁定, 這個過程是怎么實現的呢, 或者說是一個在各種語言中都會涉
及到的問題: 命名空間的確定, 接下來它就介紹了 scheme 的名字綁定使用的環
境模型(Environment Model) --- 千萬不要以為因為這是語言實現細節而可以忽
略它, 理解不了這個模型的話後面巧妙地使用 scheme 的環境模型實現模塊化和
面向對象編程的內容是無法理解的, 而且 scheme 的環境模型與 Java 和其他類
似的語言是完全一樣的 (內存管理方面很容易看出 java 的語言對 LISP 類語言
的借鑒), 我花了好大工夫把這個搞懂之後, java 類語言的內存管理模型我從來
沒有糊塗過, 而且對自己的軟體設計也是很大的啟發. 第三章的內容也令我們認
真地反思這個 ``簡單'' 的賦值語句, 為什么賦值語句或狀態會造成副作用, 是
否需要避免這個副作用等等問題, 這是在使用其他書學習語言的過程中無法觸及
到的.

提出以上的這些問題, 可能對一些計算機入門書來說是無法想象的, 但是 SICP
做到了, 它由淺入深, 從最基本的過程抽象 (即基本的定義函數), 到第四章的
元語言抽象學習到如何使用 scheme 寫一個 scheme 解釋器, 完全地理解這門語
言及其計算模型; 到第五章非常復雜的設計和實現一個寄存器計算機的模擬器,
並學習高級語言特性如何在其上實現. 計算機就真真正正地入了門了. 即使不是
初學者(其實有多少真正的初學者會從這本書開始呢?) 認真地看一次這本書, 也
會激起對各種問題的重新思考和重新認識, 會有很多的收獲.

這本書作為教材, 當然有習題. 它的習題一點都不簡單, 做起來很頭痛的. 但是
你一定會對這些習題很有興趣, 我保證, 呵呵.

而且這本書的遣詞造句非常生動形象, 而且妙句多多, 我想 Forward 中的以下
這段話應該被引用過無數遍了:

Pascal is for building pyramids -- imposing, breathtaking, static
structures built by armies pushing heavy blocks into place. Lisp is
for building organisms -- imposing, breathtaking, dynamic structures
built by squads fitting fluctuating myriads of simpler organisms into
place.

還有例如 forward 的第一句話: ``Educators, generals, dieticians,
psychologists, and parents program. Armies, students, and some
societies are programmed.''

這本書的中譯本已出版, 是北京大學的裘宗燕教授譯的, 譯得還是很准確到位的
. 總之這是一本有趣的, 有深度, 決不會讓人厭倦的入門教材.

ps. 關於函數式編程, 一篇寫得很好的文章叫 LISP 根源, 大家可以去看看, 連
接在這里 http://daiyuwen.freeshell.org/gb/rol/roots_of_lisp.html.


** C 語言學習書籍

這個我不想說太多的, 其他大牛應該有比我更好的經驗. 我學 C 語言用的書一
開始是譚浩強老師的書, 非常經典啦. 這本書似乎適合沒有任何基礎的人閱讀,
由於年代久遠忘得差不多, 不做評論.

學 C 語言的經典書當然是 K&R (The C Programming Language) 啦, 這本書完
全是一本語法定義和指南, 有過 C/C++ 基礎的人應該再翻一遍這本書, 鞏固掌
握. 而且里面的例程采用的代碼風格也是一種 C 語言編程的標准, 就叫 K&R,
可惜 GNU 似乎不准備遵循這個標准, 嗯.

C++ 我不熟悉, 我認真看完的 C++ 入門書是 Thinking in C++, 沒看過其他經
典的 C++ 書, 所以也不作評論. 另外我看的 C++ 的第一本書是類似 ``24 小時
學會 C++'' 那種, 寫得糟糕外加憋腳的翻譯, 讓我小小年紀就明白爛書對這個
世界的傷害有多深.

** python 學習書籍

python 是我除了 C 之外最熟悉的語言之一, 入門學習的話, 我還是建議這樣:
先搞清楚基本的語法和語言特性, 標准庫不用看太多, 因為 python 的標准庫實
在大得恐怖, 我都是現用現查的.

我推薦一本似乎沒有發行過的書: ann77 的python 學習筆記. 首先它是用一種
正常人能看懂的中文寫的 (相比於國內某些人寫的言語晦澀故作高深令我寧願回
去讀英文的中文書), 而且遵循的恰恰是一個 python 學習者的思路, 它第一章
介紹語言特性, 後面兩章介紹開發環境和常用的標准庫, 認真讀完第一章, 第二
第三章跳着了解一點 (第三章第一第二節不能跳, 因為那是內置常用函數和文件
操作介紹) 應該就能初步具備 python 開發的能力了. 我覺得它寫得最好的是
1.13 類一節, 它不是去介紹一大堆語法規則, 而是很輕松地解釋了 python 是
怎樣用一個簡單的方法去實現復雜的面向對象特性的, 之後該怎么做就很自然了
. 結合 1.12 名稱空間一節, 你會了解到 python 實現類的方法是多么的高明,
怎么是用 ``self'' 使得名稱空間在加入面向對象特性後不會變得混亂, 使得語
言定義變得簡潔優美. 所以在學習這些章節的時候, 你不會覺得是在學習一些麻
煩的與其他語言差不多卻偏偏有點區別的語法規則, 而是學習一種解決問題的方
法.

另外的入門書還可以推薦 ``How to Think Like a Computer Scientist -
Learning with Python'', 看題目它想做成像 SICP 一樣的書, 可惜失敗了. 它
還是更偏重於語法特性的介紹, 不過確實介紹得簡單易懂, 似乎適合完全沒有語
言基礎的讀者查看. 絕對不推薦那本叫 python bible 的書, 為什么一個這么簡
單的語言都可以被它講得這么啰嗦......

除此之外, python 的官方文檔特別是標准庫文檔是要隨身攜帶的, 隨用隨查,
常用的那幾個包用多了就熟了.


* 操作系統設計與實現

我對這方面非常感興趣, 認真看過的書也最多, 所以分列出來哈

** UNIX 操作系統設計 vs. 萊昂氏 UNIX 源代碼分析

兩本都是經典到不應該再拿來做介紹的書. UNIX 操作系統設計講的是較為近代
的 SystemV, 萊昂氏講的是更為原始的 UNIX V7. 兩本我看的都是中譯本而且無
緣得見原版, 其中萊昂氏的翻譯是尤晉元, 應該說是很有口碑的. 第一本雖然沒
有原版對照, 但我覺得翻得還是很好的, 各種用語翻得很准確清晰.

我覺得 UNIX 操作系統設計這本書的寫作目的並不是進行操作系統原理和實現的
教學, 而是試圖從系統設計角度解釋 UNIX 系統, 幫助用戶更好地掌握它, 這與
關於 UNIX 的第一篇論文是相似的. 而至少對我來說, 這樣的方法非常成功, 我
是通過看這本書才認識到 UNIX 系統的優秀的.

這本書不厚, 里面沒有列系統源代碼 (而且有版權問題), 但是對一些關鍵的調
用有非常清晰易懂的類 C 偽碼進行說明, 我非常喜歡這種形式. 我覺得它寫得
最好的是文件系統相關的內容, 即第三到第五章, 分別介紹高速緩沖的實現, 文
件內部表示和文件系統介面, 這些部分本來就是 UNIX 實現得最精妙的地方, 而
它的闡述也非常到位; 至於後面進程管理的章節, 可能是覺得已經 toooold 了
吧, 沒有太大的感覺. 另外它的 SysV IPC 描述可能是最權威的. 這也是一本我
覺得習題比較難卻很有價值的書, 值得一做.

這本書非常適合沒有很多 UNIX 使用經驗的讀者觀看, 因為它不會亂入 UNIX 專
門辭彙讓人莫名其妙, 一點一點都介紹得清清楚楚, 認真地讀讀第二章, 就能對
UNIX 操作系統的精妙設計而不是它的看起來不近人情的界面有一個大概的認識.

至於萊昂氏 UNIX 源代碼注釋, 我手上並沒有書, 是在珠海圖書館借來看的. 應
該說這種列源代碼然後寫恰到好處的注釋的方法很有意思, 也值得采用, 然而在
猛戳帶下劃線的內容也不會給我跳轉到相應頁面的紙版書上, 用這樣的學習方法
其實是很辛苦的.

老實說我沒有在這本書上學到很多關於操作系統實現的東西, 可能是因為用的源
代碼太老了吧, 它是很簡單很清楚, 但是很多必須考慮的問題它都沒有涉及. 所
以它可能更適合作為一本操作系統原理的教學書而不適合作為實際操作系統實現
分析的教學. 但是話說回來, 除了系統原理學習的意義外, 它是一個極好的 C
語言編程范本, 以至於人們可能產生 ``今不如夕'' 的感嘆, 例如它的 namei()
函數, 真是叫做無懈可擊, 多一句廢話, 少一句跑不起來. 所以去認真看看源代
碼還是很有價值的.


** 4.4BSD 操作系統設計與實現 vs. 操作系統: 設計與實現.

這兩本書的名字都很像吧呵呵. 第一本是 4.4BSD 的開發者寫的, 第二本是
Tanenbaum 教授為了操作系統教學做出 MINIX 之後以此為基礎寫的 (順帶一提,
我用的是第二版, 似乎 MINIX3 的改動非常大), 這兩本書我看的都是譯本, 原
本都讀過一點, 翻譯得都很不錯. 兩本書中我更喜歡前者.

4.4BSD 操作系統設計與實現 這本書與其他的書不同, 他是面向一個真實的, 廣
泛使用的系統. 現代的所有 BSD 系統 FreeBSD, NetBSD, OpenBSD 等都是基於
4.4BSD 並且沒有很大的改動, 因此這本書有很大的實際使用價值, 我做 NetBSD
源代碼分析 (http://student.zsu.edu.cn/~is03kyh/publish/BsdSource.html)
時的主要參考書就是它.

由於介紹的是一個真實的系統, 它涵蓋了很多操作系統實現的細節, 更為重要的
是, 這樣做是為了解決什么的問題, 為什么要這樣做, 為什么不這樣做, 是在什
么環境什么應用中得到這個結論的都寫得清清楚楚, 我們可以很清楚地看到它的
設計取舍, 對我們很有啟發. 我覺得它寫得最好的是第二部分進程, 它包括了以
下關鍵性的論題: 被所有 BSD 系統沿用至今的調度演算法, 為什么這種調度演算法
是可用且適用的 (光看理論書上的 ``先來先服務'' 之類的東西是什么都學不到
的); 內存管理系統描述, 它是用什么辦法支持共享內存, COW (Copy On Write)
等現代操作系統功能的, 這也是在其他書上沒法看到的.

跟上面的 UNIX 操作系統一書一樣, 這本書當然也 ``理論上'' 是 socket 和
TCP/IP 系統實現的最權威描述. 這本書對 socket 的實現以及對下層協議的接
口是描述得很好的, 但是 TCP/IP 的實現就描述的一般般了, 因為篇幅根本就不
夠用, 但是它還是用了相當地篇幅介紹 TCP/IP 實現中一個很重要的問題: TCP
Stream 的重組演算法, 重發策略等, 並且寫得很好. 不過這一部分的內容我還是
比較建議看 ``TCP/IP 詳解, 卷二, 實現''.

該書沒有帶任何的實現源代碼 (其實我很鄙視拿源代碼占篇幅的行為), 閱讀的
時候可以單獨閱讀, 也可以結合 4.4BSD 或 FreeBSD 等核心源代碼進行閱讀分
析.

再說說 ``操作系統: 設計與實現'' 一書, 它的基本目的與上面的一本不同, 它
是為了進行操作系統原理的教學, 它的有名也有很大程度上是因為 linux, 當然
有 linux 之前它也是經典教材了. 這本書的每一章的大概結構都是這樣的: 介
紹操作系統中的某個子系統的原理和基本理論, 然後介紹 MINIX 中的實現. 它
的優點是能讓讀者很容易看到它學的東西在 ``實際'' 中是怎么實現的, 而不會
對這門知識有空中樓閣之感; 問題是這個 ``實際'' 其實並不實際, 看過 MINIX
代碼就知道, 為了盡量簡化實現方便理解, 它在很多地方都是使用了能用但效率
很低的簡化方法, 這對初步了解操作系統設計與實現是有好處的, 但如果想真的
了解 ``真實'' 操作系統中會遇到的問題以及解決方法, 這本書並不合適; 但是
如果對操作系統原理一無所知, 看 4.4BSD 那本大概是不會有什么收獲的, 看這
本倒比較好.

** Linux 源代碼分析書

我對各種 Linux 源代碼的分析書都不大喜歡, 原因是: Linux 並不是一個適合
進行系統分析學習的系統, 它太過龐雜, 用的方法太過 ``先進'' 而沒有足夠的
文檔說明, 而且它變化得太快. 而且大多數 Linux 源代碼分析書鼓勵懶惰, 因
為它常常會列出打斷代碼然後詳細解釋, 所以不用怎么思考都可以看着書跟着``
分析'' 完源代碼, 卻沒有真正在機器上看過這段代碼, 思考它在實現上的取舍
得失, 沒有在上下文中理解代碼, 看誰調用它, 它調用的是誰, 又是怎樣實現的
. 這樣的收獲不會多.

我認為如果為理解一個優秀的開源操作系統的設計與實現計, 應該看的是 4.4
BSD 操作系統設計與實現, 但如果是要做 Linux 內核的開發, 還是必須翻一翻
相關的分析書籍的. 不過話說回來, 源代碼分析這東西, 做過一個, 另一個也是
很好做的, 分析過 BSD 源代碼, 雖然 Linux 的函數命名和代碼結構幾乎完全不
同, 但也能很順利地找到地方, 再 google 一點資料對關鍵演算法如調度演算法來點
點撥就已經可以了.


* 向大師致敬

W.Richard Stevens(1951-1999),國際知名的UNIX和網路專家,受人尊敬的作
家。他的著作有《UNIX網路編程》(兩卷本),《UNIX環境高級編程》
《TCP/IP詳解》(三卷本)等,同時他還是廣受歡迎的教師和顧問。

Stevens先生1951年生於贊比亞,早年,他就讀於美國弗吉尼亞州的費什本軍事
學校,後獲得密歇根大學學士、亞利桑那大學系統工程碩士和博士學位。他曾就
職於基特峰國家天文台,從事計算機編程。

Stevens先生不幸病逝於1999年9月1日,他的離去是計算機界的巨大損失。

他的三部巨著我都有幸讀過, 雖然有的只是一小部分. Stevens 先生在書中總是
用最平淡的語氣說着那么重要的事. 似乎每本書每一部分都寫得平淡無奇, 也沒
有提出什么新觀點新演算法, 但就是有這樣的攝人的魅力, 每一本都被奉為聖經
. 看他不厭其煩地寫出來的厚厚的書, 事無巨細都一一寫出, 可能會覺得他嘴碎
, 可是只要再向前一步, 就會知道這只是他看問題比我深, 比我廣, 在我遇到這
些問題前已經給了我這許多金玉良言. 我想, 等我再往前走, 也會回來把他的書
沒讀完的部分讀完, 讀過的部分再反復回味吧.

我也常常想, 寫很多書, 著作等身不難, 但能寫出三部被人奉為聖經的書有幾
個? 要寫厚書不難, 但做到這么厚的書中的每一句話都可以給人細細斟酌吸收營
養的又有幾個? 凡大師者, 並不是因為他的專業水平有多高, 而更多的在於多少
人能從他的工作中受益. 所以, Stevens 先生只憑着這三部書, 就足以稱大師.

關於這三部書的評論已經有很多了, 這里的只是我自己的讀後感. 其中我有紙板
的只有 TCP/IP 詳解的第一卷, 其他都是電子版. 除了 UNP 外, 我看的首先都
是中譯本.

** APUE (Advanced Programming in UNIX Environment)

這本書又是經典的不用再介紹的. 這本可以說是 UNIX 編程的聖經了. 其實內容
上我並不覺得有多大的出彩之處, 最簡潔的形容就是: 准確, 透徹. 它力求對每
一個介面都作最精確標准的描述, 大家常用的第二版是基於 POSIX 標准的. 它
對每個介面都不是泛泛而談, 甚至往往為了說明介面的用法而深入到內部的核心
實現, 他還對各種介面的一些細微的卻可能害死人的細節作了描述和討論, 我想
這就是對 UNIX 編程再熟悉的人也會經常讀這本書的原因吧.

這本書雖然是介紹編程介面, 但它不是手冊 (雖然也可以這么用), 它是一本真
正的UNIX 編程入門書. 因為它不但說明了每個介面怎么用, 還說明了這些介面
該在什么時候用, 用來干什么. UNIX 的系統調用很少很精煉, 有些功能如果沒
有一本書來提點是很難想到怎么做出來的, 比如用 manual 里只說了 dup 用來
復制文件描述符, 並且返回的文件描述符是當前可用的最小的, 光知道這個, 要
知道怎么用它構造輸入輸出重定向功能確實挺難. 這本書可以告訴你很多 UNIX
編程的慣例, 這是些 manual 不能告訴你但卻被試為常識的東西.

不過話說回來, 有基本的 UNIX 編程知識後, 開發時最好用的還是系統自帶的
manual, 首先這是最准確的, 其次每種 UNIX 系統都會有一些 ``微妙'' 的差別
導致一些可能很嚴重的問題, 這時候只有 manual 能幫到你了.


** UNP (Unix Network Programming)

這本書也是聖經級別的, 也是一本大~~~~ 書, 我手上沒有紙版不知道有多厚,
但是沒什么格式信息的 HTML 電子書全文是 8.8MB, 相當恐怖. 這本書幾乎把能
夠用到的 socket 和 TCP/IP 內容都搬上來了. 不過我根本就沒有從頭到尾把它
看過, 都是看着目錄要用什么就查的.

這本書有一個特色, 就是有很多的例程. 幾乎每個有獨立介面的功能都有, 一些
重要的應用 (比如 TCP 的 client/server) 會給出一個大一點的程序. --- 列
一大堆程序的事國內很多書都會干, 可惜往往列的程序我都懷疑作者自己有沒有
看懂過, 我也見過把一個長長的自動生成的 Makefile 貼上去作為思考題書. 但
這本書不同, 每一個程序都是小而必要的. TCP/IP 和 socket 的介面都非常復
雜, 再加上選項沒什么人能受得了的, 再加上它往往需要與系統的其他介面一起
使用才能發揮作用, 所以必須在程序中展示這些介面和參數的實際應用, 才能令
讀者理解.

當然了, 我用到這本書的時候都是來抄代碼的, 因為它的代碼寫的簡潔精干, 通
用性又強, 把它的代碼東抄抄西抄抄改動一下就是一個很好的框架, 然後往里面
填自己的東西就行了. 我總是覺得這么做的絕不止我一個, 因為看很多程序的相
關代碼都會有似曾相識的感覺, 特別是變數命名 --- 反正大家都是這么寫的誰
抄誰就不知道了咔咔.


** TCP/IP 詳解

這本書其實也不用介紹的, 經典的洪篇巨著. 大家可能看得最多的是卷一: 協議
. 這一章主要是在分析協議, 注意我用的是 ``分析'' 而不是 ``介紹'', 因為
它的思路就是簡要的介紹協議的基本思想和定義之後, 就開始用工具在實際網路
中分析數據, 來展示協議是怎么使用和怎么工作的. 比如 TCP 三次握手, 我想
學過相關知識的人都知道, 可是有沒有真的用 tcpdump 去跟蹤分析過三次握手
呢? 另外它在這里也很注意例外情況的分析: 連接超時怎么辦? 故意不完成三次
握手會怎么樣? 它都有提到並作分析.

TCP/IP 詳解的第一卷並不是網路原理介紹書, 也不怎么會涉及 IP 層以下的東
西. 我覺得它更適合給程序員, 給網路程序開發者使用, 讓他們對這些底層原理
有個概念, 知道自己層層包裹的應用層數據是怎么被發送出去的, 其中經歷了多
少艱難險阻, 也讓他們在設計和實現上能夠考慮到底層的情況而使用適當的方案
.

卷二: 實現, 我在做 NetBSD 源代碼分析的 socket 一節時翻了一點, 它是一本
源代碼分析書, 分析的事 4.4BSD-lite 的 socket 和 TCP/IP 實現部分, 這當
然時最經典的 socket 和 TCP/IP 協議棧實現. 這里用的辦法是先講大體的設計
和結構, 然後小段小段地列舉相應的代碼, 再在後面對關鍵的行作注釋, 看起來
比萊昂氏的注釋方法舒服很多, 但看的時候還是必須同步在計算機上打開同步源
代碼查看, 這樣才能建立比較好的整體感覺, 而且查交叉引用比較方便, 看來後
面忘了前面的事就比較好解決.

卷三沒看過, 不作評論.



* 開發實踐

程序開發是一項需要經驗的活, 沒有經驗的時候就需要借鑒經驗. 這是我喜歡的
幾本介紹開發實踐的書, 而一些很經典我卻沒啥特別感覺的書, 比如設計模式的
那本就沒有列出來了, 並不代表我認為它們不好. 還有軟體工程理論不包含在其
中, 所以 ``人月'' 等幾本經典書也沒有列出.


** Code Reading, The Open Source Perspective

這是一本很有意義的書, 其本意是展現一些開源工程中程序代碼的通用模式, 幫
助我們學習怎樣分析一個大型系統的代碼. 但是我覺得它的更大的意義是反過來
的意義: 通過展現這些通用模式, 告訴我們什么是一個 ``好的'' 代碼. 它首先
基於 C 來描述了程序語言的基本元素, 基本數據類型的通用實現以及一些常用
的 C 高級用法. 接下來講述了怎么處理大型工程: 如何把握脈絡, 把握架構,
編碼規范, 文檔標准等等 --- 這些都是從實際的開源軟體工程中總結而來的,
而且都有廣泛運用的實際運行代碼作實例.

就像知道 UNIX 系統的每個系統介面也不一定能寫出好的程序而要 APUE 幫助一
樣, 精通一門語言的語法規則, 對數據結構和演算法也很熟悉, 也有可能寫出很爛
的程序, 這時候我們要知道一些編程的常用模式, 這些模式應該養成習慣, 直接
套用, 比如遍歷一個鏈表要怎么寫, 就固定一個寫法; 編碼風格, 甚至包括注釋
的排版風格應該選定一個, 堅持使用下去, 而不是搞一套自己的編碼風格, 這樣
寫出來的代碼才是高質量, 可理解, 可維護的. 這本書能幫助我們完成這些學習
, 與自己讀一大堆源代碼, 自己摸索總結相比, 這本書無疑是一個捷徑, 但是不
斷地讀代碼還是很必要的咔咔.


** Hacker's Delight

中譯 ``高效程序的奧秘'', 不然又會被那些自以為黑客的小白買走奉為至寶了
. 不過原書的封面真的很黑咔咔. 這本書是介紹怎么通過位操作等原始手段實現
常用的復雜功能, 以達到優化程序最常運行的部分, 提高程效率目的, 比方怎樣
將一個字作位翻轉, 這本書把計算機的性能摳到了指令條數的量級上. 很多人可
能認為這只是微不足道的小節, 現代編程也不會用到這樣的方法, 或者認為編譯
器優化能解決一切問題, 但如果能讓程序的一個核心函數性能提高一半, 可能就
能令整個程序的性能提高 25% 以上, 這已經夠要命了, 而書中提到的很多技巧,
在我看來都很難用自動編譯器優化實現 (2 的冪的常數乘除外). 在分析操作系
統代碼的過程中, 可能會見到一些讓人莫名其妙的位操作過程, 黑客們把這些當
作常識, 我們卻一面惘然, 其實很多都出自於本書了.

如果跟第一本相比, 這本書完成的就是細節處的第一本書的作用. 我不知道有誰
能真的把這些技巧都記住 --- 都是要在實際使用中用多了才記住的, 但這本書
即使記不住, 也是一本很有趣的讀物, 時常拿着它看, 能看到幾十來黑客們智慧
和數學才能的光芒.


** 程序設計實踐 (The Practice of Programming)

這本書的作者是 Brian W. Kernighan 和 Rob Pike, 好了不用說了, 絕對的票
房保證.

這本書的意義與第一本是一樣的, 不過它是從一個 ``正'' 的方向, 系統介紹了
編碼規范, 常用數據結構實現與選擇, 開發與維護技巧等內容. 真的, 這本書不
用其他介紹了, 意義我在說第一本書的時候已經說了, 它不是一本很特別的書,
但它是好書.


** 程序調試思想與實踐 (The Science of Debugging)

這本書的作者之一是一個 M$ 的一個開發老手, 據說該書出版時的現在他的興趣
在玩 DEC 10. 這本書給 bug 歸類, 編檔, 說明發現, 診斷和解決的方法. 事實
證明, 人是不可靠的, 人的一個錯誤犯了一次必然會犯第二次, 這個人犯的錯誤
另一個人會接着犯, 所以看看這些常見 bug 列表很有好處.

這本書首先簡述了一些著名的 bug 以及它的成因, 比如 AT&T 的電話網中斷事
件成因的詳細說明, 接着介紹了頗為困難的 ``什么是 bug'' 的問題, 以及 bug
的產生, 發現, 修改等生命周期, 接下來才是詳細的 bug 分類介紹, 然後告訴
我們發現和定位 bug 的技巧以及詳細的解決方法, 還有如何在 bug 發生前避免
它. 直到這些內容後, 才介紹我們知道的傳統測試技術和維護技術. 其實, 前面
的內容對我們來說才是重要的, 知道怎么寫測試報告書 (好吧, 我就是在做這個
該死的作業), 知道黑盒白盒測試, 背熟路徑覆蓋標准是沒辦法把一個 bug 揪出
來的, 發現 bug 的辦法是經驗以及借鑒他人的經驗, 這就是這本書的價值.

這本書的習題很有意思, 而且給了解答. 它往往給出一些匪夷所思的系統出錯情
況, 要你定位可能的錯誤原因 --- 條件都是給足的, 雖然可能很隱蔽. 這是非
常有趣的專業迷題, 看完後你會對抓蟲子很感興趣的~~


** TAOUP (The Art of UNIX Programming)

NOTE: 這本書 linux 版精華區有全文, 大家支持一下吧, 咔咔~ 某著名發行版
報告我吧嘿嘿.

這本書是 Eric S. Raymond 嘔心瀝血的巨著. 基本上是幾十年來 UNIX 和開源
軟體開發的傳奇和經驗的合集, 也是一部真真正正的黑客傳奇 (他自己有一篇
``Hacker 文化簡史'').

本書分為四個部分, 第一部分基本上是傳奇介紹了, 但是在傳奇中說明了一些重
要的 UNIX 設計思想; 第二部分是 UNIX 設計模式介紹, 以一些著名的格言展開
, 第一條當然是 UNIX 的 KISS 原則, 其他的基本上是面面俱到了, 從界面到軟
件架構, 並且以一些著名的開源工程為例進行 case study, 因為他們都是著名
的常用的軟體, 所以你能馬上體會到一項設計要點的功用. 第三部分講的是實現
, 包括了語言選擇, 編譯器選擇, 使用自動代碼生成器的技巧等 (不要以為 lex
和 yacc 只是編譯原理學習工具, 在實際項目中它往往用來自動生成很復雜的命
令解析等代碼的) 等等雜七雜八的內容. 最後一個部分就是移植性, 文檔, 開源
等等方面的內容了. 另外決不可忽視 Appendix D, 那是些對話體的很有趣的短
文, 值得一看.

UNIX 編程是一個充滿隱喻, 特殊文化和傳奇的領域, 把這本書作為故事書也好,
作為設計的參考也好, 都是很有價值的. APUE 能讓你學會 UNIX 編程, 而這本
書可能是從 ``UNIX 編程'' 到 ``UNIX 開發'' 乃至 ``UNIX 風格的開發'' 的
一個途徑.


* 拾遺

很懷疑這些書跟 programming 版有多大關系, 不過作為系列, 就還是放在這里
吧.


** UNIX Haters Handbook

這是一本痛陳 UNIX 缺點的書, 從設計到界面指出 UNIX 的種種不足和嚴重失誤
, 應該說, 這是非常中肯的.

比方說, 它引用了一個著名的笑話: Ken Thompson 有一輛他參與設計的新車,
它沒有速度表等任何儀表, 如果駕駛員犯錯了, 一個碩大的問號就會出現在儀表
盤的中央, Thompson 說: 一個有經驗的用戶應該知道發生了什么. UNIX 是一個
給程序員設計的並希望用戶像程序一樣工作的系統, 所以情況確實如此. 書中還
有很多 UNIX 用戶真實的血淚控訴...

書的內容還覆蓋了可能是因為 UNIX 程序作者的鍵盤太過難敲而令人無法理解的
縮寫命令名 (如 ls, mv), 理論上很先進但實際應用中一般般的 XWindow 等等.
這不是一本笑話書, 而是一本嚴肅的設計檢討書. 我推薦它並不是說明我完全同
意里面的觀點, 而是有如精華區里 ``C之詭譎'' 那篇文章一樣, 描述 UNIX 的
一些似是而非的細節和一些 ``奇妙'' 的缺陷, 幫助我們更好地認識和使用
UNIX, 也能在其中受到啟發, 為自己的設計開發所用.


** The Jargon File aka. The New Hacker's Dictionary

作者同樣是 Eric S. Raymond. 這是一本黑客用語辭典, 在黑客的用語中, 能看
到黑客的傳奇歷史.

用樣的, 這本辭典能夠提供給我們一些獵奇用的細碎的小知識和小典故, 所以使
它變得相當有趣. 總之, 這是一本可以閑時翻一翻好玩的書.

這本書似乎有紙質出版, 但我相當懷疑它的銷量. 這本書的官方網站是
http://www.catb.org/jargon/, 除了提供原文之外, 還提供了一個搜索引擎能
夠搜索其中的辭彙, 相當好玩.


** Just for Fun

Linus 的自傳, 還是推薦一下哈.

Linus 和 RMS 雖然是最著名的自由軟體/開源軟體的代表人物, 但他們的觀點還
是有一定分歧的. Linus 稱 RMS 為偉大的哲學家, 而自己則是一個工程師. 而
我認為形容 RMS 的最好的用語就是: ``喋喋不休的傳教士'', 到處宣傳自由軟
件. 而 Linus 是一個實干家, 這本書透露出了一個與 RMS 在自由軟體思想上的
不同的觀點: Just for fun.

Linus 認為隨着人類文明與科技的不斷進步, 很多事情會由原始的生存需要, 轉
化成多少帶有禮儀性的道德需要, 直到只是為了娛樂. 所以軟體開發遲早也是一
件用於娛樂的事情, 這種觀點與 RMS 從道德, 經濟和版權合理性的角度思考自
由軟體是不一樣的.

這是一本故事書, 讀着不累. Linus 把它的黑客生涯和 linux 開發說得很輕松,
我們也看得很輕松. 我想讀着一定會為這句 ``Just for fun'' 感動. 這本來就
是很簡單的是, 不是去考慮市場, 也不是去考慮各種深奧高尚的哲學, 只是為了
做一個會比 MINIX 好的系統, 就有了 Linux, 只是純粹的為了讓它變得更好,
就讓 linux 發展到現在這個樣子 (當然其他 linux 代碼的貢獻者可能不會那么
純粹, 比如貢獻大量代碼的 IBM 等公司). 為了自己的興趣去開發軟體, 然後開
放它讓大家共享, 一定是能獲得最大快樂的辦法, 我也是這么想的.


** 如何求解問題: 現代啟發式方法 (How to solve it, Modern Heuristics)

這基本上是一本演算法書, 是一本能夠讓人重新認識問題的演算法書. 這本書首先是
對傳統方法的重認識, 接着是各種啟發式方法的介紹.

這本書的好處是讀起來不累, 這類書的一個常有毛病就是寫得像論文, 一頁一頁
的公式我看着就頭暈, 而這本書很好地避免了這個問題, 雖然還是有各種必要的
公式, 但還有大量的實例和圖表做說明, 很容易理解. 這本書的另一個特點是每
一部分前面的 IQ 迷題 --- 說 IQ 也好數學也好, 但它能通過這些迷題的問題
和解答闡述出這一部分的觀點, 讓人對這部分所說的內容的作用有一個較早的認
識.


** Introduction to Information Retrieval

http://www-csli.stanford.edu/~schuetze/information-retrieval-book.html

這是一本沒有出版的關於信息檢索的書, 上面給出的連接有部分草稿下載, 不知
道是學校網路問題還是怎么樣, 我沒有連上去. 我第一次看的時候他說預計今年
4 月能搞定, 結果我到五月的時候再去看, 發現網頁更新過了, 對比了半天發現
唯一的更新是把今年 4 月搞定改成今年夏天搞定, wish 之.

這是一本教材, 可能是給本科生的吧. 由淺入深, 講了各種信息檢索的方法, 從
最核心的 inverted index 開始講起, 然後是講壓縮和優化, 繼而是進一步挖掘
的各種方法. 書雖然沒出完, 出了的章節我也沒時間看完, 不過講 inverted
index 的部分真的講得很好. 記得現有的章節 redhat 同學是看完了的, 請補充.

Information Retrieval 方面的書我知道的還有一本 Mordern Information
Retrieval, 這本書的學習曲線就似乎比較陡峭. 其實它更像一本領域綜述而不
像一本教程, 還在啃ing.


** UML 精粹 (UML Distilled: A Brief Guide to the Standard Object Modeling Language) 2nd editon

這也算是一本很經典的 UML 教程了. 譯者徐家福似乎是個老人家, 他的這本書
的翻譯在國內似乎挺有口碑, 不過一些用語與常用譯法有區別, 如用例 (use
case) 他譯的是用案, 是否更信達雅不敢妄評. 說說這本書吧, 這是一本薄書,
簡明扼要地介紹了常用 UML 元素的用法 --- 而是不標准. 雖說 UML 不指定方
法學, 但這本書其實給出了一些開發的范例, 這是值得學習的.

雖然我對 UML 之類的文檔不大感興趣, 但是這本書確實讓我這個長着 papaya
腦袋的人比較好地了解 UML, 考系分的時候不至於一塌胡塗, 還是應該感謝 &
推薦的.


** Analysis of Algorithms: An Active Learning Approach

演算法分析方面的專著很多, 大部頭教材也有不少. 雖然我只看了很少一部分的
TAOCP, 但似乎書中很多篇幅都在干這個活. 而這本書就能給各種經典演算法的分
析以一個簡要的介紹.

基礎知識之後, 當然是最簡單的查找和排序的分析, 之後是數值演算法和圖演算法,
以及演算法在分散式條件下的分析等等. 這本書我這個演算法白痴還能基本看懂, 說
明它還是寫得很淺顯易懂的, 其中它的分析思路也非常可貴, 值得學習.


** 其他

寫到這里就差不多了吧, 好書還有很多很多. 一些非常經典的書這里都沒有涉及
到, 比如 TAOCP 啦, Machine Learing 啦, 數據挖掘 --- 概念與技術等等等等
, 他們都是被時間和口碑證明是非常好的書. 但有的我沒讀過或讀不懂, 例如
TAOCP,  有的只看過一本, 對那個領域也完全不熟悉, 不好做評價. 有的是太偏
門, 都沒有在這里寫出. 大家心里肯定也有不同的最喜歡的書的列表, 如果寫出
來, 讓版友們也能分享, 豈不樂事一件?


* 短文

** No Silver Bullet --- Essence and Accident in Software Engineering
   (沒有銀彈 --- 軟體工程中的根本和次要問題)

這是一篇非常經典的也引發了很多討論的文章. 前面我沒有說作者的經典得不能
再經典的 ``人月'' 一書, 但這里卻不能不提這篇文章.

本文開篇即開宗明義: 沒有一種技術或管理上的進步能在十年內帶來軟體工程生
產效率的本質提高 --- 看來, 不止十年, 至今這個斷言還是對的.

本文的論點是軟體是有史以來最復雜的人造物, 復雜性是導致生產率低下的主要
原因, 然而復雜性是軟體的基本屬性, 無可改變, 因此沒有銀彈. 而其他的一些
技術和方法只能或多或少地解決次要問題而無助於根本問題的解決.

我想這個多少有點悲觀的觀點在當時應該是非常震撼的, 即使是現在, 第一次讀
它的時候可能也會感受到同樣的震撼. 如果 Brooks 說的是對的, 人們對軟體的
需求和軟體復雜度飛速提高, 而軟體生產效率沒有得到本質提高的話, 在軟體生
產上投入的成本將會越來越大直至無法接受而崩潰, 這是一個非常可怕的設想
. 然後至少到現在看來, Brooks 仍然是對的. 所以這篇經典的文章, 仍然值得
我們不斷地重讀, 反思和爭論.


** The Roots of Lisp (LISP 之根源)

http://www.paulgraham.com/rootsoflisp.html
官方中譯本: http://daiyuwen.freeshell.org/gb/rol/roots_of_lisp.html

這是一個簡要的 LISP 歷史和設計思想介紹和最簡單的 LISP 入門文章. 我想被
引用的最多的應該會是這段.

值得注意的是,麥卡錫所作的發現,不僅是計算機史上劃時代的大事, 而且是一種
在我們這個時代編程越來越趨向的模式.我認為目前為止只有兩種真正干凈利落,
始終如一的編程模式:C語言模式和Lisp語言模式.此二者就象兩座高地, 在它們
中間是尤如沼澤的低地.隨着計算機變得越來越強大,新開發的語言一直在堅定地
趨向於Lisp模式. 二十年來,開發新編程語言的一個流行的秘決是,取C語言的計
算模式,逐漸地往上加Lisp模式的特性,例如運行時類型和無用單元收集.

接下來則是 LISP 語言的簡要介紹, 這個介紹的目的是為了說明為什么用最簡單
的數據結構和極少數的幾個操作符就足以構建一個強大的程序和為什么這樣的構
建方法是有效且高效的. 它把 LISP 嚴謹的數學性和美感表露無遺, 從幾個最簡
單的公理 (原子操作符) 開始構建任何復雜的數據結構; 使用一個 lambda 運算元
就能構造函數以及命名空間 (LISP 中的各種命名空間定義, 如 let, 本質上都
是 lambda 的語法糖衣, 可以完全用 lambda 構築而成), 並能在如此之短的篇
幅里演示如何使用 LISP 寫一個 LISP 解釋器, 展示元語言抽象的威力. 對
LISP 類語言有興趣的同學, 這篇文章絕對值得一讀.


** Twenty Years of Berkeley Unix

http://www.oreilly.com/catalog/opensources/book/kirkmck.html

BSD 主力開發者寫的 BSD 和 UNIX 歷史, 但不包含 4.4BSD 之後 (即 CSRG 解
散後) 的歷史.

BSD 的發展歷史中出現了很多根本不應該是這個時代的地球人的人物, 例如寫出
vi, 後來是 SUN 的技術靈魂的 Bill Joy, 也產生了一些真正影響人類發展進程
的技術, 如第一個 TCP/IP 實現, 所以 BSD 的歷史確實應該獨立出 UNIX 的歷
史之外分別論述的.

在這里不但能知道我們每天都要接觸到的技術是怎么產生的, 可以看到傳奇是怎
么看似平淡無奇地譜寫的, 也可以看出現實需要和限制是如何影響技術發展的
(如 vi 的奇怪的方向鍵設定與當時用的 terminal 很有關系), 更可以看出老一
輩黑客高手對計算機科學的熱情和無私奉獻的精神. 再看看自己的現狀以及環境
, 確實會突然有發奮圖強的熱情和沖勁的 --- 那個, 偶通常能保持幾個小時...


** The X Window System

這是由 XWindow 設計者撰寫的描述 XWindow 設計的論文. XWindow 的設計在今
天看來都是非常先進的: 它把現實設備看成一個 Server, 各種程序看成
client, 他們通過收發消息進行交互, 用這樣的方法來實現平台硬體無關和遠程
顯示 --- 注意, 這是二十年前的事情.

這篇文章是一個很好的設計范例, 作者把當前遇到的問題, 需求為了應對這樣的
需求采用什么設計都一一道來. 所以我們能夠理解 XWindow 中每一項設計的根
源. 我們會發現, 我們現在遇到的很多問題, 他們在二十年前就考慮到並着手解
決了. 在 XWindow 的設計中, 也體現了優越的 Tools, not policy 的思想, 從
第二章需求分析到第三章設計都能很好地體現這一點. 就因為堅持這樣的思想,
所以二十年來 XWindow 的系統體系並沒有什么改動, 從最原始的 twm 到最新的
Gnome 4.14 和最新的圖形化程序他們用的東西並沒有本質區別. 這在我們的開
發工作中都是值得借鑒和參考的.

當然, 正因為這樣的設計, XWindow 常常會受到效率和標准化方面的詬病 (當然
了不是 XWindow 不標准, 是上面跑的東西不標准而已), 優秀而超前的想法往往
不是當前的勝利者. 然而, 技術的發展卻堅定地朝着文章所指明的方向前進, 瘦
客戶機, 基於 XML 的用戶界面引擎等等時髦的概念和技術頻頻出現在大眾媒體
和軟體廠商的廣告詞當中. 這時候, 我們應該來看看這篇二十年前的猶如達芬奇
手稿的文章了.


** EMACS: The Extensible, Customizable Display Editor

http://www.gnu.org/software/emacs/emacs-paper.html

這是關於 emacs 設計的論述, 作者顯然是 RMS. emacs 毫無疑問是當今最強大
的文本編輯器, 這與它優秀的設計是分不開的 --- 它首先用 C 寫了一個 elisp
解釋器, 這是一個 lisp 的方言, 能夠完成最基本的文本操作, 然後編輯器的其
他部分都主要用 elisp 腳本寫成. 因而, emacs 擁有最高的可定制性和可擴展
性 --- emacs 其實沒有 ``配置文件'' 一說, 它的配置文件就是一個啟動時運
行的 elisp 程序, 是編輯器的一部分, 可由用戶隨意改動; 而用 elisp 可以給
emacs 添加幾乎任何功能, 甚至改動非常核心的函數. 因而它有無限的可能性和
威力.

這篇文章描述了 emacs 在設計中對比前人的主要進步: 徹底把編輯器的編輯語
言和編程語言分開, 保證編輯簡單易用的同時用編程語言 (elisp) 賦予用戶最
多的可能性. 文章還敘述了 emacs 的許多設計要點. 這也是一個非常好的設計
參考, 而且有一個廣受好評的實際例子可參考, 值得推薦.


** 閱讀的權利

這篇短文是 RMS 寫的一篇 ``科幻'' 文章, 說的是在未來人們連借閱圖書也會
被當作是犯罪, 並可能被投入監獄. 即使學術論文也要支付 10% 的閱讀費, 而
借債讀書的學生還債的希望就在於能夠寫出被頻繁引用的論文從而把閱讀費給賺
回來 --- 這似乎是一個無可想象的世界, 但是, 在軟體行業領域不正是這樣么?

我們無法想象買到一張新 CD 卻被要求必須單獨欣賞而不能和朋友分享的日子,
然而軟體行業正是這樣的, 甚至唱片行業也逐步有這樣的趨勢; Code Reading
那本書的前言說很難想象一個人練習寫作時不去參考著名作家的作品, 然而軟體
行業就是這樣的, 雖然我國法律允許對軟體進行研究, 但是你讀匯編干什么? 把
似乎很合理的軟體業的版許可權制放到其他我們熟知的領域, 就能看到它們有多么
的荒謬.

正是這篇文章使我認真思考關於自由軟體的意義的問題, 而不是一種幼稚的反微
軟反商業情緒. 文章的結尾是煽動性的, 主角們移民到版權官尚無力控制的月球
, 暗示着 GNU 重新創建自己的自由軟體世界的行動, 而後面的大起義, 其含義
就很明確了.


** Eric S. Raymond 的文章

Eric S. Raymond 是開源軟體界的著名作家, 他的文章對開源軟體社區及其他公
眾都產生了深刻的影響. 除了上面介紹過的 TAOUP 外, 它的經典文章還包括
``如何成為一名黑客'', ``提問的智慧'' 等等. 篇幅有限, 這里只是簡略提及,
所提到的所有文章在 Linux 版精華區有中文譯文.

``提問的智慧'' 是我最常引用的文章, 它不但是黑客社區中交流的指引, 更是
一個對 ``如何解決問題'' 的引導, 是任何人都應該一讀的文章. ``Hacker 文
化簡史'' 是一個傳奇簡述, 在傳奇中表現黑客的精神. ``如何成為一名
Hacker'' 則是一個對計算機入門者如何成長的良好指引, 它着重講兩個方面:
黑客應有的態度和黑客應具備的技術, 這其實也是計算機專業學生應有的態度和
技術. ``開拓智域'' 這篇文章有點難懂, 大概是從社會學和人性的角度分析開
源軟體社區的運作, 它解釋了一下開源軟體社區中的各種不同觀點, 也解釋了這
個社區的文化, 規則及其成因. 這幾篇文章對有點神秘的, 常常被誤解的黑客社
區做了深刻的刻畫.

``大教堂和市集'' 講述兩種不同的開發風格, 並說明為什么管理稍顯雜亂的市
集模式能夠開發出優秀穩定的軟體. 證明了開源軟體開發模式的合理性.  ``魔
法大熔爐'' 則是從經濟學的角度說明開源軟體的發展與占領市場是合理且對業
界有利的. 這可能可以算是面向大眾的對開源運動的一個理性分析.


** The Tao of Computer Programming

http://www.users.cloud9.net/~hennessy/tao.html

把這篇文章放在壓軸的位置是特意的, 從標題看是想仿道德經的, 不過混雜了不
少後世道家著作的改版, 比如那個 ``圖靈夢見自己變成了一台機器'', 乃至其
他著作的``三日不編程食肉無味'' 之類. 和道德經一樣, 它是一些對編程, 對
設計乃至對計算機科學的格言, 有的發人深思, 有的可能是我段數不夠, 看的莫
名其妙.

作者在文中把握了一個重要的思想: 編程是一項處處滲透着哲學道理和哲學情趣
的工作. 比如硬體和軟體是計算機的兩極, 沒有硬體軟體只是一堆臆想, 沒有軟
件硬體只是一堆發熱的元件, 脫離硬體談軟體和脫離軟體談硬體都是不可能的,
時間和空間是機器的陰陽兩極, 得時間往往失之空間, 得空間往往失之時間, 只
能權衡調和; 程序語言中的命名空間, 引用和實體的關系乃至 ``引用對象的實
體'' 等等, 是典型的 ``名'' 與 ``實'' 之辨. 讀點哲學書, 看看老祖宗的智
慧, 可能會有新的啟發.

具體的內容在這里不一一列舉, 我們中國人讀自己的作品, 應該更容易明白其中
的引喻和微言大義. 這篇文章當然有很多的中文譯本, 名字大抵都叫 ``編程之
道'', 大家可以搜索一下. 道可道, 非常道, 計算機的大道不存在與讓人眼花繚
亂的技術名詞中. 我們往往容易迷失在新技術和新技術名詞中而不去追尋其真正
的意義和所謂的 ``道'', 這篇文章大有返朴歸真之意, 先不說是不是真的能夠
學到所謂的 ``道'', 但看着它, 確實能讓你心平氣和, 如沐春風.

沒有留言:

張貼留言