考察点 | Level 0 | Level 1 | Level 2 | Level 3 |
交流与沟通 | 不能向同伴表达想法/主意。匮乏拼写和语法的能力。 | 同伴能了解你在说什么。有良好的拼写和语法能力。 | 能够和同伴进行高效的交流 | 能够使用清晰的方式了解和交流想法/设计/主意/细则,能适应每种环境的交流。 |
IDE的使用 | IDE大部分用来进行文本编辑。 | 了解其周围的接口,能够高效地通过菜单来使用IDE。 | 了解最常操作的键盘快捷键。 | 编写自定义宏。 |
API的使用 | 需要频繁地查阅文档。 | 把最频繁使用的API记在脑子里。 | 广阔且深入的API知识。 | 为了使实际任务中常用API使用更加便捷,编写过API的上层库,填补API之间的缺口。 |
代码可读性 | 单字母的名称,汉语拼音的名称。 | 对文件、变量、类、方法等,有良好的命名。 | 没有长函数。注释会说明bug修复和代码依赖性假设。 | 代码依赖性假设使用断言验证;自然的代码流;没有深层嵌套的条件和方法。 |
文件内的代码组织 | 同一文件中组织没有依据。 | 按照逻辑性或可访问性组织。 | 代码分块,引用其他源文件时有良好的注释。 | 文档头部有许可声明、总结。通过一致的空格缩进,使文档外观美观。 |
跨文件的代码组织 | 没想过给代码跨文件组织。 | 相关文件按文件夹分组。 | 每个物理文件都有独立的目的,比如一个类的定义,一个特性的实现等。 | 代码在物理层组织紧密,在文件名上与设计和外观相匹配。可以通过文件分布方式洞察设计理念。 |
源码树组织 | 一切都放在一个文件夹内。 | 初步地将代码分散进对应逻辑的文件夹。 | 没有循环依赖,二进制文件,库,文档,构建,第三方的代码都组织进合适的文件夹内。 | 源码树的物理布局与逻辑层次、组织方式相匹配。可以通过目录名称和组织方式洞察设计理念。 |
防御性编码 | 不知道这个概念。 | 检查代码中所有的参数,对关键的假设进行断言。 | 确保检查了返回值和使代码失败的异常。 | 有自己的库来帮助防御性编程、编写单元测试模拟故障。 |
错误处理 | 只给乐观的情形编码。 | 基本的代码错误处理,抛出异常/生成错误。 | 确保错误/异常留在程序中有良好的状态,资源,连接,内存都有被合适的清理。 | 在编码之前察觉可能出现的异常,在代码的所有层次中维持一致性的异常处理策略,提出整个系统的错误处理准则。 |
考察点 | Level 0 | Level 1 | Level 2 | Level 3 |
数据结构 | 不知道数组和链表的差异 | 能够解释和使用数组,链表,字典等,并且能够用于实际的编程任务。 | 了解基本数据结构时间和空间的折中,比如数组vs 链表,能够解释如何实现哈希表和处理冲突,了解优先队列及其实现。 | 高等的数据结构的知识,比如B-树、二项堆、斐波那契堆、AVL树、红黑树、伸展树、跳跃表以及前缀树等。 |
算法 | 不能够找出一个数组各数的平均值(这令人难以置信,但是我的确在应聘者中遇到过) | 基本的排序,搜索和数据的遍历和检索算法。 | 树,图,简单的贪婪算法和分而治之算法,能够适度了解矩阵该层的含义。 | 能够辨识和编写动态规划方案,良好的图算法知识,良好的数值估算的知识,能够辨别NP问题等 |
编程体系 | 不知道何为编译器、链接器和解释器。 | 对编译器、链接器、解释器有基本的了解。知道什么是汇编代码以及在硬件层如何工作。有一些虚拟内存和分页知识。 | 了解内核模式vs用户模式,多线程,同步原语以及它们如何实现,能够阅读汇编代码。了解网络如何工作,了解网络协议和socket级别编程。 | 了解整个程序堆栈、硬件(CPU+内存+中断+微码)、二进制代码、汇编、静态和动态链接、编码、解释、JIT(just-in-time)编译、内存碎片回收、堆、栈、存储器编址… |