K ][ N G of A R K™關於學習C++和編程的50個觀點

前 言

Long long time ago, on a topic far far away……是的,很久很久以前,kingofark無心之中寫了一篇關於學習C++和編程的發牢騷的文章。未曾料到的是,這篇文章被N個好心的網絡同胞流傳至今,以至於作者得意忘形的將文章簡稱爲Ks50PV,在淺薄和浮躁中麻醉自己。

某個醉生夢死的深夜,kingofark關上電腦,屋內一片墨黑,忽然發覺窗外的透徹和寧靜。湊到窗前向天空看去,驚訝的發現白光——不,Agent Mulder,不是UFO——來自圓月。筆者聯想到了牛郎織女——先輩們早已灰飛煙滅,只有故事被流傳下來,因爲被流傳而流傳。

一篇文章不能因爲被流傳而流傳,被流傳的不應該是流傳本身帶着這樣的衝動,kingofark又打開電腦……

眼前給大家展現的,是經過kingofark重新審視,結合作者最新感受的修訂版。其中有些條款徹底的更換或者修改了。這一方面反映了國內圖書市場近年來發生的變化,另一方面也反映出:其實有些時候,無知的人說得最多。歡迎大家批評討論甚至予以唾棄。

在這個修訂版中,作者沒有刪掉舊的條款,僅在新舊條款前加了“新”、“舊”二字以示區別。新舊條款下面伴有作者的評論。

 

1. 把C++當成一門新的語言學習(和C沒啥關係!真的。);

是的,我們仍然應該抱着這樣一種心態來學習C++。前一段時間,C/C++User’s Journal 上面有一連串關於C與C++關係的文章,Bjarne Stroustrup、Herb Sutter等幾位C++領域的大師從不同方面討論了C/C++今後發展的問題,頗爲深刻。

看問題有深有淺,有高有低。我們不是大師,不要把C和C++說得好像自己的兩個兒子。

水果刀是一種刀。瑞士軍刀也是一種刀,但它何嘗不是剪刀、起子、鋸子、銼刀、牙籤、指南針、尺子、放大鏡……?誰在使用瑞士軍刀之前還要先培訓如何使用水果刀?另外,在水果刀上面粘一個剪刀、起子、鋸子、銼刀、牙籤、指南針、尺子、放大鏡……我估計也不會太好用(不叫“瑞士軍刀”,叫“超級武器霸王3000”)。

 

舊:2. 看《Thinking In C++》,不要看《C++變成死相》;

新:2. 看《Accelerated C++》,看《C++ Gochas》;

如今《Thinking In C++ 2nd》也出了中文版,翻譯質量好壞kingofark不想再談——畢竟有人(至少在www.china-pub.com上)覺得翻譯還不錯。經常忍不住要去跟人爭辯翻譯質量的kingofark忽然明白了蘿蔔白菜定理的另一個推論:看書好像看A片,有人愛看歐美,有人愛看日臺,各得其樂。自己去衡量罷,不過最好不要參與圖書信息頁上面的無聊口舌戰。請記住一句話,一句就好:管它黑貓白貓,能抓老鼠就是好貓。

Andrew Koenig的《Accelerated C++》是一本真正具有實踐性的入門書。該書傳承了《Ruminations On C++》的闡述方法,通過一個又一個具體的設計實例充分體現使用C++進行開發的真正優勢之所在。事實上,筆者覺得Andy的書都是程序員必讀(還好不算多)。對於《Accelerated C++》的評論,國外網站上皆有,筆者不再累述。

Stephen C. Dewhurst的《C++ Gochas》是一本“奇特”的書。說“奇特”不是因爲Gotcha這個單詞對於中國人難於理解(何況中譯書乾脆把這個標題扔掉不要了),而是在於:Dewhurst用酸中帶刺、笑裏藏刀的口吻提醒程序員一些編寫C++程序(本來就)應該注意到的問題。這些問題中,有編碼細節問題,有編碼習慣問題,甚至有個人修養問題。CUJ上有一篇對該書的評論,筆者認爲還比較中肯。筆者看了該書的樣章以後的感受是:忠言向來都逆耳;這本書中的觀點你可以不認同,但其確實引出了一些應該注意(而通常沒被注意)的問題,這對於一個程序員來說是非常值的關注的。

 

舊:3. 看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因爲他們很難而我們自己是初學者所以就不看;

新:3. 看《The C++ Programming Language》和《InsideThe C++ Object Model》,不要因爲它們很難而我們自己並不想搞“學術研究”所以就不看;

這兩本書的確都不適合初學者看,舊條款說得有些過激,想必當初kingofark是希望刺激一下那些“浮躁的人(包括kingofark)”(見條款10-15)。

總聽人說“語言其實都是相通的”。問:什麼時候才能融會貫通?答:通透其理的時候。

好好學吧您吶!

 

4. 不要被VC、BCB、BC、MC、TC等詞彙所迷惑——他們都是集成開發環境,而我們要學的是一門語言;

 

5. 不要放過任何一個看上去很簡單的編程小問題——它們往往並不那麼簡單,或者可以引伸出很多知識點;

侯捷先生譯的《C++ Primer Answer Book》和裘宗燕老師譯的《C++ Solutions – Companion to TCPPL》都已經出版了。作爲在校學生或者C++自學者,通過這樣兩本書來操練自己的編碼實踐,實在是最合適不過了。

 

6. 會用VisualC++,並不說明你會C++;

會唱歌又會彈吉他,並不說明你會搞音樂創作——只不過有點“苗頭”而已(且不能拔)。

 

7. 學class並不難,template、STL、genericprogramming也不過如此——難的是長期堅持實踐和不遺餘力的博覽羣書;

博覽羣書不一定必要,但是,To learn or not to learn…that is the question! 學習C++,這些內容不可或缺。

 

舊:8. 如果不是天才的話,想學編程就不要想玩遊戲——你以爲你做到了,其實你的C++水平並沒有和你通關的能力一起變高——其實可以時刻記住:學C++是爲了編遊戲的;

新:8. 學編程與玩遊戲,兩者“相互作用,相互影響,辯證統一”,可以分割;不過的確有很多人因爲愛玩遊戲而學編程,也有不少人因爲不愛學編程而玩遊戲;其實這裏面的道理再簡單不過:如果你不是廚師——而自己會做一手好菜,自己當然有餘地飽嘗美味;如果你是廚師——拜託你不要光顧着吃,好好學廚藝行不行?回頭吃肥了跌進豬圈人家認不出你。

舊條款是一句理由不充分的氣話,源於當時筆者對沉溺遊戲的“科班學生”的焦慮。

關於遊戲編程,其實也有不少好書,比如Andre Lamothe的《Tricks of The Windows Game Programming Gurus 2nd》《Tricks of 3D Game Programming Gurus》,通俗易懂、門檻兒低,深入淺出,大師的經驗體會娓娓道來,精闢深刻,直入核心。對該作者的書,國外網站有評價,不用筆者費口舌了(好詞兒都用光了)。

筆者本人對遊戲編程也蠻有興趣,非常喜歡Andre Lamothe的書。書有多好呢?這麼說吧:《Tricks of The Windows Game Programming Gurus》中文版雖然譯得參差曖昧、差強人意(比如把數據結構linked list譯爲“連接的清單”),仍然還是瑕不掩瑜,可以讓人坐在電腦跟前打開VC,一口氣讀到深夜,體驗使用VC/DirectX SDK編寫遊戲的樂趣。

 

舊:9. 看Visual C++的書,是學不了C++語言的;

新:9. 在工作環境中,請小聲與同事說話。

方便快捷(且易導致發胖)的快餐業McDonald、KFC到了中國,成了孩子們的牙祭和每週的節日,情侶們約會的廉價地點。一到週末,McDonald、KFC店內“一片歡騰的景象”。所有人都大聲說話。

咖啡廳本來是過去從美片上面看到的那種“零零星星有着裝高雅的俊男美女在催情的柔光下竊竊私語”的夢幻般的地方。中國的咖啡廳,煙霧繚繞,音箱發出不柔和的八十年代懷舊歐美歌曲(且一般都不是原人原唱)——地方話,罵人話,話話別扭;手機聲,牌將聲,聲聲入耳。所有人都大聲說話。

軟件公司裏面,開發人員探討技術問題,間歇中的打趣,是再正常不過的事情。A和女祕書B正在咯咯的打情罵俏;C爲了告訴D文檔已經做好了,伸長了脖子蓋過AB的聲音;一旁的E正在面紅脖子粗的與高手F激烈的討論一個技術難題,這時候絕對不準有誰的聲音比他還高;G向作管理的H抱怨公司的軟件工程沒有做好,伴着唾液的“嘖嘖”濁音故意要讓自己的上司聽到。所有人都大聲說話。

請你記住一點:你大聲說話,同事只聽得見你的聲音;你小聲說話,同事還聽得見你的心情。交流需要的是心境。

 

10. 浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?

11. 浮躁的人容易問:我到底該學什麼;——別問,學就對了;

12. 浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;

舊:13. 浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!

新:13. 浮躁的人容易說:我要中文版!我英文不行!——希望這不是你不好好學的原因。

14. 浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行;

15. 浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人;

16. 把時髦的技術掛在嘴邊,還不如把過時的技術記在心裏;

 

17. C++不僅僅是支持面向對象的程序設計語言;

C++是以multi-paradigm爲目標的通用型語言,學習起來應該全面瞭解。標準庫爲你做了很多,不用都是浪費。而如果你是做嵌入式,不妨參考一下Embedded C++的規範。

技術跟進,工具更新,並不一定就是盲目浮躁——鐮刀鋤頭怎比得過洋槍洋炮?筆者願意相信,學生、年輕程序員、初學者都比較容易瞭解這些,同時也正需要被引導着去了解這些。但是在國內,大學教授、項目經理、相信“人月不是神話”的領導者們——他們瞭解嗎?我疑心重重。

強姦,蹂躪無辜良民;姦淫幼女,摧殘純潔的心靈;出版淫穢音像圖書製品,毒害青少年兒童。偏偏這些事情在IT領域裏面不算違法犯規。

 

18. 學習編程最好的方法之一就是閱讀源代碼;

JDK,CLI正是上佳的參考資料。至於C++方面,除了STL,還有Boost,Loki,ACE等等優秀的代碼值得研究、參考,甚至抄襲(如果你有足夠技術能力的話)。

 

舊:19. 在任何時刻都不要認爲自己手中的書已經足夠了;

新:19. 書不在多,好書則靈;

如今國內的圖書市場較之過去幾年,最大的改變的就是大量國外圖書的引進。書少的時候,沒有選擇的餘地;書多的時候,選擇太多,無所適從。這裏就有一個如何擇書的問題。接受推薦是一個不錯的選擇——不,我不是說某些圖書網站上的口舌對罵。

面對這種情況,讀者需要的其實是正確的引導。

 

舊:20. 請閱讀《The Standard C++ Bible》(中文版:標準C++寶典),掌握C++標準;

新:20. 請參考《 TCPPL 3rd》《C++ Primer 3rd》《The Standard C++ Library》,掌握C++標準;

基本上,以目前的圖書狀況來看,要掌握>C++標準,看哪本書也看不到《The Standard C++ Bible》>(中文版:標準C++寶典)這一本上來。筆者在另外的文章裏已經發表過對這本書的看法。

說起權威的C++參考書,一定少不了《TCPPL 3rd》《C++ Primer 3rd》《The Standard C++ Library》。

Bible? 唔……看《TCPPL 3rd》《C++ Primer 3rd》《The Standard C++ Library》的讀者,大可不必信教。

 

21. 看得懂的書,請仔細看;看不懂的書,請硬着頭皮看;

要知道,很多時候其實不是看不懂,而是沒有自信,以爲看不懂。

本條款對於學習外語同樣適用。

 

22. 別指望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;

總有人(甚至是kingofark自己)抱怨說沒有足夠的時間看書。從某個角度來看,確實如此——但這不是你不看書的理由,對吧?

 

舊:23. 請看《Effective C++》《More Effective C++》《Exceptional C++》;

新:23. 請看《Effective C++》《More Effective C++》《Effective STL》《Exceptional C++》《More Exceptional C++》《Exceptional C++ Styles》《C++ Templates》《Ruminations On C++》《C Traps and Pitfalls》《Expert C Programming》;

寫這麼多不是要誰都看都買。這些都是頂級好書,根據自己的情況擇來讀之,易收宏效。

Andrew Koenig的《C Traps and Pitfalls》是程序員必讀。令筆者不寒而慄的是,該書提到的許多錯誤筆者都犯過(而且一直在犯!)。《Expert C Programming》也是一本相當好的書,其中譯本也不錯,可惜就筆者而言,書中對某些典故的翻譯欠妥(比如StarTrek,其作爲西方的一種文化現象,已經滲透到西方文明的方方面面,對其中一些典故的引用對於中國人來說,不經解釋可能是不太容易理解的)。

 

24. 不要停留在集成開發環境的搖籃上,要學會控制集成開發環境,還要學會用命令行方式處理程序;

特別令人驚訝的是,筆者發現有些人(居然!)不知道VC還有一個叫做cl.exe的命令行編譯器!運行一個超級陽春的Hello World (居然!)需要到IDE裏面去建一個project!沒聽說過 bcc32、dumpbin、grep、nmake、makefile、javadoc……唔……呃……打個不恰當的比方:冬天非得穿着大棉襖厚棉褲才能享受做愛的樂趣嗎?

 

25. 和別人一起討論有意義的C++知識點,而不是爭吵XX行不行或者YY與ZZ哪個好;

注:XX、YY、ZZ可以指代:某計算機語言;某專家;某種哲學體系;某種軟件開發理論;某種新技術新思維;某個“務虛(務實)的”觀點;某班的男生。

 

26. 請看《程序設計實踐》,並嚴格的按照其要求去做;

題外話:從Herb Sutter的網站www.gotw.ca上看到,Sutter與Alexandrescu欲合著一本C++ Coding Standard,應該也是令人期待的一本書。

 

舊:27. 不要因爲C和C++中有一些語法和關鍵字看上去相同,就認爲它們的意義和作用完全一樣;

新:27. 注意C與C++之間的區別。

在國內,有那麼一羣豬……噢不,我是說大學教師……噢不不,我是說項目經理……不不不……對不起,其實我是想說“人”,對C/C++/Java/C#/……存有太多太多的誤解(一般很愚蠢,以至於別人都不知道該怎麼解釋纔好)。

 

舊:28. C++絕不是所謂的C的“擴充”——如果C++一開始就起名叫Z語言,你一定不會把C和Z語言聯繫得那麼緊密;

新:28. 瞭解各個語言之間的關係和區別,切忌盲目褒貶、妄加評論;

關於C與C++的關係及C++的發展與演化,C++創造者Bjarne Stroustrup在《The Design And Evolution of C++》(中譯本,裘宗燕老師譯)裏面已經說得很清楚了。

學C++的朋友應該看看本書,就當是掃盲。

 

舊:29. 請不要認爲學過XX語言再改學C++會有什麼問題——你只不過又在學一門全新的語言而已;

新:29. 請不要認爲學過XX語言再改學YY會有什麼問題——你只不過又在學一門全新的語言而已;

 

30. 讀完了《Inside The C++ Object Model》以後再來認定自己是不是已經學會了C++;

事實上,這樣的高階書你不一定就非要去啃,關鍵是浮躁與不浮躁、自信與自滿的問題。

 

31. 學習編程的祕訣是:編程,編程,再編程;

這一點在Andrew koenig的書《Ruminations On C++》《Accelerated C++》裏面有很好的體現。隨着Andy 的書一起作思維上的編程,自己再動動手,將是非常美妙的學習經歷。

 

舊:32. 請留意下列書籍:《C++面向對象高效編程(C++ Effective Object-Oriented Software Construction)》《面向對象軟件構造>(Object-Oriented Software Construction)》《設計模式(Design Patterns)》《The Art of Computer Programming》;

新:32. 請留意下列書籍:《Design by Contract,by Example》《Refactoring》《DesignPatterns Explained》;

《Design by Contract,by Example》《Refactoring》《Design Patterns Explained》毫無疑問是好書,且中譯本令人期待。

 

舊:33. 記住:面向對象技術不只是C++專有的;

新:33. 記住:哇!面向對象技術又不只是C++專有的;

嗯?我怎麼會說“又”這個字?

 

舊:34. 請把書上的程序例子親手輸入到電腦上實踐,即使配套光盤中有源代碼;

新:34. 善加利用配套光盤;

 

35. 把在書中看到的有意義的例子擴充;

 

36. 請重視C++中的異常處理技術,並將其切實的運用到自己的程序中;

36. 請重視DbC(Design by Contract)以及異常處理技術,並將其切實的貫徹和運用到自己的程序中;

Exception Handling引發着無數的討論。關於exception handing的各種議題,看Herb Sutter的文章的確讓人有些“震驚”。Embedded C++倒是蠻幹脆——STL,Exception Handling全部刪光光——可見什麼事物總有個適用範圍。

DbC絕不僅僅是assertion。DbC要求各個組件各盡其責,將交流和協作建立在非常明晰嚴格的條款之基礎上。DbC是不容忽視的,其所涉及的層面和深度,或許比我們想象的要廣,要深。

 

37. 經常回顧自己以前寫過的程序,並嘗試重寫,把自己學到的新知識運用進去;

 

38. 不要漏掉書中任何一個練習題——請全部做完並記錄下解題思路;

 

39. C++語言和C++的集成開發環境要同時學習和掌握;

 

40. 既然決定了學C++,就請堅持學下去,因爲學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的;

 

41. 就讓C++語言的各種平臺和開發環境去激烈的競爭吧,我們要以學習 >C++語言本身爲主;

 

舊:42. 當你寫C++程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請儘快將餘下的部分粗略的完成以保證這個設計的完整性,然後分析自己的錯誤並重新設計和編寫(參見43);

新:42. 只有通過編碼實踐才能領會設計思維;

 

43. 別心急,設計C++的class確實不容易;自己程序中的class和自己的class設計水平是在不斷的編程實踐中完善和發展的;

 

44. 決不要因爲程序“很小”就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的;

 

45. 每學到一個C++難點的時候,嘗試着對別人講解這個知識點並讓他理解——你能講清楚才說明你真的理解了;

 

46. 記錄下在和別人交流時發現的自己忽視或不理解的知識點;

 

47. 請不斷的對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;

鄭重提醒:請學會使用版本控制工具!Visual Source Safe,CVS——使用它們作版本控制絕對比你新建一個名爲“MyApp_New2”的目錄要好得多!在實際開發中,不使用版本控制工具的結果可以用一句話概括:能變得多糟,就定會變得多糟。

 

48. 保存好你寫過的所有的程序——那是你最好的積累之一;

 

49. 請不要做浮躁的人;

 

50. 請熱愛C++!

發佈了9 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章