案例一:问题团队A
D公司是个在发展壮大中的贸易公司,由于业务发展员工从刚开始的10人两年内增加到150多人,管理上出现了沟通效率低、对员工工作难以监控的现象。公司想近期上OA系统,以加强公司的工作效率、支持快速增长的业务。经过几次与F开发公司的沟通后,双方确定了合作意向。安排有两年开发经验的开发工程师苏成,作为项目经理带领三个开发人员,开始了D公司的OA项目。
因项目不大,没有特别安排需求工程师,而由项目经理与客户确认需求后进行开发,初为项目经理的苏成信心爆棚:对外,他想当然地按照合同后附的简单需求说明草率开发;对内,他认为项目经理拥有绝对权力,任何关于开发的不同意见都听不进去。在第一期快结束时,苏成已与项目组成员发生了N次争吵,大家纷纷要求调离项目组,团队面临崩溃。
在两个月未与客户沟通的状态下,苏成项目组向D提供了OA系统一期产品,按合同规定包括了:员工管理一项功能和其中四个子项。看完基本功能演示后,D公司的HR经理Helen几乎崩溃——OA系统中员工管理没与考勤部分联系起来,而且在系统中增加一个新用户需要五步,十分繁琐,很多功能也与公司需求相差极大。
但是苏成却认为这些都是小问题,更让Helen气结的是要求增加一个小的统计功能时,他居然说做不了。后来才了解到,原来在开发时,项目组并没有留下文档,加之团队其它几个成员均已准备离开项目组,任何在此模块中的小小变化都会面临所有代码重新开发的局面,更不用说要新增什么功能了。
最终苏成辛苦开发了几个月却没有得到相应地回报,客户不满意,项目组成员不满意,研发部总监更是对他的能力产生了怀疑,在几经努力拿到D公司的第二期项目开发合同之后,更换了项目经理。
点评:程序员如何以明确需求为基础与客户沟通?
如果有专门掌握需求编写技术和经验的需求工程师作为客户和程序员之间的桥梁是最理想的状态。但以国内目前的国情,每个项目组都配有需求工程师的并不多。因此,正确地帮客户表达需求、正确地理解需求就成了程序员的基本素质之一。在此次调查中66.67%的被访者认为“能帮助客户正确提出需求”是程序员职业素养之一,可见在程序员内部已就此达成了相当的共识。认为“能使客户需求更完善”是程序员看重的职业素养之一,占到此次调查的55.13%,这说明超过一半的程序员认识到,帮助客户完善需求会节省双方的时间和精力。
那么如何才能提高自己的需求分析能力呢?以下分享几个有关需求的小技巧:
1.尽量提高自己的表达和沟通能力。良好的表达和沟通能力能在客户不能清楚表达需求时,融入到客户组织内部,了解客户的工作流程,与客户共同更好地、更准确地定义和分析需求。此次调查中60.90%的被访者认为沟通能力是程序员应具备的基本能力,但只有28.85%的程序员认为“表达能力”是程序员必备的基本能力。沟通固然很重要,但我们更应该进一步认识到准确表达自己的观点和意见也是成功沟通的基础之一。如果只“沟”而不“通”仍然是在浪费方面宝贵的时间。
2.应用多种方式了解需求。常用的方法有:问题分析法和建模分析法以及几种方法的结合。比如在问题分析法中应用面向对象的思想,与客户的员工谈话,访谈首先要面向工作流程,面向任务,面向角色,也就是用面向对象的思想帮助客户理清思路。
3.不臆测需求。如果有专门的需求工程师,有一点要特别强调,就是在编码过程中当需求不明确时,必须与项目经理或需求工程师及时沟通,程序员不能自作主张地猜测客户的需求。
4.不过度承诺。很多销售人员拿到项目,向客户大包大揽,甚至完全不顾公司的现有开发能力向客户承诺很多功能。在定义需求阶段,一定要向客户说明“什么是我们能做的,什么是我们应该做的,什么是我们不能做的”。很多时候过度承诺导致了新功能无法实现的同时,原有功能也受到影响。在此次调查中,有59.62%(近六成)的被访者正确地认识到对客户提出的不合理需求拒绝得当也是程序员职业素养的一个重要方面,这是非常难得的。
案例二:严格开发流程的团队B
国资委某下属集团公司要上OA系统,C公司在研发能力、价格两个方面以综合分第一的成绩竞标成功。拥有10年项目管理经验的李石被任命为项目经理,并由他组建团队。李石对团队成员只有三个要求:分析能力、产品意识、较强的团队意识。
初选方案
需求确定后,项目有两个方案:更流行的BS模式和传统的CS模式。李石安排两个程序员前期负责选方案,分别基于两种模式开发用户权限管理系统的原型,给大家做演示,并结合客户特别评估每一个架构的优劣。
分析了BS/CS的特点、结合客户的需求,他们发现:
1.从流程的定制来看CS结构更加利于客户方便地进行“可视化”定制;
2.从公文的“不可修改、保密性”以及电子图章的“不可诋毁性”需求来看,CS框架更加利于实现DRM技术和数字指纹技术实现;
3.从公文的打印需求与一般WEB报表的差异性来看,CS框架更加适合对打印格式的定制与控制;
4.从客户提出的内部电子会议的实时性来看,CS框架明显优于BS框架的非状态性,能够做到更顺畅、更及时的沟通;
5.从系统的安全性来讲,CS框架更加适合硬加密系统(如加密狗、U盘Key)与系统的对接。
产品开发
在开发过程中李石强调了每个程序员的产品意识,取得了不错的效果。比如客户要求一个能上传文件的功能时,并没有提出UI需求,团队的B程序员并没有简单完成任务了事,而是做出一次能同时选取上传5个文件的程序。这种产品意识为客户使用带来方便,弥补了需求的不足。
团队配合
在团队B中,每个程序员都做到了做完一个功能后与项目经理沟通进度、结果,并与负责测试的同事沟通,及时检测Bug,及时修改并及时回归。每个功能的实现都相对完善。及时的沟通与相互学习,还促进了团队磨合。
经过8个月的开发,OA项目第一期完成基本功能顺利上线。C公司已顺利拿到了客户第二期的开发合同。
点评:成功的开发需要这样的程序员
通过上面的案例,我们为程序员总结出如下素养:
1.学习和分析能力。每个团队都在成长,作为程序员这个群体就更需要“与时俱进”。尤其是在开发这个知识日新月异的行业里。同时分析能力也是必不要少的。在调查中71.15%的程序员认为,学习能力非常重要,同时有57.69%的程序员认为,在技术方面有不同的意见时,处理妥当是程序员应该具有的职业素养。相信这个案例为我们提供了新的思路。
2.与内外保持良好的沟通,永远是成功的保证。及时汇报、沟通进展也可以在第一时间发现自己的偏差。数据证明59.62%的程序员认为“汇报项目进展时明确及时”是重要的职业素养。
3.产品意识。良好的产品意识可以大幅度提高开发效率,也能有效的弥补需求不足。例如,在案例二中,在做文件上传功能时,充分考虑了客户使用的方便性,弥补了需求中被忽略的细节。
4.团队意识。强烈的团队意识能帮助自己和整个团队更快成长,因为知识的分享是知识学习中一个最有效的方法,尤其是在程序员这个行当里。
5.编码规范和文档规范。据调查显示有分别由80.77%和68.59%的程序员认为编码规范和文档规范是程序员的必备职业素养之一。
文/橙子 点评/职业顾问 Leo
(来自:《程序员》杂志 http://www.programmer.com.cn/)