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