附 錄
一、Jiangtao, Aimingoo 關于序言的對談(2005.11.06)
Jiangtao說:
大部分的人都希望看到招術,而不是學習其中之道。 但每個人碰到的情況是不同的,不通“道”,招數就不靈了。
Aimingoo 說:
是啊。明白道理,明白原理,即知變化之道,知變通之道。
亦步亦趨學不好編程,同理,也學不好工程啊。
Aimingoo 說:
正如你說所"道理歸到底是相通的",不同的人只是在換著不同的方式在說而已。
Aimingoo 說:
像GoF這樣深徹的理解,并不多。而我們看到GoF對他們的理解的解釋,文字量并不大。而更多的是別的人的、種種不同的說法。—— 其實,根源在哪里呢?在GoF的思考,以及他們對既有事物的觀察方法。
Jiang Tao 說:
易經,論語也很短,卻可以解釋世界萬物之理,當然其中任何一個話題展開也可以寫成長篇大論。
Aimingoo 說:
從寫作手法上,看作散文集亦無妨。但我是有大綱然后逐一先成
的,也就是說,在思想上是有中心并漸次展開的。
后語
Aimingoo 說:
《程序員》選了6,7,8三章發表,其實很正確。因為6,7兩章的確
講述了中心思想。但如果沒有前面的,就有骨無肉,不豐滿了。
Jiang Tao 說:
我知道,你有一個邏輯關系組織,不過每一篇其實是散著談的。
Jiang Tao 說:
你是從根上談起,一篇篇往后。
Aimingoo 說:
對對,每一篇與其它的段落,并沒有直接關系。
Jiang Tao 說:
前面的道理大家覺得自己都明白,其實只是知道道理,卻沒有體
會上身。
所以會不斷地犯錯誤,而不知道錯誤的根源。
Aimingoo 說:
是的。“知道”和“理解”,以及“理解”和“領悟”,都是不
同的境界。
Jiang Tao 說:
我們和這些專家正相反,專家是從根上來的,我們是從道理往后
尋找根源。
大部分人還根本不找。只是用這個結果,卻不知道根在哪里。
Aimingoo 說:
對。我們做事,總是做到后來才發現道理與專家們說的是一樣的。
我讀書的時候,以及在Coder的一個很長的階段,也是很排斥“專家”
和“理論”的。但現在我卻在思考理論的東西。
Aimingoo 說:
因為我發現,這些理論,以及其背后的思想,是一切演化的根源。
如果不想淪為代碼工人,甚或代碼機器,那么就需要思考并領會
這些背后的道理。
Aimingoo 說:
我在腳注里面,有一些文字是很值得關注的,例如:“其實所謂
‘經典’也是對既有知識的總結。大師們所知的,與你所思考的未必
就有天壤之別。”
再如“《三十六計》更多的時候是被當成方法論來讀的。其根源
在于‘計謀’本身只是方法,而不是戰略。”
Jiang Tao 說:
就是這個理,不過這一關不好過。
圍棋的學習有四個階段:記住定式 應用定式 忘掉定式 創造定
式。
Aimingoo 說:
大多數時候,“文字”只是思想的結果的描述。我希望更多的人
看到思考的過程,并知道其價值。如你所說,我也希望人們忘掉我所
說的,并創造自己的“定式”,乃至達到“法無定法”的境界。
Aimingoo 說:
所以我在甚至希望大家最終將這本書束之高閣,“思想已經領悟,
文字的、紙質的東西還有什么價值嗎?”
Jiang Tao 說:
等電子版發表后,我們可以組織感興趣的人延伸討論討論,很多主
題是可以展開討論的.
對照自己的問題,再看這些思考,就會有感覺了,這樣就有案例出
來了。
Aimingoo 說:
好啊。非常不錯的主意。
后 語
前言后語
你現在讀到的文字,原本應該是這本書的前言的。然
而如今,它變成了后語。
如果讀者是客戶,那么我就應該是這本書的工程管理
人員了。與第一次著書不同,這一次我已經嘗試參與整個
“做書”的過程。我必須要考慮客戶問題,必須要知道作
為客戶或者讀者這個角色的你,在想些什么,或關注些什
么。
在這本書的最最最初的時間里,我把書稿給了我的老
朋友王寒松。然而我很失望地聽到他的意見:這個前言沒
法讀。——我想了又想,是的,因為有了玄而又玄的觀點
以及曲折旁引的論述,所以的確不是太容易讀。
從我的角度上講:
這個前言總括地講述了我的觀點
從讀者的角度上講:
讀者關注的是細節的文字
讀者享受的是閱讀的快樂
發現我在“做書”的這件事中扮演的是工程管理人員
的角色的同時,我就決定了這篇前言應該改成后語。原因
很簡單,客戶并不關注我對觀點的總括,至少一開始他們
不會關注。如果要客戶做結論,或者要他們與技術人員討
論結論,那就讓他們在看完演示之后,在最最后的階段去
-112-
『大道至簡』
做。
讀者的閱讀行為決定了我將這篇文字放在這個位置:
這篇前言既不是細節的文字,又不能給讀者以閱讀的快
樂,因此它就應該放在后面。至于它是叫前言,還是改名
叫后語,那只是形式的問題。
如果你覺得你的項目中還有一個模塊不是用戶所關
注的,那么,En,建議調整一下明天的客戶演示,把這一
部分放到幻燈的最后一頁的后面,只有客戶提及時,才拿
出來跟他們解說。
否則,如果他們不感興趣,那么他們將永遠看不到這
張幻燈。一如這一篇前言。
軟件工程
如果做一份軟件工程中的經典書目,決不會有人漏掉
Roger S.Pressman 著的《軟件工程》。這本書有第四、五版
梅宏教授譯著的中譯本。然而相信讀這本書的人不會太多
的注意到它的副標題是“實踐者的研究方法”。——從根
源上說,它是講述軟件工程方法的書,而不是軟件工程思
想。
這有什么區別呢?拿這本書來作為軟件工程活動的
參考時,絕大多數的人不能明白類似如下的問題:
為什么要這樣做呢?
我們這里應該這樣做,但是接下去呢?
這個環節很重要,但是如果不做會有怎樣的風
險?
我們在做這件事的時候,其它的人在做什么?
為什么失敗了?
相關的問題很多,但總而言之,這本經典教材更多的
是在描述“怎樣實做”,而絕少講述“為什么這樣做”。以
致于行為失去了思想的引領,能“完成”工程,而不能“做
成”工程便是可以想見的事了。
任何人在實施軟件工程的過程中,或者處于工程過程
的某一個階段的時候,都會有自己的思想或思考(哪怕是
勞騷),那么為什么沒有人寫“軟件工程思想”這樣的書
呢?
我與軟件工程
我始終認為無論是哪家公司實施軟件工程,都將是一
部成功者的血淚史。然而不實施軟件工程,則將是一部失
敗者的血淚史。換而言之,做軟件工程可能流血流淚,但
終究可能成功;而不實施軟件工程,那就是拋頭顱灑熱血
的失敗了。
我所遇見的卻是不打算實施軟件工程的公司。在“誓
死不做軟件工程”的思想的引領下,一家堪稱河南省最具
資本實力的軟件公司于 2003-2004 年間倒掉了。我在這家
公司前后工作了 7 年。在 2003 年 2 月的時候,我開始請
假在家寫書,以一個絕對 Coder 的身份完成了《Delphi
源代碼分析》。用這一年的寫書時間,完成了我對這些年
的程序生涯的回顧和反思,我看到了我在做 Develope
Manager 和 Project Manager 過程中的得失,也透析了那家
公司幾年來的成敗與沉浮。
我再次與總經理 P&J 對坐的時候,我們又討論到公
司的問題。他依舊固執地認為“最重要的是人的問題”。
我看不到他對管理、工程和決策上的任何反思,于是我終
于辭職了。
2004 年 3 月,我開始應職于一家新的軟件公司。因
為規模小,所以實施軟件工程的風險也就小。在一次公司
內的軟件工程培訓中,我突然意識到工程實踐與工程思想
之間的差異與關系,也同時看到《軟件工程——實踐者的
研究方法》一書的根本性的不足。時值我那本《Delphi
源代碼分析》將近完成之時,于是我匆匆記下當時的想法,
并確定了這本新書的名字《大道至簡——軟件工程實踐者
的思想》。
大道至簡
直到現在①,這本書的基本目標仍舊與它最初定名時
一樣:
這是一本小書
只用讀與思考,沒有實作
所謂“小書”,是我不想做成教材或者宏論。思想應
該簡明,闡釋應該清晰,而讀者應該更多地去思考,而不
是跟隨這本書去完成什么。
① 我寫書的習慣是先寫前言,這相當于大綱。因此所謂“現在”,
是指我寫下前言的這個時候:2004.11.01 凌晨 5 時。
老子說“道之為物,惟恍惟惚”。道是要體悟的,而
不是象做木工活那樣是“會與不會”的問題。道是什么呢?
“道是本體,是規律,是自然”,簡而言之,道是既存在
的事實和影響事物發展的規律。
這里需要說明的是,道并不人為的規則,而是事物本
身特質的規律。因此,本書中所要講述重點是這種規律。
即使提及到一些“實踐規則”,也是在對規律討論之后。
讀者應該發現這些“人為規則”是那樣的遵從于“本質規
律”。
經常聽到的一句話是“規矩是人定的”,因此也要“靠
人來推翻”。但是(初級的)軟件工程實施者經常抱著一些
經典的教材一步一趨,此謂之曰“知其然而不知其所以
然”。無僭越便無建樹,無大成者。
畫眉深淺入時無
我不是太喜歡寫很“入時”的東西。“入時”的往往
是新的,因而也就乏有研究。這樣的東西流于口頭的討論
是可以的。然而著書立說,是要將心得之見或謹嚴之論呈
現給讀者,不是把自己想說的話說出來就可以的了。
在寫《Delphi 源代碼分析》的時候,Delphi 8 都已經
發布了,Win32 的時代也已近末路。促使我寫那本書的原
因,在于沒有人用 Delphi 來研究操作系統的內核機制,
而 Delphi 的源碼中對這些的實現細節實在是寶藏。絕大
多數用過 Delphi 的開發人員,入源代碼之寶山而空回,
實在令人痛惜的。因此那本書能否買得了錢我是不在乎
的,我在乎的是讀過那本書的朋友,能從編譯器的角度上
對 Win32 體系增加多少的了解。
從 Delphi 7 的時代我就開始接觸.NET Framework。
2003 年的時候給 BorCon China 做演講時,我已經對
Borland 在底層上為 Delphi .NET 的實現非常了解了。因
此如果以“入時”(以及“適時”)而論,在《Delphi 源代
碼分析》完成之后,我應該寫的書是《Delphi .NET 源代
碼分析》,來全面講述 Delphi7、Delphi8 和 Delphi9(Delphi
2005)中對.NET 下開發的實現。
這個計劃被我擱置了。
在我如今看來,語言其實是開發的細微未節,而在大
學時代、在課桌上令人昏昏欲睡的《軟件工程》才是軟件
開發中的髓質與靈魂。十年的軟件開發實踐中,其實在很
多時間里我都落入了細節陷阱。
“實現”的欲望是從程序員出身的管理者的通病。因
此如果你仍然在思考選擇什么語言、如何重構,以及在開
發部里爭論一段代碼有沒有或應不應該采用某種模式,那
么請你暫時沉寂下來,聽我說:那是細節。
真正的問題是:你的老板要求你下周二就給客戶演示
這個系統;而客戶并不關注你的實現細節,他關注的是你
本月月底是否能 Close Project。
軟件工程首先關注的是以客戶為對象的、整個工程的
成敗和質量。根本上說,技術性、重用性等等,只是保障
工程成敗與質量的手段而已。
重要的東西往往并不入時①。例如你的ThinkPad還在
工作,僅僅是因為電池還沒有用光。
知之、好之、樂之
從讀者的角度上來講,是“知之不如好之,好之不如
樂之”的,因此作為作者,則希望自己的作品使人“以之
為知,以之為好,以之為樂”。在寫《Delphi 源代碼分析》
時,我的書稿的第一頁就寫著“知之、好之、樂之”,然
而那本書僅能給人以知識,讓人“知道”就很不錯了,況
乎樂哉?
讀書給人以痛苦之感是有可能的。如果讀《Delphi
源代碼分析》不感到痛苦,那是沒認真讀。然而我畢竟不
是想讓人(或者想授人)痛苦的,將《Delphi 源代碼分析》
寫到那般地步,非我所愿。
讀《大道至簡》的話,就用不著這樣了。我雖然做不
到讓讀者“以之為樂”,但“以之為好”還是可以的。我
希望讀者可以輕松地將這本小書讀完,然后便可以束之高
閣了。畢竟這本書不是理論,也不是方法論,只是思想。
思想已經領悟,文字的、紙質的東西還有什么價值
嗎?
① 你當然也可以由此反推出第 7 章的部分內容并不重要。的確,
那只是我思考事物的一種方式,我希望你看到本書中講的思想是
如何被實例化的。但對于本書來說,如同我一再強調的那樣:這
是枝節。
致謝
首先感謝我的老朋友,程序員雜志社社長蔣濤先生。
在我看來,他所作的序,既是對本書的贊許,也是對他本人十余年來從程序員進入管理和經營角色的經歷的感言。
感謝 P&J 和 Danny.Chou。他們給了我七年的從業經驗,看著一個小公司做大,又從一個大公司做到消亡。這些經歷深深地影響了我如今思考問題的方式,以及決策的方法。P&J 的知人善任和用人不疑成就了我的用人觀,而以 Danny.Chou 為鑒,則同時形成了我對技術的執著與背離的兩種態度(用于不同的思考場景)。
再次感謝 P&J 在 1997 年成功地說服我留任西南區市場經理一職。如果沒有那時的轉變,我想我至今仍然會困宥于程序員的這一個角色。
感謝我的朋友小邵(colorme)和明明,你在這本書上看到的插圖漫畫出自這對小夫妻的手繪。盡管 colorme 是我所見過的最好的平面設計人員,然而他只為本書畫過一輛坦克。——然后他把它藏在了某幅漫畫里面。
感謝我的父親母親。父親在我 12 歲之后的教育上是成功的,他留給了我足夠的、獨立的思考空間,以及面對事物的決策權。我至今記得我的第一封信是寫于 9 歲那年的一封家書,這是我第一次用筆寫課本之外的東西。這是母親的功勞,她成就了我對文學和文字的喜好。沒有他們,我不會有今日的觀點和表達這些觀點的能力。
感謝 Joy。En,我還活著,是因為她無微不至的照顧。 謝上帝把她給了我,成了我的廚師、司機、保姆、聽眾、苦力工、開心果,以及,我最愛的妻。
周愛民(Aimingoo) 2013-08-24 22:48:17