教本與手冊的曼妙組合

《C++ 標準程式庫》孟岩譯序

the-cpp-standard-library-c.jpg (70785 bytes)


IT技術書籍市場,歷來是春秋戰國。一般來說,同一個技術領域媮`會有那數本、十數本、甚至數十本定位相似的書籍相互激烈競爭。其中會有一些大師之作脫穎而出,面南背北,黃袍加身。通常還會有後來者不斷挑戰,企圖以獨到特色贏得自己的一片天地。比如說在演算法與資料結構領域,D. E. Knuth的那套《The Art of Computer Programming》一至三卷,當然是日出東方惟我獨尊。但是他老人家的學生Robert Sedgewick憑著一套更貼近實用的《Algorithms in C》系列,也打出自己一片天下,成很多推薦列表上的首選。就C++ 運用經驗類書籍來說,Scott Meyers的《Effective C++》稱王稱霸已經多年,不過其好友Herb Sutter也能用一本《Exceptional C++》獲得幾乎並駕齊驅的地位。嗨,這不是很正常的事嗎?技術類書籍畢竟不是詩詞歌賦。蘇軾一首「明月幾時有,把酒問青天」,可以達到「詠中秋者,自東坡西江月後,餘詞盡廢」的程度,但怎麼可能想像一本技術著作達到「我欲乘風歸去,又恐瓊樓禦宇,高處不勝寒」的境界!誰能夠寫出一本技術書,讓同一領域後來者望而卻步乾脆死心,那才是大大的奇跡!

然而,您手上這本《The C++ Standard Library》,作為C++ 標準程式庫教學和參考類書籍的定音之作,已經將這個奇跡維持了三年之久。按照IT出版界時鐘,三年的時間幾乎就是半個世紀,足以錘煉又一傳世經典!

1998C++ Standard通過之後,整個C++ 社群面臨的最緊迫任務,就是學習和理解這份標準給我們帶來的新觀念和新技術。而其中對於C++ 標準程式庫的學習需求,最迫切。C++ 第二號人物Andrew Koenig曾經就C++ 的特點指出:『語言設計就是程式庫設計,程式庫設計就是語言設計』(註1)。C++ Standard對程式庫所做的巨大擴充和明確規範,實際上即相當於對C++ 語言的能力做了全面提升與擴展,意味著你可以站在無數超一流專家的肩上,於輕敲鍵盤間,將最出色的思想、設計與技術納入囊中,讓經過千錘百煉的精美代碼成自己軟體大廈的堅實基礎。可以說,對於大多數程式師來說,標準C++ 較諸「ARM時代」之最大進步,不是語言本身,而恰恰是標準程式庫。因此,我們可以想像當時人們對C++ 標準程式庫教學類書籍的企盼,是何等熱切!

註1"Language design is library design, library design is language design",參見Andrew Koenig, Barbara Moo合著《Ruminations on C++》第25, 26章。

一方面是已經標準化了的成熟技術,另一方面是萬期待的眼神,我們完全有理由認,歷史上理應爆發一場魚龍混雜的圖書大戰。它的典型過程應該是這樣:先是一批快刀手以迅雷不及掩耳盜鈴註2之勢推出一堆斂財廢紙,然後在漫長的唾與期待中,大師之作漸漸脫穎而出。大浪淘沙,最後生數本經典被人傳頌。後雖偶有新作面世,波光點點已是波瀾不興。

2此處非筆誤,而是大陸流行的一句 "新俚語",意思十分明顯,就是 "迅雷不及掩耳" 地 "掩耳盜鈴"。

然而,這一幕終究沒有在「C++ 標準程式庫教學與參考書籍」領域內出現。時至今日,中外技術書籍市場上這一領域內的書籍數寥寥,與堆積如山的C++ 語言教學類書籍形成鮮明對比。究其原因,大概有二,一是這個領域堛漯F西畢竟份量太重,快刀手雖然善斬亂麻,對於C++ 標準程式庫這樣嚴整而精致的目標,一時也難以下手。更重要的原因則恐怕是19998月《The C++ Standard Library》問世,直如橫刀立馬,震懾天下。自推出之日起至今,本書在所有關於C++ 標準程式庫的評論與推薦列表上,始終高居榜首,在Amazon的銷量排行榜上名列所有C++ 相關書籍之最前列。作者僅憑一書而天下知,成號召力可與Stan Lippman, Hurb Sutter等「經典」C++ 作家比肩的人物。此書之後,雖然仍有不少著作,或深入探討標準程式庫的某些組件,或極力擴展標準庫倡導的思想與技術,但是與《The C++ Standard Library》持同一路線的書籍,再沒有出現過。所謂泰山北斗已現,後來者已然無心戀戰。

於是有了這樣的評論:『如果你只需要一本講述C++ 標準程式庫和STL的書籍,我推薦Nicolai Josuttis的《The C++ Standard Library》。它是你能得到的唯一一本全面講述C++ 標準程式庫的書,也是你能想像的最好的一本書。』這種奇異情形在當今技術書壇,雖然不是絕無僅有,也是極罕見。

究竟這本書好到什程度,可以獲得這麼高的評價?

我正是帶著這分疑問,接受侯捷先生的邀請,著手翻譯這本經典之作。隨著翻譯過程的推進,我也逐漸解開了心中的疑惑。在我看來,這本書的特點有四:內容詳實,組織嚴密,態度誠懇,深入淺出。

首先,作一本程式庫參考手冊,內容詳實全面是一項基本要求。但是,本書在這方面所達到的高度可以說樹立了一個典範。本書作者一開始就提出一個極高的目標,要幫助讀者解決「使用C++ 標準程式庫過程中所遇到的所有問題」。所周知,C++ 標準程式庫是大傢伙,每一部分又有很精深的思想和技術,既不能有所遺漏,又不能漫無邊際地深入下去,何取何舍,何去何從,難度之大可想而知!作者在大局上涵蓋了C++ 標準程式庫的全部內容,在此基礎上又對所有組件都進行細緻的、立體式的講解。所謂立體式講解,就是對於一個具體組件,作者首先從概念上講解其道理,然後通過漂亮的範例說明其用法,申明其要點,最後再以圖表或詳解方式給出參考描述。有如錢塘江潮,層層疊疊,反反復復,不厭其煩。讀完此書,我想您會和我一樣感受衝擊,並且完全認可作者付出的巨大心血。

C++ 標準程式庫本身就是一個巨大的有機整體,加上這本書的立體講解方式,前後組織和對應的工作如果不做好,很容易會使整部書顯得散亂。令人欽佩的是,這本書在組織方面極其嚴密,幾無漏洞。相關內容的照應、交叉索引、前後對應,無一不處理得妥善曼妙。整體上看,整本書就像一張大網,各部分內容之間組織嚴謹,契合密切,卻又頭緒清晰,脈絡分明,著實難能可貴。我在閱讀和翻譯過程中,常常詫異於其內容組織的精密程度,簡直像德國精密機械一樣分毫不差 後來才想到,本書作者Nicolai Josuttis就是德國人,精密是德意志民族的性格烙印,名不虛傳!

說起德意志民族,他們的另一個典型性格就是誠實坦率。這一點在這本書同樣有精彩的展現。身為 C++ 標準程式庫次委員會成員,作者對於 C++ 標準程式庫的理解至深,不但清楚知道其優點何在,更對其缺陷、不足、不完備和不一致的地方瞭如指掌。可貴的是,在這些地方,作者全不避諱,開誠佈公,直言不諱,事實是什麼樣就是什麼樣,絕不文過飾非,絕不含混過關。作讀者,我們不僅得以學到好東西,而且學到如何繞開陷阱和障礙。一個最典型的例子就是對於valarray的介紹,作者先是清清楚楚地告訴讀者,由於負責該組件設計的人中途退場,這個組件沒有經過細緻的設計,最好不要使用。然後作者一如既往,詳細介紹valarray的使用,完全沒有因?前面的話而稍微有所懈怠。並且在必要的地方將valarray的設計缺陷原原本本地指出來,讓讀者口服心服。讀到這些地方,將心比心,我不禁感歎作者的坦誠與無私,專精與嚴謹。

本書最具特色之處,就是其內容選取上獨具匠心,可謂深入淺出。本書的目的除了作為手冊使用,更是一本供學習者閱讀學習的 "tutorial"(自學教本)。也就是說,除了當手冊查閱,你也可以捧著它一篇一篇地閱讀學習,獲得系統化的堅實知識。一本書兼作 "tutorial" "reference",就好像一本字典兼作「作文指南」,沒有極高的組織能力和精當的內容選擇,簡直難以想像會搞成什麼樣子。了不起的是本書不僅做到了,而且讓你感覺,學習時它是一本最好的 "tutorial",查閱時它是一本最好的 "reference",我要說,這是個奇跡!單從學習角度來說,本書極實用,通過大量鮮明的例子和切中要害的講解讓你迅速入門,而且絕不僅僅淺嘗輒止,而是不失時機地深入進去,把組件的實作技術和擴展方法都展現給讀者。單以STL而論,我經常以侯捷先生提出的「STL學習三境界」來描述一本書的定位層次,這本書就像一座金字塔,紮根於實用,尖鋒直達「明理」和「擴展」層次。從中你可以學到「reference語意」的STL容器、smart pointer(靈巧指標)的數種實現、擴充的組合型仿函式(composing function object)、STLIOStream的擴展方法、訂製型的配置器(allocator)設計思路等等高級技術,也能學到大量的實踐經驗,比如vector的使用技巧,STL容器的選擇,basic_string<> 作為容器的注意事項等等。可以這麼說,這本書足以將你從入門帶到高手層次,可謂深入淺出,精彩至極!

我很高興自己第一次進行技術書籍翻譯,就能夠碰到這樣一本好書,這堶n深深感謝侯捷先生給我一輩子都慶幸的機會。翻譯過程出乎意料地艱辛,前後持續將近10個月。我逐字逐句地閱讀原文,消化理解,譯成自以合適的中文,然後交給侯先生。侯先生接手後再逐字逐句地閱讀原文,對照我的粗糙譯文,進行修訂和潤色,反復品味形成最終譯稿。作譯者,侯先生和我所追求的是,原書技術的忠實呈現加上完全中文化、中國式的表達。我們此花費了巨大的心力,對我來說,付出的心血遠遠超過一般翻譯一本書的範疇。雖然最終結果需要廣大讀者評論,但今天面對這厚厚的書稿,我問心無愧地享受這份滿足感。我最大的希望是,每一位讀者在學習和查閱這本中文版的時候,完全忘掉譯者曾經的存在,感覺不到語言的隔閡,自由地獲取知識和技術。對於一個初涉技術翻譯的人來說,這個目標未免太貪心了,可是這始終會是我心堛瘧@望。一個譯者應該是為了被忽略而努力的。

最後,感謝侯先生一直以來對我的欣賞和幫助,感謝您給我的機會,我十分榮幸!感謝華中科技大學出版社的周筠老師,您始終友好地關注著我,鼓勵著我。感謝CSDN的蔣濤先生,您的熱情鼓勵始終是我的動力。感謝我的父母,弟弟,你們是我最愛的人,是我最堅強的支柱!感謝曾經幫助過我,曾經關心過我的每一個人,無論你現在怎樣,我為曾經擁有過的,仍然擁有著的每一片快樂和成果,衷心地感謝你!

祝各位讀書快樂!

孟岩 20025月於北京