程序員如何深入學習計算機工作的原理 (而不是忙於解決問題)?

09年大學畢業前開始自學計算機,先從前端的HTML、CSS入手後來接觸了javaScript,並負責過一陣子前端開發的工作。現在工作範圍擴大到後台的系統服務架設,數據維護等方面。

兩年的工作讓我意識到程序員的工作是解決實際的問題 - 例如如何完成某項功能,如何配置某項服務。 在完成這些工作時,往往有很多地方可以找到參考或者前人的流程 (例如http://stackoverflow.com)

但在完成這些流程的同時,並不意味著明白背後工作的原理。例如學會配置Nginx提供http服務,不一定明白nginx為什麼比apache處理並發更高效,也不一定明白如何進行下一步的scale up。

為了解決當下的問題,去找到的書,大部分是不涉及這部分原理性的知識的。一部分如handbook,cookbook之類是提供直接的解決方法,二部分如language book是教會如何使用一種語言去完成相應的操作,另外還有介紹工具的使用的(web framework, SA services etc.)

但我總覺得這部分的只是是關於如何做,而不是關於為什麼需要這麼做。如果不明白後者,前者只是重複的工作罷了。

所以想問問各位如何深入的學習計算機原理?例如該看哪些書?該如何看這些書? 如何和實際工作結合。


看懂這本書,computer system --a programmer"s perspective, CMU的教程,涵蓋計算機多個方面,屬於原理性的著作. 在有相當實踐經驗後回歸這本書還是有意思的


"計算機工作的原理"這個範圍實在是有點大了吧。工作上肯定一般都只會涉及自己相關的範圍。

我個人對這個範圍的認識是這樣的: 數字邏輯-&>硬體(MCU, BUS, cache, MMU還有外圍的 RAM, GPU, 網卡, 音效卡...)-&>編譯器-&>操作系統-&>驅動程序-&>應用程序。(這個層級只是個大概啦) 我想很少有人能夠把這條路走一遍吧。 舉個例子 Linus Torvalds 還想學FPGA呢(對九個超級程序員的採訪)。不過這個例子似乎有點久遠了。

個人覺得操作系統是一個分界線(因為操作系統的本職就是把硬體抽象出來)。如果只是做上層的工作,將操作系統作為切入點算是比較好的。至於你想從哪個方向走就完全看個人興趣了。不學操作系統,其它的學了終究還是會覺得"不夠底層"。可以說學操作系統就是打地基,學其它的都是學如何在地基上建房子。

學操作系統的過程中應該會涉及許多演算法,數據結構,協議方面的東西。我是覺得這部分就按需要學吧。單獨去學對以「理解計算機工作原理」為目的的學習來說獲得與付出比不是太高。

或者說計算機是個什麼東西?片面點講,就是在一堆硬體上呈現出最終用戶想看到的東西。其中的過程實在太複雜,必須要切分開,而一個很重要的切分點就是操作系統(好吧,其實很多是沒有操作系統的)。操作系統將硬體抽像出來,供應用程序使用。對操作系統越明白,對計算機工作原理應該就越清楚了。不過有許多硬體上的東西操作系統也是感知不到的,而有些硬體上的東西是要搞清楚才能弄懂操作系統的。但是無論怎麼講,學習操作系統是達到「理解計算機工作原理」這一目的最好的切入點,至於終點嘛,我想沒有終點。

當然學習操作系統需要的基礎知識得先另行準備。主要差不多有:C語言,操作系統所運行的CPU對應的簡單彙編語言,相應CPU的大致架構(timer, interrupt, cache, MMU什麼的)。其中第一項是必須的,後兩項先了解下,用到的時候再細看即可。

如何學操作系統呢,這方面的資料網上一搜一大把,不過適合你的估計得多找找了。

答完了猛然發現,提問的人似乎只想了解"網路相關應用程序的工作原理"而不是"計算機的工作原理"Orz....

不過其實我也是小白,算是我自己對"計算機工作原理"的一點總結吧......


要搞明白為什麼nginx能高效的處理並發,你需要學習下面的基本知識:

1.TCP/IP協議的工作原理

2.SOCKET編程,非同步I/O的API

沒看過Nginx的源碼,不知道直接閱讀的難度有多大。根據你描述的經歷,如果不懂C/C++,看起來比較困難。

想要看書的話,《TCP/IP 協議詳解 卷一》http://product.china-pub.com/35 和《Unix環境高級編程》http://product.china-pub.com/30181 這兩本書必看。


我學習中不是看書,我看書容易分神,所以我是一邊看書,一邊把書裡面的內容打到電腦上面,這樣我映像很深刻。

書籍的話就推薦外國書籍了,如果會英語最好買英文版,中國的翻譯不敢恭維。


操作系統原理,編譯原理,計算機網路,先看這三本吧


推薦本書吧。《深入理解計算機系統》我正在看的,就是講一些計算機底層的東西,比如內存管理,文件系統,網路,編譯,彙編等


想了解計算機原理,精通一門計算機語言(C/C++)是有很大益處的。


你如果想系統的學習計算機科學,包括原理和技術。

大概有以下幾個方面:

programming language (C 比較基礎,對後面的內容大部分情況下也是必須的)

algorithm (演算法和數據結構)

第一部分和第二部分會了 就跟你現在的情況差不多

architecture

operating system

data management system

networking

第三部分到第七部分學通了,基本上你可以算做是 計算機科學領域的人

還有其他的比如 compiler 並行 高性能計算 分散式計算 這些基本都可以用前面的東西來應付

這些知識不是割裂開的,演算法絕對是基礎中的基礎 後面的幾大方面可以參照 網路課程學習

itunes store裡面的itunes U有MIT berkeley 和 stanford很多視頻課程,是很好的自學材料

能堅持學下去,必定能成為這個專業的人才


軟體是跑在硬體上的。沒硬體基礎,你總會有不夠深入的感覺。


這就是演算法和軟體應用的區別了


買套幾十本的計算機全書,看了


我覺得題主去學學 C 語言和 UNIX 編程就會解決眼前的問題了。HTML 和配置這些事情的確離計算機「底層」太遠,所以用 C 和 UNIX API 去寫點東西是最快的途徑。


看Nginx源代碼吧,大概也就10萬行。


推薦閱讀:

Microsoft Word 排版書籍哪本好些?
作為一個壓線的進入重點學校感到自卑怎麼辦?
請教一下學習製作編譯器後端的方法?
一到冬天手腳冰涼,如何改善體質?
學習電路出了邱關源的書還有那些好書值得推薦?

TAG:學習 | 程序員 | Linux | 計算機 | 計算機技術 | 計算機科學 | 計算機專業學習方式 |