簡單的畫了一個圖,如果有不對的地方歡迎指出。

要了解底層,可分為三個大的方向學習

  • 應用程序
  • 操作系統
  • 計算機體系結構

當然這是三個大的方向,這三個大方向下包羅萬象,下面會對這三個大方向進行詳細解釋。

個人覺得按照這個圖,自頂向下學習,學完之後有一種一覽眾山小的感覺。

當然也可以自底向上學習。實際上自頂向下與自頂向上也是計算機中兩種不同的思想,至於哪種方法好,各有優缺點吧。

1.程序

程序 = 數據結構 + 演算法

不管是寫機器學習的程序還是前端程序,實際上數據結構和演算法都是程序員的基本功。兩者相輔相成,緊密結合在一起。

當然在學習數據結構和演算法之前要學習一門語言,個人推薦C++

1.1 數據結構

上圖中的基本數據結構都需要掌握,知道什麼場景需要使用什麼數據結構。

數據結構的話我當初用的是這本教材:

數據結構(C語言版)清華大學計算機系列教材¥ 24.50起2

1.2 演算法

學習演算法可以看演算法導論這本書,可以先看演算法的實現,等各種演算法熟悉了再去看裡面的證明。

演算法導論 原書第3版京東¥ 77.00去購買?

當然光看書可能有一些枯燥,推薦學習數據結構和演算法的時候可以多刷一下leetCode,至少刷100道,根據上圖中數據結構的類型分類刷,這樣數據結構、演算法、程序語言都會有很大的進步。

2.操作系統

2.1 編譯器

前端的話可以看書籍龍書,實際上龍書是一本非常全面的編譯器書籍。

正版 編譯原理 龍書原書第2版¥ 70.10起2

前端的內容包括:

  • 詞法分析
  • 語法分析
  • 語義分析

後端的話可以看鯨書,非常經典,這本書是我的編譯器入門書籍,有不明白的地方可以一起討論呀。

高級編譯器設計與實現 鯨書 中文版京東¥ 75.00去購買?

主要包括的演算法有:

  • 數據流分析
  • 控制流分析
  • 指令調度
  • 寄存器分配

僅列舉了非常重要的部分,當然裡面還有很多重要的演算法。

2.2 鏈接器、載入器

這方面的推薦一部書,講的很詳細了。 可以了解ELF與PE格式以及程序的載入、鏈接的過程等。

程序員的自我修養 鏈接、裝載與庫京東¥ 32.50去購買?

2.3 linux應用編程

推薦APUE,我當初學的時候第三版還沒出,後來第三版出了又買了一本。

UNIX環境高級編程 第3版京東¥ 84.50去購買?

這本書詳細介紹了 文件IO,可以理解一切linux中一切設備皆文件,無論是讀寫文件還是設備,都會創建一個文件描述符。 進程相關的知識,例如父進程和子進程,程序總調用一次fork函數會返回兩次,分別在父進程返回一次和子進程返回一次。

還有信號機制,可以了解為啥我們按下ctrl+C進程會終止,按下ctrl+z進程會暫停。

進程間通信,包括消息隊列、信號量、共享存儲等。 套接字。這本只是簡單介紹,UNP介紹的更詳細。

UNP就是這本,看卷1就可以了。

UNIX網路編程 卷一1套接字聯網API 第3版 網路編程與開京東¥ 137.30去購買?

通過UNP可以了解迭代伺服器、並發伺服器等,TCP/IP編程等,這本書裡面的TCP/IP編程不想其它高級語言例如java把網路連接都封裝好了,這本裡面使用的系統介面,可以更加了解網路編程。

另外想學習計算機網路的話可以看TCP/IP詳解卷1,很薄的一部書,講的非常好,靜下心來看的話會非常有收穫。

TCP/IP詳解 卷1 協議¥ 55.30起2

可以搞清楚五層結構模型,以及面試中常考的TCP的三次握手四次揮手、TCP擁塞控制、TCP使用滑動窗口進行流量控制等。

2.3 linux內核

學完了linux應用編程就對linux有了一定的了解了,這個時候可以看LKD,是一本比較薄的linux內核書籍,看完可以對linux內核有一個宏觀上的了解。

Linux內核設計與實現(第3版)京東¥ 34.50去購買?

然後可以看一下ULK,這本書講的很詳細,可以選擇自己感興趣的子模塊看。

深入理解LINUX內核 第三版¥ 56.90起2

看完了這個之後,可以自己嘗試在2.6的內核版本上實現一個實時調度演算法,因為實時調度演算法相對簡單一些。可以參考linux中的FIFO演算法了,這個最簡單。我當初是做了一個EDF的demo。

2.4 linux驅動

驅動在linux內核中是以模塊的形式載入的,非常方便。linux驅動主要分為這幾塊:

  • 字元設備驅動
  • 塊設備驅動
  • 網路設備驅動

推薦書籍:ldd3

LINUX設備驅動程序 第3版京東¥ 42.70去購買?

學完這些,如果還想加深一下對linux的了解,可以做一下交叉編譯,將linux系統移植到一塊arm板子上,再嘗試寫一個驅動,然後寫一個應用程序去調用這個驅動。然後就是寫一個loader,如uboot。

3.計算機體系結構

推薦看這本書,作者是2017年體系結構方面的圖靈獎得主。

計算機體系結構:量化研究方法(原書第6版) 圖靈獎京東¥ 193.70去購買?

通過這本書可以學到CPU、GPU中提高性能的一些方法:

  • 指令級並行
  • 數據級並行
  • 線程級並行

另外還有:

  • 倉儲式計算機
  • 領域特定架構

再往下可以學一下數電:

  • 組合電路
  • 時序邏輯電路

然後學一下Verilog HDL 語言,設計一下電路。設計一個CPU啥的。

當初學的是這本教材

數字電路與系統¥ 37.70起2

模電的話當初就學過一本教材,敢覺太難了,自己學的不好,歡迎懂的人補充。

4.總綱

推薦這本CSAPP,這本書裡面會涉及到上面的很多內容,感覺這本書認真學完,計算機本科基本不用上了。。。

深入理解計算機系統京東¥ 69.50去購買?

另外附一張這些書的照片,證明我都讀過,嘻嘻。

另外歡迎大家補充一下沒有涉及到的地方,或則一些好書推薦。

沒想道答案火了,為了方便大家,我把上面的資源收集了一下。歡迎關注我的個人公眾號程序芯世界,後台回復csapp即可獲取上面的資源。這個公眾號也是分享一些計算機基礎知識,不跟熱點,做知識沉澱,佛系更新...


從應用程序到操作系統

從操作系統到編譯原理

從編譯原理到體系結構

從體系結構到指令集架構

從指令集架構到集成電路

從集成電路到晶體管

從晶體管到半導體工藝

從半導體工藝到半導體物理

從發起請求到TCP/IP協議棧

從協議棧到通信編碼

從通信編碼到波形傳輸

從半導體物理與波形傳輸到物理

從物理到數學

從數學到放棄

~~「手動狗頭」


各位大佬說的都很好,尤其是 @CompilerCoder 寫的非常全面,涵蓋了多個層次,提供了很好的一個RoadMap,這裡我試著補充一些內容。

首先,既然題主問怎樣才算懂計算機底層,那麼首先我們就要給「底層」下一個定義。一般來說,越是貼近硬體層的技術,就是越底層的技術。但是計算機涵蓋的東西太多太廣了,涉及到的東西也非常之多,由於精力所限,一個人窮其一生都無法窮盡這些知識,因此答主認為,比較明智的做法就是從自己所從事的領域出發,給「底層」做一個定義,然後根據這些定義,給自己定一些目標,等達到了再重新給「底層」做新的定義,再指定新的目標。如果沒有根據自己所在的領域,劃定一個標準,那麼結論就是,不論你怎麼學,都無法真正搞懂計算機「底層」。

為什麼要從自己的領域出發,對「底層」做一個定義呢?因為計算機的領域太廣了,設計晶元的人所認為的「底層」,和一個在應用層做APP的人所認為的「底層」是不一樣的。對於做應用的工程師而言,只要理解cpu在邏輯上是按順序一個一個地執行指令,每個cpu都有自己的指令集(主流的類別有CISC如x86架構、RISC如ARM架構),每種指令集都有自己的編碼方式,指令等,知道cpu有alu、寄存器等,知道一些基本的運作就足夠了。而一個晶元設計師,還要懂怎麼設計晶元的pipeline,怎麼設計stage才能提高指令的吞吐量,還能保證不出錯等等。這些內容也只是我從CSAPP里了解到的冰山一角,實際上這兩種工程師沒有貴賤之分,但是所從事的工作有著天壤之別。計算機的科學家們,早就為我們分好了層,早就為不同層的工作抽象好了銜接的介面,就好像應用程序員只需要知道,我們編譯成機器指令的程序,會在cpu里按順序執行就可以了。更多的時候我們只需要把它當做一個黑盒。

我們的本科教育,是將學生當做通才來培養的,教的是一些基礎,因為多數人上到大學並沒有找到自己以後的職業方向,因此什麼都教你,什麼都讓你學,讓你了解一些基礎,等你自己對某個方向有興趣了,再深入該領域,進行深究(大學教育並不是要我們把所有的課程都學到精通的程度)。這樣高校才能培養出計算機各個領域所需要的人才,這也許就是大學教育的本質所在。

如果你是一名做應用開發的工程師(遊戲、web等),那麼你說需要掌握的「底層」知識有哪些呢?可能有人會說,你需要掌握:計算機網路、操作系統、編譯原理、資料庫技術等等。單就從這幾個領域來說,每個領域都包含非常龐大的知識體系,每年都會有大量的paper湧現,不斷出現新的問題需要專業人士去解決,我們窮極一生也無法掌握所有的這些東西,甚至是大部分都做不到。實際上,很多知識,對我們所工作的內容,並沒有太多太直接的幫助,我們只需要抓住關鍵,研究那些對我們所從事的領域有直接或間接幫助的「底層」技術,才能做到有的放矢。答主認為,不妨我們按照如下的方式來做:

  • 如果你是一名應用開發的程序員,如果你熟悉了業務框架,知道怎麼寫邏輯,能夠勝任自己當前的工作,那麼你在這個階段的「底層」知識,就是去熟悉,理解項目所使用的基礎架構,比如服務端的基礎層框架(網路庫、消息調度機制、定時器實現、RPC機制等),客戶端以遊戲為例,你可以去研究遊戲引擎、渲染管線等,你可以先通過閱讀網上能夠找到的文獻,去它的架構和基礎流程,最後可以通過閱讀源碼的方式去深入研究,再然後,你甚至可以自己造輪子的方式,去作進一步的研究。答主就做過遊戲服務端基礎架構(skynet)的深入研究,並寫過一個在項目里使用的服務端框架:

圖解skynet?

www.zhihu.com圖標https://github.com/Manistein/SparkServer?

github.com

  • 如果你做到了上一步,又對網路感興趣,或者你所從事的行業,學習網路對你有很大的幫助,那麼,接下來可以研究一下網路相關的知識,入門可以從閱讀《Computer Networking A Top-Down Approach》開始,熟悉各層協議的運作方式,再作梳理總結。做到之後,如果你是應用層的開發人員,那麼將精力集中在應用層和運輸層的協議,性價比會更高,比如,你可以深入研究http協議,研究https協議(對比一下http和https的區別,為什麼要用https,什麼是對稱加密、什麼是非對稱加密,他們分別解決什麼問題),深入研究一下TCP協議,你甚至可以動手實現以下他們的機制,比如你在應用層,通過UDP協議實現一個TCP-like協議,這樣過後,這些協議將對你沒有任何秘密。再進一步,你甚至可以在應用層實現一個,能夠既能保證數據包按序交付,又能夠比TCP更低延時的網路協議,用來滿足那些對延時容忍度比較低的項目,實際上已經有大佬做了這方面的工作了,比如 @韋易笑 大佬的KCP

https://github.com/skywind3000/kcp?

github.com

研究這些,很可能直接提升我們的產品質量,都是非常有意義的「底層」技術。網路技術也要有 選擇地學,如果你是互聯網應用的開發人員,那麼深入研究路由表生成協議,(如BGP、OSPF、RIP等),那麼性價比就會低很多了,也許我們通過書籍,了解它的基本運作就足夠了。

  • 關於編譯原理方面的東西,涉及的內容也太多,太廣了,關鍵還是看我們的目標是什麼,從事什麼行業。編譯器分為前端、優化器和後端,如果要從事編譯器相關的工作的話,那麼整套流程都要去研究,而且也有大佬說過,編譯器後端的工作主要是在優化技術上,對於編譯器研發方向的人來說,編譯器後端技術,優化技術就是他們必須要掌握的「底層」技術。像我這種在應用層做開發的渣渣,我更感興趣的是,一門語言的源代碼,如果通過編譯技術,編譯成另一種形式。我只希望通過學習編譯原理,了解語言編譯的過程,讓我以後學其他語言能夠更快一些,遇到項目中的一些疑難問題能夠找到合適的解決方案,而我們的開發主要使用腳本語言。因此對於我來說,掌握編譯器技術中的前端就足夠了。編譯器前端又分為詞法分析器、語法分析器、中間碼生成器等,語法分析器實現的演算法又分為自頂向下(遞歸下降、LL(1)、LL(n)等)和自底向上(SLR、CLR、LALR等),那麼對於我們來說,從自頂向下的遞歸下降演算法開始研究最好,很多手寫的編譯器都用這種方式,因為它更契合EBNF文法,更符合我們的直覺,更好寫,作為入門足夠了,等自己能手擼一個遞歸下降的Parser再去研究其他演算法也不遲。在這個階段,除了閱讀一些編譯原理的書籍(比如《Compiler Construction Principles And Practice》,龍書太抽象,鄙人不才,看了開頭一部分,因為無法參悟其精要棄坑了,笑~),還可以直接去閱讀一門工業級的腳本語言,比如lua,這些,其實就是我所認為的「底層」技術。鄙人最近就在手擼lua解釋器:

構建Lua解釋器?

www.zhihu.com圖標https://github.com/Manistein/dummylua-tutorial?

github.com

  • 操作系統方面,閱讀《現代操作系統》、CSAPP這樣的書籍,有助於我們理解操作系統的知識,這個領域,答主還沒有深入研究,也的確是能夠被掌握,且非常有價值的「底層」知識,做軟體開發的各個行業,相信都有幫助。能夠手擼一個簡單的os內核就最好不過了。
  • 資料庫方面,我也沒有非常深入地研究,有人建議,嘗試閱讀redis的代碼,並且手擼一個mini-redis會很有幫助。

答主根據自己的情況,指定了一些「底層」的標準,並且也在努力掌握這些技能的路上。計算機領域太廣太深,我們只能挑選其中一部分對我們工作領域有幫助的部分,這樣才能打出最高性價比。總之一個原則吧,圍繞自己的領域,挑選效益比最高的「底層」技術,能學多少學多少,能學多深學多深。從整體來看,私以為,不論我們怎麼學,都不能真正搞懂計算機的「底層」,但是針對自己的行業、職業,可以挑選一些實用的技術,有直接或者非常好的間接幫助的「底層」技術,在不同的時期去學習它們,掌握他們,運用他們,這樣做才是有意義的。

以上。


要了解底層,可分為七個大的方向學習:

  • C語言
  • 演算法
  • 數據結構
  • 操作系統
  • 資料庫
  • 計算機網路
  • 計算機體系結構

當然這是七個大的方向,這七個大方向下包羅萬象,下面會對這七個大方向進行詳細解釋:

另外,程序員要想進大廠先從刷演算法做起是個好方法,演算法厲害的人進大廠非常容易,這裡送一本阿里P8撰寫的演算法刷題筆記,身邊不少朋友通過它加入大廠:

Github 瘋傳!史上最強悍!阿里大佬「LeetCode刷題手冊」開放下載了!?

mp.weixin.qq.com圖標

1.C語言

雖然你只有很小概率在工作之後用到它,但它依然無比重要。

C語言最難懂的是指針,希望你在這個暑假徹底征服它。書上說它是個變數地址,那麼問題來了,什麼是地址?一不小心,指針就讓程序Crash了。

其實C語言入門教程非常多,各種各樣的都有,還是那句老話,新手入門學習,系統性學習最為重要,因此總結網路上的一些免費的、系統的、我認為比較好的C語言入門課程,希望對於新手入門有所幫助。

  • 實驗樓——C語言入門教程

教程+在線開發環境的方式,教程文檔詳細的講解C語言基礎知識,在線開發環境和本地一樣,可以隨時動手跟著教程操作,動手學習的方式非常適合入門初學者。

  • gitbook——笨方法學C

內容較完整豐富,相當於一本書籍了,適合新手入門學習。

  • 菜鳥教程——C 語言教程

純在線文字教程,講解的不是那麼詳細,不過簡單易懂,適合入門初學者學習,看完後可對C語言有個大概的認知。

  • 慕課網——C語言入門

教程+"環境",講解的比較細緻,也很簡單易懂,跟著教程可傻瓜式操作學習,適合入門新手。

再說說這個「環境」和實驗樓環境的區別吧:這個「環境」和實驗樓的環境還真不一樣,實驗樓是一個操作系統,而這個是一個在線的編輯器,差別的話自己去看吧,只說一點:實驗樓可乾的事情,慕課網的「環境」不一定可以。

2、演算法

演算法挺難,但無論是學習計算機專業還是未來找工作,它都無比重要。

推薦一本高中生都能看懂的演算法書:《我的第一本演算法書》

這本書還配有APP,方便初學者快速入門!

入門後,可以嘗試看《演算法導論》,最好反覆翻看,反覆實踐:

曾經的演算法小抄筆記:

另外,程序員要想進大廠先從刷演算法做起是個好方法,演算法厲害的人進大廠非常容易,這裡送一本阿里P8撰寫的演算法刷題筆記,身邊不少朋友通過它加入大廠:

Github 瘋傳!史上最強悍!阿里大佬「LeetCode刷題手冊」開放下載了!?

mp.weixin.qq.com圖標

看看這本書的目錄和排版!相當經典!

3、數據結構

數據結構的重要性相信不需要強調了,不僅是工作後必備的技能,如果未來要參加研究生考試也是必考科目和拉分項。

入門的話推薦《大話數據結構》。

這本書最大的特點是,它把理論講得很有趣,不枯燥。而且每個數據結構和演算法,作者都結合生活中的例子進行了講解, 能讓你有非常直觀的感受。雖然這本書有400多頁,但是花兩天時間讀完,應該是沒問題的。如果你之前完全不懂數據結構和演算法,可以先從這本書看起。

再推薦一本稍稍難一點的《數據結構和演算法分析》。

這本書非常系統、全面、嚴謹,而且又不是特別難,適合對數據結構和演算法有些了解,並且掌握了至少一門編程語言的同學。而且,這個作者也很用心。

他用了三種語言,寫了三個版本,分別是:《數據結構與演算法分析 :C 語言描述》《數據結構與演算法分析:C++ 描述》《數據結構與演算法分析:Java 語言描述》。

4、操作系統

操作系統是計算機的基礎,複雜的計算機操作因為它而變得簡單。作為計算機專業的學生,不深入了解它怎麼行呢?

美國有很多優秀的操作系統公開課,比如mit6.828、哈弗OS/161。這類課程都會給你提供一個mini os殼程序,相當於一個核心組件,剩下的你可以自由發揮。比如你可以設計線程管理、文件系統等等。

相比只是看操作系統的書籍,這種學習方法的效率簡直高100倍!

下面是課程官網:https://pdos.csail.mit.edu/6.828/2018/schedule.html?

pdos.csail.mit.edu

國內也有一些頂尖高校也是採取類似的方式,比如清華ucore基於 Linux 0.11魔改版本https://github.com/hoverwinter/HIT-OSLab?

github.com

5、計算機網路

作者:GitHubPorn

來源:知乎原文鏈接:https://www.zhihu.com/question/421913237/answer/1560169057

如果你要入門 HTTP,首先最好書籍就是《圖解 HTTP》了,作者真的做到完完全全的「圖解」,書籍不厚,相信優秀的你,幾天就可以看完了。

如果要入門 TCP/IP 網路模型,強烈推薦的是《圖解 TCP/IP》,這本書也是以大量的圖文來介紹了 TCP/IP 網路模式的每一層,但是這個書籍的順序不是從「應用層 —&> 物理層」,而是從「物理層 -&> 應用層」順序開始講的,這一點我覺得不太好,這樣一上來就把最枯燥的部分講了,很容易就被勸退了,所以我建議先跳過前面幾個章節,先看網路層和傳輸層的章節,然後再回頭看前面的這幾個章節。

另外,你想了解網路是怎麼傳輸,那我推薦《網路是怎樣連接的》,這本書相對比較全面的把訪問一個網頁的發生的過程講解了一遍,其中關於電信等運營商是怎麼傳輸的,這部分你可以跳過,當然你感興趣也可以看,只是我覺得沒必要看。

如果你覺得書籍過於枯燥,你可以結合 B 站《計算機網路微課堂》視頻一起學習,這個視頻是湖南科技大學老師製作的,PPT 的動圖是我見過做的最用心的了,一看就懂的佳作。

6、資料庫

國內說資料庫就是mysql,這點要相信我!

首先概覽下mysql的知識體系:

基礎:
  • sql語句
  • 表結構設計

調優:

  • 索引、慢查詢優化
  • 配置參數調優

核心原理:

  • InnoDb存儲引擎 (包括隔離級別、事務、鎖、緩存池、回滾日誌等等)
  • Mysqld (包括連接管理、進程管理、查詢緩存、查詢優化、日誌等等)

架構與運維:

  • 用戶與許可權、安全
  • 備份與恢復
  • 日誌
  • 分散式與高可用

對於零基礎的童鞋:

首先,學習基本的SQL語法。完成這個後,你就可以編寫SQL語句了。

這一步推薦:W3Schools的 SQL 教程。

其次,學習資料庫的主要功能和使用方法,比如用戶相關或者許可權相關等等。

推薦兩本書:1.《MySQL必知必會》 這本書講的非常全,從基本概念,到查詢到插入新建表,用戶的管理,都有具體的例子,非常適合沒有任何基礎的同學來學習Mysql,總之這本書學習的方法就是:1、十分鐘了解下資料庫的基本概念 2、找到練手的資料庫 3、對照著上面的內容去敲。本書里也有大量的內容是講sql的,可以結合w3c的sql教程一起,有取捨地看。

2.《資料庫系統概念》這本書是dba必看的。

看完這些並且實踐+思考之後,可以算入門了。

接下來對於希望深入學習的童鞋:

我推薦幾本書(很多大神都這麼推薦),《高性能MySQL(第3版)》、 《MySQL技術內幕(第4版)》,《MySQL技術內幕 InnoDB存儲引擎》,《深入理解MySQL》還有Mysql的官網。讀完這些東西,再加些豐富的經驗,理論上來講就具備DBA的水平了。

十分推薦閱讀Planet MySQL上匯總的博客,特別是Perconas MySQL InnoDB performance and scalability blog.

以上六個部分,深入學習之後,相信對計算機底層會有一定程度的理解。

這本BAT大佬的演算法筆記,是一位阿里技術專家刷leetcode整理出來的,再次推薦:

Github 瘋傳!史上最強悍!阿里大佬「LeetCode刷題手冊」開放下載了!?

mp.weixin.qq.com圖標

祝大家前程似錦,在計算機行業一馬平川。要是覺得不錯的話,那就幫我

@findyi

點個贊哈,碼字不易,硬核碼字更難!


看了幾個高贊回答感覺都是在推銷啊。可以參考某個大佬的一個標準:以最簡單的控制台輸出一個hello,world為例子,如果你能清楚的知道整個過程都發生了什麼基本就夠了。


推薦閱讀:
相关文章