如果你是一名自學(xué)工程師或者是一名軟件集訓(xùn)課程畢業(yè)的學(xué)生,有些計算機(jī)科學(xué)基礎(chǔ)課程是你必須要補(bǔ)齊的。幸好,你通過互聯(lián)網(wǎng)就能獲得世界頂級的CS(計算機(jī)科學(xué))課程。
其實(shí)網(wǎng)上有很多學(xué)習(xí)資源但它們良莠不齊,你需要不是什么“200+免費(fèi)在線課程”列表而是如下問題的答案:
你應(yīng)該學(xué)習(xí)哪門課程?為什么?
每門課程最好的書籍或者視頻,講座是什么?
我寫這篇文章的目的就是嘗試對于這些問題給出的明確答案:
使用建議的書籍或者視頻講座來學(xué)習(xí)以下的九門科目,最好是書籍和講座都仔細(xì)的研究一下,可以不嚴(yán)格按照列出的順序來。每一門科目都需要花上100-200小時來研讀,然后在你的職業(yè)生涯中對于最熱愛的方向進(jìn)行反復(fù)重溫。
為什么要學(xué)習(xí)計算機(jī)科學(xué)
有兩種軟件工程師:一種人對于電腦科學(xué)有很好的理解從而去從事挑戰(zhàn)性的、富有創(chuàng)造力的工作。另外一種人僅僅熟悉一些高級工具,對其原理持得過且過的態(tài)度。
兩者都叫做軟件工程師,而且兩者在早期的職業(yè)生涯中可能領(lǐng)著同樣的薪水。但是第一種工程師,不管他從事的是商業(yè)工作,還是突破性的開源工程,都會由于他的技術(shù)領(lǐng)導(dǎo)力或者杰出的個人貢獻(xiàn)一點(diǎn)一點(diǎn)成長成一名對于編程更加癡迷而且待遇更高的工程師。
第一種工程師可以通過常規(guī)手段或者在職業(yè)生涯中不斷學(xué)習(xí)來加深對于計算機(jī)科學(xué)的理解深度。第二種工程師通常停留在表面,學(xué)習(xí)具體的工具或者技巧而不是其中的基礎(chǔ),當(dāng)前流行什么技術(shù),他們就僅僅撿起新的技能學(xué)習(xí)一下。
近些年來,越來越多的人進(jìn)入軟件領(lǐng)域工作,但是本質(zhì)上計算機(jī)科學(xué)的畢業(yè)生數(shù)量是沒有改變的。第二種工程師的供應(yīng)過量開始導(dǎo)致他們的就業(yè)機(jī)會變少而且導(dǎo)致他們離企業(yè)中令人感覺充實(shí)的工作更遠(yuǎn)。不管你是努力要成為第一種工程師或者僅僅是保險起見地想找到更多的工作,學(xué)習(xí)計算機(jī)科學(xué)是唯一一種可靠的途徑。
課程指南
編程
大多數(shù)大學(xué)的計算機(jī)編程課程通常以“入門類”計算機(jī)的課程開始。這些課程最好是不僅僅針對于初學(xué)者,而且對于第一次學(xué)習(xí)編程,基本概念和編程模型不是很熟悉的人也有所啟發(fā)的。
對于這種介紹的內(nèi)容的我們給出的標(biāo)準(zhǔn)建議是經(jīng)典的計算機(jī)程序的結(jié)構(gòu)與解釋,在網(wǎng)絡(luò)上能找到很多這樣的資料,它們可能是電子書或者是MIT的一系列講座視頻。這些講座都很不錯,但是我們的視頻推薦的實(shí)際上是伯克利的一門課程:Brian Harvey 的 SICP講座,這個系列的課程比起MIT的講座更精煉而且對于入門者更具有針對性。
我們推薦觀看完至少前三章節(jié)的SICP(《計算機(jī)程序的構(gòu)造和解釋》)并且做完相應(yīng)訓(xùn)練。額外地,可以在exercism進(jìn)行一些編程訓(xùn)練。
如果你覺得SICP太難,我們推薦《程序設(shè)計方法(中文版)|How to Design Programs》這本書。如果你覺得它太簡單,我們推薦《Concepts, Techniques, and Models of Computer Programming》這本書。
計算機(jī)體系結(jié)構(gòu)
硬件是平臺 – Mike Acton(Insomniac Games的工程總監(jiān)) (收看他在 CPP 大會上的演講)
https://www.youtube.com/watch?v=rX0ItVEVjHc
計算機(jī)結(jié)構(gòu)–有的時候被稱為“計算機(jī)系統(tǒng)”或者“計算機(jī)組織”–是了解程序外表下計算機(jī)運(yùn)行的第一步。根據(jù)我們的經(jīng)驗(yàn),這是自學(xué)軟件工程師最容易忽略的地方。
《計算機(jī)系統(tǒng)要素》(The Elements of Computing Systems),也被稱為“從與非門到俄羅斯方塊”。這是一本讓你對于計算機(jī)中的每一個零件是怎么工作的有一個整體的理解的雄心勃勃的書。每個章節(jié)涉及到建立整體系統(tǒng)中一個小的部分,從寫基本的邏輯門到HDL,到CPU和匯編語言,一直到完成一個俄羅斯方塊應(yīng)用程序。
我們推薦閱讀書的前六章節(jié)并且完成相關(guān)的工程。這會提高你對于計算機(jī)結(jié)構(gòu)和運(yùn)行的軟件之間關(guān)系的理解。
這本書的前半部分(和它的全部工程)在Nand2Tetris網(wǎng)站上可以免費(fèi)獲得。在Coursera課程網(wǎng)站上你也可以找到它們。
為了保證課程簡單并吸引人,Nand2Tetris 舍棄了深度。特別是現(xiàn)代計算機(jī)結(jié)構(gòu)中兩個很重要的概念:流水線(pipelining)和內(nèi)存層級(memory hierarchy),在書中都沒有提及。
當(dāng)你覺得看Nand2Tetris已經(jīng)很簡單了,我們下一個建議是Patterson和Hennessy合著的《計算機(jī)組成與設(shè)計硬件/軟件接口》(Computer Organization and Design)——一本杰出的現(xiàn)代經(jīng)典書籍。不是書中所有的部分都很重要;我們建議跟隨Berkeley的CS61C 課程——(Great Ideas in Computer Architecture),作為特殊讀物。講座的筆記和實(shí)驗(yàn)環(huán)境都是在線的,而且可以在在這個歸檔鏈接回看講座:
https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_
算法和數(shù)據(jù)結(jié)構(gòu)
只有一個方法是我一直以來廣泛推薦的—編碼前首先要思考 — Richard Hamming
我們根據(jù)幾十年的通識來看,熟悉通用的算法和數(shù)據(jù)結(jié)構(gòu)是計算機(jī)科學(xué)教育中最重要的方面之一。這是一個訓(xùn)練一個人解決問題的通用能力的方式,而且這種能力還可以遷移到其他領(lǐng)域的學(xué)習(xí)。
這個領(lǐng)域有很多優(yōu)秀的書籍,但是我們最喜歡的是Steven Skiena的《算法設(shè)計手冊》(The Algorithm Design Manual)。他顯然喜歡這東西而且也迫不及待地想幫助你學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法。這是令人耳目一新的變化,我們認(rèn)為這本書相對于被更多人所推薦的Cormen, Leiserson, Rivest & Stein 或者 Sedgewick 的書來說更好。后兩本書有些太過于引經(jīng)據(jù)典,對于想通過閱讀來解決問題的人來說并不是一個好的選擇。
對于那些更喜歡講座視頻的人來說,我們推薦Skiena的講座. 我們也喜歡Tim Roughgarden的課程,在斯坦福的MOOC平臺或者Coursera上面可以獲得。你喜歡 Skiena 還是 Roughgarden 的講課風(fēng)格就是你的個人喜好問題了。
說到練習(xí),我們傾向于讓學(xué)生在Leetcode上面解決問題。LeetCode上面的問題都比較有趣而且有答案和討論。這上面還可以通過解決各大軟件公司廣泛應(yīng)用的技術(shù)問題來幫助你測試你的進(jìn)步。我們建議解決你學(xué)習(xí)的時候解決大約隨機(jī)100道LeetCode上面的問題。
最后,我們強(qiáng)烈推薦《怎樣解題》這本書,它針對如何解題進(jìn)行了精彩絕倫和獨(dú)特的講解,既適用于數(shù)學(xué)也適用于電腦科學(xué)。
計算機(jī)科學(xué)領(lǐng)域的數(shù)學(xué)
如果人們不認(rèn)為數(shù)學(xué)是簡單的,那么他們一定沒有體會過人生的艱難 — John von Neumann
在某些方面,計算機(jī)科學(xué)是應(yīng)用數(shù)學(xué)的一個擴(kuò)展。雖然許多軟件工程師忽略了這一點(diǎn),我們建議你去學(xué)習(xí)它。好好學(xué)習(xí)數(shù)學(xué)會給你比那些不學(xué)習(xí)它們的人巨大的競爭優(yōu)勢。
和CS最相關(guān)的數(shù)學(xué)領(lǐng)域是“離散數(shù)學(xué)”,離散是連續(xù)對立面。是微積分之外的一系列的有趣的應(yīng)用數(shù)學(xué)的主題。從大體上說,嘗試學(xué)會全部范圍的“離散數(shù)學(xué)”是沒有意義的。更現(xiàn)實(shí)一點(diǎn)的做法是對于邏輯學(xué),組合學(xué)和概率學(xué),集合論,圖論和一些數(shù)論告知密碼學(xué)有一個了解。對于計算機(jī)圖像學(xué)和機(jī)器學(xué)習(xí)來說,線性代數(shù)也是一門值得學(xué)習(xí)的課程。
我們建議從László Lovász的講座學(xué)起. 這一系列開始學(xué)習(xí)離散數(shù)學(xué)。Lovász 教授讓學(xué)習(xí)的內(nèi)容變得直觀生動,比起拘謹(jǐn)?shù)奈淖郑@更利于你學(xué)習(xí)。
接下來,我們推薦《Mathematics for Computer Science》, 它是MIT同名課程的講義。講座課程的視頻也是免費(fèi)的,而且是我們推薦的離散數(shù)學(xué)的視頻課程。
線性代數(shù),我們建議從Essence of linear algebra系列開始學(xué)習(xí),接著是Gilbert Strang的書籍和視頻。
《操作系統(tǒng)概念》(Operating System Concepts)(恐龍書)和《現(xiàn)代操作系統(tǒng)》(Modern Operating Systems)是經(jīng)典的操作系統(tǒng)的書籍。這兩本書的寫作方式都飽受爭議,而且為了鼓勵你去購買新版,這些長達(dá)1000頁的書每幾年就會添加一些內(nèi)容。
《Operating Systems: Three Easy Pieces》這本書是一本比較好的可供選擇的線上免費(fèi)讀物。我們特別喜歡書的結(jié)構(gòu)和它經(jīng)典的練習(xí)題。
讀完這本書,我們推薦你去探索一種特定的操作系統(tǒng)的設(shè)計方式,比如那些書名中有系統(tǒng)名字的書籍,比如 《Lion‘s commentary on Unix》、《The Design and Implementation of the FreeBSD Operating System》,還有Mac OS X Internals.
鞏固你對于操作系統(tǒng)的理解很好的方式是去讀一個小的內(nèi)核并且添加功能。xv6 是一個不錯的選擇,它是 Unix V6 和 ANSI C 和 X86 的接口,MIT專門有一門課程就是講這個的。OSTEP(之前提到的)這本書有一個 XV6 的實(shí)驗(yàn)附錄,里面都是充滿潛力項(xiàng)目的好點(diǎn)子。
計算機(jī)網(wǎng)絡(luò)
你不能夠通過凝視水晶球來預(yù)見未來。因特網(wǎng)未來會變成什么樣,取決于如今人類如何去塑造它 — Bob Kahn
考慮到很多軟件項(xiàng)目都是基于web服務(wù)器和客戶端的,計算機(jī)網(wǎng)絡(luò)變成計算機(jī)科學(xué)中一門有實(shí)用價值的學(xué)科。系統(tǒng)學(xué)習(xí)過該課程的自學(xué)學(xué)生發(fā)現(xiàn)他們終于理解了圍繞了伴隨它們很多年的術(shù)語,概念,協(xié)議等等。
關(guān)于這個主題我們最推薦的書是:《計算機(jī)網(wǎng)絡(luò)》(Computer Networking: A Top-Down Approach)。書中的小工程和實(shí)驗(yàn)都很好,值得一做。我們非常喜歡它們提供的Wireshark labs。
對于那些喜歡視頻課程的人,我們推薦斯坦福MOOC平臺上的《Introduction to Computer Networking course》。
學(xué)習(xí)網(wǎng)絡(luò)的好處不僅僅在于做小的實(shí)驗(yàn)而且對于工程來說也有很大的好處。可能涉及到的有:一個HTTP的服務(wù)器,一個UDP協(xié)議的聊天軟件,一個迷你的 TCP 協(xié)議棧,一個代理或者負(fù)載平衡器,還有分布式的哈希表等等。
數(shù)據(jù)庫
對于自學(xué)者來說,學(xué)習(xí)數(shù)據(jù)庫系統(tǒng)會比學(xué)習(xí)其他花費(fèi)更多的時間。這是一個相對較新的(即1970年代后期)的研究領(lǐng)域。比起寫書,許多潛在的杰出教科書作者更愿意去加入或者創(chuàng)辦一家公司。
在這種情況下,我們建議自學(xué)者放棄教科書而去學(xué)習(xí)伯克利的Joe Hellerstein的數(shù)據(jù)庫課程,看完課程再去閱讀論文。
對于初學(xué)者有一篇論文比較推薦的是:《Architecture of a Database System》,它高屋建瓴地講解了關(guān)系數(shù)據(jù)庫管理系統(tǒng)是如果工作的這一問題。它會為你未來的學(xué)習(xí)提供一個有用的綱要。
《Readings in Database Systems》這本書,又被稱為數(shù)據(jù)庫紅皮書、是一本Peter Bailis、Joe Hellerstein和Michael Stonebraker編輯地論文集。對于那些理解了CS 186內(nèi)容的人來說,紅皮書是你的不二之選。
如果你堅持要使用一本引導(dǎo)性的教科書,我們推薦Ramakrishnan 和Gehrke的《數(shù)據(jù)庫管理系統(tǒng)》(Database Management Systems),對于更優(yōu)秀的學(xué)生,Jim Gray的傳統(tǒng)課程《Transaction Processing: Concepts and Techniques》值得一看,但是我們不建議把它當(dāng)成入門書。
不編大量的代碼是不能很好的鞏固數(shù)據(jù)庫的理論的,CS 186的學(xué)生往Spark中添加功能,這是一個很有意義的工程。但是我們建議僅僅是從頭寫一個簡單的關(guān)系數(shù)據(jù)庫管理系統(tǒng)。功能可能不是很豐富,但是即使每一個部分都涉及到一些基本功能也很有啟發(fā)性。
最后,數(shù)據(jù)模型是一個數(shù)據(jù)庫使用中被忽略和沒有被重點(diǎn)學(xué)習(xí)的方面。我們對于這個課題建議的書籍是:《Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World》
語言和編譯器
Don’t be a boilerplate programmer. Instead, build tools for users and other programmers. Take historical note of textile and steel industries: do you want to build machines and tools, or do you want to operate those machines? — Ras Bodik at the start of his compilers course
大部分程序員學(xué)習(xí)如何使用一門編程語言,然而大部分的計算機(jī)科學(xué)家則學(xué)習(xí)這門語言本身。這給了計算機(jī)科學(xué)家比起程序員很明顯的優(yōu)勢。他們的知識能夠更好的泛化,他們能比簡簡單單地掌握一門語言的更加深入和快速的理解一門新語言的操作。
經(jīng)典的教科書《編譯原理 技術(shù)與工具》(Compilers: Principles, Techniques & Tools)通常又被稱為“龍書”。不幸的是,這本書并不適合自學(xué)者,它比較適合教師從中選出1-2個章節(jié)并在課堂上講授。這本書是有必要看的,你可以挑選里面的主題,最好再有個師傅指導(dǎo)你。
如果你選擇在自學(xué)中使用龍書,我們推薦你一系列門視頻講座,然后再沉浸在對于龍書的研究中。我們推薦的在線課程是:Alex Aiken 的講座,你可以在斯坦福大學(xué)的幕課平臺上觀看。
也有可以替代龍書的教材:Terence Parr寫的《編程語言實(shí)現(xiàn)模式》(Language Implementation Patterns),它更適合那些工作中使用類似特定領(lǐng)域語言的小眾語言的有經(jīng)驗(yàn)的編程者,它顯得更加實(shí)用。當(dāng)然,為了達(dá)到這個目的它也刪去了一些有價值的理論。
對于工程實(shí)踐,我們推薦你寫一個編譯器,你可以選擇像COOL這種簡單的教學(xué)語言或者你感興趣的一門語言。如果你覺得太難,你可以參考Make a Lisp,你可以參考它作為開始。
分布式系統(tǒng)
計算機(jī)的數(shù)量增長了,它們的分布也更廣了。企業(yè)之前會購買越來越大型的主機(jī),但是現(xiàn)在大家更傾向于在很多機(jī)器上分布式的運(yùn)行多個小型的應(yīng)用程序。分布式系統(tǒng)研究的就是這樣的技術(shù),這一技術(shù)變得越來越重要了。
我們建議的自學(xué)教科書是 Maarten van Steen 和 Andrew Tanenbaum 的《Distributed Systems, 3rd Edition》。針對于之前的版本做了很大的改進(jìn),而且作者慷慨地把書放在了網(wǎng)上共享。由于分布式計算是一門變化很快的領(lǐng)域,所以沒有教科書可以很好的涵蓋所有的內(nèi)容。但是Maarten van Steen的書是我們讀過的所有書中最好的書。
研究生在線課程MIT’s 6.824也是一個不錯的選擇,但可惜視頻中的音質(zhì)不太好,而且不清楚這些視頻是不是都被授權(quán)過。
盡管有參考書或者其它的資源,但學(xué)習(xí)分布式系統(tǒng)是絕對要讀論文的。鏈接中有一個很好的清單,而且我們十分推薦你從Papers We Love上面下載論文到本地學(xué)習(xí)
-
互聯(lián)網(wǎng)
+關(guān)注
關(guān)注
54文章
11239瀏覽量
105925 -
編程
+關(guān)注
關(guān)注
88文章
3686瀏覽量
94978 -
計算機(jī)科學(xué)
+關(guān)注
關(guān)注
1文章
144瀏覽量
11577
原文標(biāo)題:計算機(jī)科學(xué)自學(xué)指南
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
計算機(jī)網(wǎng)絡(luò)入門指南

NVIDIA 宣布推出 DGX Spark 個人 AI 計算機(jī)

云端超級計算機(jī)使用教程
工業(yè)中使用哪種計算機(jī)?

量子計算機(jī)與普通計算機(jī)工作原理的區(qū)別

評論