計算機科學自學指南


  作為自學計算轉行或者從培訓班出來直接工作的程序員,都存在計算機科學知識不足的問題,甚至連科班出身的人畢業后因為長時間工作而忽略了基礎知識溫習,也存在同樣的問題。我們作為一名軟件方面的工程師,不應只滿足於高級語言、框架或工具的使用,這些都只能帶來短期的效益而終究會變得無用,因此每個軟件工程師都應該制定一份長期的自學計划,系統的學習計算機科學領域真正精華核心的部分,不僅是一遍,而且需要空閑時反復研究反復思考形成良性循環,一定會不斷產生新的認識,因為越是基礎的知識越具有通用性和可遷移性,而且幾乎不會過時,學習基礎會讓我們看到計算機領域的前輩們是如何思考問題的,在這個巨人的肩膀之上再學習其他任何上層的東西都將會以底層的視角來看待,而且會變得非常容易,所以計算機科學的基礎是工程師的內功,也是區分工程師是否優秀的根本,我們有了良好的基礎知識掌握后,無論開發底層系統還是上層應用,都可以做到心中有底,每一步都是踏實的,才可以長期對自己從事的領域保持熱情和信心,才更可能設計出更優秀的系統,因此每個工程師花時間學習計算機科學基礎知識,就像一次長期價值投資,這種投入一定是值得的,並且在未來也一定會帶來比自己預期還要高的收益!而這一切的山重水復、柳暗花明都需要自己經歷過,知行合一才能真正的體會,是再多的語言也無法概括的。正所謂紙上得來終覺淺,絕知此事要躬行。那么,就讓我們跟隨先賢的腳步,讓自己變得更智慧吧~
  因為對於有一定經驗的工程師來說,編程語言和工具使用本身已經沒什么問題,至少c語言要會,而且應該都對計算機運行的原理有一定的了解,比如cpu、內存、網絡等,但是每一項細節都比較模糊,因此大致的學習順序是按照自底向上的順序來學習的,大致來說是:計算機硬件---計算機架構和組成原理---操作系統---應用系統(數據庫或網絡等)---分布式系統,對於每一個層面上的學習順序按照個人習慣即可,不影響總體的順序,另外數據結構和算法、數學在整個學習中都會有貫穿,因此也應該盡早的有所了解。

1.計算機組成

  《深入理解計算機系統》,大名鼎鼎的CSAPP,學完之后一定會對計算機實現架構有很深的理解,但是這個難度也非常大,但是是所有計算機工程應用的基礎,豆瓣鏈接:https://book.douban.com/subject/26912767/,B站有配套的視頻:https://www.bilibili.com/video/BV1iW411d7hd
  如果感覺難度比較大,可以先從簡單的學起,比如極客時間上面的《深入淺出計算機組成原理》鏈接:https://time.geekbang.org/column/intro/100026001,這個是付費的課程,也不算太貴值得一看,並且課程中不僅以簡單易懂的方式講解組成原理的知識,而且也會推薦其他比較好的學習資料和路線,同時還推薦一本書《計算機系統要素》,豆瓣:https://book.douban.com/subject/1998341/,這本書會給你講清楚計算機是怎么一步一步構建出來的,能讓你一覽整個計算機的全貌,將整個運行的流程打通,看完之后一定會有全新的俯視感的認識,內容不深但是面足夠,這本書和另外一本《編碼:隱匿在計算機軟硬件背后的語言》鏈接:https://book.douban.com/subject/4822685/很相似,只不過編碼這本書算是科普書,各種概念解釋上都淺一些,而計算機系統要素這本書更深一些,算是專業領域的入門書。
  經過上面兩門課程窺探計算機組成體系的原貌之后,可以進一步深入,可以閱讀《計算機組成與設計:硬件/軟件接口》,這本書可以作為計算機組成與設計的教科書了,非常經典,或者再回頭去學《深入理解計算機系統》也是可以的,學習的同時可以配合北京大學Coursera Computer Organization這門課程一塊學習,這門課在Coursera上也是免費的:https://www.coursera.org/learn/jisuanji-zucheng,B站也有相同的課程,鏈接:https://www.bilibili.com/video/BV1Xx411Q7Nz

2.數據結構與算法

  數據結構與算法不僅可以提升我們程序設計的能力,還可以培養我們解決各個領域問題的通用能力,換句話說,數據結構和算法會讓我們知道如何思考並解決問題。
  推薦書籍方面《算法導論》就暫時跳過吧,因為實在太專業了,相對來說更推薦《算法設計手冊》https://book.douban.com/subject/4048566/,這本書對讀者比較友好,講解很透徹,比較推薦先看這個,除了這個之外還有常見的《算法》第4版,《數據結構與算法分析》這個分為C語言描述、Java語言描述的不同版本,這兩本也都很不錯。另外仍然推薦極客時間上的課程《數據結構與算法之美》https://time.geekbang.org/column/intro/100017301,作者是之前Google的工程師王爭,之所以推薦這個是因為作者抓住數據結構與算法的重點來講解,核心的內容講的很透徹,而不是上來就講實現,所以這門課還是可以作為輔助學習的。
  學數據結構與算法的過程也是提高編程能力最有效的過程,建議在學習過程中,使用自己擅長的編程語言將常用的數據結構、算法都實現並封裝一遍,可以感受到在這個過程中編程能力的飛速提高,建議使用C語言來實現,因為C語言更貼近於底層,用C語言來練習可以提高自己對於C的內存管理、指針、數據底層的存儲、程序設計范式等各個方面的認識,從此之后就再也不會懼怕C語言了,你一定會對代碼和數據理解更深,感覺這些東西原來這么簡單,所以學習數據結構與算法一定多思考,寫代碼。
  借着編程能力不斷提高這個機會,如果有時間也可以繼續學習《計算機程序的構造和解釋》https://book.douban.com/subject/1148282/,這本書會讓你對程序抽象設計本身有更深的認識,對代碼表示的思想認知會有很大的提高,從而不會再迷失在代碼中了。
  最后,如果覺得上面都太容易,那就去看《算法導論》吧

3.操作系統

  操作系統這方面經典的書籍比較多,這里主要推薦《操作系統導論》https://book.douban.com/subject/33463930/,這本“導論”要比樓上的“導論”更適合入門哈哈,可以作為麻省理工MIT 6.828操作系統課程的參考書,這里推薦兩個課程,分別是MIT 6.828 https://www.bilibili.com/video/BV1px411E7ST以及HMC CS 134 https://www.bilibili.com/video/av47977122,遺憾的是這兩門課程都是英文字幕,所以英文不好的難度有點大,不過看《操作系統導論》也是極好的。
  其次就是推薦《操作系統:精髓與設計原理》https://book.douban.com/subject/5064311/,這本書寫的也很不錯,比如清華大學操作系統的課程就是按照這個書的內容講的,B站鏈接:https://www.bilibili.com/video/BV1uW411f72n,這個課程講解比較通俗,涉及細節不是太多,相對於上面的國外課程簡單很多,可以作為入門學習,同時以《操作系統:精髓與設計原理》作為教材,然后就是推薦哈工大李治軍老師的操作系統課https://www.bilibili.com/video/BV1d4411v7u7,這個內容就深入很多,可以作為進階,啃完之后操作系統的基礎肯定是沒問題的。
  另外還有本《現代操作系統》https://book.douban.com/subject/27096665/,這本書由於風格問題爭議比較大,說好的不好的都有,如果有時間也可以看一下,看看自己是什么體會。
  上面主要是通用的操作系統原理性的學習,基礎掌握之后我們可以主動探索某一個具體的操作系統設計,對於工程師來說當然就是Linux了!推薦《Linux內核設計與實現》https://book.douban.com/subject/6097773/,短短300頁將內核將的比較清楚,讀者會有整體的感覺,即使是書中基於過時已久的Linux 2.6內核也絕不失指導意義,對Linux內核有一定了解認識之后,你應該就自然會知道自己想學習的方向以及主動尋找適合自己的資料。

4.計算機網絡

  計算機網絡部分最適合學習的書籍當然是《計算機網絡:自頂向下的方法》https://book.douban.com/subject/30280001/,這本書有自己獨有的特色來講解整個計算機網絡的演化,讀起來體驗也非常流暢,同時推薦B站的計算機網絡微課堂,作為輔助學習https://www.bilibili.com/video/BV1c4411d7jb
  另外如果有時間還可以看一下日系圖解系列的書,比如《圖解HTTP》和《圖解TCP/IP》、還有偏向科普的《網絡是怎樣連接的》,還有韓系的《TCP/IP網絡編程》,這幾本書讀起來都是非常輕松有趣的,有時間讀一下一定會有新的靈感、
  最后如果還想更上一層樓,就可以看重磅書籍《TCP/IP詳解》,這一系列一共分為3卷,分別是:協議、實現和TCP事務協議、HTTP、NNTP和UNIX域協議,其中每卷都是非常厚,不適合入門學習,所以最推薦的仍然是上面的《計算機網絡:自頂向下的方法》,如果有精力再來了解詳解也是可以的。

5.數據庫系統

  數據庫是和工程師日常最貼近的軟件系統了,可以說大部分時間我們都是在和數據庫打交道,因此學習數據庫系統技術可以非常明顯的提升自己的能力,無論是軟件研發、性能調優、故障排查都有層次性的提高,因此學習數據庫之后,就不再是簡單地CRUD,而是深知這背后的邏輯,寫出更穩定可靠的程序,這里推薦書籍《數據庫系統概念》第6版鏈接:https://book.douban.com/subject/10548379/,內容非常詳盡,可以掌握扎實的數據庫基礎,然后再學習各類開源的數據庫系統就非常簡單了

6.分布式系統

  分布式對於從事大數據或者架構工作的工程師來說是必不可少的,當前所有的主流存儲、計算框架都是基於分布式系統的基礎構建起來的,和數據庫一樣,掌握分布式系統的關鍵技術也可以快速提高開發以及架構設計的能力,分布式技術學習推薦《數據密集型應用系統設計》https://book.douban.com/subject/30329536/,這本書強烈堅持看完並吸收,知識面非常廣,學習之后會對系統有更深的認識,然后再來閱讀具體框架的英文文檔,這樣會發現很多基礎都是相通的,所以這本書學習的意義甚至超過操作系統。

7.編譯原理

  之所以把編譯原理放到最后是因為這門課的難度非常大,不如前面有趣,看起來好像和我們做軟件開發沒有什么關系,但是我們卻每天都會用到,只是編譯器幫我們做了太多的東西,如果能真正理解編譯器是如何工作的,那么不僅會幫助我們寫出更優的代碼,而且有可能為其他人創造更多工具,另外意義上來說,這就是使用者和創造者的差距,即使我們不去開發改變世界的工具或者系統,但是我們也一定對程序設計本身有質的改變,這樣在面對大型復雜的系統時,我們一定會比普通工程師具有更明顯的優勢,是非常有可能創造性解決問題的,對於編譯原理的學習,當然推薦《編譯原理》這本“龍書”,https://book.douban.com/subject/3296317/,當然如果更追求趣味性可以閱讀國外的Crafting Interpreters網站,首頁為https://craftinginterpreters.com/,具體內容頁面:https://craftinginterpreters.com/contents.html,當然這個網站上寫的條理非常清晰,隨時可以在線閱讀,看完之后你可能會發現編譯原理也是非常有趣的。
  同時可以結合B站的斯坦福編譯原理 CS 143來輔助學習,鏈接有好幾個,可以選擇學習:

8.數學(可選)

 雖然作為軟件工程師可以不用太多的數學知識,但是毫無疑問,數學學習好的人學習計算機科學一定是更有優勢,並且所有優秀的計算機科學家都是數學家,其實計算機科學本身就是數學的一個分支,只是在計算機工程方面,表面上看數學弱化了,其實每一個領域都具有大量的數學,所以學好數學不僅有助於學習計算機方面的技術,更重要的是我們掌握了可以遷移到任何領域的基本能力,這樣我們在面對任何問題時都會系統性思考,更有邏輯的解決,同時也會更有信心,數學和上面的數據結構和算法一樣,都是工程師的內功心法,具體的數學知識在機器學習部分已經介紹過一部分了,其實高中和大學課程我們掌握的差不多就基本上夠用了,唯一缺少的方面其實就是離散數學了,所以這里推薦一本《離散數學及其應用》第5版鏈接:https://book.douban.com/subject/2130743/,這本書功力非常深厚,目前已經出版到第8版了,看完離散數學后,你可能會真正發現計算機中所有的問題、算法思路、軟件底層的實現原理在這里面基本上都能找到答案,同時推薦中國大學MOOC上的離散數學課程來學習https://www.icourse163.org/course/UESTC-1002268006,這個課程質量還是比較好的,最后還是萬能的B站https://www.bilibili.com/video/BV1cs411H7sz,這個是電子科技大學的離散數學課程,也非常優秀,其實對於工程師來說數學需要經常復習,保持這種思維或者思考方式來解決問題就可以了。
  上面的可以看做比較嚴謹的專業數學課程,也可以看一些比較輕松的,比如:《計算機科學中的數學》、《程序員的數學》、《數學之美》這些,雖然不能系統完整的學習數學,也可以學到很多有趣的知識,如果感興趣每個點都可以深入,這些書可以作為科普閑暇時間閱讀還是不錯的。
 
 目前對於計算機科學系列的自學計划大致就是上面這些內容,每一門課程不僅有深度而且涵蓋面也比較廣,整個體系還是非常豐富的,另外對於學習我們一定要學習精華的東西,甚至寧缺毋濫,學習真正有用的知識,而不是為網上各類資源所束縛,什么都想學上一下,什么都想看一眼,那得多累呀~,要學習先要懂得舍棄,無需太多准備,只要路徑大致正確,其他的學起來就可以了,一定不要忽視長期堅持的價值!那么對於工作和學習該如何協調呢?我的看法是要並行,工作一定要做好,同時遇到問題去實際解決並及時整理總結,提高自己的工程能力,屬於零散的積累,然后業余時間要長期堅持系統性的學習,一定會不斷發現原來工作中的困惑都變得很透徹了,自己理論的提升也會促使工作更加出色,總結來說工作的根源在於理論的認知,而理論的充實可以讓自己工作的更優秀,如此形成良性循環,自己的知識體系會不斷補充完善,而這絕不是短期的速成,一定是背后長期堅持不懈的學習提升,以及日拱一卒的累積!另外上面這些所有的課程如果有能力,盡量看英文原版的,學起來會更透徹,像我這種英文渣渣只能看翻譯的了。
  這個課程體系也是參考網上比較火的TeachYourselfCS以及其他大佬的推薦,加上自己學習的思考整理出來的,不一定適合每個人,但相對於大學的課程,肯定還是及格的哈哈,如果有任何問題,歡迎指出來,感謝!
 
reference:
Teach Yourself Computer Science:https://teachyourselfcs.com/
TeachYourselfCS中文翻譯:https://github.com/keithnull/TeachYourselfCS-CN
硬核計算機科學自學計划:https://github.com/spring2go/cs_study_plan


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM