程序员能力评估矩阵
计算机科学 Computer Science
2n (Level 0)
n2 (Level 1)
n (Level 2)
log(n) (Level 3)
数据结构
不知道数组和链表的差异
能够解释和使用数组,链表,字典等,并且能够用于实际的编程任务。
了解基本数据结构时间和空间的折中,比如数组vs 链表,能够解释如何实现哈希表和处理冲突,了解优先队列及其实现。
高等的数据结构的知识,比如B-树、二项堆、斐波那契堆、AVL树、红黑树、伸展树、跳跃表以及前缀树等。
算法
不能够出一个数组各数的平均值(这令人难以置信,但是我的确在应聘者中遇到过)
基本的排序,搜索和数据的遍历和检索算法。
树,图,简单的贪婪算法和分而治之算法,能够适度了解矩阵该层的含义。
能够辨识和编写动态规划方案,良好的图算法知识,良好的数值估算的知识,能够辨别NP问题等。
编程体系
不知道何为编译器、链接器和解释器。
对编译器、链接器、解释器有基本的了解。知道什么是汇编代码以及在硬件层如何工作。有一些虚拟内存和分页知识。
了解内核模式vs用户模式,多线程,同步原语以及它们如何实现,能够阅读汇编代码。了解网络如何工作,了解网络协议和socket级别编程
了解整个程序堆栈、硬件(CPU+内存+中断+微码)、二进制代码、汇编、静态和动态链接、编码、解释、JIT(just-in-time)编译、内存碎片回收、堆、栈、存储器编址…
软件工程 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下编译
知道如何编译在命令行下编译系统
能够安装一个脚本构建基本的系统
能够安装一个脚本来构建系统并且归档,安装程序,生成发布记录和给源码控制中的代码分配标签。
自动化测试
认为所有的测试都是测试员的工作。
能够编写自动化的单元测试,能够为正在编写的代码提出良好的测试用例。
按照TDD (Test Driven Development)方式编写代码。
了解并且能够有效自动化安装,载入/性能和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)
跨文件代码组织
没够想过给代码跨文件组织
相关文件按文件夹分组
每个物理文件都有独立的目的,比如一个类的定义,一个特性的实现等。
代码在物理层组织紧密,在文件名上与设计和外观相匹配,可以通过文件分布方式洞察设计理念。
源码树组织
一切都放在一个文件夹内
初步地将代码分散进对应逻辑的文件夹。
没有循环依赖,二进制文件,库,文档,构建,第三方的代码都组织进合适的文件夹内。
源码树的物理布局与逻辑层次、组织方式相匹配。可以通过目录名称和组织方式洞察设计理念。
代码可读性
单音节的名称 (在国内应该是那些类似用汉语拼音命名的习惯)
对文件、变量、类、方法等,有良好的命名。
没有长函数、注释解释不常规的代码,bug修复,代码假设。
代码假设验证使用断言,自然的代码流,没有深层嵌套的条件和方法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。