W.Richard Stevens 先生所著之書比較適合有經驗的人進一步深入學習

W.Richard Stevens 先生所著的UNIX 環境高級編程、UNIX網絡編程、TCP/IP詳解是難得的入門好書,但這裏的入門指得是研究生級別的入門。Stevens 先生所著之書多半是爲了給研究生上課時用做教材,因此 Stevens 先生假設閱讀這些書的人至少已經接受過了系統的計算機技術本科教育,已經擁有了比較系統的計算機相關基礎理論知識。在書中 Stevens 先生假設讀者擁有了最基礎的操作系統理論,網絡技術理論,以及UNIX理論和實踐經驗,並擁有數種業界常用的UNIX系統作爲學習環境(在國外的大學裏很容易獲得),這樣才能體會書中所述的細節。因此這些書剛接觸時看似通俗易懂,但在閱讀細節上卻對讀者要求甚高,如果沒有足夠的專業理論和系統實踐是很難真正讀進去的。

所以,對於沒有接受過系統的計算機專業教育的愛好者,或者主要以 linux 系統維護,或以linux 桌面應用爲主的普通用戶,Stevens 先生的書並不是很合適的閱讀對象。

因此,就我個人的看法,掌握任何一種知識都是需要投入的。我們需要花費金錢去得知識來源(花錢買書,花錢上網,花錢培訓),需要花費寶貴的時間去閱讀(人生匆匆幾十年,沒多少時間可以給我們去浪費),需要花費精力去理解書中的內容(基礎知識越紮實,理解所學內容越快,但累積基礎同樣需要大量時間和精力),需要找到合適的環境(光看不實踐心裏是不會有底的)去驗證自己掌握的東西。因此,如果在決定投入之前,先要摸清楚自己到底想要達到什麼樣的目標,這個目標是否切合自己的實際(相信一個在流水線上辛苦勞作的普通工人,即使學會了計算機編程也是沒有用武之地的,除非他有機會離開流水線)。自己是否有足夠的資源承載自己的理想(如對於溫飽問題尚未解決之人,要他花上千上萬的錢去學MBA顯然是不現實的)。

同時,任何一本書都會對讀者提出一個基本的知識架構和程度上的要求,比方說即使是文學博士,讓他去讀高能物理學方面的書也會要他的命的。因此在選擇所讀之書前,先要對自己的實際能力做一次詳細的評估,看自己目前到了哪種階段,是否有能力去掌握自己想要掌握的東西。千萬不要因爲好高騖遠而勉力爲之。選擇適合自己當前水平的書去閱讀並理解,遠好過拿着大師所著的神作乾瞪眼。

如果LZ確實象帖中所描述的,主要希望掌握UNIX下的編程技術,尤其是網絡編程技術的話。那以我本人的經驗,可以有兩條路走:

1、以實際需要完善知識架構:爲自己做一個項目,比方說自己寫個簡單的 Web 服務器,因爲現在 Web 應用非常豐富,既有成熟的客戶端如瀏覽器可以配合,又有足夠全的文檔如 RFC文檔可供參考,再加上最基本的 socket 編程經驗,就可以開始做自己的 Web 服務器。一步一步的爲 Web 服務器添加流行的功能,如支持後臺 FastCGI 接口,支持 WebDAV,支持流媒體等。在這個過程中不斷地學習和掌握相關的理論知識,有時在發覺設計上的不足時甚至需要推翻全盤重新架構。當最終一個完全符合自己心意且足夠實用的 Web 服務器做成時,就擁有了可以由自己支配和修改的服務器,同時也掌握了相關的專業理論。這種方式比較適合有一定專業基礎的人使用。優點是直觀,方向明確所以學習效率高。缺點是需求驅動,形成知識架構不容易完整。

2、系統掌握計算機專業理論:最好的書就是大學裏的理論教科書,這些書不會去講解過於具體的計算機應用,而是從概念開始講起,力圖使學習者獲得一個完整的知識體系。只要以後碰到的工作和這個知識體系相關,自然就能很快學會。這種方式比較適合沒有基礎,或者希望深入學習的人使用,優點是知識架構會逐漸趨於完整,理論功底紮實,後勁足。缺點是花費時間長,方向不明確所以學習效率低,初期會因缺少實踐而進展緩慢。

因爲不很清楚LZ目前的計算機專業技術水平到了哪種程度,也不清楚LZ最終希望自己達到什麼樣的目標,所以也很難爲LZ提供什麼有價值的經驗。如果LZ能詳細描述一下自己目前的實際水平,以及希望達到什麼樣的目標,我也許可以爲LZ提供一些建議。


我的基本情況是這樣的,本科大三,通信專業,課堂裏面學過的課程有C,C++,數據結構,微機原理,通信網絡基礎,計算機網絡,交換技術。一年半linux使用經驗,會shell編程,看過操作系統的書,現在正在看算法方面的書。大四打算找工作,希望從事linux開發方向的工作。
我覺得我書看了一些,但是沒有編程經驗基本沒有。

根據你對所學課程的描述來看,你的專業屬於計算機通信專業,是多年前通過市場前景預測而設置的新興專業,主要是培養既懂計算機又懂通信的人才。

但恕我直言,計算機通信專業既不是以信號傳輸爲核心的電信專業,也不是以設計開發爲核心的計算機硬件或軟件設計專業。它在根本上其實是計算機高級應用專業,務實一點講就是培養的是高級計算機用戶。這個專業學成後既不可能從事專業程度很高的電信行業,也很難從事專業的硬件設計和軟件開發。它更適合從事網絡的現場安裝調試,網站系統維護,或者也包括部分的網頁製作等工作。

計算機軟件專業和計算機應用專業的雖然都是計算機專業,但核心內容完全不同。

計算機軟件專業的主要專業基礎課程包括:計算機程序設計原理,計算機原理,計算機組成原理,計算機彙編指令系統,數據庫原理,計算機網絡原理,算法和數據結構,編譯原理,操作系統原理,C語言程序設計,以及其它專業課程。

計算機應用專業的主要專業基礎課程包括:計算機程序設計與實踐,計算機原理,計算機網絡通信基礎,通信基礎,數據結構,數據庫應用,分組交換技術,C語言程序設計,互聯網原理與電子商務理論,linux 操作系統應用與實踐,Javascript 程序設計,以及其它專業課程等。

從以上課程設置可以看出,計算機軟件專業注重專業理論基礎的培養,力圖讓學生掌握完備的計算機基礎理論。而計算機應用專業則設置了更多的專業課程,力圖提高學生的計算機實際應用能力。這種區別是和兩者的培養目的相關的,概括地說,計算機軟件專業負責製造用戶需要的工具,計算機應用專業負責爲用戶部署和維護這些工具。

而 Stevens 先生所著之書主要是供計算機軟件專業所用的教科書,它並不完全適合只具備計算機應用背景的人閱讀。LZ你之所以覺得閱讀困難,很大程度上是因爲你所學的專業過於注重應用而在計算機專業基礎理論上相對欠缺造成的。

根據你的描述,你的專業甚至連操作系統原理、算法和數據結構都不是主要課程,即使你學過一些C和C++,以及unix shell 編程,但如果不能很好地掌握支持編程的環境(操作系統),沒有系統學過根據目標組織程序的方法(算法),僅僅靠計算機工具的應用知識,想熟練掌握 linux 編程自然就成了緣木求魚了。

因此,如果你確實希望以後從事 linux 軟件開發工作,那我認爲你現在需要做的不是馬上去啃 Stevens 先生的專業著作或者其它適合深造用的著作,那是以後的事。而是趁現在還在求學階段這個有利條件,再多選修或自修一些計算機軟件專業的專業基礎課,至少計算機程序設計原理、計算機組成原理、算法和數據結構、操作系統原理是必修的。有了這些專業基礎理論,要想看懂 Stevens 先生的書並不困難。對以後離開大學後的通過自學自我提高也是好處頗多的。

現在你已到大三,對於應用專業而言幾乎算是最後一年了,到了大四就要爲以後的工作而奔忙了,希望你能抓緊這不到半年的時間,把該學的基礎課趕緊學好。

————————————————————————————————————————————————————————————————
______________________________________________________________________________________________________________

首先你需要自學完計算機組成原理,這門課描述了完整的計算機系統是怎樣組織起來的。學完這門課後,你就對計算機各組成部分的原理有了概念上的理解。這裏需要注意的是,嵌入式應用最複雜的部分是IO控制部分,這部分需要根據實際的 ARM 模塊及模塊的應用方式去熟悉,而且還需要一些電子技術方面的專業課來支撐,所以先不要去接觸。但大部分嵌入式應用所控制的對象比較簡單,因此你可以先跳過算法和數據結構這門課,直接去熟悉工作在其上的 linux 操作系統。這裏的熟悉指的是去熟悉 linux 提供的命令行工具,以及掌握內核系統調用及庫函數爲主,用不着去學習服務器配置,桌面應用,甚至包括數據庫應用等內容,也不要馬上去學習 linux 內核源碼本身。你只需要能用命令行熟練操作即可。至於系統調用和庫函數則需要通過編寫C語言代碼來完成,在這裏你不需要編寫複雜的應用,主要需要掌握每個系統調用的特點及使用場合,比方就 fork 來說,你不能直接簡單地用 fork 派生出一個進程就完事。你需要通過編程瞭解 fork 調用後,進程如何處理信號,進程如何處理管道,進程和子進程之間如何相互聯繫,如何避免殭屍進程,新進程如何進行內存管理,更深一步還包括 fork 調用後,如果保證進程中的線程正常工作。這些東西都是你需要通過編寫代碼去熟悉的。用這種學習方法摸索完所有的系統調用和庫函數需要1-2年的時間,正好可以趕上之後學校裏學習專業基礎課的節奏。到那時通過對計算機組成原理及操作系統應用的紮實理解,專業基礎課學到一點就可以用上一點,會比一般的學習方法快許多。至於之後的內容如 ARM 應用模塊的設計,SoA 如何裁剪之類的內容只有等你把專業技術課學完了再繼續學了。

不過這裏還是要再次提醒一下:計算機軟件技術從本質上講是應用數學的具體應用,因此基礎課尤其是數學是最重要的,如果可以的話儘量不要荒廢,而且最好還要多選修幾門數學方面的課程,磨刀不誤砍材功,等到因爲基礎紮實而在以後的學習過程中一日千里,讓周圍的同學們怎麼也追趕不上時,我想你會理解我現在說的這一大段話的。

再次希望你三思,不要錯過打好基礎的機會,專業應用課程雖然學起來豐富刺激,但卻萬變不離其宗,是脫離不了基礎課程的支持。因此忽視基礎理論的培養,只注重掌握專業知識的話,就象各門各派的劍法,縱然一時看起來百花齊放氣象萬千,但終不免敗於基礎理論完整的獨孤九劍之下。

希望以上的建議對你有用。
————————————————————————————————————————————————————————————————
______________________________________________________________________________________________________________

叫我大神可不敢當
根據你的描述,你現在上到大一,大一主要是學習基礎課如數學分析,線性代數,概率論,物理學,通常在大一下半學期也會開始學一些對應專業的入門教程,如你所說的C語言程序設計之類的課程。
通常選擇計算機專業的人士都有着極其旺盛的精力和好奇心(基於功利目的的除外),這種狀態有好處也有壞處。好處是樂於吸收新知識,壞處則是容易陷於浮躁。
就我個人的看法,大一是非常關鍵的一年,對於工科類專業,公共基礎課基本上會在大一到大二上半學期完成。由於基礎課,尤其是數學課是計算機專業的基礎,而且限於時間關係,通常都得不到充足的時間深化學習。因此在這個階段,我認爲不宜學習過多的專業類課程。因爲針對不同基礎的人,即使學習完全相同的專業內容,其領會的深度也是不同的。
簡單地舉例:甲只掌握以常量爲研究對象的初等數學,乙掌握了以對變量的數學分析爲基礎的高等數學。丙掌握了以ji合爲研究對象的抽象代數。假設他們一同學習C語言程序設計這門課程。
因爲甲掌握的初等數學是以常量爲研究對象的,因此對甲來說,C語言的內容就是幾十個關鍵字加幾百個庫函數,以及順序、迭代、選擇這三種基本流程,這樣甲可以很快學完C語言課程,同時也能舉一反三地學會其它類似的計算機語言來完成軟件的開發工作。
乙掌握的高等數學是以變量爲研究對象的,因此對乙來說,C語言的內容就不光是關鍵字加庫函數,而是由關鍵字構造出來的數組,矢量,矩陣,函數組成。這樣乙可以直接將面對的問題解析成這些抽象的數據結構,並以合適的數據結構和函數加以構造出來,完成軟件的開發工作。
丙掌握的抽象代數是以ji合爲研究對象的,因此對丙來說,他首先會根據最終需要解決的問題用抽象代數來構造適合用來思考問題解決方案的代數體系。將目標域轉換成高度抽象的ji合類型,如格、羣、環、域、場等,再根據數學中關於這些ji合類型的定理來規約它們之間的關係,經過這樣的規約後,應用領域上的問題將完全轉換爲數學上的問題,這樣再用C語言將規約後的單元逐個描述出來,完成軟件的開發工作。
從以上的例子可以看出,對於甲來說,他只能完成相對簡單的開發工作,當問題複雜度大到一定程度時,他將無法對問題進行簡化,最終導致開發進行不下去。所以甲只適合成爲從事編碼工作的編碼工人。
對乙來說,他擁有一定的分析能力,可以將應用領域的問題進行一定程度的抽象,從而降低問題的複雜度,使寫出的代碼更精練,重用率更高,這樣引入的錯誤自然也更少,也更容易完成工作。但乙不具備將抽象出來的對象用嚴格的數學工具進行檢驗和規約的能力,因此乙無法保證自己的寫的代碼在數學上是否具有完備性,所以乙經常會面臨因爲設計上考慮不周重構代碼的麻煩。所以乙擁有一定的分析設計能力,適合成爲高級程序員。
對丙來說,他完全是依靠數學領域中前人總結出來的數學規則來解決問題,這些規則都經過了純粹數學家們的嚴格證明,因此只要乙對應用領域中的問題在理解上沒有偏差,他就可以用數學工具來保證自己的設計在架構上不會有邏輯上的問題。所以丙擁有嚴謹的分析能力,適合成爲系統分析員。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章