英文原文:《Programmer Competency Matrix》
Note that the knowledge for each level is cumulative.
Being at level n implies that you also know everything from the levels lower than n.
Computer Science
|
$ 2^n$ |
$n^2$ |
$n$ |
$log(n)$ |
数据结构 |
不知道数组和链表的差异 |
能够解释和使用数据、链表、字典等,并能够用于实际的编程任务 |
了解基本数据结构时间和空间的折中,比如数组vs链表,能够解释哈希表如何实现以及如何处理冲突,了解优先队列以及如何实现,等等 |
高等数据结构知识,比如B树、二项堆、斐波那契堆、AVL树、红黑树、跳表、前缀树等 |
算法 |
不能够找出一个数组的平均值 |
排序、搜索、数据的结构遍历以及检索算法 |
树,图,简单的贪婪算法和分治算法,有能力了解矩阵各层的相关性 |
能够识别和编写动态规划方案,良好的图算法知识,良好的数值估算的知识,能够鉴定NP问题 |
系统编程 |
不知道何为编译器、链接器、解释器 |
对编译器、链接器、解释器有基本的了解。知道什么是汇编代码以及在硬件层如何工作。有一些虚拟内存和分页知识 |
了解内核模式、用户模式、多线程、同步原语以及它们是怎么实现的,能够阅读汇编代码。了解网络协议和socket级别编程 |
了解整个程序堆栈、硬件(CPU+内存+中断+微码)、二进制代码、汇编、静态和动态链接、编译、解释、JIT编译、GC、堆、栈、内存寻址 等 |
Software Engineering
|
$ 2^n$ |
$n^2$ |
$n$ |
$log(n)$ |
源码版本控制 |
通过日期备份文件夹 |
VSS和初级的CVS/SVN用户 |
熟练地使用CVS和SVN特性。知道如何分支和归并,使用程序库补丁安装特性等 |
有分布式VCS系统的知识。尝试过Bzr/Mecurial/Darcs/GIT |
构建自动化 |
只知道在IDE下编译 |
知道如何在命令行下编译系统 |
可以建立脚本以构建基础系统 |
可以建立脚本以构建系统、文档、安装程序、生成发布概要并且在版本控制内打tag |
自动化测试 |
认为所有的测试都是测试员的工作 |
能够编写自动化的单元测试,能够为正在编写的代码提出良好的测试用例 |
按照TDD方式编写代码 |
理解并能够设置自动化功能,自动加载、自动性能测试、自动UI测试等 |
Programming
|
$ 2^n$ |
$n^2$ |
$n$ |
$log(n)$ |
问题拆解 |
只有复制黏贴才能复用的直线式代码 |
能够把问题分散到多个函数中 |
能够相处可以复用的函数/对象来解决整体的问题 |
使用适宜的数据结构和算法,写出通用的面向对象代码来封装问题中易改变的层面 |
系统拆解 |
无法跳到单一文件/类更高的层面 |
在相同的平台/技术上能够分拆问题空间以及设计方案 |
能够设计跨技术、跨平台的系统 |
能够可视化和设计具有多种产品线和与外部系统集成的复杂系统。同时应该有能力设计支撑系统,比如监控、报告、故障恢复等等 |
交流 |
无法向同伴表达想法、主意。拼写、语法欠缺 |
同伴能了解你在说什么,有良好的拼写和语法能力 |
能够和同伴进行高效的交流 |
能够以明确的方式理解和交流思想、设计、创意、规范,并且适应各种上下文 |
单文件代码组织 |
同一文件中组织没有依据 |
按逻辑或可访问性分组方法 |
代码分块,引用其他文件有良好的注释 |
文档头部有许可声明,良好的注释,使用长空白。文档优雅 |
跨文件代码组织 |
对跨文件代码组织一无所知 |
相关文件在同一文件夹下 |
每个文件有各自独立目的,比如一个类的定义、一个特性的实现 |
在物理级别上的代码组织与设计密切匹配,查看文件名和文件夹分布可以深入了解设计 |
源码树组织 |
一切都在一个文件夹下 |
初步将代码分散进对应逻辑的文件夹 |
没有循环依赖,二进制文件、库、文档、构建程序、第三方代码都组织进合适的文件夹内 |
源码树的物理布局与逻辑层次、组织方式相匹配,可以通过目录名称合组织方式洞察设计理念 |
代码可读性 |
单音节名称 |
对文件名、变量、类、方法等有良好的的命名 |
没有长功能,对不寻常代码、bug修复、代码假设等进行注释 |
使用断言验证代码假设,自然的代码流(没有深度嵌套的方法或条件句) |
防御式编程 |
不知道这个概念 |
检查代码中所有的参数,对关键的假设进行断言 |
确保检查了返回值和处理了代码失败的异常 |
有自己的库来帮助防御式编程,编写单元测试模拟故障 |
错误处理 |
仅针对正常流程编码 |
基本的对可能抛出异常/生成错误的代码进行错误处理 |
确保错误/异常以正确的状态离开程序, 资源、连接、内存都被正确地清理 |
在可能的异常进行编码检测, 在所有代码层级中维护一致的异常处理策略,具有对整个系统进行异常处理的指导方针 |
IDE |
基本用作文本编辑 |
熟悉UI上的多种方式,能够通过菜单高效地使用IDE |
熟悉大部分常用操作的快捷键 |
曾写过自定义宏 |
API |
需要经常查询文档 |
能记住常用的API |
对API具有广度和深度的了解 |
写过在 API 上的类库来帮助简化常用的任务以及给 API 填坑 |
框架 |
除了核心平台没使用过其它任何框架 |
听过但没用过平台上流行的框架 |
精通多个框架,并精通这些框架的习语 |
框架作者 |
需求分析 |
拿到给定需求并按规格编码 |
能够想到规格中缺失的问题 |
理解完整的蓝图并产生整个需要被纳入规格的范围 |
能够基于经验对给定需求建议更好的替代方案和流程 |
脚本处理 |
不了解脚本工具 |
BAT 文件/ shell 脚本 |
Perl/Python/Ruby/VBScript/Powershell |
曾写过并发布过可重用代码 |
数据库 |
认为 Excel 是数据库 |
了解基本数据库概念、规范化、ACID、事务, 并能书写简单的 SELECT 语句 |
能够设计良好的规范化的系统图式, 时时记住必须运行的查询,精通视图、存储过程、触发器和用户定义类型的使用, 了解集群和非集群索引间的差别, 精通 ORM 工具的使用 |
可作为基本的数据库管理员, 性能优化, 索引优化, 编写高级 SELECT 查询, 能使用关系型 SQL 替换游标的使用, 理解数据在内部是如何存储的, 了解数据库应该如何做镜像、副本等, 理解两相提交如何运作 |
Experience
|
$ 2^n$ |
$n^2$ |
$n$ |
$log(n)$ |
专业语言经验 |
命令式或面向对象 |
命令式、面向对象和声明式(SQL), 如果理解静态vs动态类型,弱类型vs强类型及静态推断类型有加分 |
函数式, 如果理解惰性求值、柯里化、延续有加分 |
并发(Erlang, Oz) 和逻辑(Prolog) |
专业平台经验 |
1 |
2-3 |
4-5 |
6+ |
专业经验年限 |
1 |
2-5 |
6-9 |
10+ |
领域知识 |
没有领域知识 |
至少在该领域的一个产品上工作过 |
在相同领域的多个产品上工作过 |
领域专家, 在该领域设计并实现过多个产品/解决方案, 精通该领域使用的标准术语、协议 |
Knowledge
|
$ 2^n$ |
$n^2$ |
$n$ |
$log(n)$ |
开发工具 |
仅限于主要的IDE |
知道一些流行且符合标准的备选工具 |
对编辑器、调试器、IDE、开源的备选方案有很好的了解。比如了解或熟悉《Scott Hanselman 的威力工具表》 |
实际编写过工具和脚本, 发表过有加分 |
代码库知识 |
从未阅读过代码库 |
基本了解代码布局,知道如何构建系统 |
熟悉代码库工作原理, 实现过几个 BUG 修复,可能也有几个小特性实现 |
在代码库中实现多个大的特性, 能够很容易构想大多数特性或 BUG 修改会对代码库造成的变更 |
新兴技术的知识 |
没听说过新兴技术 |
偶尔听过新兴技术 |
下载过 alpha 预览/CTP/beta 版本,并阅读过一些文章和手册 |
玩过预览版,并利用它构建过一些实际的东西, 将其分享给其它人有加分 |
平台内部 |
不了解平台内部 |
对平台内部如果运作有基本了解 |
深入了解平台内部, 能够想象出平台如何接受程序并将其转换为可执行代码 |
给平台内部写过工具来增强或提供有用信息。 如反汇编、反编译、调试器等 |
书籍 |
菜鸟系列,21天系列,24小时系列,蠢货系列… |
《代码大全》,《别让我思考》, 《精通正则表达式》 |
设计模式》,《人件》,《代码珠玑》,《算法设计手册》,《程序员修炼之道》,《人月神话》 |
《计算机程序设计与解释》,《事务处理:概念与技术》,《计算机程序设计模型》,《计算机程序设计艺术》,《数据库系统导论》 C.J Date版,《Thinking Forth》 ,《Little Schemer》 |
博客 |
没时间看 |
经常阅读技术/编程/软件工程相关博客及听播客 |
维护收集的有用文章和工具的博客链接 |
维护收集的有用文章和工具的博客链接 |