天天看點

【譯文】程式員能力矩陣 Programmer Competency Matrix

計算機科學 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

源碼版本控制

通過日期備份檔案夾

VSS和初級的CVS/SVN使用者

熟練地使用CVS和SVN特性。知道如何分支和歸并,使用程式庫更新檔安裝特性等

有分布式VCS系統的知識。嘗試過Bzr/Mercurial/Darcs/Git

自動化編譯

隻知道在IDE下編譯

知道如何編譯在指令行下編譯系統

能夠安裝一個腳本建構基本的系統

能夠安裝一個腳本來建構系統并且歸檔,安裝程式,生成釋出記錄和給源碼控制中的代碼配置設定标簽。

自動化測試

認為所有的測試都是測試員的工作。

能夠編寫自動化的單元測試,能夠為正在編寫的代碼提出良好的測試用例。

按照TDD (Test Driven Development)方式編寫代碼。

了解并且能夠有效自動化安裝,載入/性能和UI測試

程式設計 Programming

問題分解

隻有直線式的代碼,通過複制粘貼來複用

能夠把問題分散到多個函數中

能夠想出可複用的函數/對象來解決大題的問題

使用适宜的資料結構和算法,寫出通用的/面向對象的代碼來封裝問題的易改變的層面。

系統分解

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.

同一檔案中代碼組織

同一檔案中組織沒有依據

按照邏輯性或者易接近的方法

代碼分塊和對于其他源檔案來說是易于是釋,引用其他源檔案時有良好的注釋

文檔頭部有許可聲明,總結,良好的注釋,一緻的空格縮進。文檔外觀美觀。

跨檔案代碼組織

沒夠想過給代碼跨檔案組織

相關檔案按檔案夾分組

每個實體檔案都有獨立的目的,比如一個類的定義,一個特性的實作等。

代碼在實體層組織緊密,在檔案名上與設計和外觀相比對,可以通過檔案分布方式洞察設計理念。

源碼樹組織

一切都放在一個檔案夾内

初步地将代碼分散進對應邏輯的檔案夾。

沒有循環依賴,二進制檔案,庫,文檔,建構,第三方的代碼都組織進合适的檔案夾内。

源碼樹的實體布局與邏輯層次、組織方式相比對。可以通過目錄名稱群組織方式洞察設計理念。

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修複,代碼假設。

代碼假設驗證使用斷言,自然的代碼流,沒有深層嵌套的條件和方法

防禦性編碼

不知道這個概念

檢查代碼中所有的參數,對關鍵的假設進行斷言

確定檢查了傳回值和使代碼失敗的異常。

有自己的庫來幫助防禦性程式設計、編寫單元測試模拟故障

錯誤處理

隻給樂觀的情形編碼

基本的代碼錯誤處理,抛出異常/生成錯誤

確定錯誤/異常留在程式中有良好的狀态,資源,連接配接,記憶體都有被合适的清理。

在編碼之前察覺可能出現的異常,在代碼的所有層次中維持一緻性的異常處理政策,提出整個系統的錯誤處理準則。

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

架構

沒有使用過主平台外的任何架構

聽過但沒用過平台下流行的可用架構

在專業的職位中使用過一個以上的架構,通曉各架構的特色。

某架構的作者

需求分析

接受給定的需求和代碼規格

能對規格的遺漏提出疑問

了解全面情況,提出需要被規格化的整體範圍。

能夠提出更好的可選方案,根據經驗的浮現給出需求

腳本

不具備腳本工具的知識

批處理檔案/shell腳本

Perl/Python/Ruby/VBScript/Powershell

寫過并且發表過可重用的代碼

資料庫

認為Excel就是資料庫

知道基本的資料庫概念,規範化、ACID(原子性Atomicity、一緻性Consistency、隔離性Isolation、持久性Durability)、事務化,能夠寫簡單的select語句

能夠牢記在運作時必要查詢中設計良好的規範化資料庫模式, 精通使用者視圖,存儲過程,觸發器和使用者定義類型。知道聚集與非聚集索引之間的差異。精通使用ORM(Object Relational Mapping對象關系映射)工具

能做基本的資料庫管理,性能優化,索引優化,編寫進階的select查詢,能夠使用相關sql來替換遊标,了解資料内部的存儲,了解如何鏡像、複制資料庫。知道兩段資料送出如何工作

經驗 Experience

專業語言經驗

指令式語言和面向對象語言

指令式語言,面向對象語言和說明型語言(SQL),如果了解靜态類型vs動态類型,弱類型vs強類型則有加分

函數式語言,如果了解延緩求值,局部套用函數,延續則有加分

并發語言(Erlang, Oz) 邏輯語言(Prolog)

專業平台經驗

1

2-3

4-5

6+

專業經驗年齡

2-5

6-9

10+

領域知識

沒有該領域的知識

在該領域中曾經至少為一個産品工作過

在同一領域中為多個産品工作過

領域專家。在該領域設計和實作數種産品/方案。精通該領域使用的标準條款和協定

學識 Knowledge

工具知識

僅限于主要的IDE(VS.Net, Eclipse等)

知道一些流行和标準工具的備選方案

對編輯器、調試器、IDE、開源的備選方案有很好的了解。比如某人了解大多數Scott Hanselman的威力工具清單中的工具,使用過ORM工具。

實際地編寫過工具和腳本,如果這些被釋出則有加分

語言接觸

指令式語言、面向對象語言和說明型語言(SQL),如果了解靜态類型vs動态類型、弱類型vs強類型則有加分

函數式語言,如果了解延緩求值、局部套用函數、continuations (源于scheme中的一種進階控制結構)則有加分

代碼庫知識

從來沒有查詢過代碼庫

基本的代碼層知識,了解如果建構系統

良好的代碼庫工作知識,實作過幾次bug修複或者完成了一些細小的特性

實作了代碼庫中多個大型特性,能夠輕松地将多數特性的需求變更具體化,從容地處理bug修複。

下一代技術知識

從來沒聽說過即将到來的技術

聽說過某領域即将到來的技術

下載下傳過alpha preview/CTP/beta版本,并且讀過一些文章和手冊

試用過預覽版而且實際地建構過某物,如果共享給其他人的話則有加分

平台内部

對平台内部毫無所知

有平台基本的内部工作的知識

深度的平台内部知識,能夠設想平台如何将程式轉換成可執行代碼。

編寫過增強平台或者為其平台内部提供資訊的工具。比如,反彙編工具,反編譯工具,調試工具等。

書籍

菜鳥系列,21天系列,24小時系列,蠢貨系列...

《代碼大全》,《别讓我思考》, 《精通正規表達式》

《設計模式》,《人件》,《代碼珠玑》,《算法設計手冊》,《程式員修煉之道》,《人月神話》

《計算機程式設計與解釋》,《事務處理:概念與技術》,《計算機程式設計模型》,《計算機程式設計藝術》,《資料庫系統導論》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(沒找到其中譯本)

部落格

聽過但是從來抽不出空去接觸

閱讀一些科技/程式設計/軟體工程的部落格,并且經常的收聽一些播客

維護一些部落格的連結,收集部落客分享的有用的文章和工具

維護一個在程式設計方面,分享有個人見解和思考的部落格

繼續閱讀