工程師在實際中遇到的很多困惑都是因為基礎知識和底層知識的薄弱。而這些內容往往沒有系統的教學資料,只能靠工程師在實際中摸索得到的一些感性的、模糊的認識。系統性的課程應當通過單獨設置的環節來講授這些知識,并且通過其它環節的配合來實踐這些知識。
這個系列的課程應當在基礎程序設計訓練課程之后展開。這個環節仍以C語言為主要的編程語言,但是所講授的知識卻應超越具體的編程語言。首先通過這個環節繼續鞏固學生在前一階段學到的C語言和腳本語言。如果學員在前階段的精力主要放在C基礎上,那么他在這一階段也可以通過一些具體腳本的運用獲得腳本編程的初步能力。
這個階段的每個主題對于程序員來說都是很重要的,但課程意圖不應當局限于此。通過系列主題在學員的腦海中打造出優秀程序員的思維方式才是終目的。這個環節在C基礎階段之后,后續課程展開之前,占據一段集中的課時。在后續課程展開之后,這三大主題仍然會貫穿課程始終。以下簡單介紹了這個環節所涵蓋的主題:
底層機制視圖
這個環節講授程序運行的底層機制。學習底層機制的好處就在于不再需要去“記住”,事情變得“本該如此”。也只有在理解底層機制之后,學生才能夠深入地分析程序的性能,調試程序的錯誤甚至去突破語法規則的限制。
匯編模型:在這個環節學生會學到簡單的匯編語言。這是承上啟下的課程,既是C語言基礎(前一階段)的提高,又是體系結構(后一階段)的鋪墊。把復雜的課程環節在其它課程環節中做出鋪墊,我們憑借這種方式解決了許多教學上的難題。我們努力地用各個環節的課程去輔助原本艱難的教學環節。這種方式成功地讓幾乎全部的學員敢于閱讀匯編語言代碼,半數的學員能夠積極地運用匯編語言去分析和處理程序設計中的一些關鍵環節。
棧幀模型:多線程調度和中斷處理這些高級的程序模型都需要建立在對棧的深入理解上。程序員希望回溯動態綁定的函數調用時,就更需要使用對運行時棧的hacking技巧。這個環節的課程能夠在學員頭腦里初步建立起\虛擬的計算機",從而帶給他想象程序執行過程的能力。
鏈接原理:理解鏈接的過程,才能夠從更深層次理解軟件的構建過程。Linux內核模塊如何加載,共享庫如何構建,不同語言的程序是如何互相調用的。這個環節將討論這些關鍵性的問題。課程還將展示在不同的體系結構上的鏈接過程的差異,以及這些差異背后隱藏的體系結構設計思想。
設計模型
模型能夠讓程序員從更高的層次去分析問題,從而解決更大規模的問題。我們在課程的各個環節都重視對于關鍵模型的提煉(尤其是那些帶有廣泛適用性的模型)。在這個階段的課程,我們將通過一些具體的模型初步建立學員的這種思維方式。
有限狀態機模型:有限狀態機是大多數主流編程語言的根本模型。你將在本階段學到使用這種模型解決事件驅動問題的一般手段。我們還會講授將具體問題轉化為已有的抽象模型以及把這種抽象模型轉化為代碼的設計流程。
面向對象方法(C風格):面向對象方法是構建復雜軟件體系的根本,即便是C語言也是如此。在后面你會學到面向對象語言,以及完整的面向對象思想。在中間層階段你會運用面向對象手段解決問題,在內核中你會用面向對象思想去分析問題。這個環節是貫穿課程始終的面向對象思想的起始點。
函數指針和多態:這個環節是前述面向對象(C風格)階段的自然延續。本環節主要集中在函數指針的講解上。C程序員可以通過這種技巧降低模塊間的耦合度,從而構建大規模程序。這個階段的環節將初步探討軟件設計中的多態模型的應用價值以及實現機制。而這恰恰是軟件技術發展要面對的核心問題之一。本階段連同前述階段的模型,會和后面的諸多面向對象主題在學員的頭腦中形成完整的、超越具體語言的面向對象設計思想。