什么是程序员
对于前几天的一篇博文《好的程序员应该熟悉的几门编程语言》,有网友质疑我对程序员的定义,很可能是感觉我对程序员的定义超出了其想象,但事实上程序员的定义应该远远超乎其想象。这里说明一下我对程序员的理解,也没有绝对的对错,不同意见的朋友可以讨论,疏漏部分期待补充,欢迎交流沟通。
在软件工程上“软件=程序+文档”,有些把数据也列为软件的一个要素,但我喜欢把数据当成程序的一部分,因为数据是用于记录计算机指令执行状态的。而且我 认为,文档不仅仅是指软件的使用说明书、需求、设计等文档文件,还应该包括与软件相关的所有文字,包括代码注释,甚至源代码以及软件界面中显示的所有文 字。而进行程序开发的人员都是程序员。
记得有一篇文章将程序员分为十几个等级,分得比较细,每级之间可能就差一两年的差距,甚至更接近,但有些阶段或许需要一辈子去追求。我个人比较讨厌记数 字,数字对于我来讲多了与没有是一样的,所以我不喜欢分那么多级别,我认为程序员只需要分为三个级别:编码人员、设计人员、架构人员。
其中,编码人员负责对已有设计的编码实现。这个级别的程序员很可能就是很多人眼中的程序员,但其实这类的程序员准确地讲应该叫Coder,与“程序员 (Programmer)”的概念是一个部分与全部的关系“,是一个具有包含关系的概念,而不是相等。该级别的程序员关注的是局部的实现以及代码的优化, 不对系统的整体负责,这一级别的程序员超越该级别的一个条件就是达到编程实现时的语言的无关性——无论用什么语言,只要有了设计都可以对其进行实现,语言 只是编码实施的工具而已。除了编码实现时需要使用的主要编程语言,可能还需要其它语言进行辅助开发,比如开发工具的自动化脚本、测试的自动化脚本、构建的 自动化脚本、数据库查询语言等,所以才写了《好的程序员言熟悉的几门编程语言》。每一类语言都有它与其它类别的语言不同的编码方法、编码风格、实现思路、 优化方法等,每一类语言都熟悉一种,一旦用到某一类语言就可以很快上手进行编码实现。这也是十几年来的心得,记忆比较深刻的最早一次就是在上大学时的一次 微机原理实验课上,老师让编程来控制一个硬件电路板实现一个数字时钟,因为课下在另外一个实现室学习过Keil的C语言编程,所以用了没多长时间就使用C 语言实现完了,然后交给老师看,结果老师说必须使用汇编,然后又用剩下的时间用汇编重写了一遍交了作业。虽然是一次实验课,但在工作中也经常会遇到类似的 情况,从开始用MCS-51的汇编、C语言编程,后来用到CPLD、FPGA开始用VHDL编程,又感觉VHDL语言不够简洁,又改用Verilog HDL,后来学C++、VB,脚本学了shell跟python,工作中遇到旧代码是用perl写的,然后就拿本perl的书查着语法把旧代码给改了,做 界面又用C#,在开发Oracle的应用程序时由于C++的库收费,然后就又选择Java实现,做WEB时用到Flash,又开始用Action Script做拓扑图,后来公司要开发iPhone应用,又学习Objective C等等。通过一种种新语言的学习,一路过来并没有感觉学习一门新的语言要花太多时间,一旦把一门语言掌握得比较熟,理解比较深,特别是C++,再学习其它 语言非常快,而语法只需要把书翻一下就可以了,无非就是一些变量定义、流程控制、函数定义、对象定义、API,每种语言大同小异。通过多种语言的学习,最 终达到一定的境界——语言无关。
当然编程语言只是超越这个级别需要提升的其中一个方面,只是工具而己,并不是会了语言就是一个好的程序员了,这只是一个必要条件,还必须对微机原理、操作系统、数据结构、算法设计等有一定的理解,保证在根据设计进行实现时没有障碍。
然后,更高一级别就是设计人员,这一级别的程序员要能够完成一个小型的软件或系统的一个组件的设计,因为之前的修炼已经了解了常用的设计语言以及底层的基 本技术,再加上对设计模式、面向对象等设计方法的学习与理解,能够完成一个完整的设计,并完成概要设计和详细设计,因为文档也是软件开发一个很重要的部 分。 这一级别的程序员,不仅要对自己的产品理解较深,对常用的设计技术熟练掌握,还要对一些开源的组件、程序库有一定的了解,能够不再“造轮子”,把精力集中 在业务上,迅速完成小型的设计方案。
最后,也是最高一级别就是架构人员,这一级别的程序员要能够完成对整个系统的架构,不仅要对各种开发工具、方法、语言有足够的理解,还要能够对技术选型 做出正确的决策,对三方组件、相关开源工程的了解有足够的广度和使用经验,能够深入理解整个系统的上下文环境,并根据环境及业务需求做出正确的决策,完成 技术的选型、架构、接口定义,然后对系统进行解耦、切分,以将不同的模块、组件交给更低级别的设计人员设计,从而完成整个系统的设计。这一级别的程序员不 仅要在技术上能够做出正确决策,还要有足够的经验从各上方面对系统进行评估,平衡各方面因素,包括技术的与人文的,而且要能够充分评估风险,保证设计切实 可行。
总之,程序员不仅仅只是编码员,好的程序员也不只是会使用一种语言写出好程序就可以了;而且,好的程序也不单单中代码运行效率高、稳定性好、性能好,因为 在软件的整个生命周期中开发阶段仅占其不到一半的工作量,程序好不好应用软件的整个生命周期进行评价,这又引出另外一个话题,不再展开,有机会再讨论。
来自:http://blog.csdn.net/nocky/article/details/8079177