Programmer Competency Matrix
原文: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 数据库系统 |
博客 | 听说过,但从来没有时间阅读 | 阅读科技/编程/软件工程博客,定期收听播客 | 维护一个链接博客,收集一些他/她收集的有用的文章和工具 | 维护一个博客,在其中分享个人对编程的见解和想法 |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment