如何营造高效软件开发团队
 
前言
  本人从事软件行业以来,经历了多次的成功与失败的体验,总觉得中国的软件应该可以做得更好些,但结果并不是我想象中的那样,许多的项目实际都还只是以假的、虚的面孔而存在,其中原由大家都可以说得出很多很多,但怎么改呢?一些问题的存在只是因为其他问题存在而存在的,所以我想寻找中国软件行业为什么不能崛起的根源。
  中国人智商不够?那绝对是错的。
  中国人不够勤奋?那也绝对是错的。
  科技不如其它国家发达?通讯如此发达的现代,那不是理由。
  中国人做软件的少?那更加不是理由。
  ......
  为什么呢?中国缺少高效的软件开发团队吗?这也许是问题的根源。

正文:
  喜欢足球的朋友应该非常清楚一件事情,那就是在一场足球赛中假如球员之间缺少默契的配合或教练的指导思想执行不到位等情况下,那场比赛多半是以失败告终的,因为这支球队并不是优秀的球队。开发软件项目就象一场进行中的足球赛,是靠项目管理、系统分析设计、程序编制、测试、市场营销等不同角色人员共同协作完成的,不同角色的人执行的工作相互促进和制约着其它角色的人的工作,因此一个高效的软件开发团队是高质量软件项目或产品的保证,可如何才能营造高效软件开发团队呢?从以下几个方面来说明:
一、 高效软件开发团队的特征
  高效的软件开发团队是建立在合理的开发流程及团队成员密切的合作的基础之上的,成员共同的迎接挑战、有效的计划、协调和管理各自的工作以至完成明确的目标,高效的开发团队具有如下特征:
1、 具有明确且有挑战性的共同目标
  一个具有明确的而且有挑战性目标的团队比目标不明确或不具有很大的挑战性目标的团队效率高得多,通常技术人员往往会因为完成了某个明确的任务,而且这个任务的完成具有挑战性的意义而感到自豪,反过来团队成员为了获取这种自豪的感觉而更加积极的工作从而带来团队开发的高效率,如作为系统设计人员很清楚的知道在什么时候要做到什么,什么时候开始做,什么时候必须完成,为了完成工作必须面临哪些挑战,怎么解决这些困难等为设计出一个高质量的软件项目提供了重要保证,而模模糊糊的去设计一个系统或模模糊糊的就去编写代码是非常危险的,而且会为此付出高昂代价,因此高效的软件开发团队具有挑战性的共同目标。
2、 团队具有很强的凝聚力
  在一个高效的软件开发团队中,成员们凝聚为一个整体共同进行工作,他们是相互支持、互相交流、互相尊重的,而不是相互推卸责任、保守、相互指责的,在一些散乱的开发团队中往往存在这样的问题,一些程序员是比较保守的,明明知道另外的模块中需要用到一段与自己已经编写完成但有些难度的程序代码,他也不愿拿出来给其它程序员共享,不愿与系统设计人员交流,这样给项目的进度造成了些不可度量的因素。
3、 具有融洽的交流环境
  在一个开发团队中,每个人行使自己的职责,如需求分析人员制定需求规格说明、系统设计人员做系统概要设计和详细设计、项目经理配置项目开发环境并且制定项目计划等,但每个人的工作不可能做到完美的,如系统概要设计的文档可能有个别地方词不达意,做详细设计的时候就可能会造成误解,项目经理制定计划时可能忽略了某种风险的存在而造成执行者过于紧张的压力等等情况都需要大家通过交流、反馈的手段然后协商解决的,因此高效的软件开发团队是具有融洽的交流环境的,而不是那种简单的命令执行式的。
4、 具有共同的工作规范和框架
  高效软件开发团队具有规范性及共同框架的工作,对于项目管理具有规范的项目开发计划,对于分析设计具有规范和统一框架的文档及审评标准,对于代码具有程序规范条例,对于测试有规范且可推理的测试计划及测试报告等等。并且所有成员都明白自己的职责,知道必须完成什么计划?由谁来完成?什么时候开始?什么时候结束?按什么顺序?等,总之一个高效的开发团队无论是工作内容还是工作流程都具有不同程度的规范性和标准风格的框架。
5、 采用合理的开发过程
  软件的开发不同于一般商品的研发和生产,开发过程中会面临着各种难以预测的风险,比如需求的变化、人员的异动、技术的瓶颈、同行的竞争等,高效的软件开发团队往往是采用了合理的开发过程去控制开发过程中的风险、提高软件的质量、降低开发费用,这样的团队会根据自身的必要程度决定要执行哪些工作?如配置管理、资源管理、版本控制、代码控制等,团队还合理的分划并定义开发过程的里程碑,决定每项活动内容的底线和审评标准,决定各项活动的先后关系或迭代的关系等。总之高效的软件开发团队的开发过程的原则是高效率、高质量、低成本。
二、 目前国内软件开发团队容易存在的问题
  由于传统的旧体制下的管理思想的沿袭、大部分中国人传统的思维习惯及软件行业在中国发展的处于初期阶段等原因,使国内的许多软件开发团队在领导、合作、质量、参与等方面存在一些问题,具体如下:
1、 领导不力
  有效的领导是高效率软件开发团队的基本要求,如果领导不力,工作计划就不一定会合理,团队成员也不一定会投入工作的热情,使团队的凝聚力大打折扣;如果领导不力,就不一定有明确且具有挑战性的目标,团队成员就无法完成高质量的项目产品,无法投入信心和激情。传统的旧体制下的管理思想的沿袭,是部分领导还具有老大爷的心态,于是贪功、推卸责任、明则保身等一系列现象也相继而生;如果领导不力,就无法营造融洽的交流环境,团队的工作便是死板的没有生气的;如果领导不力,就不知道采用什么样的开发过程是合理的,就不可能高效率、高质量的完成软件项目。领导不力还可能导致其它问题的出现。
2、 缺少必要的信心和激情
  也许你会发现周围的一些同事仅仅是为了薪水而工作,在执行工作的时候即使发现了上层领导忽略的问题依然照糊涂画瓢也不反馈问题所在,即便他是个天才,但成功不会属于他的,因为成功垂青于有激情的人才,其实这些同事并不是一开始就缺少激情的,原因也许是失去了信心,而暂时做"糊涂人"而已,无论如何,缺少信心和激情的团队,只会是一盘散沙。
3、 软件质量的价值观念模糊
  软件质量这个问题已经是老调老谈了,但质量的标准是如何?是否在团队中有明确的评价标准?目前国内的许多软件开发团队都很难给出正确的答案,许多的项目最终仅仅是以可以交差、收到钱、套概念、圈钱等市场行为做为标准。目前流行的许多开发过程、质量体系如:RUP、XP、CMM、ISO9000、SEI等真正应用的又有多少?一些公司仅仅是用来提升公司形象而已。缺少正确的软件质量价值观念的软件开发团队是不可能有明确目标的,不可能会采用合理的开发过程,也不可能有共同的工作规范和框架的。
4、 相互的合作并不协调
  在一个开发团队中偶尔有部分人不愿意与整个团队合作,也许是这些人性格比较保守,也许是有某些不平衡的心态,也许是他们还没有明白目标是什么,也许他们并没有体验到团队开发成功的快乐。。。不管怎样,这种情况的出现必然影响融洽的交流环境。
5、 无效的内耗占据了开发过程的主体
  也许是一些不良的传统观念和思想的沿袭,一些软件开发团队出现了排挤其它有异议的成员、推卸责任、相互指责、贪功等,这种情况是最坏的,但却事实存在。没有凝聚力的团队是不可能做得很好的。
6、 模糊不清的角色职责定义
  软件开发是由不同角色的成员共同协作完成的,但目前国内的一些开发团队却没有对各种角色成员的职责做出明确的定义,成员就无法明确知道自己的目标,很简单的道理,都不知道要做的是什么,能按时准确的完成吗?如果每人都按自己想象中的职责去工作,那么有多少工作冲突、多少遗漏,谁能给出正确的估计?没有明确的职责定义人力资源的安排可能合理吗?结果可能是找了个资格较老的程序员做了项目经理,找了个没有理会对象概念的人去做面向对象的系统分析,找个不顾网络安全、网络流量、事务特性、运行费用的人去设计一个分布式系统。。。有才华的人也许只能跺在被窝里激呼怀才不遇或许能做个美梦安慰自己。
三、 营造高效软件开发团队的关键因素
  如果做到了高效软件开发团队的特征,那么这个团队肯定是高效的团队,可是如何才能营造这样的一个团队呢?上面分析了国内软件开发团队容易出现的一些问题,解决这些问题及避免这些问题的出现是营造高效软件开发团队的出发点,但一些问题产生的原因是其它问题的存在,关键是解决问题的根源,所以营造高效软件开发团队的因素是以下几点:
1、 选拔或培养适合角色职责的人才
  软件项目是由不同角色的人共同协作完成的,每种角色都必须有明确的职责定义,因此选拔和培养适合角色职责的人才是首要的因素,如:选拔软件项目开发经理一定要注意,这人要熟悉各种设计方法,愿意听取其他人的意见并且客观上和逻辑上把自己的思想与其它人意见相比,掌握激发团队成员的积极性的方法等;选拔系统分析员,一定要注意,这人要熟悉需要的设计方法,掌握系统分析和设计的原则,拥有完成职责所需技能和丰富经验等。选拔或培养适合角色职责的人才,特别是合适的软件开发经理是营造高效软件开发团队的最重要的因素。
2、 建立共同的工作框架、规范和纪律约束
  软件项目的开发是创造性的工作,但要有必要开发纪律。建立共同的工作框架使团队成员知道如何达到目标,知道应该做到什么及对开发过程达成共识;建立规范使各项工作有标准可以遵循,使成员知道团队的风格是怎样的;建立一定的纪律约束保证计划的正常执行。
3、 自我管理
  作为团队的成员,应该以开发经理为首坚持管理自我,对工作负责,与同事友好合作,遵守工作纪律、自我技能培训等。
4、 学习国外成功经验
  学习国外的一些成功开发过程、分析方法、设计思想、体系结构、设计模式等,如学习合理统一开发过程(RUP)的一些实践,归纳适合自己的合理开发过程;学习先进的系统分析、设计的思想力求完成更高质量要求的软件项目;学习各种体系结构优缺点及适应情况,设计出满足系统需求的软件体系结构;学习国外成功设计模式,使代码的编写满足更高质量的需求。