當前位置:吉日网官网 - 紀念幣收藏 - 學習C語言應該看什麽書?

學習C語言應該看什麽書?

三人談程序員推薦的C++書籍

主持人:熊節(透明),《程序員》雜誌編輯,C-View成員。

賈斌:孟雁(夢魘),C-View成員,在聯想手持設備事業部應用開發部工作。與侯傑先生合作翻譯C++標準庫

上海天宇公司CTO金音(惡魔)在《程序員》上連載了“壹個自由繁榮的國度”系列文章。

透明性:“用哪本書學C++”是最常被問到的問題。但是哪本書是最好的入門書呢?似乎很難找到答案。C++入門太厚,有效的C++對讀者要求更高,本質的C++經常被批評“太淺”。

其實說白了:沒有銀彈。從書本上學C++是不可能的。有朋友問我怎麽學C++,我會建議他先找壹本數據結構的書,用C++做裏面所有的習題,然後再去看有效的C++。Myan經常說“我們應該在學習的早期形成良好的習慣”,我對此相當不以為然。

個人認為,精華C++適合做教材,C++入門適合做參考書,有效C++適合課外閱讀。

妖:後悔買了《C++初級讀本》。因為從我個人的角度來說,它的功能和效用與C++編程語言基本重合。當然,對於新手來說,還是很不錯的。但是C++入門太厚,閱讀極其不方便,系統學習需要很長時間。目前這個越來越快節奏的時代有很多不適合的地方,但可以作為初學者的參考書。現在已經以壹個K3 CPU的代價借給別人了,希望同事能從中得到壹些好處。

如果妳已經有了C基礎,我建議看國內的書,比如錢能的《C++大學教程(第二版)》。(如果沒有C的基礎,看看譚浩強的C語言)。這本書對C還是比較清楚的,有很多練習值得做,尤其是最後兩部分,struct和union。這些算法中有壹部分是冗長乏味的(比如樹和鏈表的遍歷算法)。讀者可以嘗試修改這些例子,作為C語言的最終總結測試。

噩夢:這個問題讓我想起了四五年前的情況。今天大部分對C++略知壹二的人,都是從那些年開始學習C++的。那時候沒有品牌概念。從書店找壹本C++的書,如果看起來很清楚,就買下來。記得當時萬、教授、麥鐘範教授的書都是好評如潮。我最早的C++書是Greg Perry寫的壹本書。今天想來,其實是打著C++旗號的C語言課程。對我影響最大的書是國防科技出版社出版的書。書名記不清了,作者叫斯蒂芬·布拉哈。

透明性:我記得之前批評過壹本C++的書,是北航出版的,整本書都沒有出現class關鍵字。那本書畢竟實際上只介紹了C語言和iostream庫的用法,根本不是C++。當時我經常推薦的壹本書是電子科技大學張老師的C++課程。那本書,直到今天,還沒有太大的問題。唯壹遺憾的是,因為年代久遠,很多東西都過時了。對於壹本技術書來說,“過時”是最不能接受的。

總的來說,當時用C++的人真的是“盲人摸象”。不過也有好處,C++的很多細節可以理清,以後看到經典書籍更容易理解;當然缺點是概念不清,甚至不知道C++和Visual C++或者Borland C++有什麽區別。

噩夢:整個90年代,其實大部分人對C++的理解都是似是而非的。壹開始相當於Borland C++,後來相當於Visual C++和MFC。所以壹般來說,打著BC和VC旗號的書賣得好,人們都覺得這是C++。對我來說幸運的是,從現在的角度來看,Blaha的書並不出色,但基本方法是正確的。也許是因為原著是UNIX程序員的培訓教材,壹開始就沒有讓我形成對“C++ == VC++”的理解。

其實直到1996,那裏所有從事計算機的人只有Borland C++,而VC 4.0壹出,格局壹下子就變了。1997推出VC5後,書店裏MFC的書鋪天蓋地,學MFC的人都比別人昂著頭。但現在看來,當時的MFC書大多是三流貨。曾經有壹段時間,我認為許多程序員被誤導了。根本原因是相對封閉。

透明度:我認為壹本書的價值有兩個方面:壹是教會妳實用的技術;第二,讓妳思考。對於壹本關於VC(或者MFC)使用的書,我根本不希望它讓我思考,所以我必須要求它在技術上完美。剛開始用VC的時候,買的第壹本書是潘愛民老師翻譯的《VC技術內幕》(第四版)。我很幸運,沒有被那些“三流貨”誤導。

噩夢:1999年,機械工業出版社開始出版《計算機科學叢書》,其中第壹版《用C++思考》廣受歡迎。其實我從來不覺得這本書很優秀,雖然得了大獎。但是我們都不得不承認,這本書在C++書籍領域第壹次樹立了品牌概念,很多初學者也開始知道隨便買壹本都不壹樣。然後是2000年的MFC第二版(第二版),侯老師在《程序員》上發表的C++/OOP系列。隨著整個環境的改變,品牌理念深入人心,C++圖書市場終於開始與世界同步。

回顧過去,我的感覺是戰戰兢兢地選擇入門書籍的時代已經過去了。現在的C++初學者在自己閱讀的時候,可以放心的購買口碑好,思路流暢的書籍。入門不再是大問題。還有壹些學了幾年C++的程序員,看到今天出版的壹些新書覺得很奇怪,這不是問題。侯先生常說“誰走誰就留下腳印”,所謂“走彎路”未必是好事。

至於具體的推薦形式,不好壹概而論。總之在我的印象裏,Essential C++,C++ Primer,錢能教授的C++教程都不錯。有些人甚至壹上來就讀比雅尼·斯特勞斯特魯普的《C++編程語言》。只要他們喜歡,沒什麽不好。

透明度:我同意妳的觀點。反正編程是壹門很實用的知識。要深入了解C++對象模型,最好的辦法就是寫壹系列程序,看看結果。想學OOP,只能從項目學起。對於初學者來說,最好的學習方法就是堅持寫程序,寫真正有用的程序,有問題就去查書,自然會知道哪些書好,哪些書不好。然而,我懷疑我們的教育制度能否給大學生這樣的學習機會。

以我的經驗,學習C++有兩個門檻:入門和使用。完全不懂C++,這是個門檻,但只要有合適的入門,很快就能跨過去。真正使用C++並不容易。尤其是對於學生來說,接觸到的大部分都是“玩具”,很難有實戰機會。所以經常有人問“C++能做什麽?”,這是C++學習中壹個比較麻煩的問題。我們都是做了很久C++程序才看到壹些真正經典的書,也正是因為走了很長的彎路才知道這些書的經典。所謂走彎路,我覺得也是壹種必要的積累。就算壹開始就看Essential C++和C++ Primer,沒有兩三年也很難有所收獲。

妖:有兩句話很有道理。壹個是我大學的C語言老師說“寫程序不如抄襲”,壹個是壹個網友說“好的設計來源於借鑒,天才的設計來源於抄襲”。對於我這個理性的批評家來說,這兩句話實在是不合適。但無論從哪個角度,對於初學者來說,抄襲都是最快的成功捷徑。

個人認為對於C++初學者來說,首先要確定自己專業領域使用的主要特性的方向。因為C++的特性那麽多,新手想貪基本不可能成功。C++的編程範式基本可以分為ADT+PP、GP和OO。對於ADT+PP範式,初學者的主要問題不是學習C++,而是學習C的使用,對於這樣的初學者,國內有幾本書寫得很清楚,符合國人習慣,比如譚浩強的《C語言教程》,錢能的《C++語言大學教程》。我推薦這兩本書的第壹本,因為我已經研究這本書壹年了。這本書裏很多程序都可以抄襲,這些程序可以加工升級。比如結構這壹章,用struct實現鏈表和二叉樹的算法就相當差。學習ADT+PP的初學者可以在通讀本書後嘗試修改這兩個程序。另外,這本書的第二版稍微涉及了壹點關於“類”的內容。學習ADT+PP的初學者可以不受OO中壹些專有特性的幹擾,這對於類層次結構扁平化、無繼承、無多態的編程大有裨益。

透明度:妳好像很佩服國內教授寫的書。現在社會上有壹種不好的風氣:捧就捧到天上,貶就貶到地下。就像對待譚教授的書,幾年前還被奉為經典,近幾年很多人狠狠批判。學C++有點“崇洋媚外”,總覺得初學者要看Essential C++。我覺得這種觀點也是片面的。

妖:當然,Essential C++也值得壹看。但我個人認為這本書不如譚浩強的C語言課程。主要原因是:第壹,C++的所有特性都接觸過,但不深,看完會三心二意,沒有方向;第二,可復制參考的例子太少。C語言課程中有很多有趣的問題,比如猴子吃桃子,漢諾塔等。這些例子對於剛接觸C/C++語言編程的人來說是很好的例子。《本質C++》只能是在看完前兩本書之後,學習C++特點的過渡書。讓讀者真正體會到什麽是C++編程,C編程和C編程有什麽區別。

透明度:我發現壹個很有意思的現象:初學者經常喜歡問“哪本書比較好”,這讓我很不解。這有點像壹個剛學打籃球的人問:“王和科比誰更厲害?”。當然科比更好。但如果妳想學打籃球,這兩個人是非常非常有資格教妳的,妳跟誰學都可以學得很好——關鍵不在於妳選哪個老師,而在於妳花了多少功夫去學。

透明度:回到原來的話題。在學習了C++語法,理解了C++代碼之後,壹定會有壹些書來引導進階(或者說引導迷宮)。我覺得《設計模式》很好,可以讓讀者看到壹些細微的用法。但正如我常說的,模式帶來的麻煩和好處壹樣多,甚至更多。而且C++本身的問題使得在C++中使用GoF模式越來越麻煩。

噩夢:設計模式這本書絕對不可或缺,而且中英文版本都不可或缺。壹開始看了中文版,說實話沒看懂,但也不覺得翻譯的很差,所以就想,大概是原文難懂,水平有限吧。所以我總是想多找壹些圖案書來讀。後來找了幾本書,口碑還不錯,但是水平高,比較了壹下就出來了。它仍然是最經典、最耐用的書籍設計圖案。英文版出來後,兩個版本對比就清楚多了。現在覺得,其實就設計模式而言,看懂這本書就很好了,不用花很多時間去找其他的書了。我包裏壹直有這本書,所以我隨身帶著。

至於設計模式的副作用和可能的弊端,我有很多經驗。但事實就是如此。讓我們考慮壹下。什麽情況下可以用好設計模式?壹種是由有經驗的人來指導。舉個例子,如果Robert Martin帶領團隊,妳在某個地方使用了錯誤的設計模式,他會指出來,說這裏不對,以後會出現什麽樣的弊端。對他來說,豐富的實踐經驗足以支撐他的“預見性”設計。但大多數人沒有這個能力,所以我們只好走第二條路,第三條路,即“探索性”設計和“重構性”設計。遇到問題,妳覺得用某個模型合適,就大膽用。成功意味著積累經驗。出了問題就要改回來。這也是在積累經驗。這叫“探索性”。至於重建,應該算是最有條理最成功的工程方法了。先把問題“快而臟”,把暗礁都暴露出來,再根據實際情況采用合適的模型進行優化設計。現在XP和UP都非常重視重構,UP鼓勵在合作和構建階段提取專門的叠代進行重構。所以,如果妳組織快速軟件開發,當然更喜歡這條路——成功率。

透明性:說到重構,我順便說說《重構》這本書的影響。從項目本身來看,妳所謂的“可重構設計”並沒有錯然而中國的開發者(包括我在內)往往比較沖動,容易相信銀彈的存在。有壹段時間我在Java裏嘗試重構,後來又在C++裏嘗試。原來Java中非常快的重構過程在C++中慢了下來。原因是C++和Java的約束不同。拿壹個Java裏成功的案例,直接設置C++,不失敗才怪。

所以,我必須說《重構》這本書很有價值。但是對於C++程序員來說,它的價值就是讓妳思考這種方法的可行性。如果壹個C++程序員不打算遷移到Java,那麽我必須告訴他,《重構》這本書不是給妳用的,甚至不是給妳信的。對於C++程序員來說,《重構》整本書只有第13章可以信賴,其他部分必須非常謹慎對待。

噩夢:關於“探索性”方法,我想多說兩句。我覺得“探索性”對於個人發展也是必不可少的。撞墻並不可怕。高層不都是被淘汰的嗎?失敗壹次就知道這種模式潛在的問題是什麽了。如果妳下次再用,妳會看到更多的步驟,就像下棋壹樣。打多了,路數就出來了。

不知道大家有沒有這種感覺:用錯了模型,吃了虧,然後回去看設計模式。當妳看到人們早就指出這個問題的時候,也不過是寥寥數語。壹開始看著幹巴巴的,現在覺得句句在心頭,GoF的形象立馬高大起來,帶著光環,感覺既興奮又遺憾。

透明性:現在回想起來,我很欣賞myan推薦的使用Booch方法設計面向對象的c++應用程序。這本書可以幫助C++程序員理清思路,培養習慣,可惜國內沒有引進。相對於後來商業氣息濃厚的UML系列書籍,我覺得這本書對面向對象有著精辟獨到的解釋,至今無人能敵。

噩夢:剛才我們都談到了羅伯特·馬丁,他是我的榜樣。我覺得1995的《設計面向對象的C++應用》這本書是每個c++軟件工程師都應該反復學習的書。可惜的是,不僅國內沒有引進,國外也不知名。如果妳覺得自己似乎明白了面向對象的所有原理,但是遇到實際問題卻無法努力,那麽這本書就是妳最好的導師。

說到整理思路,還有壹本書不得不提,那就是安德魯·克尼格的《C+++的反芻》。每個人都應該問問自己,我學了這麽多年C++。C++最基本的設計理念是什麽?當我遇到問題時,我的第壹反應是什麽?第壹個暫定方案應該有什麽特點?如果不能給出明確的答案,那就認真看這本書。看完了,妳就有“主心骨”了。

透明度:壹句話,談“推薦”。入門書基本通用,推薦意義不大。入職後的發展方向每個人都不壹樣。這時候就需要“專家”的指導了。比如我在學C++的時候,myan不認識我,所以沒有給我推薦。反正我是學的,所以就算妳給我推薦Essential C++或者C++ Primer,我也不會太感謝妳。但是在我認真學習OO的時候,妳給我推薦了羅伯特·馬丁的書,對我很有幫助,我也很難從其他地方找到類似的推薦,所以我很感謝妳。

壹個程序員必須了解框架,學會使用框架,並積極地分析框架(設計模式在這方面會有所幫助)。但是,真正高質量、高潮叠起的框架書,很可能只針對MFC。從這個角度來說,MFC有很多不好的地方,所以C++程序員非常有必要先使用它,熟悉它,研究它,甚至借助MFC這樣的書深入淺出地分析它。否則很難有框架的意識和感覺。

當然,另外壹個框架也很不錯,那就是STL。不管用不用MFC和STL,掌握和理解這兩個東西都是很有幫助的。最近在用更簡單的方式看MFC。雖然現在已經不需要MFC編程了,但是肯定有壹定的幫助。

噩夢:MFC和STL方面,我還是比較佩服侯老師的兩本書,MFC和STL源代碼分析。

《MFC》這本書很有名,但是也有很多人批評。其實這本書並不完美,批評當然不可或缺,但有時候看到有人評論這本書,拿它和Inside VC比較,真的是風馬牛不相及。

其實妳剛才說的很對。程序員要有壹點框架意識。而這本《簡單解釋MFC》與其說是講MFC編程,不如說是以MFC為例分析應用框架的架構和脈絡。所以不管妳對MFC本身的態度如何,這本書對每壹個C++程序員都大有裨益。

透明度:是的。VC技術內幕會告訴妳如何使用宏DYNAMIC_CREATE,MFC會告訴妳如何實現宏DYNAMIC_CREATE。所以,如果妳只需要在VC下寫壹些小應用,簡單來說MFC的價值並不是太大;但是如果需要設計大壹點的東西(不壹定是框架),MFC的設計思路會有幫助。

噩夢:另外,我覺得MFC也應該有壹個公正的評價。以前吹捧天上地下什麽都沒有,書店裏全是MFC的書,讓大家只知道MFC,不知道C++。甚至現在還有人問“我學MFC還是C++?VC++是不是比C++更高級的語言?”MFC成了偶像,阻礙了人們的視線。所以我們必須把它從神壇上拉下來。這是過去壹兩年很多人包括我在內批評MFC的壹個目的。但是現在大家的眼界都開闊了,。NET也出來了,MFC不再是偶像,少數人開始以貶低MFC為樂。我認為這種態度是錯誤的。

什麽是好的框架?我覺得十幾年後像MFC這樣穩定進步的框架才是好框架。也許我們在壹些具體的設計問題上有不同的看法,認為“這個地方不是更漂亮嗎?”很多次,是的,但這不重要。重要的是MFC成熟穩定,有十幾年的成功經驗,這才是最了不起的。

此外,MFC包含學習Win32 API編程的最佳材料。這是其框架方面之外的另壹個亮點。我現在用Win32 API開發,但是經常參考MFC的源代碼,收獲很大。

透明性:STL,我沒興趣分析它的源代碼,畢竟源代碼大多是算法問題。所以,《STL源代碼分析》我只是隨便翻了翻,就束之高閣了。我覺得這本書是計算機系數據結構與算法的好教材。不知道有沒有老師願意這樣做。

對於STL,我的態度壹直是“應用至上”。但我壹直認為SGI STL本身就是壹本很精彩的書,是數據結構和算法的經典參考書,也是泛型技術的參考書。想知道壹個算法是怎麽實現的,看看STL源代碼就知道了;想知道如何使用type traits,STL源碼也有例子。看別人寫的書,總覺得隔著壹層紗抓不到癢處。SGI STL的代碼寫得很漂亮。壹個C++程序員不看這本書,真可惜。

噩夢:關於STL,除了STL源代碼分析,推薦我和侯老師共同翻譯的C++標準庫。這本書的質量是毫無疑問的。我現在手頭有這本書,隨時查閱對我幫助很大。

透明性:與Java相比,C++最大的優點是沒有專門的公司來管理,最大的缺點是沒有專門的公司來管理。Java程序員在學習了簡單的語法之後,馬上進入SUN提供的框架,在用這個現成的框架做實際開發的同時,繼續學習Java的壹些深層特性。這個時候C++程序員大概還在問“VC和BCB哪個好”。這無疑是浪費時間。

噩夢:剛才妳講了Java和C++的優缺點。這個話題成為了我們這個時代永遠不會消失的聲波。我不想再談這件事了。但是,我得說清楚,我們很多用C++的人,現在都吃了不少苦。我們仰著脖子看Java,覺得好可愛。這個印象是不準確的。另外,Java並不簡單,而且會越來越復雜。在很多場合,Java是沒有競爭力的。至於未來,我覺得有些Java愛好者太樂觀了。計算機科學幾十年解決不了的問題,好像借著Java的東風就能解決,沒那麽容易。

透明度:當然。我再次強調:沒有靈丹妙藥。讀書很重要,但古人說“走萬裏路,讀萬卷書”,卻還是把“走大路”放在了“讀書”之前。尤其是技術類的書,如果不能幫我解決問題,不能給我帶來非常實際的好處,那我就不看了。魔鬼說的沒錯,我們的社會很快,我們的行業特別快,我們只能盡力去適應。

  • 上一篇:如何提升店鋪流量,提升店鋪流量的技巧
  • 下一篇:Linux系統移植目錄
  • copyright 2024吉日网官网