【轉】給計算機專業大學生整理的書單

閒來無事,利用大半天的時間將本身對計算機課程的而見解整理成一張書單,但願對如今仍然迷茫的大學生有幫助。(轉載請註明出處)  
本人推薦的97%以上的書籍都是國外書籍,國內大學的教材仍是別看了。切記,切記!

0.000 計算機科學導論
教材:
1.《編碼:隱藏在硬件背後的語言》
2.《通靈芯片》
3.《D is for digital:What a well-informed person should know about computers and communications》
擴展閱讀:
《圖靈的祕密:他的平生、思想及論文解讀》

計算機數學基礎 0.001 微積分
教材:
1.推薦看MIT的公開課《微積分重點》
2.《什麼數學:對思想和方法的基本研究》
3.《微積分和數學分析引論》

0.002 線性代數
教材:
1.推薦孟巖的博客 《矩陣系列》 google 關鍵字 「孟巖」 「矩陣」 便可進入博客
2.推薦MIT的公開課《線性代數》
3.推薦書籍《線性代數》做者Gilbert Strang,只有看電子版的了。沒引入


0.003 機率論
教材:
1.推薦MIT的《機率導論》
2.《深刻淺出統計學》
3.《統計思惟:程序員數學之機率統計》

ps:關於數學分析、隨機過程、等高級課程就不錯贅述了。

0.004 計算機科學基礎之離散數學
教材:
1.《離散數學及其應用》

0.005 計算機科學基礎進階之組合數學
教材:
1.《組合數學》

0.006 計算機科學基礎高級之具體數學
教材:
1.《具體數學》
ps:這本書難度比較大,科大博士的必修課。之因此推薦這本書是由於若是不讀完這本書怎麼可能有機會去領略Knuth的神做《計算機程序設計藝術》系列呢?儘管大神knuth在TAOCP卷一中寫道有高中的數學知識就能看懂,可是以個人我的經驗來看彷佛作不到。

計算機編程基礎 0.007a 程序設計基礎
教材:
1.《Little Scheme》
2.《How to Design Program》

0.007b 程序設計原理
教材:
1.《計算機程序設計的構造和解釋》英文名稱《The Structure and Interpretation of Computer Programming》簡稱「sicp」江湖上人稱「魔法書」
2.《Concepts, Techniques, and Models of Computer Programming》
ps:若是你讀sicp不作裏面的習題簡直就是暴殄天物,浪費了。
推薦MIT的公開課「計算機科學及編程導論」儘管他們用python取代了scheme。

0.008 C語言程序設計基礎
教材:
1.《C語言的科學和藝術》
2.《C程序設計的抽象思惟》
3.《C語言程序設計》K&R

進階教材:
1.《C專家編程》
2.《C語言接口與實現:建立可重用軟件的技術》

0.009 彙編語言程序設計
教材:
1.《彙編語言》做者:王爽
這多是本書單中惟一一本中國人寫的教材


面向對象程序設計 C++程序設計
教材:
1.《Thining in C++》
2.《C++ Primer》
3.《Effective C++》
4.《深刻探索C++對象模型》
ps:C++的經典教材太多了說不定我能夠列出20原本,可是初學者仍是先打好基礎吧。

JAVA程序設計
市面上有不少培訓機構的java視頻,有些視頻講的真心不錯,能夠找些看看。
教材:
1.《Thinking in Java》
2.《Effective Java》
3.《Practical Java》
4.《深刻理解Java虛擬機》
5.《Java併發編程實踐》

計算機核心專業課 數據結構與算法:
教材:
1.算法:C語言實現(第1~4部分) 基礎知識、數據結構、排序及搜索
2.算法:C語言實現(第5部分)圖算法
或者
3.《算法》第四版(java描述)(本書紅黑樹講的奇比如CLRS好百倍)
4.《算法引論:一種創造性的方法》(一本被你們忽略的好書,正如序言說的,若是你沒時間請直接看第五章)
5.《編程珠璣》
6.《算法概論》 一本不厚的算法書,做者惜墨如金,字字珠璣。對動態規劃的講解很是的棒!
7.《編程之美》一本很好的習題冊


算法分析與設計
教材:
1.《算法引論:一種創造性的方法》
2.《算法導論》

程序設計與計算機系統
教材:
1.深刻理解計算機系統


計算機網絡
教材:
1.《Head First Network》
2.《Tcp/IP詳解卷一:協議》
3.《計算機網絡:自頂向下方法》

操做系統(能夠拆分紅兩門獨立的課程)
教材:
1.《現代操做系統》
2.《操做系統:精髓與設計原理》
3.《萊昂氏UNIX源代碼分析》
4.《現代體系結構上的UNIX系統--內核程序員的SMP和Caching技術》
5.《計算機系統設計原理》
6.《UNIX編程藝術》
7.《鳥哥的Linux私房菜》make your hands dirty,學一學怎麼用操做系統吧,各類名目,shell^_^
聽國外讀書的朋友講,學完的以後國外的學生就能夠寫出一個微型的操做系統內核。


Linux/Unix編程實踐:
1.《UNIX環境高級編程》
2.《UNIX編程環境》
3.《Linux/Unix編程實踐教材》(這本更適合初學者)


數據庫
教材:
1.數據庫系統導論 
2.數據庫系統概念 

計算機體系結構
教材:
1.《計算機體系結構:量化研究方法》

軟件工程:
鄒欣老師在中科大授課時候用的講義,當時我震驚了。
http://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html
1.《人月神話》
2.《代碼大全》
3.《UNIX編程藝術》
4.《夢斷代碼》
5.《程序員修煉之道:從小工到專家》

數據挖掘與機器學習
數學基礎要好,特別是統計學,線性代數可能還須要更高級的隨機過程知識
教材:
1.《Machine Learning in Action》
2.《集體智慧編程》
3.推薦斯坦福「機器學習公開課」
4.《統計思惟:程序員數學之機率統計》

網絡編程:
1.《TCP/IP詳解:卷一》
2.《UNIX網絡編程(卷1):套接字聯網API》
3.《UNIX網絡編程.卷2:進程間通訊(第2版)》
4.《Java併發編程實踐》
5.《HTTP權威指南》

編譯原理
本人學本科學了一遍編譯原理,在科大又學了一遍能夠說全部課程裏面最折磨人的莫過於《編譯原理》這門課了。
教材:
1.《編譯原理》:江湖上人稱「龍書」
2.《編譯原理》:江湖上人稱「虎書」
3.還有一本江湖上人稱「鯨書」的
4.《編程語言實現模式》一本更「practical」的書籍
5.《程序員的自我修養:編譯、連接、與庫》近年來中國人寫的又一好書。
一門優秀的編譯原理課程,在學完以後學生就能夠作出來一個簡單的編譯器。在科大的時候咱們正好五次實驗最終實現了一個簡單的編譯器。


設計模式:
不推薦初學者看GOF的《設計模式》
教材:
1.《大話設計模式》中國人寫的不錯的書籍,C#描述
2.《深刻淺出設計模式》Head first 系列
3.《敏捷軟件開發原則:模式與實踐》c++/java 描述
4.《重構:改善既有代碼的設計》
5.《重構與模式》
6.《重構與手冊》
7.好了最後看GOF的《設計模式》吧。

最後你們讀一讀《數學之美》吧,很是棒的一本書。

圖形、網絡安全、等其餘領域的課程往後再說

其餘話題

1.編程語言之爭:
不少在校大學生冥茫到底該學習哪門語言,哪門語言更好。其實語言無好壞,「尺有所短寸有所長」。這就比如我問「究竟是錘子厲害仍是水果刀厲害」,若是是用來削蘋果固然是水果刀厲害。若是是用來砸石頭固然是錘子厲害。每門編程語言都有本身的應用場景,個人建議以下:
1.學好C語言
2.學一門傳統的面嚮對象語言C++、C#、java均可以,按照本身的喜愛來
3.學一門函數式語言,好比schme,F#,common lisp,ML等等。這裏我推薦學習scheme,由於「sicp」,「hodp」兩本及其優秀的書籍都是用scheme來說編程思想的
4.學一門動態語言好比pyton,ruby等等。我我的比好喜歡python

如今不少人都會說「編程語言不重要,重要的是思想」,其實我是不徹底贊成的。深刻一門語言編程,但不拘泥於一門語言。
一個好的學院應該會有相關的課程包含這些不一樣編程範式的語言,好比讀研的時候,我在數據挖掘課上學的python,在編譯工程課上學的ML,在形式化方法課程學的F#,咱們還有一門課時講授動態語言ruby的。固然了,還有專門的實踐課javaee平臺,c#.net平臺,等等。計算機專業是實踐性很是強的學科,沒有累計必定的代碼量是不行的。10W行,沒錯,但願你們在本科四年可以累積10W行的代碼量。不必讀研了。若是你讀了本書單中的大部分書的話。

2.看英文書仍是翻譯的
你們看我推薦的書單就知道了,我都是寫的中文名字。這並不表明我不推薦你們看英文原著。個人觀點是,當你進入一個新領域第一本每每得看中文版翻譯版的,由於看英文版的有不少術語你看不明白,這樣進度會比較慢,打擊自信心。反正我是這樣的,我學任何陌生領域的第一本書看的都是中文翻譯的,之後的書籍基本上就是若是翻譯的好就看中文版的,典型的如《unix編程藝術》翻譯的就很是好。翻譯很差的就看英文版的,好比編譯原理課程裏面提到的「虎書」的java描述版就翻譯的奇差,只能看英文版的。


3.有這些書單就夠了嗎?
No,學好一門課程須要很是多的動手實踐,計算機專業尤爲如此。一門優秀的課程每每得配上很是好的實驗課程。好比《深刻理解計算機系統》這門課的實驗就很是的棒,令我印象最深入的要數「二進制炸彈」了。當時咱們你們都在拆彈,拆的不亦樂乎。可見cmu的老師很是用心的設計了這些實驗,可是中國的教育呢?
不多有拿的出手的原創課程吧?大學老師們,大家用點心教學生吧!同窗們大家用點心學吧。
若是您是工做一族那麼讀一讀用紅色標記的部分吧。
last but not the least
書單中尚有漏網之魚,往後補上。手頭還有不少事要忙,就此擱筆。

若是你們有疑問或者建議能夠聯繫我。
email:sea11107@mail.ustc.edu.cn

補充:
我相信不少學弟學妹看了這個書單可能會產生一種感受,學一門技術要看這麼多書嗎?答案是有必要!由於就算是一本極其好的書對一個知識點的闡述也都有不一樣的側重點。舉個很簡單的例子,二分查找。有編程經驗的人確定知道「二分查找」爲什麼物,任何講數據結構算法的書都會講,不少人認爲本身就理解了。好了下面就檢查一下你對二分查找的理解。全部問題都是圍繞「二分查找展開」。

若是面試官這麼問你:
Q1:請描述一下二分查找的思想吧。
Answer:Alabla,不少人能夠說出來。

Q2:請問二分查找的返回值是什麼?
Answer:

Q3:請在紙上寫出完整的二分查找代碼吧。(遞歸、非遞歸版本)
Answer:(你能保證你能寫對?90%的程序員都寫不對)

Q4: 你能給你寫的二分查找編寫測試用例嗎?
Answer:(你能保證你能寫設計出很好的測試用例?)

Q5:你能證實你的二分查找是對的嗎?
Answer:(循環不變式?)

Q6:我如今題目稍微作些改動:給定一個有序數組(升序)arr,求最大的i使得arr等於v,不存在則返回-1.
Answer:你能寫對嗎?

Q7:按照上題的敘述我如今要求最小的i使得arr等於v,不存在則返回-1。
還有不少。。。。

如何尋找這些問題的答案呢?
一本書確定是不夠的。你能夠到這些書籍尋找答案:
任何一本講數據結構算法的書籍查找二分查找的概念。
johua bloch的一篇博文《Extra Extra Extra:Nearly all the binarysearch and mergesort are broken》
或者 jdk1.5的 java.util.Arrays裏面查找錯誤二分查找的源代碼,jdk1.6中查找正確的源代碼
《編程珠璣》尋找不變式的相關答案
《編程之美》尋找相關題目的變體
《代碼之美》尋找爲二分查找設計測試用例的答案。
不變式的設計也能夠再go語言的類庫中找到。
好了很恐怖吧。
相關文章
相關標籤/搜索