

之前有很多讀者問小林,說他是計算機科班,也是需要自學(xué) CS 課程嗎? 我的答案是肯定的,即時你在計算機科班,也是需要通過自學(xué) CS 才有可能在校招中拿到一個好的 offer。 為什么這么說呢? 主要還是因為大學(xué)里的計算機教的并不是面向找工作的,與企業(yè)所需要的人才有一點出入,但是并不是說學(xué)校里教的東西完全沒用,只是教的比較淺,而校招面試時往往都問的很深入。舉個例子: 比如學(xué)校的計算機網(wǎng)絡(luò),并沒有教你「HTTP1/HTTP2/HTTP3的區(qū)別」吧?也沒有教你「鍵入網(wǎng)址到網(wǎng)上期間發(fā)生了什么」吧?也沒有教你「TCP 三次握手里的半連接隊列和全連接隊列吧」? 比如學(xué)校的操作系統(tǒng)課程,并沒有教你「協(xié)程」吧?也沒有教你「進程間通信」吧?也沒有教你「零拷貝」吧? 比如數(shù)據(jù)結(jié)構(gòu)與算法課程,并沒有讓你們?nèi)ニeetCode算法題吧? 比如數(shù)據(jù)庫課程,并沒有教你MySQL的底層原理吧?比如鎖機制、事務(wù)機制、索引原理等
上面這些問題都是在面試時很常見的面試題,如果單純靠學(xué)校資源來學(xué)習(xí),你可能大概率都不會。 可能有的同學(xué)會問,那要在哪里面試時的重點呢? 可以去??途W(wǎng)搜一下前輩們的面試題,你就大概清楚知道面試時哪些問題是常問的,然后就可以自學(xué)開始準(zhǔn)備了。 我之前也分享過我在自學(xué)計算機基礎(chǔ)路上,看過的好書和視頻的文章:逼自己一把! 最近在逛GitHub的時候,發(fā)現(xiàn)了一個寶藏開源倉庫「TeachYourselfCS-CN」,內(nèi)容涉及計算機科學(xué)專業(yè)的自學(xué)指南,目前收獲了10k+的Star。 這份指南最早是由 Bradfield 計算機科學(xué)學(xué)院的兩名教員 Ozan Onay 和 Myles Byrne 編寫的,內(nèi)容主要源自他們對數(shù)千名自學(xué)成才的工程師和培訓(xùn)班學(xué)生教授計算機科學(xué)基礎(chǔ)的經(jīng)驗。此前,一名畢業(yè)自上海交通大學(xué),現(xiàn)為微軟實習(xí)生的開發(fā)者 Keith Null 將其翻譯成了中文,并將其中文版本正式開源到了 GitHub 上,開源地址為:https://github.com/izackwu/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN.md現(xiàn)把這個自學(xué)指南分享給大家看下。 如果你是一個自學(xué)成才的工程師,或者從編程培訓(xùn)班畢業(yè),那么你很有必要學(xué)習(xí)計算機科學(xué)。幸運的是,不必為此花上數(shù)年光陰和不菲費用去攻讀一個學(xué)位:僅僅依靠自己,你就可以獲得世界一流水平的教育??。 互聯(lián)網(wǎng)上,到處都有許多的學(xué)習(xí)資源,然而精華與糟粕并存。你所需要的,不是一個諸如 “200 + 免費在線課程” 的清單,而是以下問題的答案:簡而言之大致按照列出的順序,借助我們所建議的教材或者視頻課程(但是最好二者兼用),學(xué)習(xí)如下的九門科目。目標(biāo)是先花 100 到 200 個小時學(xué)習(xí)完每一個科目,然后在你職業(yè)生涯中,不時溫習(xí)其中的精髓??。 科目 | 為何要學(xué)? | 最佳書籍 | 最佳視頻 |
---|
編程 | 不要做一個 “永遠沒徹底搞懂” 諸如遞歸等概念的程序員。 | 《計算機程序的構(gòu)造和解釋》 | Brian Harvey’s Berkeley CS 61A | 計算機架構(gòu) | 如果你對于計算機如何工作沒有具體的概念,那么你所做出的所有高級抽象都是空中樓閣。 | 《深入理解計算機系統(tǒng)》 | Berkeley CS 61C | 算法與數(shù)據(jù)結(jié)構(gòu) | 如果你不懂得如何使用棧、隊列、樹、圖等常見數(shù)據(jù)結(jié)構(gòu),遇到有難度的問題時,你將束手無策。 | 《算法設(shè)計手冊》 | Steven Skiena’s lectures | 數(shù)學(xué)知識 | 計算機科學(xué)基本上是應(yīng)用數(shù)學(xué)的一個 “跑偏的” 分支,因此學(xué)習(xí)數(shù)學(xué)將會給你帶來競爭優(yōu)勢。 | 《計算機科學(xué)中的數(shù)學(xué)》 | Tom Leighton’s MIT 6.042J | 操作系統(tǒng) | 你所寫的代碼,基本上都由操作系統(tǒng)來運行,因此你應(yīng)當(dāng)了解其運作的原理。 | 《操作系統(tǒng)導(dǎo)論》 | Berkeley CS 162 | 計算機網(wǎng)絡(luò) | 互聯(lián)網(wǎng)已然勢不可擋:理解工作原理才能解鎖全部潛力。 | 《計算機網(wǎng)絡(luò):自頂向下方法》 | Stanford CS 144 | 數(shù)據(jù)庫 | 對于多數(shù)重要程序,數(shù)據(jù)是其核心,然而很少人理解數(shù)據(jù)庫系統(tǒng)的工作原理。 | 《Readings in Database Systems》 (暫無中譯本) | Joe Hellerstein’s Berkeley CS 186 | 編程語言與編譯器 | 若你懂得編程語言和編譯器如何工作,你就能寫出更好的代碼,更輕松地學(xué)習(xí)新的編程語言。 | 《Crafting Interpreters》 | Alex Aiken’s course on Lagunita | 分布式系統(tǒng) | 如今,多數(shù) 系統(tǒng)都是分布式的。 | 《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計》 | MIT 6.824 |
還是太多?如果花幾年時間自學(xué) 9 門科目讓人望而卻步,我們建議你只專注于兩本書:《深入理解計算機系統(tǒng)》 和 《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計》。根據(jù)我們的經(jīng)驗,投入到這兩本書的時間可以獲得極高的回報率,特別適合從事網(wǎng)絡(luò)應(yīng)用開發(fā)的自學(xué)工程師。這兩本書也可以作為上面表格中其他科目的綱領(lǐng)。 為什么要學(xué)習(xí)計算機科學(xué)?軟件工程師分為兩種:一種充分理解了計算機科學(xué),從而有能力應(yīng)對充滿挑戰(zhàn)的創(chuàng)造性工作;另一種僅僅憑著對一些高級工具的熟悉而勉強應(yīng)付。這兩種人都自稱軟件工程師,都能在職業(yè)生涯早期掙到差不多的工資。然而,隨著時間流逝,第一種工程師不斷成長,所做的事情將會越來越有意義且更為高薪,不論是有價值的商業(yè)工作、突破性的開源項目、技術(shù)上的領(lǐng)導(dǎo)力或者高質(zhì)量的個人貢獻。全球短信系統(tǒng)每日收發(fā)約 200 億條信息,而僅僅靠 57 名工程師,現(xiàn)在的 WhatsApp 每日收發(fā) 420 億條。— Benedict Evans (@BenedictEvans) 2016 年 2 月 2 日 第一種工程師總是尋求深入學(xué)習(xí)計算機科學(xué)的方法,或是通過傳統(tǒng)的方法學(xué)習(xí),或是在職業(yè)生涯中永無止息地學(xué)習(xí);第二種工程師 通常浮于表面,只學(xué)習(xí)某些特定的工具和技術(shù),而不研究其底層的基本原理,僅僅在技術(shù)潮流的風(fēng)向改變時學(xué)習(xí)新的技能。如今,涌入計算機行業(yè)的人數(shù)激增,然而計算機專業(yè)的畢業(yè)生數(shù)量基本上未曾改變。第二種工程師的供過于求正在開始減少他們的工作機會,使他們無法涉足行業(yè)內(nèi)更加有意義的工作。對你而言,不論正在努力成為第一種工程師,還是只想讓自己的職業(yè)生涯更加安全,學(xué)習(xí)計算機科學(xué)是唯一可靠的途徑。23333 然而他們... pic.twitter.com/XVNYlXAHar— Jenna Bilotta (@jenna) 2017 年 3 月 4 日 分科目指引大多數(shù)計算機專業(yè)本科教學(xué)以程序設(shè)計 “導(dǎo)論” 作為開始。這類課程的最佳版本不僅能滿足初學(xué)者的需要,還適用于那些在初學(xué)編程階段遺漏了某些有益的概念和程序設(shè)計模式的人。對于這部分內(nèi)容,我們的標(biāo)準(zhǔn)推薦是這部經(jīng)典著作:《計算機程序的構(gòu)造和解釋》。在網(wǎng)絡(luò)上,這本書既可供免費閱讀(英文版),也作為 MIT 的免費視頻課程。不過盡管這些視頻課程很不錯,我們對于視頻課程的推薦實際上是 Brian Harvey 開設(shè)的 SICP 課程(即 Berkeley 的 61A 課程)。比起 MIT 的課程,它更加完善,更適用于初學(xué)者。我們建議至少學(xué)完 SICP 的前三章,并完成配套的習(xí)題。如果需要額外的練習(xí),可以去解決一些小的程序設(shè)計問題,比如 exercism。自從 2016 年首次發(fā)布這份指南以來,最常被問到的一個問題是,我們是否推薦由 John DeNero 講授的更新的 CS 61A 課程,以及配套的書籍 《Composing Programs》,這本書 “繼承自 SICP” 但使用 Python 講解。我們認為 DeNero 的課程也很不錯,有的學(xué)生可能更喜歡,但我們還是建議把 SICP, Scheme 和 Brian Harvey 的視頻課程作為首選。為什么這么說呢?因為 SICP 是獨一無二的,它可以 —— 至少很有可能 —— 改變你對計算機和編程的基本認識。不是每個人都有這樣的體驗。有的人討厭這本書,有的人看了前幾頁就放棄了。但潛在的回報讓它值得一讀。如果你覺得 SICP 過于難,試試 《Composing Programs》。如果還是不合適,那我們推薦 《程序設(shè)計方法》(中文版,英文版) ;如果你覺得 SICP 過于簡單,那我們推薦 《Concepts, Techniques, and Models of Computer Programming》 。如果讀這些書讓你覺得沒有收獲,也行你應(yīng)該先學(xué)習(xí)其他科目,一兩年后再重新審視編程的理念。新版原文刪除了對 《Concepts, Techniques, and Models of Computer Programming》 一書的推薦,但這本書對各種編程模型有深入的見解,值得一讀。所以譯文中依然保留。 — 譯者注 最后,有一點要說明的是:本指南不適用于完全不懂編程的新手。我們假定你是一個沒有計算機專業(yè)背景的程序員,希望填補一些知識空白。事實上,我們把 “編程” 章節(jié)包括進來只是提醒你還有更多知識需要學(xué)習(xí)。對于那些從來沒有學(xué)過編程,但又想學(xué)的人來說,這份指南更合適。 計算機架構(gòu) —— 有時候又被稱為 “計算機系統(tǒng)” 或者 “計算機組成”—— 是了解軟件底層的的重要視角。根據(jù)我們的經(jīng)驗,這是自學(xué)的軟件工程師最容易忽視的領(lǐng)域。我們最喜歡的入門書是 《深入理解計算機系統(tǒng)》。典型的計算機體系結(jié)構(gòu)導(dǎo)論課程會涵蓋本書的 1 - 6 章。我們喜愛《深入理解計算機系統(tǒng)》,因為它的實用性,并且站在程序員的視角。雖然計算機體系結(jié)構(gòu)的內(nèi)容比本書所涉及的內(nèi)容多得多,但對于那些想了解計算機系統(tǒng)以求編寫更快、更高效、更可靠的軟件的人來說,這本書是很好的起點。對于那些既想了解這個主題又想兼顧硬件和軟件的知識的人來說,我們推薦 《計算機系統(tǒng)要素》,又名 “從與非門到俄羅斯方塊”(“Nand2Tetris”),這本書規(guī)模宏大,讓讀者對計算機內(nèi)的所有部分如何協(xié)同工作有完全的認識。這本書的每一章節(jié)對應(yīng)如何構(gòu)建計算機整體系統(tǒng)中的一小部分,從用 HDL(硬件描述語言)寫基本的邏輯門電路出發(fā),途經(jīng) CPU 和匯編,最終抵達諸如俄羅斯方塊這般規(guī)模的應(yīng)用程序。我們推薦把此書的前六章讀完,并完成對應(yīng)的項目練習(xí)。這么做,你將更加深入地理解,計算機架構(gòu)和運行其上的軟件之間的關(guān)系。這本書的前半部分(包括所有對應(yīng)的項目)均可從 Nand2Tetris 的網(wǎng)站上免費獲得。同時,在 Coursera 上,這是一門視頻課程。為了追求簡潔和緊湊,這本書犧牲了內(nèi)容上的深度。尤其值得注意的是,流水線和存儲層次結(jié)構(gòu)是現(xiàn)代計算機架構(gòu)中極其重要的兩個概念,然而這本書對此幾乎毫無涉及。當(dāng)你掌握了 Nand2Tetris 的內(nèi)容后,我們推薦要么回到《深入理解計算機系統(tǒng)》,或者考慮 Patterson 和 Hennessy 二人所著的 《計算機組成與設(shè)計》,一本優(yōu)秀的經(jīng)典著作。這本書中的不同章節(jié)重要程度不一,因此我們建議根據(jù) Berkeley 的 CS61C 課程 “計算機架構(gòu)中的偉大思想” 來著重閱讀一些章節(jié)。這門課的筆記和實驗在網(wǎng)絡(luò)上可以免費獲得,并且在互聯(lián)網(wǎng)檔案中有這門課程的過往資料。
— Mike Acton, Engine Director at Insomniac Games (觀看他在 CppCon 上的演說) 算法與數(shù)據(jù)結(jié)構(gòu)正如幾十年來的共識,我們認為,計算機科學(xué)教育所賦予人們的最大能量在于對常見算法和數(shù)據(jù)結(jié)構(gòu)的熟悉。此外,這也可以訓(xùn)練一個人對于各種問題的解決能力,有助于其他領(lǐng)域的學(xué)習(xí)。關(guān)于算法與數(shù)據(jù)結(jié)構(gòu),有成百上千的書可供使用,但是我們的最愛是 Steven Skiena 編寫的 《算法設(shè)計手冊》。顯而易見,他對此充滿熱愛,迫不及待地想要幫助其他人理解。在我們看來,這本書給人一種煥然一新的體驗,完全不同于那些更加經(jīng)常被推薦的書(比如 Cormen,Leiserson,Rivest 和 Stein,或者 Sedgewick 的書,后兩者充斥著過多的證明,不適合以 解決問題 為導(dǎo)向的學(xué)習(xí))。如果你更喜歡視頻課程,Skiena 慷慨地提供了他的課程。此外,Tim Roughgarden 的課程也很不錯, 在 Stanford 的 MOOC 平臺 Lagunita,或者 Coursera 上均可獲得。Skiena 和 Roughgarden 的這兩門課程沒有優(yōu)劣之分,選擇何者取決于個人品味。至于練習(xí),我們推薦學(xué)生在 Leetcode 上解決問題。Leetcode 上的問題往往有趣且?guī)в辛己玫慕夥ê陀懻?。此外,在競爭日益激烈的軟件行業(yè),這些問題可以幫助你評估自己應(yīng)對技術(shù)面試中常見問題的能力。我們建議解決大約 100 道隨機挑選的 Leetcode 問題,作為學(xué)習(xí)的一部分。最后,我們強烈推薦 《怎樣解題》。這本書極為優(yōu)秀且獨特,指導(dǎo)人們解決廣義上的問題,因而一如其適用于數(shù)學(xué),它適用于計算機科學(xué)。 從某個角度說,計算機科學(xué)是應(yīng)用數(shù)學(xué)的一個 “發(fā)育過度” 的分支。盡管許多軟件工程師試圖 —— 并且在不同程度上成功做到 —— 忽視這一點,我們鼓勵你用學(xué)習(xí)來擁抱數(shù)學(xué)。如若成功,比起那些沒有掌握數(shù)學(xué)的人,你將獲得巨大的競爭優(yōu)勢。對于計算機科學(xué),數(shù)學(xué)中最相關(guān)的領(lǐng)域是 “離散數(shù)學(xué)”,其中的 “離散” 與 “連續(xù)” 相對立,大致上指的是應(yīng)用數(shù)學(xué)中那些有趣的主題,而不是微積分之類的。由于定義比較含糊,試圖掌握離散數(shù)學(xué)的全部內(nèi)容是沒有意義的。較為現(xiàn)實的學(xué)習(xí)目標(biāo)是,了解邏輯、排列組合、概率論、集合論、圖論以及密碼學(xué)相關(guān)的一些數(shù)論知識??紤]到線性代數(shù)在計算機圖形學(xué)和機器學(xué)習(xí)中的重要性,該領(lǐng)域同樣值得學(xué)習(xí)。學(xué)習(xí)離散數(shù)學(xué),我們建議從 László Lovász 的課程筆記開始。Lovász 教授成功地讓這些內(nèi)容淺顯易懂且符合直覺,因此,比起正式的教材,這更適合初學(xué)者。對于更加高階的學(xué)習(xí),我們推薦 《計算機科學(xué)中的數(shù)學(xué)》,MIT 同名課程的課程筆記,篇幅與書籍相當(dāng)(事實上,現(xiàn)已出版)。這門課程的視頻同樣可免費獲得,是我們所推薦的學(xué)習(xí)視頻。對于線性代數(shù),我們建議從 Essence of linear algebra 系列視頻開始,然后再去學(xué)習(xí) Gilbert Strang 的《線性代數(shù)導(dǎo)論》和視頻課程。如果人們不相信數(shù)學(xué)是簡單的,那么只能是因為他們沒有意識到生活有多么復(fù)雜。 《操作系統(tǒng)概念》 (“恐龍書”)和 《現(xiàn)代操作系統(tǒng)》 是操作系統(tǒng)領(lǐng)域的經(jīng)典書籍。二者都因為寫作風(fēng)格和對學(xué)生不友好而招致了一些批評。《操作系統(tǒng)導(dǎo)論》(Operating Systems: Three Easy Pieces) 是一個不錯的替代品,并且可在網(wǎng)上免費獲得(英文版)。我們格外喜歡這本書的結(jié)構(gòu),并且認為這本書的習(xí)題很值得一做。在讀完《操作系統(tǒng)導(dǎo)論》后,我們鼓勵你探索特定操作系統(tǒng)的設(shè)計??梢越柚?“{OS name} Internals” 風(fēng)格的書籍,比如 Lion's commentary on Unix, The Design and Implementation of the FreeBSD Operating System,以及 Mac OS X Internals。對于 Linux ,我們推薦 Robert Love 的 《Linux 內(nèi)核設(shè)計與實現(xiàn)》。為了鞏固對操作系統(tǒng)的理解,閱讀小型系統(tǒng)內(nèi)核的代碼并且為其增加特性是一個很不錯的方法。比如,xv6,由 MIT 的一門課程所維護的從 Unix V6 到 ANSI C 和 x86 的移植,就是一個很棒的選擇?!恫僮飨到y(tǒng)導(dǎo)論》有一個附錄,記載了一些可能的 xv6 實驗項目,其中充滿了關(guān)于潛在項目的很棒想法。 鑒于有那么多關(guān)于網(wǎng)絡(luò)服務(wù)端和客戶端的軟件工程,計算機網(wǎng)絡(luò)是計算機科學(xué)中價值最為 “立竿見影” 的領(lǐng)域之一。我們的學(xué)生,系統(tǒng)性地學(xué)習(xí)了計算機網(wǎng)絡(luò),最終能夠理解那些曾困擾他們多年的術(shù)語、概念和協(xié)議。在這一主題上,我們最愛的書籍是 《計算機網(wǎng)絡(luò):自頂向下方法》。書中的小項目和習(xí)題相當(dāng)值得練習(xí),尤其是其中的 “Wireshark labs”(這部分在網(wǎng)上可以獲得)。如果更喜歡視頻課程,我們推薦 Stanford 的 Introduction to Computer Networking,可在他們的 MOOC 平臺 Lagunita 上免費觀看。對于計算機網(wǎng)絡(luò)的學(xué)習(xí),做項目比完成小的習(xí)題更有益。一些可能的項目有:HTTP 服務(wù)器,基于 UDP 的聊天 APP,迷你 TCP 棧,代理,負載均衡器,或者分布式哈希表。你無法盯著水晶球預(yù)見未來,未來的互聯(lián)網(wǎng)何去何從取決于社會。 比起其他主題,自學(xué)數(shù)據(jù)庫系統(tǒng)需要更多的付出。這是一個相對年輕的研究領(lǐng)域,并且出于很強的商業(yè)動機,研究者把想法藏在緊閉的門后。此外,許多原本有潛力寫出優(yōu)秀教材的作者反而選擇了加入或創(chuàng)立公司。鑒于如上情況,我們鼓勵自學(xué)者大體上拋棄教材,而是從 2015 年春季學(xué)期的 CS 186 課程(Joe Hellerstein 在 Berkeley 的數(shù)據(jù)庫課程)開始,然后前往閱讀論文。對于初學(xué)者,有一篇格外值得提及的論文:“Architecture of a Database System”。這篇論文提供了獨特的對關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)如何工作的高層次觀點,是后續(xù)學(xué)習(xí)的實用梗概。《Readings in Database Systems》,或者以數(shù)據(jù)庫 “紅書” 更為人知,是由 Peter Bailis,Joe Hellerstein 和 Michael Stonebraker 編纂的論文合集。對于那些想要在 CS 186 課程的水平更進一步的學(xué)習(xí)者,“紅書” 應(yīng)當(dāng)是下一步。如果你堅持一定要一本導(dǎo)論教材,那我們推薦 Ramakrishnan 和 Gehrke 所著的 《數(shù)據(jù)庫管理系統(tǒng):原理與設(shè)計》。如需更深一步,Jim Gray 的經(jīng)典著作 《Transaction Processing: Concepts and Techniques》 值得一讀,不過我們不建議把這本書當(dāng)作首要資源。如果沒有編寫足夠數(shù)量的代碼,很難鞏固數(shù)據(jù)庫理論。CS 186 課程的學(xué)生給 Spark 添加特性,倒是不錯的項目,不過我們僅僅建議從零實現(xiàn)一個簡單的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。自然,它將不會有太多的特性,但是即便只實現(xiàn)典型的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)每個方面最基礎(chǔ)的功能,也是相當(dāng)有啟發(fā)的。最后,數(shù)據(jù)模型往往是數(shù)據(jù)庫中一個被忽視的、教學(xué)不充分的方面。關(guān)于這個主題,我們推薦的書籍是 Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World。 多數(shù)程序員學(xué)習(xí)編程語言的知識,而多數(shù)計算機科學(xué)家學(xué)習(xí)編程語言 相關(guān) 的知識。這使得計算機科學(xué)家比起程序員擁有顯著的優(yōu)勢,即便在編程領(lǐng)域!因為他們的知識可以推而廣之:相較只學(xué)習(xí)過特定編程語言的人,他們可以更深入更快速地理解新的編程語言。我們推薦的入門書是 Bob Nystrom 所著的優(yōu)秀的 Crafting Interpreters,可在網(wǎng)上免費獲取。這本書條理清晰,富有趣味性,非常適合那些想要更好地理解語言和語言工具的人。我們建議你花時間讀完整本書,并嘗試任何一個感興趣的 “挑戰(zhàn)”。另一本更為傳統(tǒng)的推薦書籍是 《編譯原理》,通常稱為 “龍書”。不幸的是,這本書不是為自學(xué)者而設(shè)計的,而是供教師從中挑選一些主題用于 1-2 學(xué)期的教學(xué)。如果你選擇使用龍書進行自學(xué),你需要從中甄選主題,而且最好是在導(dǎo)師的幫助下。我們建議依據(jù)某個視頻課程來設(shè)定學(xué)習(xí)的結(jié)構(gòu),然后按需從龍書中獲取深入的內(nèi)容。我們推薦的在線課程是 Alex Aiken 在 MOOC 平臺 edX 所開設(shè)的。
不要做一個只寫樣板代碼的程序員。相反,給用戶和其他程序員創(chuàng)造工具。從紡織工業(yè)和鋼鐵工業(yè)中學(xué)習(xí)歷史教訓(xùn):你想制造機器和工具,還是操作這些機器? 隨著計算機在數(shù)量上的增加,計算機同樣開始 分散。盡管商業(yè)公司過去愿意購買越來越大的大型機,現(xiàn)在的典型情況是,甚至很小的應(yīng)用程序都同時在多臺機器上運行。思考這樣做的利弊權(quán)衡,即是分布式系統(tǒng)的研究所在,也是越來越重要的一項技能。我們推薦的自學(xué)參考書是 Martin Kleppmann 的 《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計》。與傳統(tǒng)的教科書相比,它是一本為實踐者設(shè)計的具有很高的可讀性的書,并且保持了深度和嚴(yán)謹性。對于那些偏愛傳統(tǒng)教材,或者希望可以從網(wǎng)上免費獲取的人,我們推薦的教材是 Maarten van Steen 和 Andrew Tanenbaum 所著的 《分布式系統(tǒng)原理與范型》(中文第二版,英文第三版)。對于喜歡視頻課程的人,MIT 的 6.824 是一門很好的在線視頻課程,由 Robert Morris 教授的研究生課程,在這里可以看到課程安排。不管選擇怎樣的教材或者其他輔助資料,學(xué)習(xí)分布式系統(tǒng)必然要求閱讀論文。這里有一個不錯的論文清單,而且我們強烈建議你出席你當(dāng)?shù)氐?Papers We Love(僅限美國)。
常見問題解答我們面向自學(xué)的軟件工程師、培訓(xùn)班學(xué)生、“早熟的” 高中生或者想要通過自學(xué)補充正式教育的大學(xué)生。關(guān)于何時開啟這段自學(xué)旅程,完全取決于個人,不過多數(shù)人在有一定的職業(yè)經(jīng)歷后深入學(xué)習(xí)計算機科學(xué)理論會獲益匪淺。比如,我們注意到,如果學(xué)生在工作中曾經(jīng)使用過數(shù)據(jù)庫,他們會 喜愛 學(xué)習(xí)數(shù)據(jù)庫系統(tǒng)課程;如果學(xué)生從事過一兩個 Web 項目,他們會 喜愛 學(xué)習(xí)計算機網(wǎng)絡(luò)。人工智能 / 計算機圖形學(xué) / XX 主題怎么樣?我們試圖把計算機科學(xué)主題清單限制到那些我們認為 每一個軟件工程師 都應(yīng)該了解的內(nèi)容,不限于專業(yè)或行業(yè)。擁有了這些基礎(chǔ),你將能更加輕松地挑選教材或論文,然而無需指引地學(xué)習(xí)核心概念。在這里,我們給出一些其他常見主題的自學(xué)起點:人工智能:通過觀看視頻并完成 Pacman 項目來學(xué)習(xí) Berkeley 的 AI 課程。至于教材,使用 Russell 和 Norvig 編寫的 《人工智能:一種現(xiàn)代方法》。 機器學(xué)習(xí):學(xué)習(xí)吳恩達在 Coursera 上的課程。耐心學(xué)習(xí),先確保理解了基礎(chǔ)概念再奔向類如深度學(xué)習(xí)的誘人新主題。 計算機圖形學(xué):學(xué)習(xí) Berkeley CS 184 課程的材料,使用《計算機圖形學(xué):原理及實踐》作為教材。 一定要嚴(yán)格遵守推薦的學(xué)習(xí)次序嗎?事實上,所有主題之間都有一定程度的重疊,彼此循環(huán)引用。以離散數(shù)學(xué)和算法的關(guān)系為例:先學(xué)習(xí)數(shù)學(xué)可以幫助你更深入地分析和理解算法,然而先學(xué)習(xí)算法可以為學(xué)習(xí)離散數(shù)學(xué)提供更大的動力和應(yīng)用背景。理想情況下,你將在你的職業(yè)生涯多次重溫二者。因此,我們所推薦的次序主要是為了幫助你 起步…… 如果你出于某種強烈的原因而傾向以不同的順序?qū)W習(xí),那也沒有關(guān)系,勇敢開始吧!不過在我們看來,最重要的 “先決條件” 是:先學(xué)計算機架構(gòu)再學(xué)操作系統(tǒng)或數(shù)據(jù)庫,先學(xué)計算機網(wǎng)絡(luò)和操作系統(tǒng)再學(xué)分布式系統(tǒng)。和 Open Source Society、freeCodeCamp curricula 等比起來,這份指引?OSS 指引涵蓋太多主題,在許多主題中推薦劣質(zhì)資源,沒有就特定課程哪些方面有價值提供原因或指引。我們努力對這份指引中的課程加以限制,僅僅包括那些你作為軟件工程師 確實需要了解的,不論你的專業(yè)方向,并且對每門課程為何必要做出了解釋以幫助你理解。FreeCodeCamp 主要關(guān)注編程,而不是計算機科學(xué)。至于你為什么要學(xué)習(xí)計算機科學(xué),參見上文。如果你是個新手,我們建議先學(xué) freeCodeCamp 的課程,一兩年后再回歸本指南。學(xué)習(xí)一門特定的編程語言和學(xué)習(xí)計算機科學(xué)的一個領(lǐng)域完全不在一個維度 —— 相比之下,學(xué)習(xí)語言 容易 且 缺乏價值。如果你已經(jīng)了解了一些語言,我們強烈建議遵照我們的指引,然后在學(xué)習(xí)的空當(dāng)中習(xí)得語言,或者暫且不管以后再說。如果你已經(jīng)把編程學(xué)得不錯了(比如學(xué)完了 《計算機程序的構(gòu)造和解釋》),尤其是如果你學(xué)習(xí)過編譯器,那么面對一門新的語言,你只需要花一個周末稍多的時間即可基本掌握,之后你可以在工作中學(xué)習(xí)相關(guān)的類庫 / 工具 / 生態(tài)。沒有任何一種技術(shù)的重要程度可以達到學(xué)習(xí)其使用足以成為計算機科學(xué)教學(xué)的核心部分。不過,你對學(xué)習(xí)那門技術(shù)充滿熱情,這很不錯。訣竅是先從特定的技術(shù)回退到基本的領(lǐng)域或概念,判斷這門流行技術(shù)在技術(shù)的宏觀大局中位于何處,然后才深入學(xué)習(xí)這門技術(shù)。先嘗試讀一下,有些人覺得 SICP 讓人神魂顛倒,這在其他書很少見。如果你不喜歡,你可以嘗試其他的東西,也許以后再回到 SICP。龍書依舊是內(nèi)容最為完整的編譯器單本書籍。由于過分強調(diào)一些如今不夠時新的主題的細節(jié),比如解析,這本書招致了惡評。然而事實上,這本書從未打算供人一頁一頁的學(xué)習(xí),而僅僅是為了給教師準(zhǔn)備一門課程提供足夠的材料。類似地,自學(xué)者可以從書中量身按需挑選主題,或者最好依照公開課授課教師在課程大綱中的建議。我們所建議的許多教材在網(wǎng)上都可以免費獲得,這多虧了作者們的慷慨。對于那些不免費的書籍,我們建議購買舊版本的二手書籍。廣而言之,如果一本教材有多個版本,舊版本大概率是完全足夠使用的。即便新版本的價格是舊版本的 10 倍,新版本也絕不可能比舊版本好 10 倍!這份指引由 Bradfield School of Computer Science(舊金山)的兩位教員:Ozan Onay 和 Myles Byrne 編寫,并由 Oz 于 2020 年更新。這份指引基于對數(shù)千名自學(xué)成才的工程師和培訓(xùn)班學(xué)生教授計算機科學(xué)基礎(chǔ)的經(jīng)驗。這份指引的中文翻譯是社區(qū)共同貢獻的成果,歡迎任何反饋和改進!https://github.com/keithnull/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN.md
|