2008年12月7日星期日

自己对程序员的分级

自己闲的无聊为计算机专业的学生定的级别,从D一直到X,从低到高,偶是C系程序员,故编码都是C系的技术,J系的类比就是了,呵呵

D-:
知道一些计算机的基本操作,能够说明白内存和硬盘的区别,知道CPU既有Intel的,也有AMD的,上网很多,但没有信息抓取和搜索能力,只是被动的接收信息。

D:
可以比较熟练用某种语言编写一个"Hello World",了解程序控制结构,可以通过一堆if、while、for、switch,在一个方法(函数)里实现一个基本的功能,如果代码通不过编译的话会认为是编译器出错,如果代码通过编译而且正巧结果还对,就认为已经完成程序了。知道栈和队列这些基本数据结构的概念,但是无法完美的去用某种语言实现。

D+:
知道程序不仅仅可以在一个方法体里写,有了初步的函数的思想,可以完成一些行数较多的程序(大于200行),不过这个程序一般只有编译器和他本人能看懂(比如string s1,s2,s3;这样的语句)。终于开始相信自己有时也会犯错误的(对编译器多了点信任),写完了程序会做一点基本的测试,不过输入的数据都是比较"完美"的数据,认为没有必要用Dirty Data(脏数据)进行测试,这样只会给自己增加烦恼。

C-:
对数据结构,操作系统这样的基础课程有了一个初步的认识,可以在20分钟内写一个带有Bug的二分搜索或是含糊的描述出来进程和线程的区别。具备了"分治"(Divide and conquer)和递归(Recursive)的初步思想。知道什么是Pascal风格和camel风格,听说过Hungarian命名法,不过只是偶尔的在自己的代码去运用这种命名法。知道了程序是会抛出异常的,所以就用try/catch all这样的风格去写程序,认为没有异常的程序就是好程序

C:
具备了一定的代码量(超过5k行),至少对某一门主流的编程语言有了一定的认识,开始从结构化编程向对象化编程转变,可以从容的说出OO三特性是封装(Encapsulation),继承(Inheritance)和多态(Polymorphism),但是却很难为多态给出一个精准的定义。在写中型程序的时候会有意的建立一个class,然后"疯狂"的去丰富这个class的功能并最终完成一个典型的GodClass。认为数据结构操作系统这类的课程是在浪费时间,反正我们有的是类库,现成的List/Hashtable/Queue满天飞,需要用的时候引一下就是了。开始用搜索引擎协助自己编写代码,并会比较熟练的使用断点。

C+:
具备了一定的代码量(超过15k行),对某一门主流的编程语言有了比较深入的认识,拿C#来说,可以描述出中的属性(Property)的实现方式,指出值类型和引用类型的五个区别或是给出十个不同类型的Exception,知道有些数据存储在线程栈(Thread Stack)上而有些数据存储在托管堆(Managed Heap)上而存取它们的速度是很不一样的,拿C++来说,可以精确的给出常量指针和指针常量的区别及各自的用途,或是描述C++中实现多态的方式(VTable)。开始有意的去使用多态的思想编写程序但并没有意识到这样做的实际好处,开始使用一些接口(interface)并试图将具有同样行为的类拉拢在一起。

B-:
具备了一定的代码量(超过30k行),对某一门主流的编程语言有了深入的认识,拿C#来说,可以精确的描述出new操作符的具体的行为(计算类型到基类型需要的空间并分配这部分内存,初始化类型对象指针和同步块索引,调用类型的实例构造器创建实例,返回实例的一个引用),清楚的知道该什么时候使用struct而什么时候该使用class。开始在程序中应用设计模式的思想,编写代码的过程中将思考的问题更多的停留在代码的易读性和高效性的抉择上。能够比较有效的利用网络资源去获得自己需要的信息(尤其是熟练的使用英文的搜索引擎)。

B:
具备了一定的代码量(超过50k行),在对一门主流的编程语言有了深入的认识的基础上,在数据结构和操作系统等计算机基础课程的也有了一定的造诣。例如可以轻松的给出6种不同的排序算法并可以在段时间之内将它们以某一种语言实现,也可以在1分钟之内写出一个准确的二分搜索算法。可以在短时间内理解某个API,然后在这个API的基础之上根据自己的需求写一个更加实用的Wrapper。很自然的应用Factory Method去替代Constructor。熟悉异常的使用,拿.Net来说,既知道FCL多数常用的方法会在什么情况下抛出什么样的异常而在什么情况下不会抛异常,也知道在自己编写的类库中什么时候应该抛出什么样的异常。

没有评论: