March 26, 2016 / Jason Wang
此文翻译自 Sijin Joseph的“Programmer Competency Matrix”
程序员能力矩阵
Programmer Competency Matrix
注意每个层次的知识是累积的。层次 n 意味着你也掌握了低于层次 n 的知识
| Computer Science
(计算机科学) |
|||||
|---|---|---|---|---|---|
| Domain | 2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments
(注释) |
| data structures
(数据结构) |
不知道数组和链表的区别 | 在编程实践中,能够解释并使用数组、链表、字典等 | 知道基本数据结构的空间和时间的权衡,比如数组与链表的对比
能够解释如何实现哈希表,并能处理冲突 知道优先级队列及其实现 |
知道高级数据结构,如:B-tree、二项堆和斐波那契堆、AVL树、红黑树、伸展树、跳转表、字典树等 | |
| algorithms
(算法) |
不会找出数组元素的平均值 | 基本的排序、搜索、数据结构遍历和检索算法 |
树、图、简单贪婪和分治算法
能够理解此能力矩阵每层的相关性 |
能够识别并编写动态规划程序
非常了解图相关的算法 非常了解数值计算算法 能够识别 NP 问题等 |
Working with someone who has a good topcoder ranking would be an unbelievable piece of luck!
(与高等级的程序员一起工作是一种难以置信的幸运) |
|
systems programming
(系统编程) |
不知道什么是编译器、链接器、解释器 |
基本理解编译器、链接器和解释器
知道什么是汇编代码,知道硬件层是如何工作的 知道一些虚拟内存和分页的知识 |
理解内核模式和用户模式
理解多线程,同步原语以及它们是如何实现的 能够阅读汇编代码 理解网络是如何工作的 理解网络协议和socket编程 |
理解整个编程知识栈
理解硬件(CPU + 内存 + 中断 + 微代码) 理解二进制代码、汇编、静态和动态链接、编译、解释、JIT编译、垃圾收集、堆、栈、内存寻址 |
|
| Software Engineering
(软件工程) |
|||||
| 2n(Level 0) | n2(Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
| source code version control
(代码版本控制) |
按日期备份文件夹 | VSS,初级 CVS/SVN 用户 |
熟练使用CVS、SVN特性
知道如何建立分支和合并 知道如何使用patch等 |
分布式VCS系统的知识。
使用过Bzr/Mercurial/Darcs/Git |
|
| build automation
(构建自动化) |
只知道如何通过 IDE 构建 | 知道如何通过命令行构建系统 | 知道如何通过配置脚本来构建基本系统 |
能够配置脚本来构建系统,生成文档、安装包、Release Note
会为代码打tag |
|
| automated testing
(自动化测试) |
认为测试是tester的事 |
写过自动化单元测试的代码
能为所写的代码提出好的单元测试用例 |
以TDD(Test-Driven Development)的方式写过代码 | 理解并能够建立自动化的 函数、负载/性能和 UI 测试 | |
| Programming
(编程) |
|||||
| 2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
| problem decomposition
(问题分解) |
只会一行一行地码字,通过“复制粘贴”的方式重用代码 | 能够将问题分解为多个函数 | 能够想出可复用的函数/对象来解决整个问题 | 能使用合适的数据结构和算法,并能写出通用的、面向对象的代码,用以封装问题中需要变化的部分 | |
| systems decomposition
(系统分解) |
无法想象比单个文件/类更高的层次 | 能够为同一平台、技术的问题设计解决方案 | 能够设计跨技术、跨平台系统 |
能够理解和设计带有多个产品线,并需要集成外部系统的复杂系统。
同时能够设计运行支持系统,如系统监控、报告、故障恢复等。 |
|
| communication
(沟通) |
不能表达出想法。糟糕的拼写和语法 | 同事能了解你在说什么。好的拼写和语法 | 能与同事有效沟通 | 能够以明确的方式理解和交流思想/设计/创意/规格,能够根据场景调整交流方式 | 这是一个往往被低估,却是一个判断程序员非常关键的标准。随着非英语地区外包的增加,这个问题变得更加突出。我知道的一些项目由于程序员不能理解意图而导致失败 |
| code organization within a file
(文件内代码组织) |
没有任何组织依据 | 方法按逻辑或可访问性分组 | 代码按区域分组,并有良好的注释,包含对其他源文件的引用 |
文件有License头、摘要,良好的注释,以及一致的空白使用。
文件应当规整。 |
|
| 2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
| code organization across files
(跨文件代码组织) |
没想过跨文件组织代码 | 相关的文件归入同一个文件夹 | 每个物理文件只有一个单一目的,如单个类定义、单一特性的实现等 | 物理层面的代码组织与设计相匹配。通过文件名和目录结构可以看出设计 | |
| source tree organization
(源代码树组织) |
所有代码全在一个文件夹里 | 只有一些按逻辑区分的代码分隔 |
没有循环依赖。
二进制文件、库、文档、生成文件、第三方代码被组织在合适的文件夹中。 |
源代码物理上与逻辑架构相匹配。
通过目录名和目录组织可以看出系统设计 |
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. |
| code readability
(代码可读性) |
单音节名字 | 对文件、变量、方法有好的命名 | 没有长函数,通过注释说明:不常见的代码、bug修复和代码假设 | 使用断言验证代码假设,自然的代码流没有深度嵌套的条件和方法 | |
| defensive coding
(保护性编码) |
不知道这个概念 | 检查所有参数,并对关键的代码假设启用断言 | 确保检查返回值和由可能失败的代码引起的异常 | 有自己的库来帮助编写保护性编程,编写单元测试来模拟故障 | |
| 2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
| error handling
(错误处理) |
只编写愉快的case | 对可能抛出异常或生成错误的代码进行基本的错误处理 | 确保正确地退出错误或异常,退出时正确地清理Resources(资源)、Connection(连接)和内存 | 编码时检测可能出现的异常,在代码的所有层面,维持一致的异常处理策略,提出整个系统的错误处理准则。 | |
| IDE | 大部分用来编辑代码 | 了解IDE界面的功能,能够高效地通过菜单使用IDE | 了解常用操作的快捷方式 | 写过自定义宏 | |
| API | 需要经常查看文档 | 记住最常用的API | 广泛而深度地了解API | 编写过基于已有API的库,来简化常用任务或填补API的空白 | E.g. of API can be Java library, .net framework or the custom API for the application |
| frameworks
(框架) |
没有用过核心平台以外的任何框架 | 听过但没有用过平台上可用的常用框架 | 精通并使用过不止一个框架,熟悉框架的设计理念 | 框架作者 | |
| 2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
| requirements
(需求) |
按需求和规格编码 | 对规格中的遗漏提出疑问 | 理解完整的图景,并提出应当提供spec的所有范围 | 根据经验,针对所给的需求提出更好的可选方案和流程 | |
| scripting
(脚本化) |
不具备脚本化工具的知识 | 批处理文件/shell脚本 | Perl/Python/Ruby/VBScript/Powershell | 写过并且发表过可重用的代码 | |
| database
(数据库) |
认为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) | Comments | |
| languages with professional experience
(专业语言经验) |
命令式和面向对象式 |
命令式,面向对象式和声明式(SQL)。
如果了解静态类型 vs 动态类型,弱类型 vs 强类型以及静态推断类型则可加分。 |
函数式,如果了解 lazy evaluation(惰性求值),currying, continuations则可加分 | 并行式 (Erlang, Oz) 和逻辑型 (Prolog) | |
| platforms with professional experience
(专业平台经验) |
1 | 2-3 | 4-5 | 6+ | |
| years of professional experience
(专业经验年限) |
1 | 2-5 | 6-9 | 10+ | |
| domain knowledge
(领域知识) |
没有该领域的知识 | 在该领域中至少为一个产品工作过 | 在同一领域中为多个产品工作过 |
领域专家。
在该领域设计和实现数种产品/方案。 精通该领域使用的标准条款和协议。 |
|
| Knowledge
(知识) |
|||||
| 2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
| tool knowledge
(工具知识) |
仅限于主要IDE (VS.Net, Eclipse等) | 知道一些流行和标准的工具的可选工具 |
对编辑器、调试器、IDE、开源的备选工具有很好的了解。
使用过ORM工具。 |
实际地编写过工具和脚本,如果发布过这个工具,则有加分 | |
| languages exposed to
(语言使用) |
命令式和面向对象式 |
命令式,面向对象式和声明式(SQL)。
如果了解静态类型 vs 动态类型,弱类型 vs 强类型以及静态推断类型则可加分。 |
函数式,如果了解 lazy evaluation(惰性求值),currying, continuations则可加分 | 并行式 (Erlang, Oz) 和逻辑型 (Prolog) | |
| codebase knowledge
(代码库知识) |
从来没有了解过代码库 | 基本的代码层知识,了解如何构建系统 | 良好的代码库工作知识,修复过一些 bug,或者完成过一些小feature |
实现过代码库中的多个大的feature。
能够很容易地将大部分feature或bug的变化具像化。 |
|
| knowledge of upcoming technologies
(新技术知识) |
从未听说过新技术 | 听说过领域内的新技术 | 下载过预览版、CTP、beta版,并读取一些文章或手册 | 使用过预览版,而且使用它生成过一些东西,如果共享给其他人的话则有加分 | |
| 2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
| platform internals
(平台内部) |
对平台内部一无所知 | 了解平台内部工作的基本知识 | 深入了解平台内部,并能够理解平台如何将程序转换成可执行代码。 | 编写过增强平台或者为平台内部提供信息的工具。比如,反汇编器,反编译器,调试器等。 | |
| books
(书) |
Unleashed series, 21 days series, 24 hour series, dummies series… | Code Complete, Don’t Make me Think, Mastering Regular Expressions | Design Patterns, Peopleware, Programming Pearls, Algorithm Design Manual, Pragmatic Programmer, Mythical Man month | 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
(博客) |
听说过,但从来都没有时间 | 阅读科技、编程、软件工程的博客,并且经常收听播客 | 维护一个博客,包含收集博主收藏的一些有用的文章和工具的链接 | 维护一个博客,包含关于编程的一些个人见解和思考 |
Reference:
[1]. [译文]程序员能力矩阵 Programmer, http://blog.sina.com.cn/s/blog_53c05cad0100ha6m.html