vlambda博客
学习文章列表

为什么敏捷开发落地那么难?

最近项目组发版质量持续降低,生产事故接连不断,回家的路上陷入深思,明明几个月前还做的相当不错,质量稳步提升,虽不完美,但总算还在持续进步。到底什么原因导致现在的情况?随着思考不断深入,更多本质的问题浮到面上。(本文着重讨论开发,不涉及敏捷需求价值部分)


人的素养:

手工艺人制造商品,从设计,制作,检验,并摆上商铺进行销售往往都是一个人完成。逛街的时候会遇到现场制作的手工艺人,一道工序,接另一道工序,最后组合成可用的商品,其中并没有看到做出来的东西需要另一个人单独测试,才能摆上商铺才能销售。大家往往习惯于此,但为什么我们的软件制作(开发)需要单独一个人或一组人帮你验证(测试),你自己开发的东西?你自己开发出来的东西,为什么有如此多的缺陷,如果不经过别人的验证,甚至不敢摆上商铺销售(上线)?

优秀的软件工程师,完成一段代码,一个功能,无论从内在质量,还是外在质量都经得起推敲,甚至根本不用任何人帮助他验证,即可上线。他们在做自己功能的时候,会主动构建自动化测试,开发过程中不断重构自己代码,完成后还要经过自己多次验证,同时为了避免思维盲区,他们会采用结对编程或同行评审的方式再次验证功能的逻辑。然后和测试,产品一起看看还有没有遗漏的部分。完成上述事情,他们才认为开发完成。


平庸的.....(我觉得都不应该称为工程师),接到需求,不经思索就匆忙开始,写完代码,不做任何自动化验证,不做重构,简单测试功能(happy path),甚至happy path都没跑完,然后就扔给测试人员一堆垃圾代码,就让别人测试。这是软件开发吗?这就是中国当前大多数企业的开发现状。


我觉得这是人的素养问题,有涵养的人对自己的事都有高度的责任心,做任何事都抱着不麻烦别人的利他精神,自己的事情做到极致的工匠精神,自己的代码自己负责,需要他人协作也是借鉴他人思路,而不是假他人之手来做。和这样人相处整个团队都会处于正向上升,效率,质量都会不断进步。但是如果团队大量存在平庸的人,那么这个团队只能处于向下的循环,开发效率低下, 质量差,开发埋怨测试不够快,测试埋怨开发质量差,整个团队士气低下,几乎无可救药。


意识与技能

“功能都做不完,还写什么自动化测试,做什么重构?”,能力平庸的开发人员往往搬出这套说法告诉你,做这些浪费时间,影响交付。往往说这种话的人,从没写过自动化测试,重构是什么根本不了解。他们不知道CI,TDD,refactoring三件套实际是加速整个交付效率。这种人既没有良好的软件开发意识,同时也不具备基本的软件开发技能。在一个企业留下一堆垃圾代码,然后仓皇而逃,继续祸害下个企业。

这里企业并不是无辜的,只要“性价比高”就招进来,宁愿招一群能力平庸的人,也不愿高薪聘请少量的优秀工程师。软件在欧美是一个令人羡慕的行业,薪资常年Top5,engineer这个职位是被人尊敬的。但在这里廉价劳动力获得野蛮生长,真正的劣币驱逐良币。


磨刀不误砍柴工

我们有句谚语:“磨刀不误砍柴工”,这句话用在开发里面解释就是,如果我在加入一个新功能前,能有结构清晰的代码(重构完成),有良好的自动化测试守护,那么在加入新功能时就能加快速度。总体做完一个功能花费的时间比在一个内部质量差,且没有自动化守护的代码基上加入新功能花的时间更短。

重构+自动化测试+新功能+测试+修改bug所花费的时间 < 直接开发新功能+测试+修改bug的时间。

有时大家明明理解这个道理,却还是不愿意去做,是因为工作量的原因。敏捷期望团队提升协作,提升能力,达到提升效率。但很多组织在团队还没有提升的时候加大工作量。上个迭代完成60个点,下个迭代就要求完成80个点。导致团队明知道磨刀会加快速度,但却不愿意磨刀,直接去砍柴。结果越砍越慢,越慢越加班,越加班,越不愿磨刀,形成恶性循环。


管理文化

敏捷体系是建立在信任的基础上。有了信任才有了协作,不同性格的人才有发挥空间。敏捷强调管理者、团队关注未完成的事情。一旦管理者,团队不仅仅关注事情,还更关注人是否忙碌,这个直接破坏了敏捷的基础。这样每个人都处在微观管理下,协作变的不顺畅,团队无法自组织,更无法持续提升。

要让敏捷发展,管理层要有魄力信任个人,团队,让他们自主决定做哪些事,怎么协作,怎么提升,不到万不得已,不干涉团队的决定。这个对管理者能力是个极大的考验。


绩效

还记得“绩效毁掉sony这个故事吗?”讲述sony公司在引入绩效考核后,大家都盯着kpi做事,有一个很有价值的事,产品老化测试,但由于耗时长,体现不出绩效,而无人问津,最后导致sony的产品质量急剧下降。

虽然不知道这个故事真假,不过绩效可以很轻易的破坏敏捷文化。敏捷文化很重要的一点就是协作,无论个人还是团队之间。如果一个组织过度注重绩效,人人都盯着绩效做事,凡事都问:“这个事对我绩效有什么帮助吗?”。那么会导致人与人之间,团队与团队之间协作困难。每个人和团队都在做局部优化,整体优化丢失,组织整体效率变的低下。


总结一下:

要开展敏捷,以下几点很重要:

* 需要高素养的人,技能可以学习,但高素养的人需要从小培养

* 开发中经常使用UT,TDD,refactoring,pair programming,code review

* 支持团队成长,合理化工作量,通过团队成长,效率提升来提升工作量

* 扁平组织架构,基于信任的管理

* 注重整体绩效,尽量基于团队,甚至多个团队进行整体绩效管理


看起来很简单,实际上每一条都很难,敏捷就是这样难。