每一级别的知识都是需要累积的;在级别n表明你知道所有的低于级别n的知识。
后面的没翻译..是因为别人已经翻译过了.....悲催!!!
中文链接http://blog.sina.com.cn/s/blog_49f59cdb0100hcnv.html
原版英文http://sijinjoseph.com/programmer-competency-matrix/
目测自己基本处于Level 1到Level2之间的水平了
Computer Science | |||||
---|---|---|---|---|---|
2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
数据结构data structures | 不知道数组与链表之间的区别 | 在实际的编程实践中有能力去解释和使用数组、链表和字典等 | 知道基本的数据结构(数组VS链表)的时空代价,知道hash表是如何实现的,并且怎样处理冲突的,优先队列和实现他们的方式等等 | 具备高级数据结构领域知识例如B树、二项式堆和 fibonacci 堆、AVL/Red Black tree、伸展树(Splay tree)、跳表(Skip Lists)等等 | |
算法algorithms | 不能找到数组中的平均数(虽然很难以置信,但我测试了几个应聘者确实如此) | 基本的排序、查找和一些数据结构的遍历以及检索算法 | 树、图、简单贪婪和分治算法,并且能够理解他们之间的相关性 | 能够理解和编写动态规划的解决方案,对图的算法和数值计算有较深的理解,能过区分NP难题等 | Working with someone who has a good topcoder ranking would be an unbelievable piece of luck! |
系统编程systems programming | 不知道什么是编译器、链接器、解释器 | 基本理解编译器、链接器、解释器,理解汇编代码是什么并在机器层级别是如何工作的,对虚拟内层和分页有一定知识 | 理解内核模式VS用户态模式,多线程,同步原语以及他们是怎样实现的,能过读汇编代码。理解网络如何工作的,理解网络协议以及会socke编程 | 理解整个程序栈,硬件层(cpu+内存+cache+中断+微代码),二进制代码,汇编,静态和动态链接,编译,解释器,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 特性非常熟练,知道怎样分支和合并,使用程序库补丁安装特性等 | 对分布式的VCS系统很熟悉,尝试使用Bzr/Mercurial/Darcs/Git | |
自动构建build automation | 只知道从IDE构建 | 知道从命令行构建系统 | 可以设置一个脚本构建基本系统 | 可以设置一个脚本来构建基本系统,并且对文档,安装,产生发布版本笔记和在源代码上标记 | |
自动测试automated testing | 认为所有的测试都是测试员的工作 | 在写代码之前,已经编写了自动测试单元,并为代码提出好的单元测试用例 | 在TDD方式写代码 | 理解和能够设置自动化功能,负载/性能和UI测试 | |
Programming | |||||
2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
问题分解problem decomposition | 仅仅会直接的使用黏贴来使代码重用 | 能够将问题分解成多个函数 | 能够提出在整个问题上的可重用的方法/对象 | 使用适宜的数据结构和算法,提出通用类/面向对象代码使得当问题改变时可以封装问题的各个方面 | |
系统分解systems decomposition | 不能考虑单一文件/类以上的层次 | 能够分解问题空间并设计出只要在相同的平台/技术上的解决方案 | 能够设计出跨多平台/技术的系统 | 能够虚拟化和设计使用多个产品线以及整合外部系统的复杂系统 ,同样可以设计支持系统 的监控,报告故障恢复等 | |
交流communication | 不能对等的表达思想/想法,糟糕的拼写和语法能力 | 同事间可以相互理解对方所说的,好的拼写和语法能力 | 非常有效的与同事交流 | 能过以一种非常清晰的方式理解和交流思想/设计/想法/规格和并通过上下文去调整交流的能力 | 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. |
在文件中代码的组织code organization within a file | 在文件中没有明显的组织结构 | 按照逻辑的或者可达的组织方法 | 代码用块来组织且具有非常良好的参考其他源代码的解释 | 文件具有许可证头,总结,良好的注释,一致的白色空间使用。代码看起来非常漂亮 | |
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 | Mono-syllable names | Good names for files, variables classes, methods etc. | No long functions, comments explaining unusual code, bug fixes, code assumptions | Code assumptions are verified using asserts, code flows naturally – no deep nesting of conditionals or methods | |
defensive coding | Doesn’t understand the concept | Checks all arguments and asserts critical assumptions in code | Makes sure to check return values and check for exceptions around code that can fail. | Has his own library to help with defensive coding, writes unit tests that simulate faults | |
2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
error handling | Only codes the happy case | Basic error handling around code that can throw exceptions/generate errors | Ensures that error/exceptions leave program in good state, resources, connections and memory is all cleaned up properly | Codes to detect possible exception before, maintain consistent exception handling strategy in all layers of code, come up with guidelines on exception handling for entire system. | |
IDE | Mostly uses IDE for text editing | Knows their way around the interface, able to effectively use the IDE using menus. | Knows keyboard shortcuts for most used operations. | Has written custom macros | |
API | Needs to look up the documentation frequently | Has the most frequently used APIs in memory | Vast and In-depth knowledge of the API | Has written libraries that sit on top of the API to simplify frequently used tasks and to fill in gaps in the API | E.g. of API can be Java library, .net framework or the custom API for the application |
frameworks | Has not used any framework outside of the core platform | Has heard about but not used the popular frameworks available for the platform. | Has used more than one framework in a professional capacity and is well-versed with the idioms of the frameworks. | Author of framework | |
2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
requirements | Takes the given requirements and codes to spec | Come up with questions regarding missed cases in the spec | Understand complete picture and come up with entire areas that need to be speced | Able to suggest better alternatives and flows to given requirements based on experience | |
scripting | No knowledge of scripting tools | Batch files/shell scripts | Perl/Python/Ruby/VBScript/Powershell | Has written and published reusable code | |
database | Thinks that Excel is a database | Knows basic database concepts, normalization, ACID, transactions and can write simple selects | Able to design good and normalized database schemas keeping in mind the queries that’ll have to be run, proficient in use of views, stored procedures, triggers and user defined types. Knows difference between clustered and non-clustered indexes. Proficient in use of ORM tools. | Can do basic database administration, performance optimization, index optimization, write advanced select queries, able to replace cursor usage with relational sql, understands how data is stored internally, understands how indexes are stored internally, understands how databases can be mirrored, replicated etc. Understands how the two phase commit works. | |
Experience | |||||
2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
languages with professional experience | Imperative or Object Oriented | Imperative, Object-Oriented and declarative (SQL), added bonus if they understand static vs dynamic typing, weak vs strong typing and static inferred types | Functional, added bonus if they understand lazy evaluation, currying, continuations | Concurrent (Erlang, Oz) and Logic (Prolog) | |
platforms with professional experience | 1 | 2-3 | 4-5 | 6+ | |
years of professional experience | 1 | 2-5 | 6-9 | 10+ | |
domain knowledge | No knowledge of the domain | Has worked on at least one product in the domain. | Has worked on multiple products in the same domain. | Domain expert. Has designed and implemented several products/solutions in the domain. Well versed with standard terms, protocols used in the domain. | |
Knowledge | |||||
2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
tool knowledge | Limited to primary IDE (VS.Net, Eclipse etc.) | Knows about some alternatives to popular and standard tools. | Good knowledge of editors, debuggers, IDEs, open source alternatives etc. etc. For e.g. someone who knows most of the tools from Scott Hanselman’s power tools list. Has used ORM tools. | Has actually written tools and scripts, added bonus if they’ve been published. | |
languages exposed to | Imperative or Object Oriented | Imperative, Object-Oriented and declarative (SQL), added bonus if they understand static vs dynamic typing, weak vs strong typing and static inferred types | Functional, added bonus if they understand lazy evaluation, currying, continuations | Concurrent (Erlang, Oz) and Logic (Prolog) | |
codebase knowledge | Has never looked at the codebase | Basic knowledge of the code layout and how to build the system | Good working knowledge of code base, has implemented several bug fixes and maybe some small features. | Has implemented multiple big features in the codebase and can easily visualize the changes required for most features or bug fixes. | |
knowledge of upcoming technologies | Has not heard of the upcoming technologies | Has heard of upcoming technologies in the field | Has downloaded the alpha preview/CTP/beta and read some articles/manuals | Has played with the previews and has actually built something with it and as a bonus shared that with everyone else | |
2n (Level 0) | n2 (Level 1) | n (Level 2) | log(n) (Level 3) | Comments | |
platform internals | Zero knowledge of platform internals | Has basic knowledge of how the platform works internally | Deep knowledge of platform internals and can visualize how the platform takes the program and converts it into executable code. | Has written tools to enhance or provide information on platform internals. For e.g. disassemblers, decompilers, debuggers etc. | |
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 | Has heard of them but never got the time. | Reads tech/programming/software engineering blogs and listens to podcasts regularly. | Maintains a link blog with some collection of useful articles and tools that he/she has collected | Maintains a blog in which personal insights and thoughts on programming are shared |