前言:
- 软件开发项目的成功,取决于很多相互作用、综合影响的因素,因此我们无法找到一种办法来保证软件开发项目能够100%获得成功。
- 但在软件开发领域,通过采取一些特定的做法或实践,可以大大提高软件项目的成功机会,因而我们有必要去发现并采纳这些做法和实践。
- 不管是离岸开发还是在岸开发,有很多通用的方法和实践都能提高软件项目的成功概率,但本文的目的不是去说明这些通用的做法。
- 本文关心的仅仅是在离岸软件开发这个环境中,显得相对比较突出的问题,或者是相对比较容易出现问题的部分。
- 文中所提到的内容,大多来自于作者在相关领域的工作经验,希望这些经验能够对大家获得离岸软件开发项目的成功,有所帮助。
问题:离岸软件开发有什么特别?
离岸软件开发过程中所遇到的问题,大多数都跟在岸开发相似,但主要因为距离上的限制以及时区的不同,有几点跟软件项目成败密切相关的要素变得突出起来:
- 首先是团队之间的协同一致,变得更加困难,这既包括在岸团队和离岸团队之间就工作内容方面的协调一致,也包括两个团队之间就项目进展的同步;
- 其次是沟通的壁垒增加了,这主要包括团队之间的信息共享和知识传递壁垒,可能的影响是增加了由误解信息导致的返工和浪费;
- 再则就是位于两个不同地点的团队之间,容易产生不信任的现象,这将影响团队合作的顺利度和有效性,增加很多不必要的成本;
先说团队之间的协同问题,在离岸软件开发中,大家可能遇到过下面这些问题:
- 这边团队进行的改动,导致对岸团队的代码编译失败,影响了对方工作的正常进展;
- 这边团队check in的内容,导致了对岸团队的变更丢失,其中一方不得不回滚或者重做相关的工作;
- 双方的代码整合过程超出了预期时间很多,而且充满痛苦,这引起人员的不满和系统的不稳定;
- 双方的工作内容出现重复;
- 对方报告的Bug无法重现;
不难看出这些问题都有一个共性,就是双方的协调一致没有到位。就个人的经验,采取以下做法将有助于降低这些问题发生的概率和影响:
- 双方一开始就应该建立起公共代码库,共同基于这套代码进行开发,并采取持续集成的做法经常性同步代码;
- 建立并遵循共同的规则,譬如每天Check in,并且check in之后,必须编译通过才能下班;
- 尽量使用共同的开发工具和环境,譬如相同版本的控件和相同的测试环境;
- 经常性同步,譬如定期合并Branch和Trunk;又譬如每周共同举行两次远程站立会议;
- 采用相同的实践并尽量使其有所交叉,譬如离岸在案团队都采用2周一次的迭代,在每个迭代末共同举行演示会议等;
离岸环境下,沟通方面的问题主要在于难以开展面对面的沟通以及时区的差异可能导致两个团队没有彼此交叠的时间,常见问题有:
- 难以在不见面的情况下描述清楚需求,或者难以理解客户的需求描述;
- 对需求文档的相关疑惑得不到及时解答,进而影响进展;
- 做出来却发现并不是客户真正想要的;
那么如何去应对这些问题呢?个人经验中比较有效的做法有:
- 一开始就建立多种沟通渠道,至少要保证双方都知道彼此的IM,Email和电话;并且计划固定的沟通时间,譬如每周二、周四沟通,每次是下午的13点到15点等;
- 尽量用有记录可寻的方法来沟通需求,譬如更多地用书面文件来代替口头沟通,若口头沟通,也尽量录音并留存;
- 若用文档传递需求,最好把格式固定下来,尽量多用图片和表格,少用文字;User Story和Test Case是很有效的需求沟通办法;
- 非文档类型的需求传递,原型是最好的方法,最质朴的原型就是手工画的草图,将其扫描或拍照;一段录制的视频资料也可以考虑;
- 尽量用产品去沟通,譬如每周或者每两周向客户演示一次产品并获取反馈;
- 建立共同的信息平台,譬如Wiki
总之,沟通的顺畅度和有效性对离岸环境下项目的成败影响很大,可能首先是一定要确保双方都能花足够的时间在沟通上(因为经常有些客户不愿意在这方面花时间),其次才是采用各种沟通的方法来增强沟通的效果。如果你是发包方,切忌当甩手掌柜的想法,如果实施者对产品没有深入的认识,如何把产品做好呢?
至于信任问题,离岸环境下也是比较突出的,因为除了有形的产出外,双方一般都看不到彼此在做些什么,如果共事者之间没有一定的信任,对项目的成功将是有害无利的。我遇到过的有两种情况:
- 发包方对接包者的不信任 - 发包者心里担心自己的资源被浪费,所以他会想办法设置种种要求和限制,以此确保团队不会分心其它事情;实际上团队这边本来是全心投入的,现在为了满足这些要求和限制,不但增加了很多额外的工作负担,而且团队成员觉得不被信任,缺乏干劲。
- 双方的团队成员之间互相猜疑 - 我遇到过一个项目,开发人员之一认为对方的某个开发人员需求描述得不够清楚,一直把需求退回去,而对方人员认为需求已经够清楚了,不愿进一步反馈,这就导致有些任务在需求这个环节被延误,整体工作进展很慢,双方就是因为缺乏信任而不愿共同合作来解决这个问题。
我相信这类由于缺乏信任而引发项目进展受阻的现象应该还有很多,这也是为什么要进行团队建设的原因之一。在离岸环境下如何改善这种情况?以下建议可以参考:
- 增加双方见面的机会,无论是商务访问还是视频会议,只要能让双方互相看到,感受到对方个体的真实存在,那种感觉会比只看得到冷冰冰的代码、文本和屏幕要好很多;
- 建立共同解决问题的机制,譬如每个迭代结束后,大家一起开会进行总结回顾,讨论共同的问题;
- 主动并有规律性地进行信息共享和披露;
除了上面提到的这些做法,良好的任务拆分也可提高离岸软件开发项目的成功概率,推荐的做法是把工作内容按照功能特性进行拆分,这样做的主要目的是避免业务逻辑层面的耦合性,以减少不同团队之间的沟通协调需要。如果是把项目外包给个人或者是能力还未达到胜任系统级设计的团队,那么在拆分任务时,尽量把任务分得细小而明确也是比较有益的做法,因为小而明确的任务利于实施和管理,使得项目更加可控。
以上是在离岸软件外包环境下,软件开发项目中比较常见的三个问题及其对策,欢迎补充和探讨。