一个有意思的能力评价表:

Programmer Competency Matrix

http://www.starling-software.com/employment/programmer-competency-matrix.html

一.计算机科学(Computer Science)

数据结构(data structures

Level 0:不知道Array和LinkedList的区别

Level 1:实际编程中能解释和使用Array,LinkedList,Dictionaries等

Level 2:了解基本数据类型(Array vs LinkedList)在空间和时间上的权衡,能够解释哈希表如何实现,如何处理冲突(collisions),优先队列(Priority Queue)及如何实现等。

Level 3:了解如B-trees,二项式堆和斐波那契堆(binomial and fibonacci heaps),AVL树和红黑树(AVL/Red Black trees),伸展树(Splay Trees),跳跃表(Skip Lists),进行尝试等

算法(algorithms

Level 0:无法找到数组的平均值

Level 1:简单的排序、查找,数据结构的遍历和检索算法

Level 2:树、图、简单的贪婪和分治算法,能够理解这个矩阵水平的相关性

Level 3:能够识别和编写动态规划解决方案,良好的图算法知识,良好的数值计算算法知识,能够识别NP-问题等

系统编程(systems programming

Level 0:不知道什么是编译器,连接器或解释器

Level 1:对编译器,连接器和解释器有基本的了解,理解汇编代码及在硬件级别如何运作,一些虚拟内存和页面的知识

Level 2:理解内核模式和用户模式,多线程,同步基础,以及它们如何实现,能阅读汇编代码,理解网络如何运作,理解网络协议和socket级编程

Level 3:了解整个程序堆栈,硬件(CPU + 存储器 + 缓存 + 中断 + 微代码),二进制代码,汇编代码,静态和动态链接,编译,解释,JIT编译,垃圾回收,堆,栈,内存寻址……

二.软件工程(Software Engineering)

源代码版本控制(source code version control)

Level 0:加日期的文件夹进行备份

Level 1:VSS和初始CVS/SVN用户

Level 2:熟练使用CVS和SVN功能,知道如何分支和合并,使用补丁安装库等特性

Level 3:了解分布式VCS系统,已经试用Bzr/Mercurial/Darcs/Git

构建自动化(build automation)

Level 0:仅知道如何使用IDE进行构建

Level 1:知道如何从命令行构建系统

Level 2:能够设置脚本构建基本系统

Level 3:能够设置脚本构建系统以及文档,安装包,生成发行说明和标记源码控制的代码

自动测试(automated testing)

Level 0:认为所有测试都是测试员的工作

Level 1:已经编写自动单元测试,为正在编写的代码提出很好的单元测试用例

Level 2:按TDD(测试驱动开发)方式编写代码

Level 3:理解并能设置自动功能,负载/性能和用户界面测试(Understands and is able to setup automated functional, load/performance and UI tests)

三.编程(Programming)

问题分解(problem decomposition)

Level 0:只是使用复制粘贴的复用方式,进行直线编码

Level 1:能够将问题分成多个函数

Level 2:能够拿出可重复使用的函数/对象,解决整个问题

Level 3:使用适当的数据结构和算法,并提出了泛型/面向对象的代码封装问题的各个方面,应对问题进行变化

系统分解(systems decomposition)

Level 0:不能超过单个文件/类的级别进行思考

Level 1:在同一个平台/技术上,能分解问题空间和设计解决方案

Level 2:能够设计系统,跨越多个技术/平台

Level 3:能够可视化和设计多种产品线的复杂系统,并与外部系统集成

交流能力(communication)

Level 0:不能向同行表述思路/想法,在修辞和语法方面较差

Level 1:同行能理解你所说的话,良好的修辞和语法

Level 2:能与同行高效地沟通

Level 3:能够清楚地理解和交流思维/设计/想法/规范,在各背景下调整交流

单文件代码组织(code organization within a file)

Level 0:在文件中没有组织的迹象

Level 1:方法依逻辑和可访问性进行分组

Level 2:代码分组为不同区域,对引用的其他源代码有良好的注释

Level 3:文件有license头,摘要,良好的注释,统一的空白使用,文件看起来很美观

跨多文件代码组织(code organization across files)

Level 0:没有想过跨文件组织代码

Level 1:相关文件组织到同一文件夹中

Level 2:每个物理文件拥有唯一的用途,例如一个类的定义,一个特性的实现等

Level 3:代码组织在物理级别严密符合设计,文件名和文件夹的结构分布,能提供对设计的见解

源码树组织(source tree organization)

Level 0:所有东西放到一个文件夹中

Level 1:把代码基本分类到逻辑文件夹

Level 2:没有循环依赖,二进制文件,库,文档,构建,第三方代码都组织到适当的文件夹

Level 3:源树物理布局符合逻辑层次结构和组织,目录的名称和组织反映系统的设计见解

代码易读性(code readability)

Level 0:单音节的名字

Level 1:良好的文件名,变量名,类名,方法名等

Level 2:没有过长的函数,对特殊的代码进行注释,bug修正,代码预测(code assumptions)

Level 3:使用断言进行代码预测,代码流程自然,没有过深的条件语句和方法嵌套

防御性编程(defensive coding)

Level 0:不了解这个概念

Level 1:检查代码中所有引数(argument)并对关键预测进行断言

Level 2:确保检查返回值,检查可能失败的代码异常

Level 3:有自己的库帮助进行防御性编程,编写模拟故障的单元测试

错误处理(error handling)

Level 0:仅编写情况良好的(the happy case)代码

Level 1:围绕代码进行基本的错误处理,能够抛出异常/产生错误

Level 2:确保错误/异常以良好的方式离开程序,资源,连接和内存都被正确清理

Level 3:代码检测到可能的异常前,在代码的各个层面保持一致的异常处理策略,为整个系统提出异常处理准则

集成开发环境(IDE)

Level 0:主要采用IDE进行文本编辑

Level 1:知道它们的接口方式,能够有效地利用IDE使用菜单

Level 2:知悉最常用操作的快捷方式

阿里云-推广AD

Level 3:写了自定义宏

应用编程接口(API)

Level 0:需要频繁查看文档

Level 1:记住最常用的API

Level 2:广泛而深入的API知识

Level 3:在API之上编写了库,以简化常用任务,填补API的空白

框架(frameworks)

Level 0:没有使用过核心平台以外的任何框架

Level 1:听说过,但没有使用过平台流行的框架

Level 2:在专业级别上使用一个以上的框架,通晓框架的风格特色(idiom)

Level 3:框架的作者

需求(requirements)

Level 0:接受给定的需求并按照规格编程

Level 1:对规格中遗漏的方面提出质疑

Level 2:了解全貌,提出需要制定的所有领域(entire areas)

Level 3:能够基于自身经验,对给定的需求提出更好的选择和流程

脚本(scripting)

Level 0:不了解脚本工具

Level 1:批处理文件/shell脚本

Level 2:Perl/Python/Ruby/VBScript/Powershell

Level 3:已编写和发布可重用代码

数据库(database)

Level 0:认为Excel就是数据库

Level 1:了解基本的数据库概念,规范,ACID(数据库事务正确执行的四个基本要素,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),事务,能编写简单的select语句

Level 2:能够设计良好和标准化的database schemas,牢记这将不得不运行,熟练使用视图,存储过程,触发器和用户自定义类型,了解聚集索引和非聚集索引的区别,熟练使用ORM(对象关系映射)工具

Level 3:能够进行基本的数据库管理,性能优化,索引优化,编写高级的select查询,能用关系sql取代游标的使用,理解内部如何存储数据,如何存储索引,理解数据库可以被镜像、复制等,理解两阶段递交是如何运作的(how the two phase commit works)

四.经验(Experience)

语言专业经验(languages with professional experience)

Level 0:指令式(Imperative)或面向对象(Object Oriented)编程

Level 1:指令式(Imperative),面向对象(Object Oriented)和宣告式(declarative)(SQL)编程,如果了解静态和动态类型、强类型和弱类型则加分

Level 2:函数式(Functional)编程,懒惰计算法(lazy evaluation),科里化(Currying is the process of transforming a function that takes multiple arguments into a function that takes just a single argument and returns another function if any arguments are still needed.),延续(Continuations)

Level 3:并行(Concurrent)(Erlang, Oz)和逻辑(Logic)(Prolog)编程

平台专业经验(platforms with professional experience)

Level 0:1

Level 1:2-3

Level 2:4-5

Level 3:6+

经验年限(years of professional experience)

Level 0:1

Level 1:2-5

Level 2:6-9

Level 3:10+

领域知识(domain knowledge)

Level 0:没有相关领域知识

Level 1:做领域中至少一种产品的工作

Level 2:做同领域中多种产品的工作

Level 3:领域专家,曾设计和实现领域中多个产品/解决方案,精通领域中使用的标准条款和协议

五.知识(Knowledge)

工具知识(tool knowledge)

Level 0:仅限于主要的IDE(VS.Net, Eclipse等)

Level 1:了解一些流行和标准工具的替代品

Level 2:掌握编辑器,调试器,IDE,开源替代品等,例如知道Scott Hanselman的power tools list中所列的绝大多数工具,使用过ORM工具

Level 3:在实际中已编写工具和脚本,如已发布则加分

语言涉及(languages exposed to)

Level 0:指令式(Imperative)或面向对象(Object Oriented)语言

Level 1:指令式(Imperative),面向对象(Object Oriented)和宣告式(declarative)(SQL)语言,如果了解静态和动态类型、强类型和弱类型则加分

Level 2:函数式(Functional)语言,懒惰计算法(lazy evaluation),科里化(Currying is the process of transforming a function that takes multiple arguments into a function that takes just a single argument and returns another function if any arguments are still needed.),延续(Continuations)

Level 3:并行(Concurrent)(Erlang, Oz)和逻辑(Logic)(Prolog)编程语言

代码库知识(codebase knowledge)

Level 0:从没看过代码库

Level 1:具有代码布局以及如何构建系统的基本知识

Level 2:良好的代码库的工作知识,实现了一些bug修正甚至一些小特性

Level 3:已实现代码库中多个的较大的特性,能够很方便地显示大部分特性和bug修正

关于即将到来技术的知识(knowledge of upcoming technologies)

Level 0:没听过即将到来的新技术

Level 1:听说到领域中即将到来的新技术

Level 2:已下载Alpha预览版本/CTP版(Community Test Preview 社区测试试用版)/beta版,阅读相关文章和用户手册

Level 3:

平台内部原理(platform internals)

Level 0:完全不懂平台内部原理

Level 1:对平台内部如何运作有基本认识

Level 2:深入理解平台内部原理,能想象平台如何处理程序并将之转换为可执行代码

Level 3:已经为平台内部编写工具以强化机能和提供信息,如反汇编器(disassemblers),反编译器(decompilers),调试器(debuggers)等

书籍(books)

Level 0:入门系列(Unleashed series),21天系列(21 days series),24小时系列(24 hour series),傻瓜系列(dummies series)

Level 1:《Code Complete(代码大全)》,《Don’t Make me Think》,《Mastering Regular Expressions(精通正则表达式)》

Level 2:《Design Patterns(设计模式)》,《Peopleware(人件)》,《Programming Pearls(编程珠玑)》,《Algorithm Design Manual(算法设计手册)》,《Pragmatic Programmer(卓有成效的程序员)》,《Mythical Man month(人月神话)》

Level 3:《Structure and Interpretation of Computer Programs(计算机程序的构造和解释)》,《Concepts Techniques, Models of Computer Programming》,《Art of Computer Programming(计算机编程艺术)》,《Database systems , by C. J Date》,《Thinking Forth》,《Little Schemer

博客(blogs)

Level 0:听过但没时间

Level 1:阅读技术/编程/软件工程的博客,定义发表博客

Level 2:维护一个链接博客,存放已收集的一些有用的文章和工具的链接集合

Level 3:维护一个博客,与他人分享自己对于编程的见解和想法。