http://blog.csdn.net/luckheadline
覺得這個東西實在太好,不翻譯不轉載一下實在不好意思。
程序員能力矩陣
注意每個級別的知識是累加的,即如果你在 n 階,則表明你也知道低於 n 階的所有知識。
計算機科學
|
2n(Level 0) |
n2(Level 1) |
n (Level 2) |
log(n) (Level 3) |
數據結構 |
不知道數組與鏈表的區別 |
能夠解釋和在實際編程任務中使用數組,鏈表,字典等 |
知道基本數據結構的時空開銷,如數組對比鏈表;能夠解釋如何實現哈希表並能處理衝突,優先隊列並知道實現它們的方法 |
瞭解高級數據結構,如 B- 樹,二項堆和 fibonacci 堆,平衡二叉樹和紅黑樹,伸展樹, trie 樹等 |
算法 |
不知道如何找出一個數組中的平均數 |
基本排序,搜索和數據結構遍歷與查找算法 |
樹,圖,簡單貪心與分治算法;能理解其相關知識 |
能夠識別和編碼動態規劃解決方案;較好的瞭解圖算法;較好的瞭解數值計算算法;能識別 NP 問題等。 |
系統編程 |
不知道編譯器,鏈接器或解釋器是什麼 |
基本瞭解編譯器,鏈接器和解釋器。理解彙編代碼並知道在硬件級別是如何工作的。部分了解虛擬內存和頁。 |
理解內核態和用戶態,多線程,同步原語以及它們如何實現;能夠讀懂彙編代碼。理解網絡如何工作,理解網絡協議與 socket 級別的編程。 |
理解整個程序棧,硬件,二進制代碼,彙編,靜態與動態鏈接,編譯,解釋,及時編譯,垃圾收集,堆,棧,內存地址等等。 |
軟件工程
|
2n(Level 0) |
n2(Level 1) |
n (Level 2) |
log(n) (Level 3) |
源代碼版本管理 |
根據日期備份文件夾 |
VSS 使用和初學使用 CVS/SVN |
精通使用 CVS 和 SVN 。知道如何分支和合並,使用補丁建立目錄屬性等。 |
瞭解分佈式 VCS 系統。嘗試過 Bzr/ Mercurial/ Darcs/ Git |
Build 自動化 |
只知道如果使用 IDE 去 build |
知道如何使用命令行 build 系統 |
能夠用腳本 build 基本系統 |
能使用腳本 build 系統,文檔,安裝,產生髮布 notes 和標記代碼 |
自動化測試 |
認爲所有的測試都是測試人員的工作 |
寫過自動化單元測試併爲代碼建立好的單元測試用例 |
使用 TDD 方式寫代碼 |
理解並能建立自動的功能測試,負載 / 平衡和 UI 測試 |
編程
|
2n(Level 0) |
n2(Level 1) |
n (Level 2) |
log(n) (Level 3) |
問題分解 |
僅僅因爲重用而直接拷貝粘貼代碼 |
能夠將問題分解爲多個功能 |
能夠想出重用的功能和對象以解決整體問題 |
使用合適的數據結構和算法,考慮泛化和麪向對象的代碼以封裝問題易變化的層面 |
系統分解 |
不能超出單個文件和類考慮問題 |
能夠打破問題空間並設計解決方案只要它在相同平臺和技術範圍內 |
能夠跨多個技術領域與平臺設計系統 |
能夠利用多個產品線和集成外部系統以虛擬化和設計複雜系統。也能夠設計操作以支持系統的 monitoring, reporting, fail overs |
交流 |
不能和同事表達思想與想法。較差的拼寫與語法。 |
同事能理解所說的。較好的拼寫與語法 |
能夠有效的與同事交流 |
能夠不含糊的理解與交流思想 / 設計 / 觀點,並能根據環境調整溝通 |
在一個文件中組織代碼 |
沒有明顯的組織結構 |
方法在邏輯與訪問方式上被劃分 |
代碼被劃分爲多個域,並通過對其他代碼文件的引用加以註釋 |
文件有 license 頭,總結,較好的註釋,統一的空行使用。文件看起來美觀。 |
跨文件代碼組織 |
不考慮跨文件的代碼組織 |
相關文件被分組放進一個文件夾 |
每個物理文件有其獨特的目的,例如類定義,功能實現等 |
物理級別上的代碼組織非常匹配於設計,文件名與目錄分佈都能透視出設計 |
源代碼樹管理 |
所有的都在一個文件夾裏 |
代碼基本區分進不同邏輯的文件夾 |
沒有循環依賴,二進制文件,靜態庫,文檔, builds ,第三方代碼都被組織放在合適的文件夾裏 |
源代碼樹的物理表現匹配於邏輯組織和管理。目錄名和管理提供了對整個系統設計的透視 |
代碼可讀性 |
單音節名 |
良好的文件名,變量名,類名及方法名 |
沒有長方法,對不尋常代碼, bug 修改,代碼假設加上註釋 |
代碼假設使用斷言證明,自然的代碼流,無深度的條件或方法嵌套 |
防禦性編碼 |
不理解這個概念 |
檢查所有的參數並對代碼中重要的假設加上斷言 |
確保檢查返回值並對代碼可能失敗的異常進行檢查 |
擁有自己的庫以幫助防禦性編碼,通過單元測試模擬錯誤 |
錯誤處理 |
只對愉快的 case 編碼 |
對代碼有基本的錯誤處理以能夠拋出異常或產生錯誤 |
確保錯誤與異常處理,資源,連接和內存都被合理的清理 |
編碼以提前識別可能的異常,在所有代碼層面統一的維護異常處理,對整個系統的異常處理建立統一的方針 |
IDE |
通常使用 IDE 作爲文本編輯 |
能夠有效通過菜單使用 IDE |
知道常用的快捷鍵 |
寫過定製宏 |
API |
需要經常查找幫助文檔 |
記住常用的 API |
廣泛而深入的瞭解 API |
針對 API 寫過庫以簡化經常使用的任務並填補 API 空隙 |
框架 |
除了核心平臺沒有使用任何框架 |
聽說但沒有使用流行的框架 |
使用過超過一個框架並熟知框架的慣用語 |
框架作者 |
需求 |
採用已有的需求與代碼去實現 |
關心未考慮的情況以考慮問題 |
理解整個 picture 並對整個領域考慮 |
能夠根據經驗對已有需求提出額外的選擇和流程 |
腳本 |
不知道腳本工具 |
批處理文件或 shell 腳本 |
Perl/Python/Ruby/ VBScript/Powershell |
寫過併發布過可重用代碼 |
數據庫 |
認爲 Excel 是一個數據庫 |
瞭解基本數據庫概念,規範化, ACID ,事務,並能寫簡單的查詢語句 |
能夠設計良好和規範的數據庫結構並記住將會運行的查詢;擅長使用視圖,存儲過程,觸發器和自定義類型。知道簇與非簇索引的區別。擅長使用 ORM 工具 |
能做基本數據庫管理,性能優化,索引優化,寫高級的查詢語句;能夠用對應的 sql 語句代替遊標的使用;理解索引在內部如何實現;理解數據庫如何被鏡像,複製等;理解兩個段提交如何工作 |
經驗
|
2n(Level 0) |
n2(Level 1) |
n (Level 2) |
log(n) (Level 3) |
對語言的專業經驗 |
命令或面向對象 |
命令,面向對象和陳述 (SQL) ,如果理解靜態和動態類型,弱和強類型,靜態推理類型將獲得額外獎勵 |
函數語言,如果理解晚綁定, currying, continuations ,將獲得額外獎勵 |
併發 (Erlang, Oz) 和邏輯 (Prolog) |
對平臺的專業經驗 |
1 |
2-3 |
4-5 |
6+ |
專業經驗年限 |
1 |
2-5 |
6-9 |
10+ |
領域知識 |
沒有領域知識 |
在某個領域至少工作從事一個產品 |
在相同領域從事工作多個產品 |
領域專家。在領域內設計和實現多個產品與解決方案。熟知和理解領域內的術語與協議 |
知識
|
2n(Level 0) |
n2(Level 1) |
n (Level 2) |
log(n) (Level 3) |
工具知識 |
侷限於主要的 IDE |
知道流行與標準工具的其他選擇 |
熟知編輯器, debugger 和 IDE ,開源的選擇等等。使用過 ORM 工具 |
實際寫過工具和腳本,如果發佈將獲得額外獎勵 |
代碼庫知識 |
未看過代碼庫 |
基本瞭解代碼表現並知道如何 build 系統 |
較好了解代碼庫,實現過一些 bug 修補和一些小的功能 |
對代碼庫實現了多個大的功能,並能輕易的實現需要的修改 |
對流行技術的瞭解 |
沒聽說過流行的技術 |
聽說過領域內的流行技術 |
下載過測試版本並讀過一些文章與手冊 |
玩過預覽版並實際用它建立過一些 |