數(shù)學(xué)知識(shí)從某個(gè)角度說,計(jì)算機(jī)科學(xué)是應(yīng)用數(shù)學(xué)的一個(gè) “發(fā)育過度” 的分支。盡管許多軟件工程師試圖 —— 并且在不同程度上成功做到 —— 忽視這一點(diǎn),我們鼓勵(lì)你用學(xué)習(xí)來擁抱數(shù)學(xué)。如若成功,比起那些沒有掌握數(shù)學(xué)的人,你將獲得巨大的競(jìng)爭(zhēng)優(yōu)勢(shì)。對(duì)于計(jì)算機(jī)科學(xué),數(shù)學(xué)中最相關(guān)的領(lǐng)域是 “離散數(shù)學(xué)”,其中的 “離散” 與 “連續(xù)” 相對(duì)立,大致上指的是應(yīng)用數(shù)學(xué)中那些有趣的主題,而不是微積分之類的。由于定義比較含糊,試圖掌握離散數(shù)學(xué)的全部?jī)?nèi)容是沒有意義的。較為現(xiàn)實(shí)的學(xué)習(xí)目標(biāo)是,了解邏輯、排列組合、概率論、集合論、圖論以及密碼學(xué)相關(guān)的一些數(shù)論知識(shí)??紤]到線性代數(shù)在計(jì)算機(jī)圖形學(xué)和機(jī)器學(xué)習(xí)中的重要性,該領(lǐng)域同樣值得學(xué)習(xí)。學(xué)習(xí)離散數(shù)學(xué),我們建議從 László Lovász 的課程筆記開始。Lovász 教授成功地讓這些內(nèi)容淺顯易懂且符合直覺,因此,比起正式的教材,這更適合初學(xué)者。對(duì)于更加高階的學(xué)習(xí),我們推薦?《計(jì)算機(jī)科學(xué)中的數(shù)學(xué)》,MIT 同名課程的課程筆記,篇幅與書籍相當(dāng)(事實(shí)上,現(xiàn)已出版)。這門課程的視頻同樣可免費(fèi)獲得,是我們所推薦的學(xué)習(xí)視頻。對(duì)于線性代數(shù),我們建議從 Essence of linear algebra 系列視頻開始,然后再去學(xué)習(xí) Gilbert Strang 的《線性代數(shù)導(dǎo)論》和視頻課程。
如果人們不相信數(shù)學(xué)是簡(jiǎn)單的,那么只能是因?yàn)樗麄儧]有意識(shí)到生活有多么復(fù)雜。— John von Neumann
操作系統(tǒng)《操作系統(tǒng)概念》?(“恐龍書”)和?《現(xiàn)代操作系統(tǒng)》?是操作系統(tǒng)領(lǐng)域的經(jīng)典書籍。二者都因?yàn)閷懽黠L(fēng)格和對(duì)學(xué)生不友好而招致了一些批評(píng)。《操作系統(tǒng)導(dǎo)論》(Operating Systems: Three Easy Pieces)?是一個(gè)不錯(cuò)的替代品,并且可在網(wǎng)上免費(fèi)獲得(英文版)。我們格外喜歡這本書的結(jié)構(gòu),并且認(rèn)為這本書的習(xí)題很值得一做。在讀完《操作系統(tǒng)導(dǎo)論》后,我們鼓勵(lì)你探索特定操作系統(tǒng)的設(shè)計(jì)??梢越柚?“{OS name} Internals” 風(fēng)格的書籍,比如?Lion's commentary on Unix,?The Design and Implementation of the FreeBSD Operating System,以及?Mac OS X Internals。對(duì)于 Linux ,我們推薦 Robert Love 的?《Linux 內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》。為了鞏固對(duì)操作系統(tǒng)的理解,閱讀小型系統(tǒng)內(nèi)核的代碼并且為其增加特性是一個(gè)很不錯(cuò)的方法。比如,xv6,由 MIT 的一門課程所維護(hù)的從 Unix V6 到 ANSI C 和 x86 的移植,就是一個(gè)很棒的選擇?!恫僮飨到y(tǒng)導(dǎo)論》有一個(gè)附錄,記載了一些可能的 xv6 實(shí)驗(yàn)項(xiàng)目,其中充滿了關(guān)于潛在項(xiàng)目的很棒想法。
你無法盯著水晶球預(yù)見未來,未來的互聯(lián)網(wǎng)何去何從取決于社會(huì)。— Bob Kahn
數(shù)據(jù)庫比起其他主題,自學(xué)數(shù)據(jù)庫系統(tǒng)需要更多的付出。這是一個(gè)相對(duì)年輕的研究領(lǐng)域,并且出于很強(qiáng)的商業(yè)動(dòng)機(jī),研究者把想法藏在緊閉的門后。此外,許多原本有潛力寫出優(yōu)秀教材的作者反而選擇了加入或創(chuàng)立公司。鑒于如上情況,我們鼓勵(lì)自學(xué)者大體上拋棄教材,而是從 2015 年春季學(xué)期的 CS 186 課程(Joe Hellerstein 在 Berkeley 的數(shù)據(jù)庫課程)開始,然后前往閱讀論文。對(duì)于初學(xué)者,有一篇格外值得提及的論文:“Architecture of a Database System”。這篇論文提供了獨(dú)特的對(duì)關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)如何工作的高層次觀點(diǎn),是后續(xù)學(xué)習(xí)的實(shí)用梗概。《Readings in Database Systems》,或者以數(shù)據(jù)庫 “紅書” 更為人知,是由 Peter Bailis,Joe Hellerstein 和 Michael Stonebraker 編纂的論文合集。對(duì)于那些想要在 CS 186 課程的水平更進(jìn)一步的學(xué)習(xí)者,“紅書” 應(yīng)當(dāng)是下一步。如果你堅(jiān)持一定要一本導(dǎo)論教材,那我們推薦 Ramakrishnan 和 Gehrke 所著的?《數(shù)據(jù)庫管理系統(tǒng):原理與設(shè)計(jì)》。如需更深一步,Jim Gray 的經(jīng)典著作?《Transaction Processing: Concepts and Techniques》?值得一讀,不過我們不建議把這本書當(dāng)作首要資源。如果沒有編寫足夠數(shù)量的代碼,很難鞏固數(shù)據(jù)庫理論。CS 186 課程的學(xué)生給 Spark 添加特性,倒是不錯(cuò)的項(xiàng)目,不過我們僅僅建議從零實(shí)現(xiàn)一個(gè)簡(jiǎn)單的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。自然,它將不會(huì)有太多的特性,但是即便只實(shí)現(xiàn)典型的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)每個(gè)方面最基礎(chǔ)的功能,也是相當(dāng)有啟發(fā)的。最后,數(shù)據(jù)模型往往是數(shù)據(jù)庫中一個(gè)被忽視的、教學(xué)不充分的方面。關(guān)于這個(gè)主題,我們推薦的書籍是?Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World。
編程語言與編譯器多數(shù)程序員學(xué)習(xí)編程語言的知識(shí),而多數(shù)計(jì)算機(jī)科學(xué)家學(xué)習(xí)編程語言?相關(guān)?的知識(shí)。這使得計(jì)算機(jī)科學(xué)家比起程序員擁有顯著的優(yōu)勢(shì),即便在編程領(lǐng)域!因?yàn)樗麄兊闹R(shí)可以推而廣之:相較只學(xué)習(xí)過特定編程語言的人,他們可以更深入更快速地理解新的編程語言。我們推薦的入門書是 Bob Nystrom 所著的優(yōu)秀的?Crafting Interpreters,可在網(wǎng)上免費(fèi)獲取。這本書條理清晰,富有趣味性,非常適合那些想要更好地理解語言和語言工具的人。我們建議你花時(shí)間讀完整本書,并嘗試任何一個(gè)感興趣的 “挑戰(zhàn)”。另一本更為傳統(tǒng)的推薦書籍是?《編譯原理》,通常稱為 “龍書”。不幸的是,這本書不是為自學(xué)者而設(shè)計(jì)的,而是供教師從中挑選一些主題用于 1-2 學(xué)期的教學(xué)。如果你選擇使用龍書進(jìn)行自學(xué),你需要從中甄選主題,而且最好是在導(dǎo)師的幫助下。我們建議依據(jù)某個(gè)視頻課程來設(shè)定學(xué)習(xí)的結(jié)構(gòu),然后按需從龍書中獲取深入的內(nèi)容。我們推薦的在線課程是 Alex Aiken 在 MOOC 平臺(tái) edX 所開設(shè)的。
分布式系統(tǒng)隨著計(jì)算機(jī)在數(shù)量上的增加,計(jì)算機(jī)同樣開始?分散。盡管商業(yè)公司過去愿意購買越來越大的大型機(jī),現(xiàn)在的典型情況是,甚至很小的應(yīng)用程序都同時(shí)在多臺(tái)機(jī)器上運(yùn)行。思考這樣做的利弊權(quán)衡,即是分布式系統(tǒng)的研究所在,也是越來越重要的一項(xiàng)技能。我們推薦的自學(xué)參考書是 Martin Kleppmann 的?《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計(jì)》。與傳統(tǒng)的教科書相比,它是一本為實(shí)踐者設(shè)計(jì)的具有很高的可讀性的書,并且保持了深度和嚴(yán)謹(jǐn)性。對(duì)于那些偏愛傳統(tǒng)教材,或者希望可以從網(wǎng)上免費(fèi)獲取的人,我們推薦的教材是 Maarten van Steen 和 Andrew Tanenbaum 所著的?《分布式系統(tǒng)原理與范型》(中文第二版,英文第三版)。對(duì)于喜歡視頻課程的人,MIT 的 6.824 是一門很好的在線視頻課程,由 Robert Morris 教授的研究生課程,在這里可以看到課程安排。不管選擇怎樣的教材或者其他輔助資料,學(xué)習(xí)分布式系統(tǒng)必然要求閱讀論文。這里有一個(gè)不錯(cuò)的論文清單,而且我們強(qiáng)烈建議你出席你當(dāng)?shù)氐?Papers We Love(僅限美國)。
常見問題解答
這份指引的目標(biāo)受眾是?我們面向自學(xué)的軟件工程師、培訓(xùn)班學(xué)生、“早熟的” 高中生或者想要通過自學(xué)補(bǔ)充正式教育的大學(xué)生。關(guān)于何時(shí)開啟這段自學(xué)旅程,完全取決于個(gè)人,不過多數(shù)人在有一定的職業(yè)經(jīng)歷后深入學(xué)習(xí)計(jì)算機(jī)科學(xué)理論會(huì)獲益匪淺。比如,我們注意到,如果學(xué)生在工作中曾經(jīng)使用過數(shù)據(jù)庫,他們會(huì)?喜愛?學(xué)習(xí)數(shù)據(jù)庫系統(tǒng)課程;如果學(xué)生從事過一兩個(gè) Web 項(xiàng)目,他們會(huì)?喜愛?學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)。人工智能 / 計(jì)算機(jī)圖形學(xué) / XX 主題怎么樣?我們?cè)噲D把計(jì)算機(jī)科學(xué)主題清單限制到那些我們認(rèn)為?每一個(gè)軟件工程師?都應(yīng)該了解的內(nèi)容,不限于專業(yè)或行業(yè)。擁有了這些基礎(chǔ),你將能更加輕松地挑選教材或論文,然而無需指引地學(xué)習(xí)核心概念。在這里,我們給出一些其他常見主題的自學(xué)起點(diǎn):
人工智能:通過觀看視頻并完成 Pacman 項(xiàng)目來學(xué)習(xí) Berkeley 的 AI 課程。至于教材,使用 Russell 和 Norvig 編寫的?《人工智能:一種現(xiàn)代方法》。