持续交付是指持续的将各类变更(包括新功能、缺陷修复、配置变化、实验等)安全、快速、高质量地落实到生产环境或用户手中的能力。
持续交付是软件工程领域的重要概念,
与之相关的还有 持续集成(CI)、持续部署(CD) ,甚至 DevOps 等等。
有很多文章,已经在技术视角,关于如何实现 CI/CD 做出了解释。
本文想继续深究,为什么会有这个概念,如何做好,以及未来的发展方向。
动机
交付能力
持续交付是一种能力,代表着人们在软件工程领域的强烈意愿,
人们希望,软件团队可以更快速的响应市场需求,
并且还要在保证质量、安全性的前提下。
所以说,持续交付从一开始,并不是单指支撑团队进行持续交付的软件系统。
而是,团队本身所具备的一种能力。
为了能让团队具备这种能力,可以采取很多种不同的办法,
其中,将基础设施工具化、将操作流程自动化,用以辅助团队,是最容易出结果的。
而这些工具、系统 确实也能在很大程度上提升团队的持续交付水平。
但仅仅看到这些还不够。
交付主体
事实上,整个团队才是交付的主体。
空有一套系统,而未抓住精髓,并不能有效的帮助团队达到高水平交付。
我们从团队的边界来看,整个团队就像一个大型的持续交付系统。
它能吞吐多少需求,能以多高效的响应市场变化,
才是最终需要解决的问题、衡量的标准。
这个时候需要考虑的点就非常多了。
如何获取市场所需,打造什么样的产品可以赢
需求如何进行转换,可以快速的被开发人员所理解和把控
系统如何设计,能够更加灵活,用更少的变更将功能实现
质量和安全如何保障
服务如何提供给用户,用户反馈如何获取
这是一个大的反馈循环,从市场来到市场去,软件功能从实现到更新。
整个团队通过产品形态不断的跟外界进行交互。
关于团队内部如何支撑这个循环,属于内部行为。
策略
做好持续交付,比完成持续交付软件系统的建设难得多。
因为需要关注方方面面,
甚至包括 产研销全流程、团队的组织形态与文化、以及人的因素。
可以假想一下 50 年后的软件研发团队,看看持续交付的极限在哪里。
等待时间
当前持续交付的第一个瓶颈点在于,等待时间过长,大部分人并没有有效的进行工作。
- 等待上游
上游完不成,下游就不能开展工作,只能等着,这些损耗是巨大的。
精益生产提供了解决这个问题的办法,
就是把大任务拆散,一小块一小块,在流水线中完成(增强流动性)。
- 沟通时间
还有很大一部分时间,耗费在团队内部的共识达成上。
团队内部有很多讨论,在众多可选的方案中,用何种办法解决会更好。
确定负责人、区分利益相关者,是一个不错的实践。
- 多任务切换
人脑的上下文切换能力是有限的,最高效的办法是不要一次处理多件事。
同时涌入很多任务,而这些任务又是相互关联的时候,
应当以何种顺序解决它们,得需要管理者、或系统加以辅助。
- 疲劳度
工作会产生疲劳,高效的工作则更甚。所以效率与产出并不总是正相关的。
这取决于完整工作时间内的自动化水平,以及干扰水平。
这甚至跟团队文化相关,是加班还是追求效率(实际上工作更累)。
基础设施
团队能够交付更快,取决于自动化工具的丰富度、可用性和稳定性。
首先要有工具,其次这些工具必须能被用上,最后,还要好用、够稳。
因此,如何形成一套有效的工具、流程实践,才是重中之重。
- 技术、非技术
这套实践不只包括 开发环节,还要包括 市场、需求、测试、运维、运营 等等。
开发也只是很小的一个关注阶段。
大部分团队可能没有意识到,其他阶段对持续交付的影响。
也就是说,仅开发人员能够持续交付软件功能,这远远不够。
所以我们提供的基础设施,应当是面向 产研销全链路 的,而不只是开发。
尤其是这些不同职能角色之间的边界上,中间产物、价值 如何流转。
这可能并不是以一人之力,或者一个团队之力能够解决的。
往往会动摇多个团队的利害关系,甚至部门内外的大协同。
因此,组织架构的设计和团队的职责划分很重要,什么样的划分就有什么样的系统和产品。
很多团队做好了基础设施,但是整个业务线还是无法达到高水平交付,
可能的原因之一,就在于各职能之间的关系没有理顺。
或者没有共同达到较高的交付水平。
- 业务开发、基础架构
如果只考虑开发阶段的话,主要包括两种角色,一种是业务开发,另一种是基础架构。
基础架构为业务开发提供可编程的、可复用的软件工具。
这一层封装,是为了减少整体的技术多样性和复杂度,便于量产。
难点在于,稳定好用的封装层,不容易打造。
在提高效率的同时,也增加了新手的门槛,一开始甚至还会降低效率。
并且增加依赖深度的同时,也容易让整个系统变得更加脆弱。
链路上的每个环节,一旦出现问题,就容易影响全局。
所以基础架构团队的交付产物,必然还要比业务研发团队具备更高的质量要求。
而且还要从一开始就考虑兼容性问题。
沉重的技术债务最容易出现在基础架构团队,而且影响面非常广。
目标设定
比起单个人提升效率而言,如何让多人沿着相同的目标前进,无疑更重要。
此外,如何激发每个人的动力,发挥主动性,也很重要。
所以在部门团队层面,如何设定目标,能很大程度上影响持续交付。
目标不能是拍脑袋想出来的,需要非常多的沟通。
但实际执行下来,不论是自底向上,还是自顶向下的设计目标,都有问题。
- 自底向上
往往最底层员工,是最了解问题的,或者说是离问题最近的。
但并不一定是最善于解决问题,或者最适合、最能够解决问题的。
因为第一眼看到的可能只是问题的表象。
所以自底向上的考虑目标,容易使得目标无法解决真正的问题。
也容易缺少规划,因为规划能力底层员工所欠缺的。
自底向上的传导,也很容易造成信息折损,重心也容易跑偏。
甚至还取决于不同员工,向上反馈问题时的个人水平。
- 自顶向下
自顶向下的拆分,会使得目标更有格局,眼光更加深远。
但难免会与实际脱节,或者没有完整考虑各种细节因素。
人的精力有限,全局和细节,真的很难兼得。
当企业采取这样的拆分方式时,很容易形成揣摩上意的风气。
上层的一次些微调整,底层就得转的飞起,就像齿轮套齿轮一样。
为了能够完成上级的目标,拆分容易促进层层加码,
到了底层可能会变成无法完成的任务。
- 改进
有了以上思考之后,
既能了解上层目标,又能了解底层问题,就显得非常重要。
这取决于,目标在制定之后,能否、以及用什么样的方式可做出修订。
以及企业文化,能否支撑不同层级的员工,就目标进行修订。
只有可以被修订、不断被修订的目标,才能使得上下同心。
当然修订的周期、涉众 也是需要考量的。
结语
未来仍然是人的社会,不论新兴技术如何发展,最后还是要解决人的问题。
只不过机器与人边界会进一步压缩、调整。
当一个产业变成全自动化时,再讨论持续交付就是失去了意义。
因为进一步提高生产力的关键,只剩下了科技。
全自动化产业的人力投入,也将极大程度的缩减。
此外,这也意味着,这个产业的需求也趋近稳定。
比如农副产品,人们会种植、量产、销售 特定品类的农副产品。
发达国家中,几乎所有的生产活动都被机器所取代。
软件行业还远没有达到这种丰富程度,因为人们的想法无穷无尽。
所以除了一些特定领域,随着需求不断稳定之外,
持续交付在软件行业,还有很长的路要走。