做职业化的软件工程师
中软通用产品研发中心 陈尚义
与20年前大不一样,现在软件正发挥着越来越重要的作用,而且以越来越快的速度影响着每一个国家、每一个公司、甚至是每一个人。它是国家核心竞争力的体现,它为商业流程优化提供了可能性,它在不断地改善着我们的日常生活。君不见,软件已经无处不在,无处不有,无人不用吗?
作为软件工程师,我们工作在这样一个如此重要的领域里,我们从事的事业正在影响着世界的每一个角落。我们应该感到无上光荣和自豪,但与此同时,我们的工作质量,我们的职业水准,将是何等重要。软件开发已成为一个职业,职业规范和标准正在逐步形成和完善,工程师的职业化也已经提到议事日程。尤其在我国,软件业的振兴在很大程度上依赖于软件从业人员职业水平的提高,不幸的是,我们目前的职业化水平还很低,与美国相比,我们拥有的软件工程师数量可能和美国相近,但我们合格的软件工程师却是凤毛麟角。这严重制约了我们软件行业的发展。
下面我从“职业化是软件工程师的必然选择”、“什么是职业化”以及“怎样做职业化的软件工程师”等几个方面,谈谈自己的体会和认识。
“职业化”是软件工程师的必然选择
世界正在经历着前所未有的变化。世界正在逐渐变平,全球经济一体化的进程在加快,发展中的中国正在与世界接轨。过去那些老的观念彻底地受到冲击,“学而优则仕”只是老一代的想法,虽然延续了数千年,但终于和农民的农业税一起走进了历史。站在时代最前列的年轻一辈则更有着不同的价值观念,他们更多地追捧商业的成功;他们崇拜Bill Gates和Larry Ellison;他们不再对国家授予给他们的“助理工程师”、“工程师”头衔感兴趣,他们不再关心自己的单位是什么性质,“个体户”被赋予了正面含义,民营企业也许更充满活力;他们也不担心自己是干部还是工人;他们关注的是职业的素质和技能,他们在乎的是自己的市场价值;他们再不像父辈那样有铁饭碗,他们没有稳定感,他们只有不断地提高自己,以适应社会经济的快速发展,才能不断地争取美好生活。他们尊重职业道德,他们正实践着职场的各种各样规则,并以自己能成为职业人为目标。
越是发达的国家和地区,这种变化表现得越明显。“职业化”成为历史发展的必然趋势。职业化是经济发展、社会分工的产物。大到全球经济链条,国与国之间形成了明显的分工:谁提供能源,谁提供服务,谁制造产品,发展中国家和发达国家扮演着不同的角色。工业和经济的高度发展,需要人们“术有专攻”;流水线的发明和推广应用使这种分工得以明确和固化,工程化程度越高,分工就越明确,由此而来的就是对各种专业人才的需求越来越强烈。大到一个国家、一个地区和一个企业,小到一个人,只有在这种明确分工的环境中找到自己的位置,才能适应未来的发展。
职业化能带来财富。世界在变化,变得到处充满竞争,不再有稳定的工作。随着宏观经济走势的时好时坏,那些还不够“职业”的人,其工作起起落落。在这个年代,没有可以托付终身的单位,只有不断提升自己,时刻保持竞争力,成为一个真正的职业化人士。唯有这样,才是根本出路。而现在的情况是,一方面,所谓的“软件工程师”到处可见,大学毕业生找不到工作,一个招聘广告引来一堆应聘者简历;另一方面,真正合格的软件工程师却不多见,公司找人难。于是大量的培训机构搞起了“就业培训”、“岗前训练”、“定制培训”、“实训基地”等等,籍此弥补专业人士的不足。
综上所述,职业化是市场经济和社会发展的必然要求;市场呼唤职业化人才;职业化能给自己带来光明的职业前途和财富。毫无疑问,对于软件工程师而言,职业化是必然选择。
怎样才是职业的?
职业化一词在英文里是Professional。字典里,professional既是名词也是形容词。形容词的含义是:职业的或与职业相关的、从事职业的或适合职业的;或是符合职业标准的;或是从事某一特定活动作为职业或谋生手段的。对名词的解释是:从事某项职业的人,尤指有学问的职业;以特定职业为生的人;技术熟练的行业者和专家。
为了说明什么是职业的,让我们先看看什么是非职业的。非职业的应该是业余的,俗话称其为“二把刀”。这种人说他行,他却不行。说他行是因为他的教育背景,或从他的简历上看到的;说他不行,是因为他不能真正从事这个领域里的正规工作,高不成,低不就。非职业的就是平庸的,平庸的从业者在做事方式、思考问题方式上不到位,缺乏必要的技能和职业素养,其工作成果也不够专业水准。这些人工作是不稳定的,收入也是平庸的,他们在泡沫年代能找到自己的暂时的位置,一遇到泡沫破裂,迅速沦为下岗一族。我们拥有很多这样的软件工程师,但缺乏真正职业化的软件工程师。
职业化的软件工程师应该是这样一些人,他们拥有扎实的基础知识,有能力在软件开发的工作中找到自己的位置,他们以正确的方式做事,他们遵守这个行业的游戏规则,信守和公司的合约,他们会尽努力使自己的工作成果尽可能地符合这个行业的标准或规范,他们知道国内外同行都在做些什么,他们比较了解所从事的这个行业的发展趋势。
更为重要的是,职业化的软件工程师必须将满足客户需要作为自己的最高行动指南,把自己所从事的工作和公司的商业目标紧紧联系在一起。唯有如此,才能实现软件工程师的价值。
对职业化的更高要求是遵守行业标准和不断创新。为更深入地理解什么是职业化的软件工程师,我们来看看三个外科医生的故事:
第一个外科医生,重复做着同样的手术,挣到了很多钱,但他的技术不符合规范,也从来不教给别人。
第二个外科医生按照标准给别人做手术,同时他还不断地改进规程。由于大量时间花在创新上,他挣的钱就比第一个外科医生少了一些。
第三个外科医生,除了按照标准之外,他开发了一个新的手术规程并加以实践,经常出差到其它地方教其他的医生同行如何去实践这些创新。
谁更职业呢?大家一般不会否认,第三个工程师是最职业的。死守陈旧技术、生怕别人学会、只顾自己挣钱的第一个医生,是没有医德的医生,他的技术再精湛,却无论如何也不是职业的。
但是,职业化的概念也正在经历着变迁。上个世纪80年代,我刚接触计算软件的时候,那时我国的软件业还刚刚兴起,那个时候的软件简单,规模也很小,软件生产还是一个手艺,软件工程师还是一个匠人,软件工程缺乏相应的标准和规范,不可能要求软件工程师象第三个医生那样专业。但是,有很多证据表明,时代在变化,对软件工程师的要求也在不断提高。开源代码社区里涌现很多很高职业水准的软件工程师,他们不仅技术精湛,而且遵守软件行业标准、规范和最佳实践,同时他们将这些技术、标准、规范和最佳实践,通过互联网络,向全世界的软件开发同行传播,带动这整个软件行业的发展。他们是最职业化的一批人。
不同的组织对职业化有不同的理解:
有人对职业化的定义是:职业化的软件工程师应该解决有意义(有益于社会和大众利益)的问题;应该尽最大努力满足客户的需要;应该尽可能提供高质量的产品;应该富有创新精神;等等。
IEEE CS也有自己的理解。他们通过11个方面的认证,包括职业道德规范和技能训练,通过考试者将被IEEE授予“软件开发职业工程师”(Certified Software Development Professional)。
各大软件厂商也有自己的资格认证。但这些认证不是从整体上评价一个软件工程师是否职业化,而是对他们各自产品和服务的一种熟悉程度的测评和认证。
怎样才能成为一个职业化的软件工程师?
自律、沟通和技能是成为职业化软件工程师的必要条件。
一、自律
软件区别于其它传统产品,因为它是看不见、也摸不到的。它本身不像一个具体的物件,人们肉眼看不见软件本身,软件存放在CD里,存放在磁盘里,只有安装后,运行了,人们才看见它的界面;它的开发进度也是肉眼看不见的,你根本无法准确知道你的下属完成了任务的80%还是30%;质量更是不可见的,除非你通过非常认真、全面的测试和度量,你才能了解你下属的代码的质量。一个程序员认真思考问题时的模样和他发呆时的表现一样,外人很难判断。正常上班时间,他要不是好好工作,而是在想心事甚至在消极怠工,你也无从知道。
因此说,“自律”对软件工程师来说更为重要。不象产品流水线上的工人,他们的一举一动都能被看见,他们的工作质量和他们当时的心情关系并不大,他们的工作业绩当时就得到非常清楚地评价。
自律不仅表现在认真工作上,还表现在与公众(the public)利益的一致性上,表现在和雇主、同行、上级等的关系处理上。IEEE和ACM联合发布了一个软件工程师职业道德规范,规范涉及8个方面[1],软件工程师应以此来约束和规范自己的行为。
自律还表现是否为客户着想。你的软件是为客户开发的,只有心中装着客户,才能不断改进产品,不断提高客户满意度。更广义的客户,不仅是掏钱买你产品的人,还有你所服务的所有对象,包括你的经理、你的下属和你周围的同事和合作伙伴,让他们的工作顺利进行,和他们一起共同完成任务,是职业化软件工程师的最起码的职责。
二、沟通
还是由于软件的不可见的特性,决定了沟通对于软件工程师的特殊重要性。
沟通的目的是使得软件本身变得可理解。软件既看不见,也摸不着,软件越来越复杂,而且处在不断的变化过程中,几乎没有人能够一次性地将软件完整、准确地描述清楚,更不能指望一个文档毫无遗漏地、无二义性地将软件完整地定义出来。因此,需要软件工程师进行大量书面的、口头的、或面对面的沟通,沟通的目的是为了说明一个产品,大到产品的整体功能要求和性能要求,小到程序的结构,甚至一个函数和一个变量的含义和使用方法。
沟通的另一个目的是使得软件工程过程得到有效管理。什么时候能交付一个什么样的产品,软件的质量要达到什么样的程度,是软件项目管理的主要任务。如果没有很好的沟通,项目经理就不能准确知道你的进度如何、你的代码质量如何,项目经理也无从知道什么时候项目能够结束,总共要花去多大成本。
沟通的方法有很多。既有标准化的、结构化的工具语言,如UML,也有文字化的表达方式,软件工程强调文档的重要性就是以文档作为沟通的工具,用它和客户沟通(requirement specification);用于工程师和工程师沟通(design document);用于市场人员和工程师沟通(product definition或system specification);用于开发人员和测试工程师沟通(design document, requirement specification);用来培训新加入项目的人员;用于今后的维护。口头沟通是必不可少的,尽管文档的重要性在软件工程中被反复强调,但是,正如刚才所说的,既没有一个一锤定音的文档,也没有一个一成不变的文档。实践上,口头沟通是文档的必要补充,既可以用于文档形成之前,也可以用于文档形成之后。
沟通的技巧也有很多。文字表达技巧、科技写作技巧和口头表达技巧都属于沟通技巧范围之内。不幸的是,软件工程师在这方面普遍呈现能力不足。
然而,技巧本身固然重要,但对本领域知识的理解和实践经验是沟通的基础。
除了技巧之外,我认为更为重要的是软件工程师对所负责开发的软件的责任感。主动和上级、和同行、和下属沟通是职业化所必须的,因为软件开发需要团队协作,任何一个具体的工程师的工作都可能会影响别人,进而影响全局。软件工程的实践表明,个别人缺乏主动沟通,往往导致整个团队的技术方案出现偏差,或整个项目的进度受到影响。
三、技能
在中国,一线的软件工程师都很年轻。这些年轻的工程师往往担心自己的编程技能能否达到一定的水准。他们认为只要会写这样那样的程序,只要会面向这个或面向那个,就认为自己在这个单位立住了脚,心里就踏实了,也具备了跳槽的本钱,至于这些程序所需要的文档写没写,代码的质量好和坏,能否被用户欢迎和接受,能否符合公司的商业利益,他们并不关心,认为那些不重要,不是什么技术活,随时需要随时都能补上。他们还认为,不写文档、代码没有优化或验证这些陋习,不会影响他们在公司的地位和跳槽的能力,不会影响他们的职业发展。
IEEE的职业化认证,要求职业化的软件工程师不仅要掌握必要的专业知识和专业技能,如编译原理、操作系统原理、数据结构、数据库、编程语言和算法,IEEE更强调以下几个方面:需求的引导和分析、软件设计、软件构造、软件测试、软件维护、配置管理、软件工程管理、软件过程管理、软件工具和方法以及软件质量保证等[2]。这是业界专家学者从大量实践中总结出来的,是面对“软件危机”时人们提出的工程化思想的具体体现。
结语
著名的数学家和IT教育专家袁传宽教授,在认真比较了中美两国的软件工程师之间的差别之后,认为中国目前最紧迫需要的是占整个软件工程师队伍的35%的高级软件工程师[3],认为这35%应该有良好的沟通能力和国际化的文化交流能力,能够看清大局,能够把握项目实施的方向,平衡各方面的因素,保证设计意图的执行,保证产品开发优有序进行。袁教授对我国目前的软件人才队伍表示担忧:中国软件业正是缺少懂技术、会管理的这35%,才导致有想法无法落实,有资源无法组织,水平不高,发展不快。基于这样的认识和担忧,袁教授做了大量的调查和研究,然后指出,之所以中美之间存在这种差别,是因为我们的教育体系不同于美国:美国的计算机专业是立足于用,而我们的计算机专业是为了向美国看齐;美国教授要求必须有实践经验,而我们的教师几乎没有什么实践经验;我们的教材都是从美国的教材翻译过来的,教师对课本内容不甚了解,于是只有照本宣科。
袁教授所说的35%,大致就是我这里所说的职业化的软件工程师。袁教授认为,必要的系统训练,并获得权威部门的认证,是通往职业化的有效途经[3]。
参考资料
1. IEEE/ACM:《Software Engineering Code of Ethics and Professional Practice》
2. Summivalue:《Software Enginneering》, 机械工业出版社,2005
3. 袁传宽:“培养关键的35%” 《程序员》杂志,2007年7月