基礎篇(理論與硬件)
這一部分關注的是計算機的基本理論與基本實現。包括硬件結構理論,以及軟件與硬件的交互。以理論開篇,在機器語言部分深入,最終在操作系統部分達到高潮。
1、計算機實現計算的原理。這包括門電路是如何實現計算的,時序電路是如何實現存儲的,馮諾依曼體系結構是如何將二者結合實現了真正的現實世界的計算機的,以及它是如何反映圖靈機這一理論計算模型的。其間會學習布爾邏輯。
2、如何控制計算機硬件。這部分使用的“工具”就是機器語言和匯編語言。我們需要理解機器語言的本質,以及它如何以“匯編語言”這種更容易理解的形式為程序員提供了控制硬件設備的機會。這部分可以學習到很多非常低級但是本質的內容。
3、操作系統是如何工作的。如果你理解了上一部分的計算機硬件相關的問題,那么理解操作系統的工作原理將不會那么困難。另外你將明白操作系統作為硬件和上層軟件的中間層次,是如何大大簡化了人們對硬件的操作過程的。
進階篇(軟件系統)
1、編程語言。這包括結構化編程語言以及面向對象編程語言。因為有很多選擇,其實以一門語言開始即可,如果你在前面正確的理解了硬件與機器語言,那么C語言入門真是太簡單了,如果你運氣不好,覺得C很困難,那么即使是從Python、Javascript開始學習也沒問題。重點在于理解編程中和語法相關的基本概念,并了解一些簡單的算法知識。
2、數據結構與算法。說白了就是如何合理的組織數據,通過其結構特點來簡化編程或者提高計算的效率。這里的內容是模式化的,所有人都需要學習無序結構、有序線性結構、樹結構、圖結構等。另外,排序算法、查找算法必須學好,特別是算法策略如遞推、遞歸、蠻力(窮舉)、分治、動態規劃等也必須有所實踐和了解。切記不必深陷其中,這里是個大坑,你不可能真的“精通”他們。
3、編程語言是如何實現的。這里主要涉及編譯原理。當你站在高級編程語言實現者的角度再來認識編程語言本身的時候,許多問題豁然開朗。這會深刻的改變你的編程觀??上У氖羌词故呛芎玫膶W生在這里也會遇到很大的阻力。真正的問題不是這方面理論性有多強,而是教材都很爛——包括國外教材(什么龍書虎書鯨書都根本不是為初學者準備的),而且語焉不詳。這導致大部分人都感覺莫名其妙高深莫測。如果你不是有志攀登軟件設計的最高峰,可以繞行。否則從表達式運算解析開始,逐步引入變量,類型,控制結構,函數,再到對象,一步步構建出解析器,然后結合前面學習的硬件接口知識,將其轉換為低級表示,最后你會發現沒有那么可怕。
基礎領域篇(必備領域知識)
1、互聯網絡是如何構成的。這部分包括網絡的基本知識,主機間通信的原理,轉發設備的實現,以及互聯網絡的構成。這是網絡編程所需的基礎知識。除了理解低級協議,也要花一些時間了解應用層的協議,特別是 SMTP、POP3、FTP、HTTP 等,重點是了解他們的基本原理,而不是每個細節。因為每個協議都有自己的標準,光 HTTP 協議就夠你研究 6 個月以上了。這里注重的是原理。
2、如何管理大量的數據并在其上建立信息系統。數據庫是一個很好的例子。包括數據庫系統的基本理論,實現原理,以及設計原則。同樣,這里不是真的在教你如何構建一個數據庫系統,而是在學習他的核心原則,重點是學會如何合理的設計表結構,以及實現效率良好的SQL查詢語句。
擴展領域篇(特定領域知識)
1、基于特定平臺的軟件開發。如何在Windows平臺、Linux平臺、Mac OS平臺或者手機、平板、電視機、微波爐上完成開發?這需要學習特定的軟件平臺提供了哪些編程接口,如何編譯并部署,如何調試和測試等知識。這部分就是軟件工程師職業生涯中最耗費時間的部分。
2、有效的軟件研發是如何實現的。這包括軟件結構的設計知識,軟件實施流程的管理知識,以及一些細微而繁雜的內容。人們通常用軟件工程一詞來概括。但事實上軟件工程站的角度要更高一些,這里只是涵蓋軟件工程的一小部分。
科技領域篇(研究性知識)
如果你對人工智能、科學計算、圖像處理感興趣,這里還有大片的區域等待你探索。