近 20 年来,许多新一代的软件技术、 过程和方法的发展异常迅速,但软件工业仍然是一个人力密集的过程,离工业化生产方式的差距相当遥远,软件开发人员的素质、 技术、 能力以及软件开发团队建设的好坏,对软件项目的成败有着举足轻重的作用。为了提高软件开发的效率,提高软件开发的质量,减少软件开发的成本,降低软件开发的风险,就必须加强软件开发人员的管理,建立高效的开发团队。
1 软件开发团队在软件开发中的重要性
软件企业与传统工业企业不同,与现代企业的其他行业也不同。其最主要特征就是,企业最主要的 “资产” 是一批掌握技术、 熟悉业务、 懂得管理的 “人”。软件企业主要的成本是人的成本,软件企业主要的财富积累是知识和经验的积累。因此,软件企业的人力资源管理,是企业最主要的管理内容。软件项目组的管理过程,几乎全部是围绕 “人” 来进行的管理。而作为被管理对象的 “人” 本身管理的讨论,则越来越成为软件领域所要讨论的核心问题。软件项目队伍是项目的基本工作单元,队伍的作用非常重要,是顺利实施项目的基础平台,值得花时间研究,探讨与项目成败的关系,以便更好地组建队伍,最大限度地提高工作效率。软件项目管理的主体是软件开发团队。一个软件项目管理的好坏,很大程度就体现在软件开发团队的建设和管理上。软件开发团队是软件项目实施的基础,它直接影响和制约着软件项目管理的最终效果。软件开团队在软件开发中的作用越来越突出。团队管理非常重要,它是项目顺利进行的基础,对于一个球队来说,要大力培养他们的团队精神,要求队员深刻认识自己球队的特点,团队精神能使球队更具有竞争力,可以打败实力相同而没有团队精神的球队。同理,对于软件项目团队也一样,在开发复杂软件的时候,通常每个人开发不同的部分,运行这些软件的设备又可能来自不同的供应商,而事后将软件的不同模块集成在一起,带来的问题会更多。一个软件模块本身没有问题,但是合在一起却可能不能工作。所有这些都需要一个高效合作的团队来共同完成的,所以建立一支工作效率高的队伍非常重要。
2 软件开发团队的建设内容
高效的软件开发团队是建立在合理的开发流程及团队成员密切的合作基础之上的,成员共同迎接挑战,有效地计划、 协调和管理各自的工作以至完成明确的目标,高效的开发团队具有如下特征:
(1)具有明确清晰的共同目标。高效的开发团队对要达到的目标有清楚的理解,并知道目标的重大意义和价值。清晰明确的目标会激励团队成员把个人目标升华到群体目标,团队的成员愿意为团队目标做出承诺,共同努力实现目标。项目经理及团队成员对于实施什么样的项目;为什么要实施这样的项目;团队的工作范围有哪些;实施项目的主要目标,包括时间要求、 成本指标、 质量性能参数等;完成项目的重要交付成果及其衡量标准,以及实施项目的制约因素及假设前提等问题有着共同的认识与一致的理解。有了明确清晰的目标,团队的每个成员都十分清楚团队要取得什么样的成就以及由此给团队、 给个人带来的益处,他们能将个人目标与项目目标有效地结合起来,会积极地完成工作从而为团队带来高效率的开发,为设计出高质量的软件提供了重要的保证。项目团队参与充分的策划活动,对于如何实现项目的目标,包括采取的步骤,应用的工具、 技术与方法,采用的规章制度与作业流程,以及应遵循的价值观和行为准则达成共识。由于观念上的统一,队员很容易在行为上步调一致,他们都强烈希望为争取项目成功付出努力,能满腔热忱地为实施项目活动付出自己的智慧、 时间和努力,并且能自觉地运用团队精神和共同的价值观去规范自己的行为,去争取项目的成功。
(2)团队成员相互信任,精诚合作。成员间相互信任是高效团队的显著特征。只有相互信任才能够真诚地相互交流,相互支持,共享工作成果,能够围绕项目展开紧密的合作,能够相互指出工作中存在的不足,从而减少相互推卸责任、 相互指责,增加团队的凝聚力,提高项目开发的效率。相反,缺乏信任会使团队散乱,给项目的开发带来不可估量的负面影响。精诚合作是队员强烈地意识到个人和团队的力量,充分了解团队合作的重要性,视彼此的合作是团队智慧和力量的源泉,而不仅限于完成自己的任务。他们充分相信团队比任何一个个人都能做出更好的决定,制定更科学的方案,解决更复杂的难题。团队队员不羞于寻求他人的帮助,能够自觉地以双赢思维相互协调、彼此配合,积极主动地向他人提供所需要的指导与支持,分担团队发展和领导的责任。在冲突和问题面前能够设身处地地站在对方的立场上看问题,能够集思广益倾听团队中其他人的意见。
(3)融洽的关系及通畅的沟通。团队成员之间高度信任、 相互尊重,既关注工作本身,更珍惜彼此之间的友谊,能够共同营造和谐、 宽松、 友爱的工作环境。他们意愿分享知识、 经验和信息,互相关心,使团队有一种强烈的凝聚力,成员在团队中有一种归属感与自豪感,彼此能够分享他人及团队的成功。团队致力于进行开放性的信息交流与沟通,承认彼此存在差异,鼓励不同的意见,并允许自由地表达出来。队员能毫无顾忌地表达他们的意见、 观点和想法,大胆地提出可能产生争议或冲突的问题,而不用担心遭到打击报复。每个人不仅仅是热情的表达者同时也是忠实的听众,团队成员不同的意见和观点能得到尊重和包容。面对冲突和问题,当事人能够就事论事寻求彼此接受的解决问题的方案,并通过诚恳而友善的反馈来帮助团队成员认识他们的长处及弱点,帮助团队实现项目目标。
(4)具有共同的工作规范和框架。软件项目的开发是创造性的工作,但要有必要的开发纪律。建立共同的工作框架使团队成员知道如何达到目标,知道应该做到什么及对开发过程达成共识;建立规范使各项工作有标准可以遵循,使成员知道团队的风格是怎样的;建立一定的纪律约束保证计划的正常执行。在项目策划阶段,团队对如何完成任务、 由谁去完成、 完成任务的期限、 所需技术等方面通过责任分配矩阵(LRM)得到清楚的界定,团队成员分工清晰、 权责对等,每个人都清楚自己在项目中的角色、 职责及汇报关系,包括上级是谁,下级是谁,遇到困难从何处取得支持等。每个人都能得到充分的授权,在完成他应该做的事情的同时,还有一种整体观念,知道自己工作上的失误将对他人、 对整个项目造成的影响。
(5)高昂的士气与高效的生产力是标志。团队成员对项目工作有满腔的热情和高度的信心,大家在一起工作配合默契、 心情舒畅、 其乐融融,彼此能从工作中体会到成功的乐趣,每个队员都强烈地感到作为项目团队一员的骄傲和自豪。团队能够认同和利用个人的特长,依靠集体的力量和智慧去制定项目计划、 优化项目决策、 平衡项目冲突、 解决项目问题,结果团队比任何个人更出类拔萃,做出的决策更正确、 制定的计划更完善、 解决的问题更复杂,能以更低的成本、 更少的投入,产生出高质量、 高标准、 更快捷的项目成果。
3 软件开发团队建设的方法和技术
3.1 选拔或培养适合角色职责的人才开发团队人才选拔和培养是建设高效团队的基础。一个软件项目的完成是由项目经理、 系统分析员、 设计员、 程序员和测试员共同协作完成的,在这个过程中每个角色的职责是不一样的,因此在人才选拔和培养的标准上各有不同。各角色的职责和要求如下:
3.1.1 项目经理
职责:制定产品的目标;制定各个工作的详细任务表,跟踪这些任务的执行情况,进行控制;组织会议对程序进行评审;综合具体情况,对各种不同方案进行取舍并做出决定;协调各项目参与人员之间的关系。人员要求:对产品有激情,具有领导才能;对问题能正确而迅速地做出确定;能充分利用各种渠道和方法来解决问题;能跟踪任务,有很好的日程观念;能在压力下工作。
3.1.2 系统分析员
职责:了解用户需求,写出 《软件需求规约》 ;建立用户界面原型。人员要求:担任系统分析员的人员应该善于协调,并且具有良好的沟通技巧。担任此角色的人员中必须要有具备业务和技术领域知识的人才。
3.1.3 设计员
职责:定义类的方法和属性以及各个类之间的关联,画出类图;进行数据库设计。
人员要求:掌握面向对象分析与设计技术,统一建模语言
(UML) 。
3.1.4 程序员
职责:按项目的要求进行编码和单元测试。人员要求:良好的编程技能和测试技术。
3.1.5 测试员
职责:执行测试,描述测试结果,提出问题的解决方案。人员要求:了解被测试的系统,具备诊断和解决问题的技能,编程技能。
3.2 增强项目的凝聚力
项目团队的凝聚力不仅是维持项目团队存在的必要条件,而且对项目团队潜能的发挥、项目团队生产效率的提高有重要作用。因此在工作中采取必要的措施不断增强项目团队的凝聚力,并引导团队成员努力为
现项目目标而工作。要增强项目团队的凝聚力,应采取以下措施:
(1)建立共同的愿景。愿景是项目经理与项目组织成员共同
建立起来的、 融项目目标与个人目标于一体的、 项目组织成员们努力要追求的目标。有了这样一个目标,项目团队就可以对团队成员产生强大的吸引力,从而增强团队的凝聚力。另外,愿景使组织目标与团队目标高度一致,因此可以使团队的生产效率大大提高。
(2)采取措施满足项目组织成员各种物质和精神需求。除了建立共同的愿景之外,在项目建设的过程中,项目经理应注意采取必要的措施满足项目组织成员各种物质和精神需求,使其不断受到激励,从而增强团队对他们的吸引力。如:通过使成员承担的工作内容更有挑战性,授予他们在工作中更大的自主权,来满足他们希望实现自我价值的精神需要;通过为成员提供学习的机会,来满足他们希望不断提高自身价值、 不断成长的需要;通过公平合理的工资和奖金的发放,来满足他们希望不断改善生活条件的需要;通过各种各样丰富多彩的业余活动的安排,如聚餐、 郊游等,来满足他们希望与人交往、 沟通的需要。
3.3 营造良好的沟通氛围和交流环境
与 IT 项目成功有直接关系的3个主要因素分别为:用户的积极参与,明确的需求表达,管理层的大力支持。这三要素全部依赖于良好的沟通技巧。要营造良好的沟通氛围和交流环境,具体来说应该做到以下几点:
(1)加强团队成员之间的沟通。成员之间由于价值观、 性格、处世方法等方面的差异会产生各种冲突,人际关系往往会陷入紧张的局面,甚至有可能出现敌视情绪以及向领导者挑战等各
种情况。为此,软件开发经理要进行充分沟通,引导团队成员调整心态和准确定位角色,把个人目标与项目目标结合起来。
(2)促使团队成员尽快熟悉工作环境。团队成员与周围环境之间也会产生不和谐,如对软件开发团队采用的信息技术不熟悉等。软件开发经理要帮助团队成员熟悉工作环境,学习并掌握相关的技术,以利于软件项目目标的及时完成。
(3)加强软件开发团队与其他部门之间的沟通。在软件开发过程中,开发团队与其他部门也会产生各种各样的矛盾冲突,这需要软件开发经理与这些部门的管理者进行很好的沟通和协调,为软件开发团队争取更充足的资源与更好的环境。
3.4 鼓舞项目团队士气项目团队的士气依赖队员对项目工作的热情及意愿,为此,项目经理必须采取有效措施激发成员的工作热情与进一步发展的愿望,创造出信任、 和谐而健康的工作氛围,让每个成员都知道,如果项目成功了,每个人都是赢家,个人的价值也得到了实现,否则便是双输,而且,任何人都没有比团队更聪明、 更有战斗力。鼓励成员相互协调、 彼此帮助,开诚布公地表达自己的思想
可行的团队模式
很多团队,公司在成本压力下,总是希望寻求一个最经济有效的团队组合,这个是可以理解的,也是开发的初衷。
最小团队不是指单纯的减少人员,不是把一个需要5个人做的工作压缩为1个人做。
软件开发本身存在一个众所周知的弊病,就是只要存在一个能够编码的技术人员,那么软件就总是能够“做”的出来,这也给人一个假象,软件开发的最小团队就是一定数量的“码农”;这个在其他领域比如建筑和制造几 乎是不可想象的,究其根源,是因为软件的质量标准过于的飘渺: 我的意思是,最小团队绝不是几个“码农”。
人员可以合并,但角色不能合并;职能可以合并,但能力不能合并: 换言之,担什么角色就必须能做什么事情,就必须具备相应的能力.
总之,我对最小团队的看法,最小团队就是最少的角色,而这些角色不能再削减,但人员还是可以以兼任的方式来合并角色,不过在兼任过程中要注意不能有名无实,同时需要具备胜任该角色的能力.
三要素
软件时开发的三个基本要素是:管理,业务和技术。
管理: 除完全以单人方式进行的开发不在本文讨论的范围,2人以上就存在一定的团队管理,人员的协调,工作的安排,流程的部署,进度的监督等等,加上必然存在的客户管理,“鸟无头不飞”,说的就是管理者的必要性。
业务: 很简单,软件做了半天是为什么而做,产生什么效益和结果,这个都需要业务来完成,业务来自于需求,深化为设计,由测试加以验证, 最后接受者是客户。
技术: 更容易理解,没技术能叫软件开发?软件开发首先是技术活,但广义上来说,需求分析,系统设计和开发管理这些也都属于技术的范畴,只要需要方法论的地方就需要技术。
所以做软件先考虑其三大要素,是管理是否成熟,业务是否明确,技术是否过硬,就能知道软件是否能够顺利完成。
角色
下面我们从3个基本要素的基础上讨论下,探讨下我心目中的最少角色。
管理体系
项目经理: 兼顾客户管理和团队管理2大职责,在小团队中,这两种管理几乎不可能再拆分。
业务体系
需求分析:从客户获取需求并加以分析,重在和客户的交流。
系统设计:通过软件的设计方法,把需求升华为软件系统。由于系统设计是一种非常抽象的升华过程,这里我认为还是和需求分析分开。
测试:对软件实现业务的确认和评估者。
培训:业务的实施者,撰写系统相关文档(功能性文档),另外也需要负责客户的培训,由于该人员和测试人员有对内和对外之分,目前在角色上还是加以区分。
技术体系
主程:整个开发技术体系的支持者,就是我们一般理解的“技术高手”,在小团队中虽然还谈不上“构架师”的名头,但主程除了需要较高的研发能力以外,还必须能培训带动其他人员进入自己的技术体系。 n 业务开发:一般有被称为后端开发人员,由于目前的系统都需要大量的数据支持,这样的人员必然具有极高的数据处理功底。
前端开发:由于客户对界面的要求日益提升,前端人员目前的地位已经大幅提高,不但要熟悉界面构架,界面技术,相当程度也必须熟悉数据查询和后台技术。
界面设计:当前端开发不能达到美观要求,界面设计人员必须以自己的美术能力加以辅助设计。 目前来看以上9大角色几乎我认为的最少角色配备(非人员配备),当然其中,培训(如果软件简单到不需要培训),主程(技术简单到不需要高手研发),界面设计(界面简单到不需要设计),者3个角色为辅助角色,在特定的情况下可以考虑省略,尽管我认为这样的情况其实并不常见。
人员
有人会说,不是9个角色吗,我1个人或者2个全包了,这就是最小团队; 但如果每个角色的工作都要做好,显然不太现实. 又有人说了,那么有个角色就马虎点呗,反正软件给你做出来就行了: 好,这里就涉及本文的一个核心问题,我认为这9个角色如果被随意省略,或者根本不做,那么软件的质量将会受到极大的影响. 不过9个角色也不是一定需要9个人,那么最小的人员配备是什么的, 我谈下我的看法:
1. 项目经理可以和需求分析: 这个在很多团队几乎是一个标配,由于项目管理和需求分析合并同样是一种交流为主的工作,这样的合并是合理的.
2. 系统设计和业务开发: 刚刚说了,需求分析是更偏向于客户交流的工作,而系统设计则是更多依赖逻辑思维和技术理解的工作,这两者最好是分开. 而作为系统设计者,对技术构架的理解加上对业务本身的理解,做后台业务开发几乎是顺理成章.
3. 前端开发和界面设计: 在目前日益增长的软件界面要求下,前端开发的要求越来越高,其工作量和技术要求完全不在业务开发之下. 前后端人员分离是目前比较常见的选择, 另外, 前端人员业务也需要完成界面布局和一些美观方面的设计. 当然如果对界面美术要求非常的高, 还是可能需要其他美工的协助.
4. 测试和培训: 测试人员是业务的确认者,那么就不能由业务的开发者来兼任,系统设计看似是另外一个不错的选择,但一方面成本较高,另外一方面兼顾业务开发的系统设计人员可能无暇分身,加上后期培训需要的考虑,加入一个测试人员无疑还是比较划算的.
5.主程: 这个人员是可选的, 如果团队技术框架稳定明确,这个角色可以不加,业务和前端开发人员一样能够完成系统的技术实现. 风险也较小, 但如果团队的技术框架是不成熟的,项目的技术风险特别大的,我强烈建议加入一个独立的主程人员,为项目的技术实现保驾护航.
所以我心中的最小团队这样的:
一个具备管理能力和需求分析能力的项目经理.
一个能够进行系统设计和后台业务开发的业务开发人员.
一个具有一定界面设计和较强前端开发能力的前端开发人员.
具有测试能力和一定培训和文档能力的测试人员.
共4人团队.
如果团队技术体系不成熟,项目技术风险特别大的时候,请加入
一个具有很强研发能力,技术能力过硬,对软件构架有相当理解的主程人员.
共5人团队
当然根据项目的规模再适当增加更多的业务开发,前端开发或者测试人员,这里就不加累述了,而一般项目经理和主程不需要太多人参与.
总结
最小团队指用最少的角色组建团队,角色可以合并,但工作和能力不能省略. l 软件时开发的三个基本要素是:管理,业务和技术
软件团队最少需要的9个角色是:项目经理,需求分析,系统设计,业务开发,前端开发,测试,培训,界面设计,主程.
最小团队至少包括4-5人: 项目经理,业务开发人员,前端开发人员,测试人员,必要时加入一个主程人员.
最后,根据我目前的经验,最小团队的最大问题不是这个团队能不能完成任务,而是能不能找到5个合适的人员,最小团队的确大大削减了人员的数量,但其实是大幅提高了对人员素质的要求,少而精是它的本质,而在实际情况中,既不愿意化代价请高手,又不愿意化时间培训新人,却偏偏希望团队“少而精”,才是这种模式最大的尴尬。

