程序员能力矩阵

<h1>[译文]程序员能力矩阵 Programmer Competency Matrix</h1>
<blockquote>注意:每个层次的知识都是渐增的,位于层次<em>n</em>,也蕴涵了你需了解所有低于层次<em>n</em>的知识。 </blockquote>
<table border="0"><tbody>
<tr>
<th colspan="5">计算机科学 Computer Science </th>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>数据结构</td>
<td>不知道数组和链表的差异 </td>
<td>能够解释和使用数组,链表,字典等,并且能够用于实际的编程任务。</td>
<td>了解基本数据结构时间和空间的折中,比如数组vs 链表,能够解释如何实现哈希表和处理冲突,了解优先队列及其实现。 </td>
<td>高等的数据结构的知识,比如B-树、二项堆、斐波那契堆、AVL树、红黑树、伸展树、跳跃表以及前缀树等。</td>
<td></td>
</tr>
<tr class="q">
<td>算法</td>
<td>不能够找出一个数组各数的平均值(这令人难以置信,但是我的确在应聘者中遇到过) </td>
<td>基本的排序,搜索和数据的遍历和检索算法。</td>
<td>树,图,简单的贪婪算法和分而治之算法,能够适度了解矩阵该层的含义。</td>
<td>能够辨识和编写动态规划方案,良好的图算法知识,良好的数值估算的知识,能够辨别NP问题等。 </td>
<td>Working with someone who has a good topcoder ranking would be an unbelievable piece of luck!</td>
</tr>
<tr class="q">
<td>编程体系</td>
<td>不知道何为编译器、链接器和解释器。 </td>
<td>对编译器、链接器、解释器有基本的了解。知道什么是汇编代码以及在硬件层如何工作。有一些虚拟内存和分页知识。 </td>
<td>了解内核模式vs用户模式,多线程,同步原语以及它们如何实现,能够阅读汇编代码。了解网络如何工作,了解网络协议和socket级别编程。 </td>
<td>了解整个程序堆栈、硬件(CPU+内存+中断+微码)、二进制代码、汇编、静态和动态链接、编码、解释、JIT(just-in-time)编译、内存碎片回收、堆、栈、存储器编址…</td>
<td></td>
</tr>
<tr>
<th colspan="5">软件工程 Software Engineering </th>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>源码版本控制</td>
<td>通过日期备份文件夹 </td>
<td>VSS和初级的CVS/SVN用户</td>
<td>熟练地使用CVS和SVN特性。知道如何分支和归并,使用程序库补丁安装特性等 </td>
<td>有分布式VCS系统的知识。尝试过Bzr/Mercurial/Darcs/Git</td>
<td></td>
</tr>
<tr class="q">
<td>自动化编译</td>
<td>只知道在IDE下编译 </td>
<td>知道如何编译在命令行下编译系统 </td>
<td>能够安装一个脚本构建基本的系统 </td>
<td>能够安装一个脚本来构建系统并且归档,安装程序,生成发布记录和给源码控制中的代码分配标签。</td>
<td></td>
</tr>
<tr class="q">
<td>自动化测试</td>
<td>认为所有的测试都是测试员的工作。 </td>
<td>能够编写自动化的单元测试,能够为正在编写的代码提出良好的测试用例。 </td>
<td>按照TDD (Test Driven Development)方式编写代码。</td>
<td>了解并且能够有效自动化安装,载入/性能和UI测试</td>
<td></td>
</tr>
<tr>
<th colspan="5">程序设计 Programming</th>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>问题分解</td>
<td>只有直线式的代码,通过复制粘贴来复用 </td>
<td>能够把问题分散到多个函数中 </td>
<td>能够想出可复用的函数/对象来解决大题的问题 </td>
<td>使用适宜的数据结构和算法,写出通用的/面向对象的代码来封装问题的易改变的层面。</td>
<td></td>
</tr>
<tr class="q">
<td>系统分解</td>
<td>N想不出比单一的文件/类更好的层面 </td>
<td>如果不在同一平台或没采用相同的技术,能够把问题空间和设计方案分解。 </td>
<td>能够设计跨技术/平台的系统。 </td>
<td>能够在多个产品线和与外部体系一体化中虚拟化和设计复制的系统。同时也能够设计支持系统监视、报告、故障恢复等。</td>
<td></td>
</tr>
<tr class="q">
<td>交流</td>
<td>不能向同伴表达想法/主意。匮乏拼写和语法的能力。 </td>
<td>同伴能了解你在说什么。有良好的拼写和语法能力。 </td>
<td>能够和同伴进行高效的交流</td>
<td>能够使用清晰的方式了解和交流想法/设计/主意/细则,能适应每种环境的交流 </td>
<td>This is an often under rated but very critical criteria for judging a programmer. With the increase in outsourcing of programming tasks to places where English is not the native tongue this issue has become more prominent. I know of several projects that failed because the programmers could not understand what the intent of the communication was.</td>
</tr>
<tr class="q">
<td>同一文件中代码组织</td>
<td>同一文件中组织没有依据 </td>
<td>按照逻辑性或者易接近的方法 </td>
<td>代码分块和对于其他源文件来说是易于是释,引用其他源文件时有良好的注释 </td>
<td>文档头部有许可声明,总结,良好的注释,一致的空格缩进。文档外观美观。</td>
<td></td>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>跨文件代码组织</td>
<td>没够想过给代码跨文件组织</td>
<td>相关文件按文件夹分组 </td>
<td>每个物理文件都有独立的目的,比如一个类的定义,一个特性的实现等。 </td>
<td>代码在物理层组织紧密,在文件名上与设计和外观相匹配,可以通过文件分布方式洞察设计理念。</td>
<td></td>
</tr>
<tr class="q">
<td>源码树组织</td>
<td>一切都放在一个文件夹内 </td>
<td>初步地将代码分散进对应逻辑的文件夹。 </td>
<td>没有循环依赖,二进制文件,库,文档,构建,第三方的代码都组织进合适的文件夹内。 </td>
<td>源码树的物理布局与逻辑层次、组织方式相匹配。可以通过目录名称和组织方式洞察设计理念。 </td>
<td>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.</td>
</tr>
<tr class="q">
<td>代码可读性</td>
<td>单音节的名称(在国内应该是那些类似用汉语拼音命名的习惯) </td>
<td>对文件、变量、类、方法等,有良好的命名。 </td>
<td>没有长函数、注释解释不常规的代码,bug修复,代码假设。 </td>
<td>代码假设验证使用断言,自然的代码流,没有深层嵌套的条件和方法</td>
<td></td>
</tr>
<tr class="q">
<td>防御性编码</td>
<td>不知道这个概念</td>
<td>检查代码中所有的参数,对关键的假设进行断言 </td>
<td>确保检查了返回值和使代码失败的异常。 </td>
<td>有自己的库来帮助防御性编程、编写单元测试模拟故障</td>
<td></td>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>错误处理</td>
<td>只给乐观的情形编码 </td>
<td>基本的代码错误处理,抛出异常/生成错误 </td>
<td>确保错误/异常留在程序中有良好的状态,资源,连接,内存都有被合适的清理。 </td>
<td>在编码之前察觉可能出现的异常,在代码的所有层次中维持一致性的异常处理策略,提出整个系统的错误处理准则。</td>
<td></td>
</tr>
<tr class="q">
<td>IDE</td>
<td>IDE大部分用来进行文本编辑 </td>
<td>了解其周围的接口,能够高效地通过菜单来使用IDE</td>
<td>了解最常操作的键盘快捷键 </td>
<td>编写自定义宏</td>
<td></td>
</tr>
<tr class="q">
<td>API</td>
<td>需要频繁地查阅文档 </td>
<td>把最频繁使用的API记在脑子里 </td>
<td>广阔且深入的API知识。 </td>
<td>为了使实际任务中常用API使用更加便捷,编写过API的上层库,填补API之间的缺口。 </td>
<td>E.g. of API can be Java library, .net framework or the custom API for the application</td>
</tr>
<tr class="q">
<td>框架</td>
<td>没有使用过主平台外的任何框架 </td>
<td>听过但没用过平台下流行的可用框架</td>
<td>在专业的职位中使用过一个以上的框架,通晓各框架的特色。</td>
<td>某框架的作者</td>
<td></td>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>需求分析</td>
<td>接受给定的需求和代码规格 </td>
<td>能对规格的遗漏提出疑问 </td>
<td>了解全面情况,提出需要被规格化的整体范围。</td>
<td>能够提出更好的可选方案,根据经验的浮现给出需求</td>
<td></td>
</tr>
<tr class="q">
<td>脚本</td>
<td>不具备脚本工具的知识 </td>
<td>批处理文件/shell脚本 </td>
<td>Perl/Python/Ruby/VBScript/Powershell </td>
<td>写过并且发表过可重用的代码</td>
<td></td>
</tr>
<tr class="q">
<td>数据库</td>
<td>认为Excel就是数据库 </td>
<td>知道基本的数据库概念,规范化、ACID(原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)、事务化,能够写简单的select语句 </td>
<td>能够牢记在运行时必要查询中设计良好的规范化数据库模式, 精通用户视图,存储过程,触发器和用户定义类型。知道聚集与非聚集索引之间的差异。精通使用ORM(Object Relational Mapping对象关系映射)工具 </td>
<td>能做基本的数据库管理,性能优化,索引优化,编写高级的select查询,能够使用相关sql来替换游标,理解数据内部的存储,了解如何镜像、复制数据库。知道两段数据提交如何工作</td>
<td></td>
</tr>
<tr>
<th colspan="5">经验 Experience </th>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>专业语言经验</td>
<td>命令式语言和面向对象语言 </td>
<td>命令式语言,面向对象语言和说明型语言(SQL),如果了解静态类型vs动态类型,弱类型vs强类型则有加分 </td>
<td>函数式语言,如果了解延缓求值,局部套用函数,延续则有加分 </td>
<td>并发语言(Erlang, Oz) 逻辑语言(Prolog)</td>
<td></td>
</tr>
<tr class="q">
<td>专业平台经验</td>
<td>1 </td>
<td>2-3 </td>
<td>4-5 </td>
<td>6+</td>
<td></td>
</tr>
<tr class="q">
<td>专业经验年龄</td>
<td>1 </td>
<td>2-5 </td>
<td>6-9 </td>
<td>10+</td>
<td></td>
</tr>
<tr class="q">
<td>领域知识</td>
<td>没有该领域的知识 </td>
<td>在该领域中曾经至少为一个产品工作过</td>
<td>在同一领域中为多个产品工作过 </td>
<td>领域专家。在该领域设计和实现数种产品/方案。精通该领域使用的标准条款和协议</td>
<td></td>
</tr>
<tr>
<th colspan="5">学识 Knowledge </th>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>工具知识</td>
<td>仅限于主要的IDE(VS.Net, Eclipse等) </td>
<td>知道一些流行和标准工具的备选方案 </td>
<td>对编辑器、调试器、IDE、开源的备选方案有很好的了解。比如某人了解大多数Scott Hanselman的威力工具列表中的工具,使用过ORM工具。</td>
<td>实际地编写过工具和脚本,如果这些被发布则有加分</td>
<td></td>
</tr>
<tr class="q">
<td>语言接触</td>
<td>命令式语言和面向对象语言</td>
<td>命令式语言、面向对象语言和说明型语言(SQL),如果了解静态类型vs动态类型、弱类型vs强类型则有加分 </td>
<td>函数式语言,如果了解延缓求值、局部套用函数、continuations (源于scheme中的一种高级控制结构)则有加分 </td>
<td>并发语言(Erlang, Oz) 逻辑语言(Prolog) </td>
<td></td>
</tr>
<tr class="q">
<td>代码库知识</td>
<td>从来没有查询过代码库 </td>
<td>基本的代码层知识,了解如果构建系统 </td>
<td>良好的代码库工作知识,实现过几次bug修复或者完成了一些细小的特性 </td>
<td>实现了代码库中多个大型特性,能够轻松地将多数特性的需求变更具体化,从容地处理bug修复。</td>
<td></td>
</tr>
<tr class="q">
<td>下一代技术知识</td>
<td>从来没听说过即将到来的技术 </td>
<td>听说过某领域即将到来的技术 </td>
<td>下载过alpha preview/CTP/beta版本,并且读过一些文章和手册 </td>
<td>试用过预览版而且实际地构建过某物,如果共享给其他人的话则有加分</td>
<td></td>
</tr>
<tr class="headers">
<td></td>
<td>2<sup>n</sup><span class="explain"><span style="color: #6688aa;">(Level 0)</span></span>
</td>
<td>n<sup>2</sup><span class="explain"><span style="color: #6688aa;">(Level 1)</span></span>
</td>
<td>n <span class="explain"><span style="color: #6688aa;">(Level 2)</span></span>
</td>
<td>log(n) <span class="explain"><span style="color: #6688aa;">(Level 3)</span></span>
</td>
<td>Comments</td>
</tr>
<tr class="q">
<td>平台内部</td>
<td>对平台内部毫无所知 </td>
<td>有平台基本的内部工作的知识 </td>
<td>深度的平台内部知识,能够设想平台如何将程序转换成可执行代码。 </td>
<td>编写过增强平台或者为其平台内部提供信息的工具。比如,反汇编工具,反编译工具,调试工具等。</td>
<td></td>
</tr>
<tr class="q">
<td>书籍</td>
<td>菜鸟系列,21天系列,24小时系列,蠢货系列... </td>
<td>《代码大全》,《别让我思考》, 《精通正则表达式》 </td>
<td>《设计模式》,《人件》,《代码珠玑》,《算法设计手册》,《程序员修炼之道》,《人月神话》 </td>
<td>《计算机程序设计与解释》,《事务处理:概念与技术》,《计算机程序设计模型》,《计算机程序设计艺术》,《数据库系统导论》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(没找到其中译本)</td>
<td></td>
</tr>
<tr class="q">
<td>博客</td>
<td>听过但是从来抽不出空去接触 </td>
<td>阅读一些科技/编程/软件工程的博客,并且经常的收听一些播客</td>
<td>维护一些博客的链接,收集博主分享的有用的文章和工具</td>
<td>维护一个在编程方面,分享有个人见解和思考的博客</td>
<td></td>
</tr>
</tbody></table>
<blockquote>
<a rel="license" href="http://creativecommons.org.sixxs.org/licenses/by-nc-sa/2.5/cn/"><img style="border-width: 0px;" src="http://i.creativecommons.org.sixxs.org/l/by-nc-sa/2.5/cn/88x31.png" alt="Creative Commons License"></a><br><span>程序员能力矩阵</span> by <a rel="cc:attributionURL" href="http://www.cppblog.com.sixxs.org/xguru">XGuru</a> is licensed under a <a rel="license" href="http://creativecommons.org.sixxs.org/licenses/by-nc-sa/2.5/cn/">Creative Commons 署名-非商业性使用-相同方式共享 2.5 中国大陆 License</a>. 原文请看 <a href="http://www.indiangeek.net.sixxs.org/wp-content/uploads/Programmer%20competency%20matrix.htm">这里</a>。<br>Thanks to bearice for debugging.<br>Thanks to <a href="http://fullof.bs.sixxs.org/">John Haugeland</a> for a reformatting of it that works much more nicely on the web. </blockquote>
<p><img src="http://6bone.informatik.uni-leipzig.de/ipv6/stats/log.php3?URL=www.sixxs.net&amp;ImageId=6" alt="IPv6 webpop stats" width="0" height="0"></p>

你可能感兴趣的:(程序员)