求推薦系統學習計算機知識的教材, 最好英文經典為主?
目標:希望通過系統的學習,達到科班畢業生的水平。
現狀:最近辭職在學習CS,不急找工作,想系統學習計算機。學完:1、《標準C語言設計》
2、python看了大概2本入門書,能寫小script3、《高等數學》同濟版學完上冊正在學:1、《數據結構》(嚴蔚敏版) /* 看了一半 */2、《C++ Primer》(英文 5th) /* 學到第七章 */3、《The C program language》(英文版) /* 還有兩天看完 */4、《深入理解計算機系統》(中文版 第三版) /*3月末買的,英文影印版四月出,說出來都是淚,五月末開始看,目前卡在第三章,正在爬。*/5、《計算機程序的構造和解釋》 (英文版) /* 目前下了個盜版的kindle英文版,罪過……當枕邊書,每天看幾頁,目前看到2.2節 */我為自己列的其它必修學習書目如下,計劃半年時間學完:
數學方面:1、《離散數學及其應用》(kenneth H.Rosen 英文版 第七版》2、《線性代數》 (Sheldon Axler 英文版 第二版)3、《高等數學(下冊)》(同濟版)4、《概率論》(浙大版)計算機基礎方面:1、《計算機網路》 (Anderw S.Tanenbaum 英文版 第五版)2、《現代操作系統》 (Anderw S.Tanenbaum 英文版 第四版)3、 《數據結構與演算法分析:C語言描述》 (Mark Allen Weiss 英文版 第二版)4、 《計算機體系結構:量化研究方法》 (John L.Hennessy 英文版 第五版)
計劃外書目:如果看完了有時間的話,準備再看看下列書:1、《具體數學:計算機科學基礎》(Ronald L.Graham 英文版 第二版)2、《Fluent Python》 (Luciano Ramalho 英文版)。3、《演算法》(Robert Sedgewick 英文版 第四版)/* 不過學習需要JAVA基礎,我沒用過JAVA,所以到時再說。*/4、《編譯原理》(Alfred V.Aho 英文版 第二版)/* 不知道有沒有必要學習下。*/請求:1、希望各位幫看看這個書目是否合適,需不需要調整。
2、另外有沒有哪門課業遺漏了必須補充的,望推薦具體書目。在此拜謝!---2017-06-18---
1. 題主想要達到科班畢業生的水平,效率最高的方法其實還是讀一個CS學位。同意樓上說的,這個書單首先很難在半年內看完,其次就算能讀完也只是知道這麼一個概念。書單里的比如CSAPP, SICP, 計網,操作系統都是課上的教材,我們在學的時候都是要有配套的lab和project來鞏固,同時老師答疑,單純看書很難達到效果。
2. 堅持自學的話,還是推薦題主通過北美top4的公開課來學習,如果覺得看視頻的效率沒有看書高,也可以直接看公開課的講義+教材,再配合課程的project,lab。個人覺得一個合格科班本科畢業生要達到的能力大概是這麼幾方面:軟體構造與抽象,演算法與數據結構,系統基礎(包括體系結構,操作系統,資料庫,網路)。知乎上很多高票答案都對公開課有推薦了,比如伯克利的CS61A/B/C,CS162,普林斯頓的演算法課,CMU的15213, etc.
3. 北美CS專業的研究生,如果本科不是CS的話,一般也需要花一年半到兩年的時間補上這些基礎。這還是在每學期滿學分上課的情況下。所以題主可以衡量一下自學達到你的標準所需要花費的時間。
4. 書單里我只看過CSAPP和SICP,前者可以打下很好的系統基礎,後者極大提高抽象能力和對程序的理解。操作系統建議看威斯康星的一本教材:Operating Systems: Three Easy Pieces,網路推薦這本:Computer Networking: A Top-Down Approach, 6/e。這兩本分別是我在上操作系統和計網課時候用的教材,特點都是深入淺出容易理解,對很多概念的闡述非常清晰。
我不是大神,我也是自學cs,但我是根據大神們的教誨走完以下路的:
計算機科學導論與計算機科學概論
CSAPP (理解思想為主,把c語言編程的部分略掉了,因為我那時還不會c語言)
The c programming language c primer plus c語言程序設計現代方法(把c用熟,實現數據結構時天才感強烈)
結合c語言編程再看CSAPP,但這本書是入門書,重要內容過一遍就過了,以後有用再看。我沒做習題,我認為理解思想最重要。但我會自己設計一些程序去探討系統的原理。
大話數據結構 和 啊哈演算法
Data Structure and Alogrithm Analysis in C 殷人昆數據結構c語言版本 鄧俊輝數據結構c++版本(鄧書我只看思想,講的很好。沒編程,因為我潛意識排斥c++)嚴蔚敏的數據結構買了沒看也不建議你看
天勤考研的數據結構高分筆記,不考研也值得看
計算機組成原理,唐朔飛和白中英的都看了,各有優劣,總體不做評價
Structured Computer Organization(不要看量化那本,那本難,開始學習能結構化組成已經很厲害了)
王道考研的計算機組成輔導書,不考研也值得看
Operating System Concept 強烈推薦(不要看現代操作系統,後者晦澀,而且字小眼累)
Computer Networking : A Top-Down Approach 和Computer Networks,A System Approach 後者不太出名,但有講的很靚的點,比如路由尋路的距離向量演算法,相反,top down並沒有把這個點講透。
上面的書大部分是國外英文經典,英文書名的話 ,我看的都是國外原版的,或者先買的翻譯版後來又買的英文版。扔了好多嶄新的翻譯版。現在也沒什麼後悔的,交學費是必不可少的。
數學的話,考研數學都推薦的教材——同濟的高數和浙大的概率我認為都不錯。同濟的線代不適合初學。我的線代入門教材是《線性代數及其應用》原著作者是David C. Lay。數學,我非常重視數學思想以及例題和證明。但是不去做課後習題。理解了書本上的思想和方法後,直接跳到考研真題。真題是最好的數學題。當然你可以看大神推薦的國外經典數學教材。不過我覺得,中國的數學教學和國外的差距不大,可能我見識短淺吧。
不要光看書,間隔輔以開發,做自己想做的,萬一沒有,就模仿他人的的例子。我是用的python和c#做開發,你可以用其他語言。理解c之後,學python和c#是很快的。不要專門學她們。不要聽人調侃c#,在windows平台上,用c#難道不是最自然的選擇嗎?python是開源的,所以解決方案也是開放式,新手會遇到很多要搜的問題。不覺得python有多好,但她作為從c到c#的過渡是很好的,因為它有c的面向過程也有c#的面向對象。我是用python在三維動畫軟體maya中編程。用c#在unity中編程。網路應用開發也是c#。我覺得c#是最好的語言。
現階段不要看SICP,演算法導論不評價。沒看java版的演算法,因為我潛意識排斥java。你就不一定了。可以用java實現演算法了。看看圖示理解思想也好。
看了一點離散,看不懂,就沒再看了。也沒學編譯,如果有時間你還是學習一下吧。
我就是這麼過來的,從以前的小白到現在初步知道CS是什麼回事,會一點編程。我把我的經歷寫下來你參考一下,波瀾不驚,很平淡,但自我感覺所學堪用了。因為我對自己的定位是類似介面的作用,是cs在其他行業的應用。如果你想在cs上走得更深更遠的話,可以參考真正大神的回答。包括我的回答有些意見也不是我的,大神在回答中三言兩語提到的,我記住了。
我現在知道潛意識排斥c++和java是沒必要的,因為c是c++的子集,java和c#類似。這是我學習cs時唯一參與的cs的門派之爭。像什麼大括弧該怎麼放,++i比i++更快什麼的,從來沒參與過。這也許是自學的好處。共勉。
書單上的書大部分還不錯,但是毫無章法,也缺乏目的性,建議參考一下國內外高校的教育計劃有針對性的制定一下
另外從書單來推測的話,有個別的書,我覺得你如果半年之內看完了,那純粹是走馬觀花,只能做到別人說到這個概念你能背出點東西,知道去哪裡查的程度,理解是絕對談不上的。
這個階段學C++沒必要,這個語言太複雜。樓主做題了嗎?如果只看書不做題,實際沒什麼用。如 @Adder 的建議,最好能參考國外高校的課程設置,先挑一些基礎的課,扎紮實實的學完,再循序漸進。
演算法導論(提醒一句,影印版比原版便宜太多太多)
另外,我用bing圖片搜索「演算法導論」,出來一堆代溝美女圖是怎麼回事。 @grapeot 這是什麼演算法。
2017/6/xx
17fall master 入學,因為轉專業所以正在開學前補基礎的階段。
題主說的書太多了,半年根本不可能看完,很多經典的書對於大部分人沒什麼用,而且也很難,尤其是《具體數學》。。。
很多課只看書是很難理解的。
建議半年時間看其中幾本+學對應的課程即可。
建議順序:
1、CSAPP, 同時跟CMU CS15-213 Panopto 的課程,並做完課程lab,做lab過程中學習c語言,彙編,並通過lab和彙編對計算機系統有所了解。------&>2017/8/25 課程主頁的lab好像不讓下載了?不過應該還是能google到的。
2、《數據結構與演算法分析》,可以跟coursera上普林斯頓的algorithm part1,通過編程作業入門演算法和數據結構。有興趣還可以把part2跟完。
3、《操作系統概念》(Operating System Concepts), 很多操作系統課都是直接摘取這本書的內容做課件,可以跟berkeley的 CS162 - Spring 2017。 建議跟完CMU15-213後再學習操作系統。
4、 《計算機網路-自頂向下方法》,配合UCB的 CS 168, Fall 2015, 這個我還沒看,看了課程里有四個projects, 覆蓋了比較廣的計算機網路內容。------&> 2017/8/25 在看,cs168較其他計算機網路課程(我本科水過的一門網路課),除了會講基本內容外,有更多的時間會花在一些網路演算法的實現上。(其實這些內容在這本書里都有,但是我完全沒看過。。這本書的內容的確很廣泛和優質)
以上是我學習的順序,在各個課中我還完成了其他兩門別的課,但學完後感覺無關緊要。
按工作日學習、周末休息、平時偶爾偷會懶的節奏跟以上幾門課,一門一門的學,四個月左右應該可以跟完,基礎薄弱的話可能會久點。
個人認為學好以上幾門課其實已經對於一些必備的計算機基礎就學的差不多了,如果要找工作就可以根據自己的興趣來發展某個方向的技能了。
其實自學最大的問題是沒有各種deadline逼著你去做project,身邊也沒有人跟著你一起學,沒有TA答疑,然後很容易在一些簡單的bug上卡的懷疑人生……
-
參考
-
-
如果你只是要達到一本科畢業生的水平。給你一點建議,可以試試。
一,所有的數學書,都不用看了。這個後續再看。
二,學c語言的話,一定要看彙編,一定要。強烈推薦清華大學王爽老師的《彙編語言》,非常好。看的話,了解call指令,ret指令,push pop指令,如果能比較清楚,就可以暫時放下了。這本書學了,那些深入理解計算機系統,計算機架構的書,就可以暫時不用看了。
三,編譯原理,不用看了。
四,數據結構,知道咋回事就行了。會寫基本的隊列創建,插入節點,折半查找,樹,圖遍歷,就夠了。不用花費太多時間,沒有用,這個和你編碼量有關,就好比開車,公里數沒有開到,學再多都是白搭。
五,學好操作系統基礎原理。於淵寫的《自己動手寫操作系統》很不錯,不過第二章還是第三章的保護模式下彙編語言是初學者的噩夢,沒有死磕的準備,就不要嘗試了。這個可以先看個大概,後續再說。首先學會多線程編程,文件讀寫,加鎖保護這些應用層的編程,知道這些東西是幹啥的就行了。
六,會網路編程,計算機網路相關書籍,看一下目錄就行了。計算機網路分七層,實際上用起來只有五層,教材都是從底層往高層教,但是你實際應用的時候,正好相反,先寫一個tcp的客戶端服務端通信的程序,然後試試寫多線程或者非同步通信的網路程序。
七,關於面向對象,這個可以看一下程傑的《大話設計模式》,這個書廢話有點多,有些章節感覺作者自己也沒鬧明白,但是第一章相當不錯,當時是初學者的我看了有種醍醐灌頂的感覺,這個不急著看。
看會這些,如果再能寫上一些代碼,普通的本科畢業生就不是你的對手了。
不要迷信經典書籍,那些書我感覺對初學者來說完全不如我說的那些。
計算機專業的學生來說兩句:
1.如果打算按照計算機專業的專業課開設內容來學習,那麼補充一些書: 計算機組成原理: 《計算機組成與設計:硬體/軟體介面》,這本書看完再看量化研究方法那本。資料庫:《資料庫系統概念》。彙編: 學校一般會和微機介面一起開講,然而並沒有什麼用,自學可以用王爽的《彙編語言》然後高級的可以看《x86彙編語言:從實模式到保護模式》。
2.有些書,同類型看一本入門就行,時間多了再看其他的。比如(個人感覺): 嚴蔚敏的《數據結構》和《數據結構與演算法分析:C語言描述》看後者就行了。
3.編譯原理是必修課。
4.有些書不是必須立刻看,比如SICP和CSAPP。前者只是聽說過不評價,後者我覺得可以把計算機組成原理相關內容看完再看。
感覺題主還是有個明確目地比較好,例如找某個類型的開發工作或者考研之類的(如果考研又是看另一套東西了),然後只看幾本書把目標達成。一下看這麼多書,可能過段時間就忘掉了。方法有問題。這種不成體系的胡亂安排只會事倍功半。
首先找到你的目標,目標是什麼?是為了工作還是進一步深造。如果是工作那就應該明確找到方向,舉個例子假如想找Web開發的,前端後端?需要哪些技能從招聘可以看出來。工作方面編程是實踐性很強的,我不認為你泛泛的看書能有什麼效果。就拿 計算機網路,操作系統,計算機體系結構三個方面來講,半年時間自學完任何一個都是很大的挑戰(效果達到習題全部自己完成並正確),而且就算完成了對以後工作未見得有實質性幫助。如果是要深造,那就明確深造的方向,考研,出國。先看怎麼入門檻再說。
如果你是真的熱愛計算機技術,那就不該急功近利。這個書單我也曾經想看完。。。
但是發現這些書雖然都很經典,但是枯燥,讀不了多少就暈了然後放棄了。所以我一般先去找一點有趣的並且淺顯的書,先建立一點熟悉感和興趣。這樣後,可以比較無痛的刷完這些書。。。半年前,打開CSAPP,兩眼一瞪,這tm是什麼東西。現在打開CSAPP,恩,說得很好,且一目十行。如果不是想考研,沒必要和本科生比,他們只是勝在知識面全題主可以走技術路線自頂向下,用到啥學啥,建立一個自己的的技術棧,這才是工作時候的核心競爭力
mit open courseware
系統化的自學,我覺得一般是很難做到,因為沒有各種正負反饋也沒有壓力。
從自己感興趣或者有實際需求的角度切入比較實際可行。以為是推薦系統。。
推薦閱讀:
※鄰居家 Wi-Fi 忘記設置密碼了,怎樣優雅地告訴 TA?
※如何看待 2017 年 10 月 16 日公布的 WPA2 安全漏洞 KRACK?
※萬網買了域名之後,該如何建立網站?
※BGP協議的路由表記錄了整個路由路徑嗎?
※計算機執行一條指令要多長時間?