《道法自然——面向對象實踐指南》
10月隆重推出 博文視點的介紹
2. 出版信息 作者:王詠武 王詠剛 預計頁碼:432 預計定價:45.00元 預計出書時間:10月
3. 內(nèi)容簡介 本書是一本試圖用實戰(zhàn)案例闡釋面向對象技術體系的指南。本書共分19章,通過實際的開發(fā)案例——FishGUI項目為主線依次介紹了需求和用例分析、面向對象分析、架構分析、面向對象設計、設計模式、編碼技巧等幾個主要的技術領域,并基本按照時間順序,描述了FishGUI系統(tǒng)設計和實現(xiàn)的全過程。 如果把面向對象大師們偏重理論建構的經(jīng)典讀物稱為面向對象盛宴中的主菜,那么,這本指南若能充當佐餐的涼菜或是飯后的甜點,作者就心滿意足了。本書適合所有在軟件開發(fā)領域辛勤工作的開發(fā)人員、管理人員、系統(tǒng)分析人員、測試人員、技術支持人員等閱讀。
4. 序言 自從2000年面向對象設計領域內(nèi)的里程碑著作《設計模式》被譯成中文出版后,面向對象和軟件工程領域的經(jīng)典名著就陸續(xù)被各出版社大批引進。模式、框架、UML、用例、MDA、AOP這些新潮名詞開始不斷出現(xiàn)在專業(yè)報刊雜志中,程序員的求職簡歷中也都紛紛加上了精通面向對象的字句,但一陣熱潮過去后,開發(fā)者的實際設計水平提高了多少呢?很遺憾,從業(yè)界的實際反饋來看,一般開發(fā)者的面向對象設計水平并沒有實質性的提高。 問題出在哪里呢?我們認為,關鍵在于經(jīng)驗。國外譯著的理論水平很高,但是理論如何落實到實踐,這是一個經(jīng)驗的問題。我們出版的技術圖書當中,能夠向讀者傳授實踐經(jīng)驗的不多。圖書市場上充斥了不少銷售得還不錯的軟件開發(fā)案例叢書,它們本應當承擔起教授讀者實踐經(jīng)驗的責任。但是它們的表現(xiàn)如何呢?大部分案例完全沒有OO的設計思想,沒有設計過程,沒有重構,沒有復用,重復代碼到處出現(xiàn),甚至還有不少錯誤的設計和代碼。就是這樣的圖書,卻能影響成千上萬的學習者,這樣學習下來的結果,當然不會令人樂觀。 在軟件開發(fā)的第一線人員中,OO的應用到底是什么樣的景象呢?按實際應用的水平可以把軟件開發(fā)人員分成五個層次: 第一層是不管什么OO,直接編碼,把功能實現(xiàn)了項目就是成功; 第二層是理解了幾個面向對象的典型概念——封裝,繼承,模式。囫圇吞棗,不管實際效率如何就開始應用,為OO而OO; 第三層是在設計階段擺出一副O(jiān)OAD的架子,進入編碼實現(xiàn)就逐步把OO放到了一邊,OO與實踐分離; 第四層是基本掌握OO理論,在具體應用中能大量使用OO技術來進行系統(tǒng)分析和程序設計; 第五層是把OO思想融會貫通,不管用不用OO技術,都能選擇最佳設計和實現(xiàn)方法。 我喜歡把設計模式類比成圍棋定式,OO技術同樣也可以類比成圍棋技術。在圍棋中定式的定義:“在局部戰(zhàn)斗中,用最穩(wěn)妥的順序,而且能經(jīng)得住以后的檢驗,從而被固定下來的就是定式”。 在軟件開發(fā)中模式的定義:“將一類不斷重復發(fā)生的,類似的問題以及該類問題的解決之道總結出此類問題的共同點并抽象成一定的描述及規(guī)范,以便遇到此類問題無須再做過多的考慮,直接使用已經(jīng)總結好的解決之道。我們稱之為模式”。 我們可以看到這兩者的類似,圍棋入門容易,精通難。拋開入門級別,圍棋手按水平從業(yè)務初段到職業(yè)9段還可以劃分16個等級,其差距就在于棋手們在實踐中對技術的綜合使用能力。 上面這幾個層次的差別也在于此,要學習OO理論和方法并不難,難的是在實踐中如何用好面向對象技術。OO大師們提出的理論和方法都有著深刻背景,剖析了軟件開發(fā)過程,經(jīng)過了提煉和抽象,大師們的名著是學習的基礎,也有很多來源于實踐的例子,但每個具體項目有著千差萬別的情況,如果不能結合具體實踐去靈活應用,可能很難達到較高的水平。 如果能跟蹤學習一個完整項目的進展過程,對于在實踐中全面掌握OO會有很大益處。 長久以來,我一直希望在《程序員》雜志上開設這樣的欄目,針對真正的第一線實戰(zhàn)項目,記錄一個項目從分析到設計,并實現(xiàn)的思考全過程;類似于MBA教學中的案例分析,類似于圍棋中的名局細解,從實踐中去領悟體會OO技術的內(nèi)涵。可是很困難,大部分的實踐項目都不愿意完整地公開,另外,真正的專家高手又很難花時間去做這樣的工作。 這本書彌補了這個遺憾,本書的作者有著多年豐富的軟件開發(fā)經(jīng)驗,以一個真實的項目——FishGUI為基礎,全面記錄了項目的實施,并對每一個技術過程做了分析總結。凝聚了他們對OO技術的解讀與實踐,提煉出了經(jīng)過咀嚼的精華。 讀者可以跟著這個項目實施的步伐,從需求分析,用例建模,OO分析,OO系統(tǒng)設計,模式應用一步步去真實體驗。書中精彩的部分包括對各種理論的提煉和解讀,既講清了這些紛繁技術的來龍去脈和關系,又點出了OO技術的關鍵點。華羅庚先生說過,讀書要先把書讀“厚”,再把書讀“薄”。這些總結就是作者把OO技術讀薄的成果。 “一花獨放不是春”,只有不斷交流,知識才能分享,技術才能進步,我衷心希望看到更多的第一線專家分享自己的成果,看到更多這樣來源于實踐的作品。
《程序員》雜志社社長
5. 自序 程序員的生活天天都在改變,不變的只有求知的樂趣和創(chuàng)新的快感;面向對象的世界時時都在進步,永恒的只有技術的純潔和科學的謹嚴。 面向對象技術讓許多軟件項目由難變易,也讓不少程序員的學習歷程由易變難。不是我們遲鈍,也不是我們偷懶,誰讓面向對象的海洋如此浩瀚? 計算機科學在根本上是實踐的科學,面向對象的技術也不例外。記熟了三千佛法,卻不懂得定慧雙修的出家人不見得就能大徹大悟、見性成佛;背誦了“封裝繼承和多態(tài)、模型模式加模板”,卻不知道聯(lián)系實際的程序員也不見得能開發(fā)出優(yōu)秀的軟件。 從實踐中來,到實踐中去,這是學習面向對象技術的不二法門,也是我們在寫作本書時努力追求卻未必能窺其堂奧的理想境界。但愿本書能為讀者步入面向對象的殿堂提供些許指引和幫助;除此以外,我們別無他求。 《老子》中說:“人法地,地法天,天法‘道’,‘道’法自然!比绻梢酝庀荣t的名句,我們倒寧愿把這里的“自然”理解為——實踐。
6. 前言 我討厭長篇大論的“前言”——為什么每一本嚴肅的圖書都要用正文以外的篇幅浪費讀者的大量時間?我也討厭喋喋不休的“致謝”——IT書籍又不是奧斯卡頒獎典禮上的那些除了“感謝”二字就再也不知道如何謙虛的大牌明星。所以,大家在此處看到的前言只是一份簡單的FAQ(常見問答,最有助于節(jié)省程序員時間的文檔形式之一),讀者完全可以像使用其他FAQ那樣在這里快速查找自己需要的信息。 為什么需要一本面向實踐的指南? 每1000個學習面向對象技術的程序員中,有997個都要將學到的知識付諸實踐;在另外的3個人中,一個是只靠做研究和寫論文就可以衣食無憂的理論家,另一個是試圖記住800種以上的技術名詞以便在人前炫耀的牛皮家,最后一個是根本不知道面向對象為何物卻非要擺出頭懸梁、錐刺股的架勢博取老板歡心的鉆營家。 顯然,99.7%的人都需要在學習面向對象技術時,更多、更好地掌握理論和方法在實際項目中的應用秘訣。在此過程中,面向對象大師們的經(jīng)典著作當然都是必讀的教材。但實際工作中有太多太多的案例告訴我們,像趙括那樣只會紙上談兵的程序員遲早會在冷酷的現(xiàn)實中一敗涂地。也許,一本面向實踐的指南讀物可以幫我們更快地適應面向對象的思維方式,更容易地將書本知識應用到實踐中去——我們有什么理由拒絕這樣一本實用的書籍呢? 誰需要這樣一本指南? 絕大多數(shù)聽說了也見過了面向對象的神奇魅力,卻始終無法真正邁進面向對象大門的程序員需要這樣一本指南;絕大多數(shù)在面向對象領域里刻苦攻讀、努力實踐,卻遲遲不能看到美好回報的程序員需要這樣一本指南;絕大多數(shù)在面向對象的開發(fā)過程中屢戰(zhàn)屢敗、灰心喪氣,恨不得明天就去國足尋找同病相憐者的程序員需要這樣一本指南;絕大多數(shù)對面向對象大師們的鴻篇巨著佩服得五體投地,卻總也猜不出大師們在字里行間究竟隱藏了多少玄機的程序員需要這樣一本指南;當然,絕大多數(shù)好奇心強烈,想了解本書到底有多大價值,想知道本書作者究竟是何許人也的評論者也不妨紆尊降貴,先讀過本書再發(fā)表意見。 補充說明1:本書的讀者最好能事先掌握一門面向對象的程序設計語言,C++、Java、C#、Delphi等語言均可。盡管本書案例使用的是C++語言,但大多數(shù)面向對象的語言都有著類似的精神實質,都能很好地體現(xiàn)本書的主旨。如果你對面向對象的程序設計語言還比較陌生,那不妨在閱讀本書的同時學一學C++的語法和編碼技巧——有這樣一舉兩得的機會,你又何樂而不為呢? 補充說明2:如果了解UML語言的基礎知識,閱讀本書時,你就不會對著一堆堆抽象的圖形發(fā)呆;如果還沒有接觸過UML語言,那不妨找一本《UML用戶指南》之類的書籍,在閱讀本書之余,趁便補習一下相關知識。 補充說明3:本書所說的“程序員”是指廣義的程序員而言,包括所有在軟件開發(fā)領域辛勤工作的開發(fā)人員、管理人員、系統(tǒng)分析人員、測試人員、技術支持人員等等。是否選擇本書是讀者的自由,但我們不想因為使用更親切、更順口的“程序員”一詞而將許多潛在的讀者拒之門外。 為什么要結合一個實際的案例? 這個問題純屬多余:一本自稱面向實踐的指南讀物,如果不緊扣一個實際的開發(fā)案例,不就和《笑傲江湖》中林震南所使的辟邪劍法一樣徒有其表了嗎? 惟一需要說明的是,貫穿本書始終的案例——FishGUI項目(一個有趣的名字)是本書作者王詠武親身參與的一個軟件開發(fā)項目。無論項目的最終效果如何,我們從FishGUI的開發(fā)過程里獲得的許多經(jīng)驗、教訓都值得和大家分享。FishGUI產(chǎn)品本身屬于通用的GUI(圖形用戶界面)框架系統(tǒng),其用途類似于Java的Swing,但功能遠比后者簡單。因為強調通用性和靈活性的原因,這一類系統(tǒng)中往往包含了最多的面向對象知識和最豐富的開發(fā)技巧,用這樣的例子來論證面向對象領域的基本理論和實踐準則,再合適不過了。即便FishGUI的設計和實現(xiàn)還存在著諸多不足,但在書中把這樣的例子詳詳細細展現(xiàn)出來,供方家指正,讓讀者品評,這不也是一種最好的交流方式嗎? 為什么每章的標題都包含了一組對立統(tǒng)一的概念? 的確,本書正文中每一章的標題都包含了一組對立統(tǒng)一的概念。采用這種寫法的主要原因是,我們對面向對象技術有一個最根本的認識: 面向對象領域充滿了辯證關系,開發(fā)者不得不在每一個設計和實現(xiàn)環(huán)節(jié)中仔細權衡、則善而從。 許多急功近利的程序員都喜歡在開發(fā)時把某種技術、某種架構或某種設計方案的作用絕對化。在他們眼中,一種好的技術就理應放之四海而皆準,一種成功的設計方案也絕不存在什么適用場合和環(huán)境的問題。套用軟件工程界廣為流傳的一個說法,這些人其實都是“銀彈萬能論”的忠實擁躉。 實際上,軟件開發(fā)和所有人類活動一樣,都是充滿了矛盾的復雜過程。概括起來,絕大多數(shù)軟件開發(fā)都是由一次又一次的選擇所組成的:我們必須根據(jù)實際情況,謹慎地選擇模型、選擇架構、選擇模式、選擇語言、選擇接口、選擇流程、選擇算法……每一次選擇時,我們幾乎都會面對兩難的境地:對同一需求,往往有兩種以上的方案可以奏效,但每一種方案都各有其長處、缺陷和適用范圍。沒有哪種技術完美無缺,也沒有哪個負責任的程序員能夠用擲硬幣的方式做出取舍。 在面向對象的實踐中,我們只有承認這種矛盾關系,才能更好地認識和把握它,并在對立統(tǒng)一的思辨中找到最適合當前情況的解決方案。從這個意義上講,面向對象領域里那些游刃有余的高手們,都天生有著黑格爾般的敏銳頭腦和縝密思路,都是IT世界里的業(yè)余哲學家。 如何閱讀本書? 本書共分19章,依次介紹了需求和用例分析、面向對象分析、架構分析、面向對象設計、設計模式、編碼技巧等幾個主要的技術領域,并基本按照時間順序,描述了FishGUI系統(tǒng)設計和實現(xiàn)的全過程。對于大多數(shù)以學習為目的的讀者,我們推薦從頭至尾、循序漸進的閱讀方式;如果你對其中的某個或某幾個領域早已了如指掌,當然可以采用跳躍式的閱讀辦法,只翻檢你最關心的章節(jié)。 既然是一本面向實踐的指南讀物,我們在此強烈建議大家在閱讀時多多動手:遇到不明白的UML圖示,不妨在Rational Rose等工具中勾畫幾下;碰見繁難的代碼問題,打開你的IDE調試本書的示例代碼自然是最好的選擇;假如在閱讀過程中,你的腦子里突然跳出了某個新鮮的感覺,那你應該干凈利落地把書拋在地上,然后飛快地跑到計算機前,在面向對象的開發(fā)工具中記錄或驗證你的靈感…… 什么是“笨笨點評”? 本書大多數(shù)章節(jié)里都會隨機出現(xiàn)一兩段“笨笨點評”。這里的“笨笨”就是王詠剛,也就是那個慵懶閑散、不務正業(yè)、還時不時在報刊上發(fā)兩篇笨拙文章的家伙了。所謂“點評”,就是王詠剛在整理和刪改本書的過程中(本書的主要技術思想來自第一作者王詠武),因為大腦短路或其他類似的原因,突然想到并隨手記下的各種稀奇古怪的文句,其中既有技術的隨想,也有歷史的回眸,既有肆意的評論,也有大膽的臆測?傊,大家千萬別把“笨笨點評”當正文來讀,高興的時候盡管當它是下酒的涼菜,不高興時對它視而不見也未嘗不可。 為什么使用C++語言? 為什么不呢?C++語言是普及面最廣、適用性最強、開發(fā)工具最多、開發(fā)成果最豐富的程序設計語言之一。既然本書的案例終歸要由某種特定的程序設計語言來實現(xiàn),那為什么不選擇著名的C++呢?而且,現(xiàn)實中的FishGUI項目使用的就是C++語言,F(xiàn)ishGUI的最終產(chǎn)品在執(zhí)行效率、可擴展性、可移植性等方面的表現(xiàn)也都令人非常滿意,我們有什么理由放棄C++語言呢? 我們知道,有人一定會說出C++太復雜、C++不如C#時髦等等冠冕堂皇的理由。我們不想為此多費口舌。但需要強調的是,在面向對象的領域里,只要你真正掌握了面向對象的基本理論和基本方法,使用何種語言對你來說并不重要。舉例而言,如果你是不折不扣的Java迷,那你完全可以在閱讀本書的同時,隨著FishGUI的設計和開發(fā)的進程,用Java語言把FishGUI重寫一遍,這可是一種最好的實踐方式呀!到那時,如果你能把你的大作寄給我們學習和參考,我們將不勝榮幸。 FishGUI到底有什么用? FishGUI系統(tǒng)是本書中最重要的開發(fā)案例,也是一個真實存在過的軟件產(chǎn)品。很多在Windows或Linux系統(tǒng)中開發(fā)過GUI應用的讀者可能大惑不解:既然已經(jīng)有MFC、.NET Framework、AWT、Swing、SWT、Tcl/Tk、Qt等許多GUI開發(fā)環(huán)境可用,為什么還要自己開發(fā)FishGUI這樣的GUI框架呢?我們覺得,除了為本書提供案例支持外,F(xiàn)ishGUI的存在價值至少還包括以下幾個方面: 我們可以很容易地將FishGUI移植到各種嵌入式或實時操作系統(tǒng)(RTOS)中。對于在那些缺乏GUI支持的操作系統(tǒng)中開發(fā)應用軟件,或者沒有實力購買商用GUI開發(fā)包的用戶來說,F(xiàn)ishGUI顯然可以助他們一臂之力。 同樣的道理,基于FishGUI開發(fā)的應用軟件也可以快速移植到不同的嵌入式或實時操作系統(tǒng)中,并保持相同的外觀和使用體驗(Look and Feel)。 嵌入式軟件開發(fā)者可以利用FishGUI在Windows或Linux系統(tǒng)下建立一個模擬開發(fā)環(huán)境,并在該模擬環(huán)境中利用Visual Studio等通用IDE快速完成圖形用戶界面的開發(fā)、調試工作,然后將應用程序不加修改地移植到嵌入式或實時操作系統(tǒng)中。 通過研習FishGUI系統(tǒng)的架構,我們可以更好地理解MFC、.NET Framework、AWT、Swing、SWT、Tcl/Tk、Qt等復雜GUI開發(fā)包的實現(xiàn)機理,這顯然有助于提高我們的GUI開發(fā)水平。 怎樣下載和使用本書的源代碼? 本書各章節(jié)的源代碼,F(xiàn)ishGUI系統(tǒng)的所有UML模型文件、文檔、源代碼和相關說明文件都可以從網(wǎng)上直接下載。網(wǎng)址是: http://www.contextfree.net/wangyw/ooguide/ 你可以使用Rational Rose 2002或更高版本打開FishGUI系統(tǒng)的UML模型文件;在Windows系統(tǒng)下可使用Visual Studio .NET 2003或Visual C++ 6.0編譯所有C++工程和源代碼(Visual Studio .NET 2003也用于編譯少量C#語言示例代碼);在Unix/Linux系統(tǒng)下可使用gcc 3.2.2或更高版本編譯C++工程和源代碼。 有關FishGUI系統(tǒng)本身更詳細的生成、安裝和使用說明請參見本書附錄及FishGUI源代碼中所附的說明文檔。
7. 目錄 第1章 需求分析:追求完美vs.容忍缺陷 在生活的任何領域尋求完美,都不過是抽象的、病態(tài)的或無聊的幻想而已。 ——車爾尼雪夫斯基,《藝術與現(xiàn)實的審美關系》 第2章 用例分析:海底總動員vs.云中漫步 橫看成嶺側成峰,遠近高低各不同。不識廬山真面目,只緣身在此山中。 ——蘇軾,《題西林壁》 第3章 設計方法:面向過程vs.面向對象 思想的真正客觀性應該是:思想不僅是我們的思想,同時又是事物的自身,或對象性的東西的本質。 ——黑格爾,《小邏輯》 第4章 模式:變化之美vs.永恒之道 老僧三十年前未參禪時,見山是山,見水是水。及至后來,親見知識,有個入處,見山不是山,見水不是水。而今得個休歇處,依前見山只是山,見水只是水。 ——釋普濟,《五燈會元》,第十七卷 第5章 分析模型:實體類vs.軟件類 不,我不想要自由;我只要條出路,向左或是向右,到哪兒都行。 ——卡夫卡,《致科學院的報告》 第6章 架構分析:功能分解VS.對象分析 天下莫大于秋豪之末,而大山為;莫壽于殤子,而彭祖為夭。天地與我并生,而萬物與我為一。既已為一矣,且得有言乎?既已謂之一矣,且得無言乎? ——《莊子•齊物論》 第7章 面向對象設計:共性VS.個性 一尺之捶,日取其半,萬世不竭。 ——《莊子•天下》
第8章 外觀模式:統(tǒng)一接口VS.暴露細節(jié) 百事有所出,而獨知守其門。 ——《淮南子•原道》 第9章 觀察者模式:間接依賴VS.直接依賴 你以為那很奇怪嗎?什么事情都逃不過旁觀者的冷眼;淵深莫測的海底也可以量度得到,潛藏在心頭的思想也會被人猜中。 ——莎士比亞,《特洛伊羅斯與克瑞麗達》,第三幕
第10章 單件模式:隱式全局變量VS.顯式全局變量 云長笑曰:“……吾來日獨駕小舟,只用親隨十余人,單刀赴會,看魯肅如何近我!” ——羅貫中,《三國演義》,第六十六回
第11章 復合模式:透明VS.安全 誰是那個總是走在你身旁的第三人? 我數(shù)的時候,只有你和我在一起 但是我朝前望那白顏色的路的時候 總有另外一個在你身旁走 ——艾略特,《荒原》
第12章 迭代器模式:繼承VS.模板 道生一,一生二,二生三,三生萬物。 ——《老子》,第四十二章 第13章 創(chuàng)建型模式:工廠方法VS.抽象工廠 神說:“水要多多滋生有生命的物,要有雀鳥飛在地面以上,天空之中!鄙窬驮斐龃篝~和水中所滋生各樣有生命的動物,各從其類;又造出各樣飛鳥,各從其類。神看著是好的。 ——《舊約•創(chuàng)世紀》 第14章 消息:廣義消息VS.狹義消息 曾是寂寥金燼暗,斷無消息石榴紅。 ——李商隱,《無題》 第15章 模板方法模式:正向依賴VS.依賴倒置 樂思把他滲透了:有時是單獨而完整的一句;更多的時候是包裹著整部作品的一片星云:曲子的結構,大體的線條,都在一個幕后面映現(xiàn)出來;幕上還有些光華四射的句子,在陰暗中燦然呈露,跟雕像一樣分明。 ——羅曼•羅蘭,《約翰•克里斯朵夫》,卷四 第16章 MFC消息映射表模式:虛函數(shù)VS.映射表 人的生活就像作曲。各人為美感所導引,把一件件偶發(fā)事件(貝多芬的音樂,火車下的死亡)轉換為音樂動機,然后,這個動機在各人生活的樂曲中取得一個永恒的位置。 ——米蘭•昆德拉,《生命中不能承受之輕》 第17章 適配器模式:類模式VS.對象模式 斷鶴續(xù)鳧,矯作者妄;移花接木,創(chuàng)始者奇。 ——蒲松齡,《聊齋志異•陸判》 第18章 MVC模式:三國演義VS三分歸一 天下大勢,分久必合,合久必分。 ——羅貫中,《三國演義》,第一回 第19章 C++編碼經(jīng)驗談:理論vs.實踐 朱薩克,照當時的說法,是個劍法高手,而且已經(jīng)身經(jīng)百戰(zhàn);可是碰上這么一個壓根兒不管通常的擊劍規(guī)則,身子靈活、蹦蹦跳跳的對手,他反倒無所適從,不知如何招架是好了。 ——大仲馬,《三劍客》,第五章
8. 書評 從“凌波微步”到“道法自然” 韓磊
王詠剛的文章,曾經(jīng)在《程序員》雜志以“凌波微步II”的專欄題目發(fā)表過多篇。其實這個專欄是其著作《凌波微步》的后續(xù)——蓋作者認為一本書尚不足道盡各種秘辛,故另辟疆土,繼續(xù)戰(zhàn)斗。 除雜志文章外,王詠剛還常在其Blog專欄中撰文,主題涉獵頗廣。顯然作者試圖跳出《凌波微步》講項目管理的圈子,在其它開發(fā)相關領域“講述自己的故事”。 聽說王詠剛與其兄長王詠武合著《道法自然——面向對象實踐指南》,不由得心中一驚——王氏作品,常因為“務虛”——一些讀者的看法,我對此并不贊同——而為人所詬病,寫這樣一本書,是否意味著某種意義上的“硬著陸”呢?再,面向對象是每位程序員耳熟能詳、甚至每天要干的事情,這樣一本書,會不會讓人覺得是老生常談,絮絮叨叨不知所云呢?避“虛”就“實”,再加上一個普通得不能再普通的題目,這本書的命運似乎就值得擔心了。 從博文公司拿到還沒有出版的《道法自然——面向對象實踐指南》,看完之后,有幾個感覺:
一、 不管是軟著陸還是硬著陸,這本書的確落到了實處。全程跟蹤解析一個實際項目,描述過程中種種問題及解決方案,總結出應當遵循的原則……每一章節(jié)都是來自于實踐,也對項目實踐有指導性的意義。
二、 在回歸實踐的同時,作者眼界卻比《凌波微步》時更高了。我們每天都在將世界抽象為類,都在不停地創(chuàng)建對象,都在與繼承、接口打交道;在因為對這些技術運用自如時,往往會陷入偏執(zhí),執(zhí)著于尋找“銀彈”——放之四海而皆準的面向對象解決方案。書中告訴讀者:面向對象領域充滿了辯證關系,開發(fā)者不得不在每一個設計和實踐環(huán)節(jié)中仔細權衡,擇善而從。這句話可謂是貫穿全書的“書眼”,一語道破天機。的確,在項目開發(fā)過程中,每一階段都會面臨和做出選擇,誤入歧途的結果就是滿盤皆輸?梢哉f整個項目開發(fā)過程,就是不斷做選擇的過程:從需求分析到具體實現(xiàn),從系統(tǒng)框架到一個類的設計。沒有選擇的項目是不可想象的。
三、 如果說《凌波微步》是銷金斷玉的寶劍,那么,《道法自然——面向對象實踐指南》就是一把黑黝黝實沉沉的重劍。所謂“重劍無鋒,大巧不工”,這把重劍讓我們看到王氏兄弟輕靈步伐后面的深厚功力和豐富經(jīng)驗。那些不喜歡《凌波微步》的程序員讀者,大可在這本書中扭轉對作者的印象。俗語說得好:光說不練是假把式,光練不說是傻把式。前后兩本書,一說一練,形成了有趣的對比。
《道法自然——面向對象實踐指南》是作者經(jīng)驗和理論的凝聚,雖然是講一個項目,但聰明的讀者卻能從中悟出禪機來。我想要緊的是怎樣去讀這本書。書的開頭,作者就給出了“一份關于本書的FAQ”,給出了具體的指引。我總結一下,再加上點自己的理解,大致如下——
一、 你需要有基本的面向對象知識和技能(也包括UML相關知識)。這本書不是入門讀物,不會教你怎么扎馬站樁,對OO一無所知的朋友,應該先去補補課。 二、 你要做好被頓喝的準備。曾經(jīng)見過許多以用面向對象語言開發(fā)的非面向對象程序,這些程序的作者,也許會被接連不斷的“頓喝”打擊得不知所措。 三、 善于模仿、善于總結。閱讀這本書的過程,如同在觀看別人練劍術。練劍者也許不會把每一招的訣竅和要點講出來,對整套招數(shù)的講解也許只停留在點到為止的層面。這時,如果你能一步一步跟著書中項目組成員去做,隨時思考,再從全局角度返觀內(nèi)照,才能悟到“劍法”之外的“心法”。
我會毫不猶豫地向每一位程序員推薦這本書。同時我也強烈期待作者的下一部著作。從《凌波微步》到《道法自然——面向對象實踐指南》,是從寶劍到重劍的轉變;下一本書,能否來一次徹底升華,“枯枝斷木,無不遂心所用”,真正做到“道法自然”?想必這也是作者自己想去回答的問題吧。
軟件開發(fā)中的“道”和“自然” 劉天北
大凡箴言,都是文學苗圃里最經(jīng)得起移植的花木。王詠武、王詠剛兩先生的新著《道法自然——面向對象實踐指南》,從標題開始就取材于老子的不朽學說:“人法地,地法天,天法‘道’,‘道’法自然!边@當然是技術領域對古中國神秘主義的又一次挪用或嫁接。講軟件開發(fā)的專著,有不少都喜歡援引東方味兒十足的“道”字——比如,開源軟件巨頭Eric Raymond的力作《Unix編程藝術》就另有一個更微妙的名字《Unix編程之道》;而對軟件技術領域中的這塊哲學殖民地,我們的兩位作者則另有貢獻:他們在序言中就做出了引人深思的論斷:他們“寧愿”把“道法自然”中的“‘自然’理解為——實踐”。 荷蘭大師Dijkstra說過,計算機科學領域總共有兩種人:數(shù)學家和工程師(準確地說,大師原話是“歐洲人”和“美國人”)。二者的區(qū)別在于,數(shù)學家/歐洲人傾向于把技術探尋當成一種理論研究,而工程師/美國人則“寧愿”視之為一項工程實踐。數(shù)學家看重原理和模型,看重認識的先天性和推導的優(yōu)美性,工程師則更注重實驗和例證,注重在反復試錯中趨近真理。 所以,同樣是求“道”,數(shù)學家和工程師卻會倡導不同的范式:前者大多認為大道不必外求,直指心性即可,所謂道法“自然(希臘字physis)”,也就是反觀我們的“本性(英文nature)”罷了,因此數(shù)學家氣質的軟件開發(fā)者往往長于建模和演繹,能夠以驚人的精確和一致完成一整套抽象概念的構造;另一方面,對于后者——也就是略顯平庸的工程師們——而言,“自然”卻遠不是眼前的現(xiàn)成物,我們恰恰要超出自身、遠離本來的出發(fā)點,經(jīng)歷長期、艱苦的探尋和精神漫游,才能獲知這自然的真貌。從后面這個意思看,軟件開發(fā)之“道”,無非是程序員求索自然真貌的“道路”;一部軟件開發(fā)的方法論,也就是一部開發(fā)者自身的探險史和漫游日記。 好了,還是把玄想留給哲學家吧(雖然本書作者們不一定贊成這樣做,他們——不無自詡地——說:“面向對象領域里那些游刃有余的高手們都是IT世界里的業(yè)余哲學家!保。我的意思其實只是:軟件開發(fā)論著大概也要分為“歐洲型的”和“美國型的”兩種,而本書體現(xiàn)的正是不折不扣的美國風味。作者們對“實踐”的推崇決非僅僅掛在口頭;事實上這部《道法自然》的全書就是由一個完整的開發(fā)實例構成,而對應于上面談到的“漫游日記”,書中的各章也就是半虛構的敘述者“我(小W)”,與項目負責人老Z、同事小A一起,在3個多月的時間里進行一個小型軟件項目(一個基于C++的GUI框架FishGUI)時寫下的開發(fā)日記。 所以,本書的實踐意義首先來自這個貫穿全書的實例;讀者打開第一章,就像是受到了同行的邀請和挑戰(zhàn),難免要把書中的小W當成真正的“我”、不由自主地加入到老Z、小A的行列中,和他們一道在一個個場景里神思苦慮、載沉載浮。在這個取材于真實世界的實例中,作者們展示了面向對象軟件開發(fā)的若干主要環(huán)節(jié):分析、設計、直至編碼實現(xiàn);對于各環(huán)節(jié)中包含的方法論要素,比如項目生命周期、需求捕捉技術、用例分析技術、面向對象設計原則、設計模式等等內(nèi)容,都結合實例做出了精到的介紹和講解。我注意到一個有趣的細節(jié):書中每章的標題都包含一對相互矛盾、沖突的價值,比如:“第5 章分析模型:實體類vs.軟件類”、“第11 章復合模式:透明vs.安全”,作者們正是借此闡明了在不同應用情景中做出取舍的思路。也許這一點正是一切方法論運用的精髓:抽象的原則本身固然重要,但我們所說的“軟件開發(fā)之道”,更多地還是在于面對問題時應變權衡的實踐智慧(phronesis)。 我常常想,處于國內(nèi)軟件開發(fā)的一般環(huán)境下,開發(fā)者們研習面向對象方法論往往會落入事倍功半的陷阱:很多開發(fā)者都會抱怨,由于平時工作條件的限制,他們其實很難接觸到完整、正規(guī)的面向對象開發(fā)項目案例;因此各種名著中介紹的重要概念、原則,也只能成為停留在紙面上、口頭上的口號(catchwords)而已。對正確實踐的缺乏甚至會導致不良實踐的惡性循環(huán):一間軟件公司、一個開發(fā)組,越是依賴面向過程式的設計、剪刀加漿糊式的編碼習慣,由此造成的低下效率也越是會榨干開發(fā)者的空閑時間,使他們無暇嘗試那些更成功的開發(fā)范式。在很大程度上,本書尤其適合這一部分讀者:他們對具體開發(fā)語言、技術細節(jié)都耳熟能詳,但唯獨欠缺面向對象開發(fā)的實踐經(jīng)驗。本書事實上可以構成他們第一個面向對象開發(fā)項目:讀者一邊看書,一邊就能打開建模工具或者IDE,跟隨老Z、小A(和兩位作者“小W”)完成實際開發(fā)中的大部分內(nèi)容——該書官方網(wǎng)站給出的源碼,還能夠為讀者提供隨時印證的坐標。 當然,這種結合實例的論述方式?jīng)Q非本書的首創(chuàng):幾乎每一部技術專著都會為讀者提供一定數(shù)量的例子,而各章、甚至全書結合案例場景組織論述的作品也屢見不鮮。但是,涉及到“面向對象開發(fā)”這樣一個主題,選用這種論述方式卻不乏風險:一方面,即使是像本書中的FishGUI這樣一個小型項目(書中記錄了3個開發(fā)者從2003年11月到2004年1月的工作過程),頭緒眾多的細節(jié)也足以淹沒讀者,另一方面,在描述案例之余,作者們還要適時地、不枯燥地、恰如其分地提供相關的理論參照,條分縷析地講清特定場景下的所有要點。就我的判斷而言,作者們出色地完成了他們的任務;素材的選取繁簡適宜、實例的配合直觀明了、理論的闡述深入透徹?梢哉f,在內(nèi)容安排和風格運用兩方面,本書都達到了當前本領域漢語作品的最高水準。 談到這里,我身上的玄學幽靈又不免要浮回紙面:也許作者們選定的箴言“道法自然”,也不妨看作他們對自身寫作的期許。道既是道路,當然還更是“道說”、“書寫”、“邏各斯(logos)”;而本書的讀者見證的,不也正是作者們經(jīng)由這條道路、這種書寫,借助實踐之光,對軟件開發(fā)的自然真貌的探索歷程嗎?
9. 名家點評 看完這本書,我不由得深深呼一口氣,因為實在太精彩了,內(nèi)容扎實、豐富,看得出作者花了極大的心血。如果您想了解如何使用C/C++以面向對象方式開發(fā)實際軟件,這是一本不容錯過的好書。 —— 李 維
10. 作者介紹 作者介紹: 王詠武:在軟件行業(yè)摸爬滾打十多年。大學四年,一直面對著裸露的單板機,一 個字節(jié)一個字節(jié)地調試各種不同的匯編語言;畢業(yè)后在UNIX系統(tǒng)下學了幾年C和C++語言,嘗試開發(fā)了幾個大型軟件;隨后又有機會在大型主機一人多高的CPU、硬盤以及水管粗細的導線面前編寫復雜的COBOL程序;最近幾年則一直在移動通信領域奮斗,在Solaris和Windows系統(tǒng)下開發(fā)、調試手機軟件平臺,F(xiàn)在已經(jīng)不再狂熱地 追尋各種新的語言或技術,而是把更多的精力放在了面向對象技術的應用層面上,并特別關心面向對象技術在嵌入式系統(tǒng)中的應用問題。
王詠剛:職業(yè)程序員,業(yè)余撰稿人。在數(shù)據(jù)壓縮、全文檢索、內(nèi)容管理、分布式系統(tǒng)、軟件測試等技術領域有一定的積累。撰寫過一本據(jù)說還算有趣的技術讀物《凌波微步——軟件開發(fā)警戒案例集》,協(xié)助微軟亞洲研究院編寫過《軟件企業(yè)的管理與文化》等技術書籍。曾在《程序員》、《CSDN開發(fā)高手》等雜志主持技術專欄,在《中華讀書報》等媒體發(fā)表書評文章若干,還以“王笨笨”的名義在網(wǎng)絡上發(fā)過一些小有名氣的技術教程。
出處:藍色理想
責任編輯:donger
|