程式設計師能力矩陣 Programmer Competency Matrix
阿新 • • 發佈:2019-01-10
注意:每個層次的知識都是漸增的,位於層次n,也蘊涵了你需瞭解所有低於層次n的知識。
電腦科學 Computer Science
- | 2n(Level 0) | n2(Level 1) | n(Level 2) | log(n)(Level 3) |
---|---|---|---|---|
資料結構 | 不知道陣列和連結串列的差異 | 能夠解釋和使用陣列,連結串列,字典等,並且能夠用於實際的程式設計任務。 | 瞭解基本資料結構時間和空間的折中,比如陣列vs 連結串列,能夠解釋如何實現雜湊表和處理衝突,瞭解優先佇列及其實現。 | 高等的資料結構的知識,比如B-樹、二項堆、斐波那契堆、AVL樹、紅黑樹、伸展樹、跳躍表以及字首樹等。 |
演算法 | 不能夠找出一個數組各數的平均值(這令人難以置信,但是我的確在應聘者中遇到過) | 基本的排序,搜尋和資料的遍歷和檢索演算法。 | 樹,圖,簡單的貪婪演算法和分而治之演算法,能夠適度瞭解矩陣該層的含義。 | 能夠辨識和編寫動態規劃方案,良好的圖演算法知識,良好的數值估算的知識,能夠辨別NP問題等。 |
程式設計體系 | 不知道何為編譯器、連結器和直譯器。 | 對編譯器、連結器、直譯器有基本的瞭解。知道什麼是彙編程式碼以及在硬體層如何工作。有一些虛擬記憶體和分頁知識。 | 瞭解核心模式vs使用者模式,多執行緒,同步原語以及它們如何實現,能夠閱讀彙編程式碼。瞭解網路如何工作,瞭解網路協議和socket級別程式設計。 | 瞭解整個程式堆疊、硬體(CPU+記憶體+中斷+微碼)、二進位制程式碼、彙編、靜態和動態連結、編碼、解釋、JIT(just-in-time)編譯、記憶體碎片回收、堆、棧、儲存器編址… |
軟體工程 Software Engineering
- | 2n(Level 0) | n2(Level 1) | n(Level 2) | log(n)(Level 3) |
---|---|---|---|---|
原始碼版本控制 | 通過日期備份資料夾 | 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) |
---|---|---|---|---|
問題分解 | 只有直線式的程式碼,通過複製貼上來複用 | 能夠把問題分散到多個函式中 | 能夠想出可複用的函式/物件來解決大題的問題 | 使用適宜的資料結構和演算法,寫出通用的/面向物件的程式碼來封裝問題的易改變的層面。 |
系統分解 | N想不出比單一的檔案/類更好的層面 | 如果不在同一平臺或沒采用相同的技術,能夠把問題空間和設計方案分解。 | 能夠設計跨技術/平臺的系統。 | 能夠在多個產品線和與外部體系一體化中虛擬化和設計複製的系統。同時也能夠設計支援系統監視、報告、故障恢復等。 |
交流 | 不能向同伴表達想法/主意。匱乏拼寫和語法的能力。 | 同伴能瞭解你在說什麼。有良好的拼寫和語法能力。 | 能夠和同伴進行高效的交流 | 能夠使用清晰的方式瞭解和交流想法/設計/主意/細則,能適應每種環境的交流 |
同一檔案中程式碼組織 | 同一檔案中組織沒有依據 | 按照邏輯性或者易接近的方法 | 程式碼分塊和對於其他原始檔來說是易於是釋,引用其他原始檔時有良好的註釋 | 文件頭部有許可宣告,總結,良好的註釋,一致的空格縮排。文件外觀美觀。 |
跨檔案程式碼組織 | 沒夠想過給程式碼跨檔案組織 | 相關檔案按資料夾分組 | 每個物理檔案都有獨立的目的,比如一個類的定義,一個特性的實現等。 | 程式碼在物理層組織緊密,在檔名上與設計和外觀相匹配,可以通過檔案分佈方式洞察設計理念。 |
原始碼樹組織 | 一切都放在一個資料夾內 | 初步地將程式碼分散進對應邏輯的資料夾。 | 沒有迴圈依賴,二進位制檔案,庫,文件,構建,第三方的程式碼都組織進合適的資料夾內。 | 原始碼樹的物理佈局與邏輯層次、組織方式相匹配。可以通過目錄名稱和組織方式洞察設計理念。 |
程式碼可讀性 | 單音節的名稱(在國內應該是那些類似用漢語拼音命名的習慣) | 對檔案、變數、類、方法等,有良好的命名。 | 沒有長函式、註釋解釋不常規的程式碼,bug修復,程式碼假設。 | 程式碼假設驗證使用斷言,自然的程式碼流,沒有深層巢狀的條件和方法 |
防禦性編碼 | 不知道這個概念 | 檢查程式碼中所有的引數,對關鍵的假設進行斷言 | 確保檢查了返回值和使程式碼失敗的異常。 | 有自己的庫來幫助防禦性程式設計、編寫單元測試模擬故障 |
錯誤處理 | 只給樂觀的情形編碼 | 基本的程式碼錯誤處理,丟擲異常/生成錯誤 | 確保錯誤/異常留在程式中有良好的狀態,資源,連線,記憶體都有被合適的清理。 | 在編碼之前察覺可能出現的異常,在程式碼的所有層次中維持一致性的異常處理策略,提出整個系統的錯誤處理準則。 |
IDE | IDE大部分用來進行文字編輯 | 瞭解其周圍的介面,能夠高效地通過選單來使用IDE | 瞭解最常操作的鍵盤快捷鍵 | 編寫自定義巨集 |
API | 需要頻繁地查閱文件 | 把最頻繁使用的API記在腦子裡 | 廣闊且深入的API知識。 | 為了使實際任務中常用API使用更加便捷,編寫過API的上層庫,填補API之間的缺口。 |
框架 | 沒有使用過主平臺外的任何框架 | 聽過但沒用過平臺下流行的可用框架 | 在專業的職位中使用過一個以上的框架,通曉各框架的特色。 | 某框架的作者 |
需求分析 | 接受給定的需求和程式碼規格 | 能對規格的遺漏提出疑問 | 瞭解全面情況,提出需要被規格化的整體範圍。 | 能夠提出更好的可選方案,根據經驗的浮現給出需求 |
指令碼 | 不具備指令碼工具的知識 | 批處理檔案/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) |
---|---|---|---|---|
專業語言經驗 | 命令式語言和麵向物件語言 | 命令式語言,面嚮物件語言和說明型語言(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) |
---|---|---|---|---|
工具知識 | 僅限於主要的IDE(VS.Net, Eclipse等) | 知道一些流行和標準工具的備選方案 | 對編輯器、偵錯程式、IDE、開源的備選方案有很好的瞭解。比如某人瞭解大多數Scott Hanselman的威力工具列表中的工具,使用過ORM工具。 | 實際地編寫過工具和指令碼,如果這些被髮布則有加分 |
語言接觸 | 命令式語言和麵向物件語言 | 命令式語言、面嚮物件語言和說明型語言(SQL),如果瞭解靜態型別vs動態型別、弱型別vs強型別則有加分 | 函式式語言,如果瞭解延緩求值、區域性套用函式、continuations (源於scheme中的一種高階控制結構)則有加分 | 併發語言(Erlang, Oz) 邏輯語言(Prolog) |
程式碼庫知識 | 從來沒有查詢過程式碼庫 | 基本的程式碼層知識,瞭解如果構建系統 | 良好的程式碼庫工作知識,實現過幾次bug修復或者完成了一些細小的特性 | 實現了程式碼庫中多個大型特性,能夠輕鬆地將多數特性的需求變更具體化,從容地處理bug修復。 |
下一代技術知識 | 從來沒聽說過即將到來的技術 | 聽說過某領域即將到來的技術 | 下載過alpha preview/CTP/beta版本,並且讀過一些文章和手冊 | 試用過預覽版而且實際地構建過某物,如果共享給其他人的話則有加分 |
平臺內部 | 對平臺內部毫無所知 | 有平臺基本的內部工作的知識 | 深度的平臺內部知識,能夠設想平臺如何將程式轉換成可執行程式碼。 | 編寫過增強平臺或者為其平臺內部提供資訊的工具。比如,反彙編工具,反編譯工具,除錯工具等。 |
書籍 | 菜鳥系列,21天系列,24小時系列,蠢貨系列… | 《程式碼大全》,《別讓我思考》, 《精通正則表示式》 | 《設計模式》,《人件》,《程式碼珠璣》,《演算法設計手冊》,《程式設計師修煉之道》,《人月神話》 | 《計算機程式設計與解釋》,《事務處理:概念與技術》,《計算機程式設計模型》,《計算機程式設計藝術》,《資料庫系統導論》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(沒找到其中譯本) |
部落格 | 聽過但是從來抽不出空去接觸 | 閱讀一些科技/程式設計/軟體工程的部落格,並且經常的收聽一些播客 | 維護一些部落格的連結,收集博主分享的有用的文章和工具 | 維護一個在程式設計方面,分享有個人見解和思考的部落格 |