目錄 [隱藏]
本期導(dǎo)讀:你是否還在為如何學(xué)習(xí)編程語言痛苦不堪?你是否還在為看哪本編程的書糾結(jié)不已?你是否還沒有找到合適的學(xué)習(xí)網(wǎng)站?本期我們特意邀請了黃超學(xué)長給我們推薦了一些平臺和開發(fā)方面的書目,另外還推薦了一些你所不知的資訊網(wǎng)站,千萬不要錯過?。?!
引言很害怕說的不好,寫的不對,誤人子弟,那就罪過了。由于平時主要是用C/C++做一些圖像和視頻方面的處理,所以下面列的也主要是C/C++方面的內(nèi)容。 我們這個行業(yè)雖然技術(shù)更新非???,但是普遍認(rèn)為基本功才是最重要的。CPU體系結(jié)構(gòu)、匯編、C/C++、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)和算法、計算機網(wǎng)絡(luò),永遠(yuǎn)都是程序員的護生法寶,就如同少林寺的《易筋經(jīng)》;學(xué)會了《易筋經(jīng)》,幾乎可以無所不能,任你創(chuàng)造武功。我們想想操作系統(tǒng)、編譯器、虛擬機都是怎么開發(fā)的就知道這些知識的重要性了。先推薦一本書《深入理解計算機系統(tǒng)》,這本書是需要不斷研究的一本經(jīng)典,每次看都會有新的收獲。這本書對計算機軟硬件體系結(jié)構(gòu)進行了深入淺出的介紹,涵蓋的內(nèi)容較多,值得反復(fù)研究。 對于編碼、程序最好還是深挖,更多的要去了解底層、了解程序背后的東西。要了解編譯器在背后為我們做了什么,鏈接器又做了什么,程序在加載的時候是怎么一個過程,程序在執(zhí)行的時候CPU、高速緩存、內(nèi)存、操作系統(tǒng)是怎么樣協(xié)作工作讓程序順暢的跑起來的。下面列出一些主題和書目,都是個人的一些想法和偏好,看完這些收獲確實很大,但是其中還有很多不理解的,可能還有理解不正確的,還需要再鉆研,也許需要在項目中或者到工作中才會有更深刻的體會和認(rèn)知。下面我會就C語言、C++、Linux、Windows、數(shù)據(jù)結(jié)構(gòu)、算法方面推薦一些我認(rèn)為值得看得書,并分享一下自己在編程時的一些感受,希望能對家有所幫助。 書目推薦篇C語言
相信C語言都是學(xué)過的,基本的概念語法什么的應(yīng)該都是懂的,這里就直接推薦書了。 《C程序設(shè)計語言(第2版新版)》:這本應(yīng)該時刻放在手邊,經(jīng)常翻,超級大師的作品,字字珠璣,深刻透徹。這本書可以作為了解C語言思想的書籍,看過之后會對C有很大的了解。寫的很精練,但是內(nèi)容涵蓋又非常的廣,感覺是多一頁不多,少一頁不少的那種。由于是C語言設(shè)計者寫的,所以里面會提到函數(shù)的設(shè)計思路。 《C和指針》、《C陷阱與缺陷》、《C專家編程》:三本一起來,暫且稱其為C語言(進階書)三杰。如果你想成為一個嚴(yán)肅的程序員,這三本必須讀。起點有點高,但看某些內(nèi)容時頗有頓悟之感。C語言的精髓是指針,而這三本書對指針和數(shù)組,還有函數(shù)這些問題分析的相當(dāng)透徹。C語言之所以強大,以及其自由性,很大部分體現(xiàn)在其靈活的指針運用上。因此,說指針是C語言的靈魂,一點都不為過。要想學(xué)好C語言,那么指針是必須熟練掌握的。 《C語言深度解剖》:這個是已出版的書,作者之前在網(wǎng)上放了電子版的,叫《C語言深度剖析》,比較深入的研究了C語言。 其實這本書中,很多都是《C專家編程》、《C和指針》、《C陷阱與缺陷》中的內(nèi)容,作者用自己的理解寫出來,讓人更容易理解和接受,而且對于知識點的講解都配有相關(guān)例子。但是書中有一些錯誤需要自己辨別。而且所有的分析都基于VC6.0,太依賴特定的編譯器了,所以里面說到的結(jié)論對不對還需要我們自己深思。總的來說還是一本值得看的書。 《高級質(zhì)量程序設(shè)計指南》:林銳的書,順便也可以了解一下林銳是何許人也。其實這本書講C++的東西更多一點,比較強調(diào)編程規(guī)范、編程習(xí)慣等方面的問題。提的東西比較廣、很重要,可惜講的不太深,看完這本書以后建議找更多的讀物來深入理解。據(jù)說有些公司的面試筆試題就選上面的,所以找工作的看看會很有幫助的。 C++如果沒有學(xué)過C++,那么先找本傻瓜一點的教材翻起來,《C++Primer》。 《C++Primer》:一本久負(fù)盛名的C++經(jīng)典教程,這本書幾乎包含了有關(guān)C++的所有基礎(chǔ)知識,包括一些基礎(chǔ)的語法,常見的錯誤解析和最為基礎(chǔ)的編程案例以及一些在C++中很經(jīng)典的實例,這些知識能夠使初學(xué)者很容易地掌握有關(guān)的知識,以最快的速度進入C++學(xué)習(xí)的“門檻”。但是內(nèi)容相當(dāng)多,要全部消化不容易,可以作為工具書放在手頭翻。 另外,如果大家想對C++有更深入的了解的話,建議大家看看下面幾本書。 《Effective C++》、《More Effective C++》:對C++中各類知識點的總結(jié),主要都是實際編程中的一些經(jīng)驗。 《C++對象模型》:第一代C++編譯器開發(fā)主管所寫,看這本書,他為你講述了編譯器在處理各種語法時在“后臺”所做的事。對C++有較深入了解的同學(xué)會在讀后有恍然大悟之感,侯捷翻譯,質(zhì)量還是不錯的。但內(nèi)容較深,涉及到標(biāo)準(zhǔn)和編譯器的東西比較多,很多東西標(biāo)準(zhǔn)沒有明確定義,留給廠商一些自由發(fā)揮的空間,對于這些我們不能想當(dāng)然,要自己去辨別哪些是和編譯器相關(guān)的。作者所使用的編譯器較老,現(xiàn)代編譯器是不是還是這樣實現(xiàn),需要自己上機練習(xí),結(jié)合匯編代碼看。 《C++反匯編與逆向分析技術(shù)揭秘》:這個對程序調(diào)試還是很有幫助的。 Linux至于Linux,由于在現(xiàn)在的學(xué)習(xí)中用的比較少,了解的也不是很深,就推薦幾本網(wǎng)絡(luò)上公認(rèn)的好書吧。 《鳥哥的Linux私房菜》:相信這個應(yīng)該是最好的教材了吧,作者完全顧及了初學(xué)者的感受,它懂得從哪里講,以及如何講才能讓所有人都看得懂。從硬件講起,為安裝做鋪墊,然后講到文件的操作,編排得非常有序,內(nèi)容也非常全了。 另外大家可以看一下《Unix環(huán)境高級編程》、《Unix網(wǎng)絡(luò)編程卷一、卷二》。要是有興趣還可以研究研究Linux內(nèi)核,對于理解操作系統(tǒng),C/C++的學(xué)習(xí)會有很大的幫助。 Windows《Windows核心編程》:原書名為Programming Applications for Microsoft Windows,但是這個Windows核心編程貌似是夸大了一點啊。這不是一本W(wǎng)indows編程的入門讀物,而是進階讀物。沒有它,你也可以寫出各種Windows程序。但是有了它,你的視野一下子就打開了??梢哉J(rèn)為是操作系統(tǒng)的延伸,從OS理論到OS實現(xiàn)。由于WINDOWS代碼是不可見的,而這本書已經(jīng)盡最大努力讓你在API層上窺探一些系統(tǒng)底層的一些知識。對于Windows平臺下的開發(fā),這個最好認(rèn)真研讀。 《Windows程序設(shè)計(上下冊)》:也是經(jīng)典,當(dāng)然不一定要所有內(nèi)容都搞透,用的時候翻就行了。 不過Windows下寫程序最好的東西應(yīng)該還是MSDN,電腦上裝個安裝版的,不懂的時候就到里面搜,肯定能找到你要的東西,同時還能練英文。 數(shù)據(jù)結(jié)構(gòu)、算法《算法導(dǎo)論》:這個要啃下來不容易,數(shù)學(xué)的東西比較多; 《數(shù)據(jù)結(jié)構(gòu)與算法分析:C++描述》 《編程之美:微軟技術(shù)面試心得》 《編程珠璣》、《編程珠璣(續(xù))》 對于像設(shè)計模式這種需要大量經(jīng)驗才可以領(lǐng)悟到的知識,如果你從來沒獨立寫過一個上萬行的程序,基本上理解不了設(shè)計模式在講什么。其實這種時候能做的也就是背下來,理解什么的都是扯淡。諸如此類,學(xué)習(xí)程序,如果要加速那個過程,肯定要花大量的時間寫代碼。當(dāng)你把項目做得越大、越復(fù)雜、算法越扭曲、界面越華麗、尺寸已經(jīng)大到你覺得不學(xué)習(xí)新的方法論就肯定會讓代碼失控的時候,這個時候你來看設(shè)計模式的書,保證是每看到一個模式都覺得人家說到你心坎里去了。那你不僅可以迅速理解,而且以后還可以不由自主的想起來使用它。所以前期的話還是把基本功練扎實了,更高級的主題到我們需要的時候自然而然會去學(xué)。 個人經(jīng)驗分享篇1.程序出錯了怎么辦程序錯了很正常,程序越大調(diào)試占用的時間會越多。調(diào)程序要有耐心,千萬不能浮躁,要靜心定性。有時候我們會有這樣的想法,認(rèn)為我們的程序肯定是對的,是不是編譯器有問題,這個概率很小啦,碰到錯誤,我們應(yīng)該告訴自己肯定是我們的程序有問題。調(diào)程序要充分利用好工具,現(xiàn)在一般都是使用IDE,怎么樣利用好IDE,不管是Windows平臺還是linux平臺都要熟練使用開發(fā)環(huán)境。怎么樣調(diào)試,跟蹤變量、觀察內(nèi)存、甚至是看相應(yīng)的匯編代碼。另外最好熟悉調(diào)試的相關(guān)快捷鍵,效率會更高一點。注意編譯器鏈接器給出的出錯信息,一般同一類錯誤給出的提示信息基本都是一樣的,解決完錯誤后想想是怎么原因造成的,再結(jié)合錯誤的提示信息,那么下次碰到相同的出錯信息就能知道大概是什么原因了,這樣就找到了排錯的大致方向,不至于盲目、下不了手。我們也不能盲目相信編譯器給出的錯誤提示,有時候不一定準(zhǔn)。這里推薦兩本書《程序員的自我修養(yǎng)》(這本書感覺有點亂,但是內(nèi)容還是很多的,而且講的也不錯,看下來收獲還是蠻大的)、《Linkers and loaders》(這本書有中文版的,但是本來英文的就寫的比較晦澀,中文版的翻譯的也不怎么樣,所以看下來會有點壓力)。 2.閱讀源代碼,撰寫文檔很重要當(dāng)我們了解了語法,寫了一些代碼后可以閱讀一些他人的代碼,有很多開源代碼都是很好的選擇,甚至是一些庫的源代碼(TCP/IP卷二:實現(xiàn)、glibc)??粗跋认胂肴绻屇阕约簩崿F(xiàn)你會怎么寫,然后再去看人家是怎么寫的,為什么人家會寫的這么簡潔,效率這么高。當(dāng)然還可以看看基本的語法是怎么樣用到實際的代碼中的,比如宏定義、內(nèi)聯(lián)、const,這些是在哪些地方用的,以后自己寫的時候也可以學(xué)著用。我接觸的主要是多媒體通信方面的,X.264、WebRTC(這個比較新,Google的)都是可以研究的。拿到別人的代碼,第一步要先把代碼跑通,然后熟悉程序的流程,最好能畫出流程圖來,再看類之間的依賴關(guān)系、函數(shù)之間的調(diào)用關(guān)系,最后才去研究相關(guān)函數(shù)的具體實現(xiàn)。這里提醒一下,我們寫代碼的時候要盡量寫好注釋,學(xué)會寫文檔。不管是參加比賽還是將來工作都會要求我們有撰寫文檔的能力,平時盡量能學(xué)著寫起來,我知道很多寫程序的人很排斥這個(包括我自己),但是還是要強迫自己去寫,自己懂了不代表別人也能懂,把自己的想法表達出來也是一種能力。 3.書看不懂怎么辦很多時候看書感覺像是在看天書,這個不懂,那個也不懂??吹枚囊屑?xì)看,爭取看出更多東西,看不懂的要硬著頭皮往下看,不可能是一遍就能看懂的。當(dāng)然這其中有一些問題,有很多東西看不懂是因為需要先修知識,那么我們就應(yīng)該把先修的那部分先看懂再回來接著看。還有的情況是我們理解的角度不對,那我們可以求教Google,搜索相關(guān)知識點,先看看別人是怎么理解的,然后再回去看。很多時候我們會在不同的書上看到同一知識點,千萬不能不看,每個作者對同樣問題的理解角度不一樣,我們看多了就能從不同的角度去理解,可以對其有立體性的認(rèn)識。另外一些好的作品是要反復(fù)研讀的,隨著知識的積累,回過頭再去看的時候會有新的收獲。如果能找到三兩同伴一起研究,那就最好不過了。 4.我推薦的網(wǎng)站博客要在CSDN、weibo等社交網(wǎng)絡(luò)關(guān)注技術(shù)大牛,訂閱RRS。及時了解新語言,對技術(shù)要有深入研究而不是僅僅停留在只會調(diào)用API的層面上。技術(shù)是要靠實力說話的,光忽悠沒用,所以盡可能早的去深入了解。另外對他們的關(guān)注會了解到更多的業(yè)界動向,出現(xiàn)了哪些新技術(shù),作為致力于IT發(fā)展的我們應(yīng)該要有一個全局的認(rèn)識。對于IT行業(yè)、IT企業(yè)的發(fā)展感興趣的,可以翻翻吳軍老師的《浪潮之巔》,寫的很好,值得一讀。 網(wǎng)站: http://blog./,一個資訊類網(wǎng)站吧,閑來可以看看; http://www.csdn.net/,這個網(wǎng)站應(yīng)該不用多介紹; http://www./,Linux環(huán)境下開發(fā)的好去處; http://www.cnblogs.com/,里面總結(jié)性的東西比較多。 博客: http://blog.csdn.net/v_JULY_v,算法必看。
上面列的這些網(wǎng)站和博客隔三岔五就上去看看,碰到好的文章保存下來,經(jīng)常翻出來研究下,學(xué)習(xí)了一段時間再看又會有新的認(rèn)識和收獲。去論壇里面、博客上面看人家有什么問題,你有沒有意識到有這些問題,你能不能解決人家提出的問題,你準(zhǔn)備怎么解決,回復(fù)者里面是不是有比你更好的解決方案。試著去回答他人的問題,不要怕出錯,相互交流才會有更大的提高??偟膩碚f就是向他人學(xué)習(xí),和他人探討問題。通過閱讀他人代碼提高自己的水平,同時盡可能去幫助他人,用一種開放地思維接受和分析他人的解決方案以及思想。 5.注意關(guān)注熱點現(xiàn)在很fashion的詞——云計算、物聯(lián)網(wǎng),吸引了很多人的眼球,其實這只是一個概念,落實到實處還是要有相關(guān)的應(yīng)用、產(chǎn)品推出來。所以包括多核多線程編程、海量數(shù)據(jù)處理、機器學(xué)習(xí)等這些都是值得研究的,會有大量的應(yīng)用用到這些技術(shù),感興趣的可以深入研究。前面都沒有提到數(shù)據(jù)庫,對于數(shù)據(jù)庫還是建議大家要有所了解的,相信將來不管是服務(wù)器端、桌面、還是手持終端上的開發(fā),對數(shù)據(jù)庫的要求都會越來越高。 6.關(guān)于提問題和網(wǎng)絡(luò)資源的使用對于不懂的問題或者自己沒法解決的問題,先上網(wǎng)搜,現(xiàn)在網(wǎng)絡(luò)資源這么豐富,絕對不能浪費了。怎么搜、選擇什么關(guān)鍵詞、到哪邊去搜,這又是一門學(xué)問了。這樣在網(wǎng)上看了一圈、學(xué)習(xí)了相關(guān)知識后再去請教別人就能有更好的認(rèn)識了,不至于別人講的一些術(shù)語或是基本知識都聽不懂。向別人提問題,不管是當(dāng)面還是在網(wǎng)上發(fā)帖,一定要把問題講清楚,什么平臺、什么背景都要說,另外把自己已經(jīng)理解了多少、或是自己是怎么理解的也最好要說明,這樣別人才能針對性的作答。 后記大家也要學(xué)會忙里偷閑。多參加娛樂、體育活動、多接觸大自然。身體是革命的本錢,你的身體和大腦需要休息,經(jīng)常站起來活動活動,切忌一直坐著盯著屏幕。 什么事情都怕你堅持,堅持下去總會成功的。對于軟件、對于開發(fā)才剛上路,要時刻學(xué)習(xí)、堅持學(xué)習(xí)。另外前面有什么不對的,不足的地方,希望得到指正,更希望能當(dāng)面交流,共勉!
黃超學(xué)長的郵箱:hc.huangch@gmail.com
作者為2010級通信與信息工程學(xué)院研二學(xué)長黃超,保研通院董育寧老師 2011.12 獲第八屆全國研究生數(shù)學(xué)建模大賽二等獎; 2011.11 獲中國移動二等獎學(xué)金; 2010.06 獲南郵優(yōu)秀畢業(yè)生; 2007.11-2009.11 連續(xù)三年獲南郵?!叭脤W(xué)生”; 2007.11-2009.11 連續(xù)三年獲南郵二等獎學(xué)金; 2009.11 獲南郵單科成績優(yōu)秀獎; Good Books Worth Sharing ,Ideas Worth Spreading!
本篇文章約稿by :周丹 編輯by :周丹 魏浩 |
|