软件人才不是从书本中来,也不是从证书中来。软件人才只能从实践中来,从软件中来
软件业的发展是关系到中国高科技能否站到世界前沿的一件大事,受到国家有关领导部门及信息产业界人士的高度重视。一个产业的发展需要有三个基本条件,即资金、人才和市场。今天的专栏针对如何培养软件人才进行分析和论证。
软件人才的缺乏是世界上众多国家,包括世界第一大软件国美国,所共同面临的问题。由于中国软件业发展相对较晚,规模较小,人才缺乏就显得更加突出。在政府大力号召和支持国内软件产业发展的情况下,如何以快速度培养出一大批高质量的软件人才就成了一个很迫切的话题。
从过去一年多看来,国内的解决方法大致有两方面。一是软件人员的培训。新办的全国35所软件学院去年秋季都已开始招生,有读硕士的、博士的,也有读本科或第二学士学位的。有的班面向所谓“蓝领”人才,即软件工程师;也有的班面向“白领”或“高级”人才,即软件结构设计师或经理级的管理人才。同时,许多脱产的或业余的软件培训班亦应运而生,以满足希望转行的技术人员之需要。
解决方法的第二方面则是软件企业的培训。更具体地说,就是通过CMM的考试认证,来提高一个企业在开发软件方面的素质。一年前,通过CMM3级的企业还屈指可数。目前一些企业已达到CMM4级,而最近东软则率先达到了CMM5级的认证。
学院式的培训以及CMM的认证是否能达到快速培养高质量人才的目的呢?软件人才到底从何而来?要回答这些问题,必须先了解软件是怎么开发的,软件人员需要什么技能和知识结构,以及软件人员的成长路线。根据在美国Sun公司领导软件开发团队的经验以及多年在硅谷的耳濡目染,我认为软件开发与其说是科学技术不如说更像艺术或体育,扎实的基本功与刻苦的训练虽然重要,但最终的成功是通过大量的实战,不断地积累经验,不断地在比赛中磨练而获得的。
软件人才的知识结构
一个软件产品不是存在于真空中的。 它是针对某一类应用的需要,通过一定的开发工具,面对某些特定的运行平台而开发出来的。 因此, 除了足够的计算机背景和编程技巧之外,一个好的软件工程师还要具备如下几方面的知识:
1. 通用的软件工程知识。譬如,一个好的工程师应懂得从产品需求书、项目规划、软件系统框架设计,到具体界面设计、编程、测试等一系列步骤,知道哪一步应做什么。
2. 软件应用领域的专业知识。举例说,如果一个软件是为银行业所用的,那么懂得相关银行业务就对软件的设计和修改有决定性的作用。而如果设计的是java.net这个程序包,就一定要了解其他程序员怎样使用网络界面最方便,因为java.net是针对这一群“用户”的通用界面。
3. 具体软件工具和环境的知识。在做一个软件产品前,要选定软件的应用平台、操作系统,以及编程所用的程序设计语言和开发系统。用Java 开发一个运行在Solaris服务器上的企业级的应用软件与用C++编写Windows XP上的个人应用软件,对一个工程师的专业知识结构有很不一样的要求。譬如,如何利用Java虚拟机的特点提高程序效率,如何利用CVS的特点更有效地管理开发,如果是开源软件,如何与开源社区协调等等,问题都因项目而不同。
显然,这些知识大部分是在软件班的课堂上学不到的。只有通过大量实践,才有可能成为软件开发的专家。而也只有能力强,吸收快,积累多的人才有可能成为专家。
管理人才与高级技术人才
所谓软件“高级”人才是指资深的软件工程师。他们的工作偏重于软件开发的带头作用,设计产品框架,解决疑难问题,以及辅导中、初级的工程师。所谓软件“管理”人才是指软件产品部门的经理级人物。他们的主要任务偏于管理,既管理团队又管理软件产品开发的整个项目。
管理人才和高级技术人才是两类截然不同的人才。高级技术人员需要深厚的技术基础,大量的软件开发经验,有品味的结构和界面的设计能力,以及对各种开发系统和平台拥有既广泛又深入的了解。在博得其它技术人员的尊敬以外,好的高级技术人员也应具有较强的领导能力、亲和力,能在技术上领导大家的同时,在非技术方面也成为大家的“领袖”。
而管理人才则需要很强的运作能力,能有效地计划(包括资金和时间),分配资源,指挥多个不同功能的部门。在预定的时间内,在不超过预算的情况下,做出高质量的软件产品。管理人员还需较多与客户及其他部门打交道,所以人与人之间的交流和沟通能力,书面及口头表达等方面要求都很高。管理人员同样要得到员工的信赖与支持,才能起到领导作用。
这两种不同的人才在素质上,甚至在性格上, 都有不同的特点,但却有共同之处,那就是好的人才大多是工程师出身,有足够的技术背景。高级技术人员是从普通工程师中脱颖而出,这一点可能比较容易理解。可为什么软件管理人才最好也从工程师中选拔呢?简单地讲,软件部门的经理必须要了解软件工程师的工作方式、爱好、习性等等,才能有效地管理。自身出于工程师的行列,比其他人在管理上有许多天然的优势。而更重要的是,一个部门的经理,天天面对着许多决策性的问题。譬如说,如何解决产品在性能、质量和开发时间三方面不可避免的矛盾。或在产品研发过程中,当出现了新的市场动向,需怎样应变。要决策这些管理上的问题,实际上必须掌握较深的技术知识,才能做出准确的判断。反过来, 一个不懂技术的管理者,则通常要配备一个高级技术人员做“军师”。而且在遇到两、三种不同的技术意见时,会很难定夺。 纵观Sun的几大硬软件产品部门,绝大多数管理人员都是从工程师这个位置起家的。
下面我以Sun公司的产品部门为例,看看在技术和管理方面,以及在低中高三个层次上,人才是如何配置的。 (本文所使用的级别名称引自Sun公司全球人事系统规范,与某些地区工作上的用法不一定完全吻合。)
软件部门的人才结构
在Sun公司,一般工程师 (Member of Technical Staff) 分为四级。做到第四级时,能力就应已经十分强,技术上多多少少可以独挡一面。从第四级再往上走,就要做一个比较大的职业选择。这是晋升的第一个比较大的“坎”。 一条路是升为高级工程师 (Staff Engineer)或“高工”。高工内又分为二级。做到高级高工 (Senior Staff Engineer),则应能同时主导数个项目的技术方向。 当然,级别越高,要求也越严,年终评定也把得越紧,很少能拿到优。
再往上走,就遇到第二个大“坎”,即升到杰出工程师 (Distinguished Engineer) 或院士 (Fellow) 。在Sun全球一、二万技术人员中,杰出工程师和院士共计六十人左右,每个人通常在某一技术领域有突出的造诣 ,是工业界在世界上的领先人物。 这些人是主持Sun硬软件系统开发的技术带头人,一般不直接管人或项目。大部分时间处理技术问题,做设计和写程序也是很经常的事。
另一条路是升为部门经理,分为普通经理和高级经理二级。 如果再升,就要跃过大“坎”,到总监,甚至副总裁。这些人则是以管理为主。部门经理与软件开发的细节接触还很多,而总监或副总裁就与编程无缘了。
选择两条路中的哪一条,一是要看机会,二是要看个人的能力与爱好。在Sun,不是谁想当经理就能当上的,也不是拿个“白领”班的毕业证书就行了。 通常的情况是,一个工程师在工作中显示出经理人才的素质,经过定向培养和一段实践后,再提拔起来。这里,定向培养包括选修一些管理的基础课,其中涵盖有关管理法律知识的课程,以及由该人的上级进行一定量的咨询辅导。
在工程师成长的过程中,要避免的一个大问题就是把最有成绩的技术人员不分三七二十一,不论他们是否有管理的天赋或愿望,都提拔成经理,让他们去管理人和项目。这个问题的原因是,在许多公司,升为经理是唯一提拔的途径。 这样一来,不仅没得到优秀的管理人员,还丢掉了好的高级工程师。 解决这个问题的有效办法之一,就是给技术人员开辟一条宽广明亮的职业发展道路。在Sun公司,为了鼓励技术人员,高级技术人员的四级(从普通高级工程师到院士)与管理层的四级(普通经理到副总裁)在级别上一一对应,在工资待遇等方面一律划等号。当然,由于工作性质的关系,从人数上讲,高级工程师远远多于经理,但总监或副总裁则远远多于杰出工程师和院士。
除了技术人员以外,一个完整的软件开发部门还应有配套的程序管理(Program Management)、文档管理(Documentation)、测试和质管(Quality Assurance),以及产品化(Release Engineering) 部门。本文在这些方面就不多谈了。 但值得一提的是Sun有一整套产品生命周期的流程(Product Life Cycle, 简称PLC)。而我们的Program Manager,则要确保产品的开发,严格遵守PLC的流程规范。
软件开发与CMM
说到PLC,自然想到CMM,因为PLC可以说是Sun内部的产品研发规范。由于国内对CMM的重视,许多人问我,CMM到底有没有用。CMM是美国卡内基梅隆大学软件工程院提出的一套软件企业研发和管理的规范。近年来有不少国内外单位采用,一方面通过实施CMM来提高软件开发过程的管理水平,同时以CMM证书来说明自己的实力。 学习CMM,自然比不学习要有用处。就像一个想成为作家的人去上写作课一样,听听别人是怎样写的,小说都有哪几种形式等等,不无启发作用。另外,也时常听到有些公司说CMM使软件开发效率提高,使错误和返工率下降,程序稳定性提高。
但拿到CMM的认证与一个企业的软件研发能力是否有必然的关系,恐怕就不一定了。世界上一流的软件公司,包括Sun、Oracle、微软、IBM、BEA、Adobe、苹果、MacroMedia等,没有一家用CMM作为产品开发的规范。而世界上一流的软件产品,如Unix(Solaris、HP/UX、AIX)、Linux(RedHat、SuSE)、微软Windows、办公套件(微软Office、StarOffice、OpenOffice)、排版软件(FrameMaker、InDesign)、浏览器(微软 IE、Netscape Navigator、Mozilla、Opera、Safari)、网站服务器(Appache、SunONE Web Server)、应用服务器(WebLogic、WebSphere,、SunOne Application Server)、Java(J2ME、J2SE、J2EE)、微软 .NET等许多其他产品,也都不是用CMM开发出来的。
这并不是说CMM没用处,而是说明没有CMM同样可以开发出世界一流的软件产品。大家之所以信赖这些著名公司所开发出来的产品,归因于这些公司多年努力开发一流产品所带来的声誉而已。
结束语
回顾今天的专栏所涉及的内容,可以总结如下几点。
首先,要想培养大批的软件人才,学院式的教育仅仅是打基础的阶段而已。真正的人才要通过大量的实践,通过多个软件产品开发周期的磨练,才能塑造成。软件工程的思想,不能只是在软件企业内部开发产品时才实施,而是应该多方面渗透到工作和学习中。譬如说,在学校里,老师指导的各种软件项目,就应该运用软件工程的各种规范和工具,而不应该因为是一次性或临时性的工作而简单凑合。在Sun公司,就连公司的网站内容都严格按照软件源代码来管理,不仅可以自动记录内容修改的情况,出了问题时也很容易恢复到从前的版本。
除此之外,管理人员(特别是中低层管理人员)和高级技术人员最好也能从工程师中培养。这些人不仅应怀有足够的技术背景,还需要有在第一线工作的经验,以及较强的领导能力和沟通能力。一个人有没有这方面的潜力,只有在实际软件开发环境中才能看出来。只读一个“白领”班,并不一定有当“白领”的能力。
再者,不管是CMM也好,还是Sun的PLC也好,关键不在于证书,而在于实际应用,在于在软件研发上有没有一套完整有效的规范和流程。最终的检验标准则是一个公司能不能开发出世界一流的软件产品。用产品说话,比一纸证书或公司的广告要响得多。
总而言之,软件人才不是从书本中来,也不是从证书中来。软件人才只能从实践中来,从软件中来。