The Programmer's Life

英文原文:《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》
博客 没时间看 经常阅读技术/编程/软件工程相关博客及听播客 维护收集的有用文章和工具的博客链接 维护收集的有用文章和工具的博客链接