轉-程序員的能力矩陣

[譯文]程序員能力矩陣 Programmer Competency Matrix

注意:每一個層次的知識都是漸增的,位於層次 n,也蘊涵了你需瞭解全部低於層次 n的知識。
計算機科學 Computer Science
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
數據結構 不知道數組和鏈表的差別 可以解釋和使用數組,鏈表,字典等,而且可以用於實際的編程任務。 瞭解基本數據結構時間和空間的折中,好比數組vs 鏈表,可以解釋如何實現哈希表和處理衝突,瞭解優先隊列及其實現。 高等的數據結構的知識,好比B-樹、二項堆、斐波那契堆、AVL樹、紅黑樹、伸展樹、跳躍表以及前綴樹等。  
算法 不可以找出一個數組各數的平均值(這使人難以置信,可是個人確在應聘者中遇到過) 基本的排序,搜索和數據的遍歷和檢索算法。 樹,圖,簡單的貪婪算法和分而治之算法,可以適度瞭解矩陣該層的含義。 可以辨識和編寫動態規劃方案,良好的圖算法知識,良好的數值估算的知識,可以辨別NP問題等。 Working with someone who has a good topcoder ranking would be an unbelievable piece of luck!
編程體系 不知道何爲編譯器、連接器和解釋器。 對編譯器、連接器、解釋器有基本的瞭解。知道什麼是彙編代碼以及在硬件層如何工做。有一些虛擬內存和分頁知識。 瞭解內核模式vs用戶模式,多線程,同步原語以及它們如何實現,可以閱讀彙編代碼。瞭解網絡如何工做,瞭解網絡協議和socket級別編程。 瞭解整個程序堆棧、硬件(CPU+內存+中斷+微碼)、二進制代碼、彙編、靜態和動態連接、編碼、解釋、JIT(just-in-time)編譯、內存碎片回收、堆、棧、存儲器編址…  
軟件工程 Software Engineering
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
源碼版本控制 經過日期備份文件夾 VSS和初級的CVS/SVN用戶 熟練地使用CVS和SVN特性。知道如何分支和歸併,使用程序庫補丁安裝特性等 有分佈式VCS系統的知識。嘗試過Bzr/Mercurial/Darcs/Git  
自動化編譯 只知道在IDE下編譯 知道如何編譯在命令行下編譯系統 可以安裝一個腳本構建基本的系統 可以安裝一個腳原本構建系統而且歸檔,安裝程序,生成發佈記錄和給源碼控制中的代碼分配標籤。  
自動化測試 認爲全部的測試都是測試員的工做。 可以編寫自動化的單元測試,可以爲正在編寫的代碼提出良好的測試用例。 按照TDD (Test Driven Development)方式編寫代碼。 瞭解而且可以有效自動化安裝,載入/性能和UI測試  
程序設計 Programming
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
問題分解 只有直線式的代碼,經過複製粘貼來複用 可以把問題分散到多個函數中 可以想出可複用的函數/對象來解決大題的問題 使用適宜的數據結構和算法,寫出通用的/面向對象的代碼來封裝問題的易改變的層面。  
系統分解 N想不出比單一的文件/類更好的層面 若是不在同一平臺或沒采用相同的技術,可以把問題空間和設計方案分解。 可以設計跨技術/平臺的系統。 可以在多個產品線和與外部體系一體化中虛擬化和設計複製的系統。同時也可以設計支持系統監視、報告、故障恢復等。  
交流 不能向同伴表達想法/主意。匱乏拼寫和語法的能力。 同伴能瞭解你在說什麼。有良好的拼寫和語法能力。 可以和同伴進行高效的交流 可以使用清晰的方式瞭解和交流想法/設計/主意/細則,能適應每種環境的交流 This is an often under rated but very critical criteria for judging a programmer. With the increase in outsourcing of programming tasks to places where English is not the native tongue this issue has become more prominent. I know of several projects that failed because the programmers could not understand what the intent of the communication was.
同一文件中代碼組織 同一文件中組織沒有依據 按照邏輯性或者易接近的方法 代碼分塊和對於其餘源文件來講是易因而釋,引用其餘源文件時有良好的註釋 文檔頭部有許可聲明,總結,良好的註釋,一致的空格縮進。文檔外觀美觀。  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
跨文件代碼組織 沒夠想過給代碼跨文件組織 相關文件按文件夾分組 每一個物理文件都有獨立的目的,好比一個類的定義,一個特性的實現等。 代碼在物理層組織緊密,在文件名上與設計和外觀相匹配,能夠經過文件分佈方式洞察設計理念。  
源碼樹組織 一切都放在一個文件夾內 初步地將代碼分散進對應邏輯的文件夾。 沒有循環依賴,二進制文件,庫,文檔,構建,第三方的代碼都組織進合適的文件夾內。 源碼樹的物理佈局與邏輯層次、組織方式相匹配。能夠經過目錄名稱和組織方式洞察設計理念。 The difference between this and the previous item is in the scale of organization, source tree organization relates to the entire set of artifacts that define the system.
代碼可讀性 單音節的名稱 (在國內應該是那些相似用漢語拼音命名的習慣) 對文件、變量、類、方法等,有良好的命名。 沒有長函數、註釋解釋不常規的代碼,bug修復,代碼假設。 代碼假設驗證使用斷言,天然的代碼流,沒有深層嵌套的條件和方法  
防護性編碼 不知道這個概念 檢查代碼中全部的參數,對關鍵的假設進行斷言 確保檢查了返回值和使代碼失敗的異常。 有本身的庫來幫助防護性編程、編寫單元測試模擬故障  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
錯誤處理 只給樂觀的情形編碼 基本的代碼錯誤處理,拋出異常/生成錯誤 確保錯誤/異常留在程序中有良好的狀態,資源,鏈接,內存都有被合適的清理。 在編碼以前察覺可能出現的異常,在代碼的全部層次中維持一致性的異常處理策略,提出整個系統的錯誤處理準則。  
IDE IDE大部分用來進行文本編輯 瞭解其周圍的接口,可以高效地經過菜單來使用IDE 瞭解最常操做的鍵盤快捷鍵 編寫自定義宏  
API 須要頻繁地查閱文檔 把最頻繁使用的API記在腦子裏 廣闊且深刻的API知識。 爲了使實際任務中經常使用API使用更加便捷,編寫過API的上層庫,填補API之間的缺口。 E.g. of API can be Java library, .net framework or the custom API for the application
框架 沒有使用過主平臺外的任何框架 聽過但沒用過平臺下流行的可用框架 在專業的職位中使用過一個以上的框架,通曉各框架的特點。 某框架的做者  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
需求分析 接受給定的需求和代碼規格 能對規格的遺漏提出疑問 瞭解全面狀況,提出須要被規格化的總體範圍。 可以提出更好的可選方案,根據經驗的浮現給出需求  
腳本 不具有腳本工具的知識 批處理文件/shell腳本 Perl/Python/Ruby/VBScript/Powershell 寫過而且發表過可重用的代碼  
數據庫 認爲Excel就是數據庫 知道基本的數據庫概念,規範化、ACID(原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durability)、事務化,可以寫簡單的select語句 可以牢記在運行時必要查詢中設計良好的規範化數據庫模式, 精通用戶視圖,存儲過程,觸發器和用戶定義類型。知道彙集與非彙集索引之間的差別。精通使用ORM(Object Relational Mapping對象關係映射)工具 能作基本的數據庫管理,性能優化,索引優化,編寫高級的select查詢,可以使用相關sql來替換遊標,理解數據內部的存儲,瞭解如何鏡像、複製數據庫。知道兩段數據提交如何工做  
經驗 Experience
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
專業語言經驗 命令式語言和麪向對象語言 命令式語言,面嚮對象語言和說明型語言(SQL),若是瞭解靜態類型vs動態類型,弱類型vs強類型則有加分 函數式語言,若是瞭解延緩求值,局部套用函數,延續則有加分 併發語言(Erlang, Oz) 邏輯語言(Prolog)  
專業平臺經驗 1 2-3 4-5 6+  
專業經驗年齡 1 2-5 6-9 10+  
領域知識 沒有該領域的知識 在該領域中曾經至少爲一個產品工做過 在同一領域中爲多個產品工做過 領域專家。在該領域設計和實現數種產品/方案。精通該領域使用的標準條款和協議  
學識 Knowledge
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
工具知識 僅限於主要的IDE(VS.Net, Eclipse等) 知道一些流行和標準工具的備選方案 對編輯器、調試器、IDE、開源的備選方案有很好的瞭解。好比某人瞭解大多數Scott Hanselman的威力工具列表中的工具,使用過ORM工具。 實際地編寫過工具和腳本,若是這些被髮布則有加分  
語言接觸 命令式語言和麪向對象語言 命令式語言、面嚮對象語言和說明型語言(SQL),若是瞭解靜態類型vs動態類型、弱類型vs強類型則有加分 函數式語言,若是瞭解延緩求值、局部套用函數、continuations (源於scheme中的一種高級控制結構)則有加分 併發語言(Erlang, Oz) 邏輯語言(Prolog)  
代碼庫知識 歷來沒有查詢過代碼庫 基本的代碼層知識,瞭解若是構建系統 良好的代碼庫工做知識,實現過幾回bug修復或者完成了一些細小的特性 實現了代碼庫中多個大型特性,可以輕鬆地將多數特性的需求變動具體化,從容地處理bug修復。  
下一代技術知識 歷來沒據說過即將到來的技術 據說過某領域即將到來的技術 下載過alpha preview/CTP/beta版本,而且讀過一些文章和手冊 試用過預覽版並且實際地構建過某物,若是共享給其餘人的話則有加分  
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3) Comments
平臺內部 對平臺內部毫無所知 有平臺基本的內部工做的知識 深度的平臺內部知識,可以設想平臺如何將程序轉換成可執行代碼。 編寫過加強平臺或者爲其平臺內部提供信息的工具。好比,反彙編工具,反編譯工具,調試工具等。  
書籍 菜鳥系列,21天系列,24小時系列,蠢貨系列... 《代碼大全》,《別讓我思考》, 《精通正則表達式》 《設計模式》,《人件》,《代碼珠璣》,《算法設計手冊》,《程序員修煉之道》,《人月神話》 《計算機程序設計與解釋》,《事務處理:概念與技術》,《計算機程序設計模型》,《計算機程序設計藝術》,《數據庫系統導論》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(沒找到其中譯本)  
博客 聽過可是歷來抽不出空去接觸 閱讀一些科技/編程/軟件工程的博客,而且常常的收聽一些播客 維護一些博客的連接,收集博主分享的有用的文章和工具 維護一個在編程方面,分享有我的看法和思考的博客  
Creative Commons License
相關文章
相關標籤/搜索