Programmer Competency Matrix

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