引言
2019年新年期间,吴京演的《流浪地球》风靡全世界。 太阳要爆炸,小小地球无处安家;地球人历经磨难,终于找到了安家之地。同样,面对VUCA的时代,软件市场在爆炸,传统软件开发模式受到挑战,我们将何去何从?似乎只有敏捷这条路才能拯救软件行业。在此,让我们回顾一下,软件开发的前世今生。
1,code &fix时代
这是软件开发的原始时代,也是软件行业兴起的初始时代。
用户需求场景:
蒙娜丽莎希望乙方在一个月的时间内给自己制作一幅画像。
解决方案
想象一个不会画画的小孩,拿着画笔笨拙地在纸上涂鸦,最终画出了梦娜丽莎的画像,但确实那么难看。
再想象这次是达芬奇在作画,他凭借多少年的艺术修养和技术积累,在画纸上行云流水,潇洒自如。画出的画像惟妙惟肖,而梦娜丽莎的微笑,更是让无数人痴迷。
所以,那个时代,用户的需求是明确的,但软件质量的高下,全赖个人的技术积累和艺术修养。
总结
总结一下,code&fix 时代,软件开发的特点是
● 需求简单,基本明确
● 个人英雄主义,拼个人才华,很少协作
● 工具简陋,对交付物的影响也不大
● 不需要流程,随写随改
● 没有标准,企业内部如果需要多个系统,则是各自为政,完全竖井架构。
2,传统的软件开发模式时代
场景略有改变
蒙娜丽莎希望乙方在一周的时间内给自己制作一幅画像。
解决方案
在这个时代,照相技术正在传统模拟相机的时代。
想像传统相机时代,为了给梦娜丽莎制作出满意的画像,第一步先要充分了解女主的需求,采办服装道具,给她进行化妆打扮,直到女主的原型确认,第二步开始用相机给她拍照,通过对焦、曝光等手段在胶片上留下影像,第三步在暗室里冲洗出相片,然后交给梦娜丽莎检查,接受她的UAT测试,最终完成拍摄,制作出用户满意的一幅画像。
分析
这中间,任何一个需求的微小改变,都有可能重新开始某一步拍照过程,甚至全部来过。比如发型的变化,就需要全部来过,当然如果对曝光度有要求,就只需在第二步进行调整。
另外,在画像制作过程中,工具的使用已经开始普及,工具的优劣对最后交付物的质量有直接的影响,比如相机的好坏、胶卷的好坏、暗室的好坏,冲印药水的好坏,还有相纸的好坏等。
同时,在画像的制作过程中,也有的角色的分工合作,比如化妆师,摄影师,冲印师等,他们的技术水平的高低,对交付物的质量也有直接的影响。
这个例子用于说明传统的瀑布式开发模式比较合适,当然,实际的软件开发远比此复杂,但这个时代的软件开发总的特点是用户需求总体是比较稳定的,不会有太大变化,因此工作量是可估算的、系统开发过程是可排期的、和开发商的合同是闭口的合同。
补充一下,对于需求确认的方式不同,传统开发模式也细分了几个不同的模式,在开发过程中有个发掘和确认过程,需求可以一下子全部确认(这就是瀑布模式适合的场景),也可以一个模块一个模块确认(这就是增量开发模式适合的场景),也可以先确认有把握的部分,然后再补充丰富(这就是迭代开发模式适合的场景)。
总结
总结一下, 传统的软件开发模式时代,软件开发的特点是
● 开发过程中需求明确,有定论,用户接收后需求基本就不会再频繁变更了(这个是为了和敏捷模式进行比较),工作量容易确定,合同是闭口的。系统上线后的变更,可以用运维合同的形式来完成。
● 对于开发过程中需求频繁变更、不断反复的的软件开发,传统开发模式显得力不从心,工作量难以估算,工期无法确认,开发合同已经不可能闭口的了。举个例子,这次蒙娜丽莎希望是穿红衣服的画像,过几天又要变成蓝衣服画像,再下次又要红衣服的画像了。每次需求是确认的,但下次需求和这次需求的变化很大,不只是增加(create),还有大量的(update)。
● 分工明确,需要大量合作,质量依赖于不同角色的技术和管理水平
● 工具集不断丰富,工具集对软件开发的质量和效率有较大影响
● 流程清晰,开发过程有条不紊,可集中交付产品
● 已经形成了质量标准,有了质量管理的方法和组织,质量的好坏,和软件开发的技术和管理的成熟度有关。
● 企业内部多系统已经成为趋势,为了提高软件开发的效率和质量,提出了软件分层和复用的概念,接口大量存在,对于系统间接口也有了成熟的解决方案。(主要是SOA理念的风行)。
3. 敏捷开发模式的时代。
场景有了变化
蒙娜丽莎希望乙方为自己制作画像并发表在自己的博客上,但画像除了是自己本人这个要求比较明确外,发型服饰等外观,需要根据访客们的喜好每周更改一次。
解决方案
在这个时代,照相技术已经从传统相机时代进入了数字相机时代,数字化编辑工具已经成熟,数字化组件可以直接拿来编辑。
乙方决定采用敏捷开发的模式来开展这项工作。首先和梦娜丽莎签了一个长期的合同,然后用scrum的方式开展工作,每周一个sprint 迭代,scrum master 在第一次的需求确认会上,收集了蒙娜丽莎的需求并通过其他途径收集了蒙娜丽莎的关键影迷的需求,和蒙娜丽莎一起确定了最小可用产品(MVP))的各个需求,放入第一个sprint log池中,编辑人员根据需求分解出来的看板(kanban)上的task开展外饰组件的编辑工作和给蒙娜丽莎的数字化照片进行编辑的工作,编辑完成后提交到画像的产品分支(代码分支管理工具),触发其他编辑人员和智能评审工具(自动化测试工具)对该组件进行评审,被修改的组件一旦评审通过,则自动合成并自动发布(CICD)到博客待发布区供蒙娜丽莎和她的关键影迷们进行检查,通过后自动发布到正式的博客区。同时蒙娜丽莎、关键影迷和博客的访问者的需求被不断堆积到product backlog中,供下一轮冲刺中选用。在每个sprint冲刺中每天开15分钟站会来沟通编辑小组的工作情况,周末开展评审会和回顾会,沟通每次交付的技术情况并及时调整敏捷工作方法。此项工作一直延续到梦娜丽莎不再制作画像为止。
总结
通过这个例子,结合软件开发实践我们可以发现敏捷开发时代,软件开发的特点是:
● 需求频繁变更、不断反复,工作量难以估算,工期无法确认,开发合同必须是长期合同
● 需求不再是客户一方的,还有大量的用户(这里客户是梦娜丽莎,用户是她的影迷和博客访问者,产品必须频繁发布以满足客户和用户的需求。
● 业务接口标准化,标准的业务中台已经建立
● 标准的可伸缩的后台架构是支持快速交付和业务流量的核心能力(比如容器云)
● 有成熟的持续集成持续部署和发布的流水线,和自动化测试工具,确保频繁的集成和发布
● 分工明确,依赖于业务中台和技术中台以及CICD工具,团队有极大的自治能力。可采用Scrum等方法进行流程管理
● 系统间接口调用已经升级为服务调用,且不仅限于企业内部,已经开放到整个市场,服务治理成了软件开发的核心能力。
四,总结
软件开发模式的进化,市场需求是幕后推手,同时也得益于云原生的生态环境的进化(包括微服务化、容器化、DevOps等)。对于企业来说,同样要注重整个生态环境的建设,切不可头痛医头脚痛医脚,以至于顾此失彼。
同时,软件开发模式的进化,实际上就是成熟度的提高。如下图所示
软件开发的原始时代 code&fix时代,就是ML1初始级的时代,而随之传统开发模式时代的到来,我们已经在需求确定情况下,把软件开发做到ML5这样的极致。到了VUCA时代,也就是呼唤敏捷的时代,我们依旧需要站在传统开发模式时代所积累的技术和经验的基础上,努力向ML5的级别迈进。而这个成熟度提高的过程,实际上就是把原来的艺术的东西逐步用技术和平台的方式固化下来,让更多的资源投入到更高的艺术追求上去。换句话说,就是让那个不会画画的小孩更容易地成为达芬奇,而让达芬奇成为更高的高手,创造更大的价值!