程序员能力矩阵 Programmer Competency Matrix

计算机科学 Computer Science

2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
数据结构 不了解数组和链表的区别 能解释并在实际编程任务中使用数组、链表和字典等 理解基本数据结构如数字和链表在空间和时间上的权衡;
能够解释哈希表可以如何实现并能够处理冲突;
了解优先级队列及其实现方式等
了解高级数据结构,
如 B-tree、
项式和斐波那契堆、
AVL/红黑树、伸展树、
跳表、tries 等
算法 无法找到数组中的数字的平均值 基本排序、搜索和数据结构遍历和检索算法 树、图、简单贪心和分治算法,
能够理解这个矩阵的关联性
能够识别并编码出动态规划算法,
精通图算法,
精通数值计算算法,
能够识别 NP 难题 等
系统编程 不了解编译器、链接器或解释器为何物 基本理解编译器、链接器和解释器。
了解汇编代码是什么,并知道在硬件层是如何运作的。
了解虚拟内存和页
理解内核模式和用户模式、多线程、同步原语及其实现
能够阅读汇编代码
理解网络如何运作,了解网络协议及 socket 层编程
理解整个编程栈:
硬件(CPU+内存+缓存+中断+多核)、二进制代码、汇编、
静态和动态链接、编译、解释、JIT 编译、
垃圾回收、堆、栈、
内存寻址...

能和具有很高的 topcoder 排名的人一起工作简直太幸运了!

软件工程 Software engineering

2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
源码版本控制 按天文件夹备份 VSS 和初步 CVS/SVN 使用者 静通 CVS 和 SVN 特性
知道如何进行分支和合并
使用补丁来设置仓库属性等
理解分布式 VCS 系统
已使用了 Bzr/Mercurial/Darcs/Git
构建自动化 仅知道如何从 IDE 进行构建 知道如何从命令行构建系统 能设置脚本来构建基本系统 能设置脚本来构建系统
以及文档、安装器、生成发布文档
及在源码版本控制中生成 tag
自动化测试 认为所有测试都是测试人员的工作 已经编写了自动化单元测试
对书写的代码都写有良好的单元测试用例
以 TDD 方式编写代码 理解并能够设置自动化功能测试
负载/性能测试
UI 测试

程序设计 Programming

2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
问题分解 仅通过复制粘贴代码来进行重用 能将问题分解为多个函数 能提供解决整体问题的可重用函数/对象 使用合适的数据结构和算法
能提供通用/面向对象的代码来封装问题中会变化的方面
系统分解 无法从单个文件/类以上的高度来思考 能够在相同的平台/技术内拆分问题空间及设计解决方案 能够设计跨多种技术/平台的系统 能够可视化并设计带有多个产品线的复杂系统及其与外部系统的集成
同时能够设计运维支持系统如监控、报告、故障恢复等
沟通 无法给同事表达想法/意见
拼写和语法较差
同事可以理解说的是什么
良好的拼写和语法
能和同事有效地沟通 能够以清晰的方式理解和沟通观点/设计/意见/规范
并根据不同的上下文调整沟通方式

沟通 在评价一个程序员时是常常被低估的一项。
随着编程任务被外包给非英语母语地区变得越来越多,这个问题会更加突出。
我了解到很多项目因为程序员无法理解沟通的是什么而导致项目失败。

2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
文件内代码组织 没有文件内代码组织的迹象 方法根据逻辑或访问性进行分组 代码按区块分组
并且具有到其它源码文件的良好的注释
文件包含许可证头部、摘要,有良好的注释和一致的空格使用。
文件应该看起来漂亮
跨文件代码组织 不考虑跨文件代码组织 相关文件用目录来分组 每个物理文件都具有唯一的目的,
如一个类定义
一个特性实现等
物理层的代码组织紧紧匹配设计
且查看目录和文件名称可以洞察其设计
源码树组织 所有东西都在一个目录中 基本分离代码到逻辑目录中 没有循环依赖
二进制包、类库、文档、构件、第三方代码都组织到合适的目录中
物理源码树布局匹配逻辑层级并组织。
目录名称和组织提供了对系统设计的洞察

这两者差别在于组织的尺度上,源码树组织关系到定义整个系统的工件集

2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
代码可读性 单音节名称 对文件、变量、类、方法有良好的命名 没有过长的函数
注释解释了不寻常的代码、BUG 修复、代码假设等
代码假设由 asset 来验证
代码流自然 - 没有深度嵌套的条件或方法
防御编程 不理解这个概念 在代码中检查所有参数和 assert 重要假设 确保检查返回值以及检查可能失败的代码的异常 有自己的类库来帮助防御编程
编写单元测试来模拟错误
错误处理 仅针对正常流程编码 基本的对可能抛出异常/生成错误的代码进行移除处理 确保错误/异常以正确的状态离开程序
资源、连接、内存都被正确地清理
在可能的异常进行编码检测
在所有代码层级中维护一致的异常处理策略
具有对整个系统进行异常处理的指导方针
2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
IDE IDE 基本用作文本编辑 熟悉 UI 上的多种方式,能够通过菜单高效地使用 IDE 熟悉大部分常用操作的快捷键 曾写过自定义宏
API 需要经常查询文档 能记住常用的 API 对 API 具有广度和深度的了解 写过在 API 上的类库来帮助简化常用的任务以及给 API 填坑
框架 除了核心平台没使用过其它任何框架 听过但没用过平台上流行的框架 精通多个框架,并精通这些框架的习语 框架作者
2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
需求 拿到给定需求并按规格编码 能够想到规格中缺失的问题 理解完整的蓝图并产生整个需要被纳入规格的范围 能够基于经验对给定需求建议更好的替代方案和流程
脚本 不了解脚本工具 BAT 文件/ shell 脚本 Perl/Python/Ruby/VBScript/Powershell 曾写过并发布过可重用代码
数据库 认为 Excel 是数据库 了解基本数据库概念、规范化、ACID、事务,
并能书写简单的 SELECT 语句
能够设计良好的规范化的系统图式
时时记住必须运行的查询
精通视图、存储过程、触发器和用户定义类型的使用
了解集群和非集群索引间的差别
精通 ORM 工具的使用
可作为基本的数据库管理员
性能优化
索引优化
编写高级 SELECT 查询
能使用关系型 SQL 替换游标的使用
理解数据在内部是如何存储的
理解索引在内部是如何存储的
了解数据库应该如何做镜像、副本等
理解两相提交如何运作

经验 Experience

2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
具有专业经验的语言 命令式或面向对象 命令式、面向对象和声明式(SQL)
如果理解静态vs动态类型,弱类型vs强类型及静态推断类型有加分
函数式
如果理解惰性求值、柯里化、延续有加分
并发(Erlang, Oz) 和逻辑(Prolog)
具有专业经验的平台 1 2-3 4-5 6+
具有专业经验的年数 1 2-5 6-9 10+
领域知识 没有领域知识 至少在该领域的一个产品上工作过 在相同领域的多个产品上工作过 领域专家
在该领域设计并实现过多个产品/解决方案
精通该领域使用的标准术语、协议

学识 Knowledge

2n(level 0) n2(level 1) n (level 2) log(n) (level 3)
工具知识 局限于主要IDE(VS.NET, Eclipse 等) 了解一些流行和标准工具的替代方案 对编辑器、调试器、IDEs、开源替代方案有深入了解,如有些人主要从 Scott Hanselman 的工具列表中了解一些
使用过 ORM 工具
实际编写过工具和脚本
如果发布过有加分
接触的语言 命令式或面向对象 命令式、面向对象和声明式(SQL)
如果理解静态vs动态类型,弱类型vs强类型及静态推断类型有加分
函数式
如果理解惰性求值、柯里化、延续有加分
并发(Erlang, Oz) 和逻辑(Prolog)
代码库知识 从未阅读过代码库 基本了解代码布局,知道如何构建系统 熟悉代码库工作原理
实现过几个 BUG 修复,可能也有几个小特性实现
在代码库中实现多个大的特性
能够很容易构想大多数特性或 BUG 修改会对代码库造成的变更
新兴技术的知识 没听说过新兴技术 偶尔听过新兴技术 下载过 alpha 预览/CTP/beta 版本,并阅读过一些文章和手册 玩过预览版,并利用它构建过一些实际的东西
将其分享给其它人有加分
平台内部 不了解平台内部 对平台内部如果运作有基本知识 深入了解平台内部,
能够构想出平台如何接收程序并将其转换为可执行代码
写过工具来增强或提供平台内部信息。
如反汇编、反编译、调试器等
书籍 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
博客 听过但没时间看 经常阅读技术/编程/软件工程相关博客及听播客 维护收集的有用文章和工具的博客链接 维护分享了自己个人对编程的思考和想法的博客
comments powered by Disqus