原文:Programmer Competency Matrix

注意:每个水平的知识是累积的

计算机科学
2n (0级) N2(第1级) N (第2级) Log (n)(第3级)
数据结构 不知道数组和链表的区别 能够解释和在实际编程任务中使用数组、链接列表、字典等 懂得权衡基本数据结构,数组与链接列表空间和时间,能够解释如何实现哈希表并可处理碰撞,优先级队列以及如何实现等 懂得高级数据结构,如B树的知识,二项式堆和斐波那契堆,AVL/红黑树中,展开树,跳跃表,尝试等
算法 不能找到数组中的平均值 基本排序、搜索和遍历数据结构和检索算法 树图,简单的贪婪和分治算法,能理解这个矩阵水平的相关性。 能够识别和编写动态规划解,具有良好的图形算法的知识,良好的数值计算算法的知识,能够识别NP问题等
系统程序设计 不知道什么是编译器、链接器或解释器 对编译器、链接器和解释器有基本的理解。理解什么是汇编代码,以及在硬件级别上是如何工作的。关于虚拟内存和分页的一些知识 理解内核模式与用户模式、多线程、同步原语以及它们是如何实现的,能够读懂汇编代码。了解网络如何工作,了解网络协议和套接字级别的编程 了解整个编程堆栈,硬件(CPU + 内存 + 缓存 + 中断 + 微代码) ,二进制代码,汇编,静态和动态链接,编译,解释,JIT 编译,垃圾收集,堆,堆栈,内存寻址..
软件工程
2n (0级) N2(第1级) N (第2级) Log (n)(第3级)
源代码版本控制源代码版本控制 按日期备份文件夹 TFS 和初始SVN用户 熟练使用 TFS 和 SVN 特性。知道如何分支和合并,使用补丁设置存储库属性等 了解分布式 VCS 系统。已经尝试过 Git
自动化构建 只知道如何从 IDE 构建 知道如何从命令行构建系统 可以设置脚本来构建基本的系统 可以设置脚本来构建系统,也可以设置文档、安装程序、生成发布说明和标记源代码控制中的代码
自动化测试 认为所有的测试都是测试人员的工作 编写了自动化的单元测试,并为正在编写的代码提供了良好的单元测试用例 以 TDD 方式编写代码 理解并能够设置自动化的功能、负载/性能和 UI 测试
编程
2n (0级) N2(第1级) N (第2级) Log (n)(第3级)
问题分解 只有复制粘贴的直线代码可重用 能够将问题分解为多个函数 能够提出可重用的函数/对象来解决整个问题 使用适当的数据结构和算法,并提出通用的/面向对象的代码,这些代码封装了可能发生变化的问题的各个方面
系统分解 无法超越单个文件/类的级别进行思考 能够打破问题空间和设计解决方案,只要它是在相同的平台/技术 能够设计跨多种技术/平台的系统 能够可视化和设计复杂的系统与多个产品线和与外部系统的集成。还应该能够设计操作支持系统,如监视,报告,故障转移等
沟通 不能向同龄人表达思想/想法。拼写和语法不好 同龄人能听懂别人在说什么。拼写和语法都很好 能够有效地与同伴交流 能够明确的方式理解和沟通的想法/设计/创意/规格和在不同的上下文中调整
文件中的代码组织 档案中没有组织的证据 方法按逻辑或可访问性分组 代码按区域分组,并使用对其他源文件的引用进行了很好的注释 文件有许可头,摘要,很好的注释,一致的空白使用。文件应该看起来漂亮
跨文件的代码组织 没有考虑跨文件组织代码 相关文件被分组到一个文件夹中 每个物理文件都有一个独特的用途,例如一个类定义,一个特性实现等 代码组织在物理层面上与设计紧密匹配,通过查看文件名和文件夹分布可以深入了解设计
源码组织 所有东西都放在一个文件夹里 将代码分成逻辑文件夹的基本方法 没有循环依赖项、二进制文件、库、文档、构建、第三方代码全部组织到适当的文件夹中 源码的物理布局与逻辑层次结构和组织相匹配。目录名称和组织提供了对系统设计的深入了解
代码可读性 单音节的名字 文件、变量类、方法等的好名字 没有长函数,非常规代码、错误修复、代码假设的注释 代码假设使用断言进行验证,代码自然流动——没有条件或方法的深度嵌套
防御性编码 不明白这个概念 检查代码中的所有参数并断言关键假设 确保检查返回值并检查围绕可能失败的代码的异常 拥有自己的库来帮助进行防御性编码,编写模拟错误的单元测试
错误处理 只有正常情况下的代码 围绕可能引发异常/生成错误的代码的基本错误处理 确保错误/异常使程序处于良好状态,资源、连接和内存都被正确清理 在可能的异常之前进行代码检测,在所有的代码层保持一致的异常处理策略,为整个系统 提出了异常处理的指导方针
IDE 主要使用 IDE 进行文本编辑 了解IDE的界面,能够有效地使用 IDE菜单 了解大多数常用操作的键盘快捷键 编写了自定义宏
API 需要经常查找文档 记得最常用的 API 对 API 有广泛而深入的了解 编写了位于 API 之上的库,以简化经常使用的任务并填补 API 中的空白
架构 没有使用核心平台之外的任何框架 听说过但没有使用过该平台可用的流行框架 以专业人员身份使用过不止一个框架,熟悉框架的习惯用法 框架的作者
需求 根据规格要求和代码 在规范中提出有关遗漏用户用例的问题 了解完整的用户用例,并提出整个领域需要规格 能够根据经验提出更好的备选方案和流程以满足给定的需求
脚本 不懂脚本工具 了解批处理文件/shell 脚本 了解Perl/Python/Ruby/VBScript/Powershell语言 编写并发布可重用代码
数据库 认为 Excel 是一个数据库 了解基本的数据库概念、规范化、 ACID、事务,能够编写简单的查询 能够设计良好和规范化的数据库模式,牢记需要运行的查询,熟练使用视图、存储过程、触发器和用户定义的类型。知道聚集索引和非聚集索引之间的区别。熟练使用 ORM 工具 能够进行基本的数据库管理、性能优化、索引优化、编写高级选择查询、能够用关系 sql 替换游标的使用、理解数据如何在内部存储、理解索引如何在内部存储、理解数据库如何镜像、复制等。了解两阶段提交的工作原理
经验
2n (0级) N2(第1级) N (第2级) Log (n)(第3级)
有专业的语言经验 命令式或面向对象 命令式的、面向对象的和声明式的(SQL) ,如果他们理解静态类型和动态类型,弱类型和强类型以及静态推断类型,就会有额外的好处 功能性的,如果他们了解懒惰的评估,咖喱,延续,增加奖金 并发(Erlang,Oz)和逻辑(Prolog)
有专业经验的平台 1个 两到三个(如C#与Python) 4-5个 6个以上
多年的专业经验 1年 2-5年 6-9年 10年以上
领域知识 对这个领域一无所知 已经在该领域中至少开发了一个产品 曾在同一领域的多个产品上工作 领域专家。设计并实现了该领域的几个产品/解决方案。精通该领域使用的标准术语和协议
知识
工具知识 仅限于主要IDE (VS.Net, Eclipse etc.) 了解一些流行和标准工具的替代品 熟悉编辑器、调试器、 IDE、开放源代码等。例如,有人知道 Scott Hanselman 的电动工具列表中的大部分工具。使用了 ORM 工具 实际上已经编写了工具和脚本,如果他们已经发布了额外的奖金
接触到的语言 命令式或面向对象 命令式的、面向对象的和声明式的(SQL) ,如果他们理解静态类型和动态类型,弱类型和强类型以及静态推断类型,就会有额外的好处 功能性的,如果他们了解懒惰的评估,咖喱,延续,增加奖金 并发(Erlang,Oz)和逻辑(Prolog)
代码库知识 从没看过代码库 代码布局的基本知识以及如何构建系统 良好的代码库工作知识,已经实现了几个 bug 修复,可能还有一些小特性 已经在代码库中实现了多个大特性,并且可以很容易地显示大多数特性或 bug 修复所需的更改
对未来技术的了解 没有听说过即将到来的技术 听说了这个领域即将出现的新技术 已经下载了 alpha 预览版/CTP/beta 并阅读了一些文章/手册 玩过预告片,并且实际上已经用它建立了一些东西,作为奖励,与其他人分享
平台内部结构 对平台内部原理一无所知 具有平台内部工作的基本知识 深入了解平台的内部原理,可以直观地看到平台是如何将程序转换成可执行代码的 编写了增强或提供平台内部信息的工具,例如反汇编程序、反编译程序、调试程序等
21天系列,24小时系列,傻瓜系列.. 《代码大全》, 《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 数据库系统
博客 听说过,但从来没有时间阅读 阅读科技/编程/软件工程博客,定期收听播客 维护一个链接博客,收集一些他/她收集的有用的文章和工具 维护一个博客,在其中分享个人对编程的见解和想法