1. 程式人生 > >深入理解計算機系統(序章)------談程序員為什麽要懂底層計算機結構

深入理解計算機系統(序章)------談程序員為什麽要懂底層計算機結構

人類 是你 驅動 計算機世界 執行過程 鍵盤 二進制 java虛擬機 調優

  萬丈高樓平地起,計算機系統就像程序員金字塔的地基。理解了計算機系統的構造原理,在寫程序的道路上才能越走越遠。道理LZ很早就懂了,可是一直沒下定決心好好鉆研,或許是覺得日常工作中根本用不到這些,又或許是每次拿起書看到那些復雜的底層架構,看到存儲器,寄存器,CPU,總線等等這些概念就頭大。總之,由於各種各樣的原因,對這塊的知識一直沒有認真花時間去鉆研。那麽你可能會問,那你寫這篇博客的題目不就是準備學習這方面的知識嗎?是的,LZ 準備下定決心鉆研了,至於原因如下:

  ①、經常用一些不知其所以然的技術,會感到不安

    大家可以看看LZ前面寫的博客,很多都是對框架的用法進行總結,至於為什麽這個框架要這麽實現等等而涉及的很少。原因很簡單,LZ 研究框架的源碼很吃力。因為源碼的實現往往涉及到多方面的的知識,比如設計模式,比如JDK的一些高級特性等等。LZ 是想做一個有夢想的鹹魚,但是每次看到很多不懂的東西,就深深的體會到現實與理想落差的痛苦,所以LZ下定決心要改變這種無力感。

  ②、在這個數據爆炸的年代,很多系統對於項目性能的優化有很高的要求。那麽如何調優成為了程序員不可避免的問題,我們知道 Java 是運行在 JVM 上的,程序的調優那就需要對 JVM 有一定的了解。LZ 本來想直接研究 JVM 的,書都找好了------《深入理解Java虛擬機:JVM高級特性與最佳實踐》。但是 LZ 發現很難消化,理解起來特別困難,於是間接的將 LZ 推上了研究計算機系統的道路。

  ③、再就是如果你對計算機系統的構造不太了解,可能你平時寫的程序都是錯誤的。

    比如我們一直以為兩個正數的和或者積一定為正,但是用二進制補碼表示的正數和或者積卻不一定;程序員和編譯器不能用(x-y<0)來代替(x<y),因為前者會產生溢出。甚至也不能用表達式(-y<-x)來代替,因為在二進制補碼表示中負數和正數的範圍是不一致的。算術溢出是造成程序錯誤和安全漏洞的一個常見根源。

  ④、第四個原因,這個也是最直接的原因。不知道大家是否了解大的互聯網公司面試,比如阿裏巴巴,騰訊這樣的公司。他們面試對於基礎的東西要求的很嚴格,你對這些東西的了解程度將直接決定你的面試成敗。

    比如:講一下JVM的結構,TCP/IP的三次握手、四次揮手,淘寶用戶的數據怎麽滿足高並發?等等。像這些問題,如果我們不懂計算機底層知識肯定是不能過關的。

  ⑤、樹立正確的計算機世界觀

    培養一種心態,即計算機的一切是可以理解的,沒有超出人類的智慧。即使有些問題你現階段沒有明白,但這些問題都是可以理解的,只是你時間不夠,所以先放一下,等有時間再學習它們。這種心態可以防止你滑入無助的陷阱。 有時候你的潛意識會愚弄你,把很難做成的事情當成無法做成的事情。就像《肖申克的救贖》中表現的那樣,一把很小的錘子也是可以砸開監獄的墻壁逃出來的。而Red第一次看到那個錘子時,他就認定了Andy肯定逃不出來了。而實際上Andy卻用19年的時間確實把墻給鑿開了,雖然其間各種艱辛,但是結局卻很美好。

    計算機科學與其他學科相比,好的地方在於,它是人創造的,它的原理沒有超出我們人類的大腦的理解範圍,它為什麽這樣設計,每一個做法都是有理由的。而那些發明它的人,有許多現在還活著,比如晶體管的發明者,硬盤的發明者,顯示器、鼠標、鍵盤等的發明者,有些發明者雖然已經過世,但是有豐富詳盡的記錄,他不是一門有可能超出人類理解範圍的科學,所以我們不要擔心不能理解它。

    其次 我們是程序員,不是造計算機的,我們也不需要對計算機的每一個部件都了解,我們只需要了解我們所寫的程序在系統中的執行過程,以及計算機系統的構造對我們的程序代碼有什麽限制,有什麽影響即可。

  好了,說了這麽多,其實是想告訴大家,做一只鹹魚很簡單。但是LZ是想做一只有夢想的鹹魚。如果和LZ有同樣想法的人,又一直下不定決心去學習的人,我們可以一起,互相監督,互相學習交流。

《深入理解計算機系統》

  如題,LZ 學習是以《深入理解計算機系統》這本書為基礎,我們還是要尊重作者,先來介紹一下作者:Randal E.Bryant:1981年在麻省理工學院獲計算機科學博士學位,現任美國卡內基·梅隆大學計算機學院院長,是ACM和IEEE的雙會士。

  那麽為什麽要選擇這本書呢?LZ也在網上找了很多這方面的教材,但是都不是太滿意,不過當LZ看到這本書的時候卻眼前一亮,這本書是從程序員視角全面剖析的實現細節,使讀者深刻理解程序的行為,將所有計算機系統的相關知識融會貫通。註意是以程序員的角度來分析的,那麽作為一個程序員,相對於市面上關於計算機系統的書,這個理解起來應該不會很困難。

  其次這本書是以案例驅動為講解順序的。第一章就給我們詳細的講解了學習程序的萬能入門級程序“Hello World” 在計算機是如何運行的。說實話,LZ 接觸了 C 語言,C#,Java,PHP等,也都寫過每種語言的 “Hello World”,但是到底在計算機中是怎麽運行的,LZ 是完全不了解的。

  LZ 後面打算根據自己的學習進度不定時更新《深入理解計算機系統》學習心得。

  軟件開發產業正在發生變化,它將不再需要更多的程序員,它需要的是高級匠師,這句話與大家共勉。

  

深入理解計算機系統(序章)------談程序員為什麽要懂底層計算機結構