点击关注“有赞coder”

获取更多技术干货哦~

作者:费解

团队:效能改进

背景

众所周知,在丰田精益生产中,核心观念包含对人的尊重、消除浪费、持续改善,只有这样,企业才能保持良性运转,竞争力才会提升。而具体的浪费场景,被总结为「制造过剩、等待、搬运、库存、加工、额外动作、次品」七种,后来又增加了「管理」的浪费。

笔者所在效能改进团队,一直致力于精益的实践,从降本增效的角度,来提升有赞软件研发的效能,以应对这个充满不确定性时代的变化的冲击。而彼时的软件研发,从过程管理的角度,已将「项目制」普及到团队之中并持续发挥作用,但从工程实践的角度,虽然各部门都有一些基础设施,但仅为本部门服务,整体处于萌芽阶段,需要有一条主线将各独立的孤岛串接起来,发挥协同的价值。

一、工程实践的现状

1.1 技术债

有赞作为一家初创公司,首要任务是在市场竞争中活下来,所以在技术沉淀方面,于某段时期内处于被动局面,由业务裹挟着往前狂奔,是可以理解的,而且是必须经历的。但可以预见的是,长此以往,就会积累大量的技术债,而且会随着系统复杂度的上升,技术债所带来的研发成本会快速增加,直到它变成一堆无人敢碰的遗留功能。

从精益浪费的视角看,处理技术债就是一种「额外动作」,它是每次研发中一项绕不开的工作,但除了耗费大量人力物力和时间之外,并不产生任何价值。我们亟需掌握目前有多少技术债、风险如何、处理成本如何、在多少量级的范围里是合理和可控的。下图是有赞在 DevOps 建设过程中,某个应用通过 SonarQube 静态扫描得到的代码质量情况:

1.2 代码改动的影响

我们常说:输入的是垃圾,输出的也一定是垃圾( garbage in, garbage out )。在充满技术债和没有任何保护措施的代码上做增量开发,就好比行走在沼泽中,随时会出现意外。也许有代码注释来帮助你理解历史遗留业务,但经过多人之手增补过的代码文件,注释可能比代码更冗长。

在这样的技术环境中工作,很容易产生「次品」,也许大部分问题都能在上线前被扑灭,但流到线上就很可能成为故障,甚至成为未来新代码的故障源。下图是 DevOps 的布道之作《凤凰项目》的封面,就呈现了这样一番触目惊心的景象:

1.3 集成周期

由于研发是一项需要多方协同的工作,而各方的产出成果非常明确:符合产品功能和质量预期的代码。关于这个结果,在研发前期筹备时,各方按产品功能点目标进行任务分解时,就已经注定了的。既然是为了共同的产品目标,大家齐头并进,分别进行研发生产后,就必然要将成果汇合到一起,以产生协同创新的价值。我们通常诟病瀑布项目模式最致命的缺陷之一,就是每个人开发质量都很高,但大规模集成时就一塌糊涂。

所以,研发人员需要不断尝试与上下游进行集成,而集成又涉及到代码的编译运行,每次集成都是一场等待,对项目来说也是一次煎熬,时间进度难以控制,故精益认为这是一种「等待」的浪费。尽管我们在项目流程中定义了「接口先行」的管理动作,但在实际编码过程中,还是会随着对需求产生进一步理解和澄清后,研发人员随手变动接口(但没有及时通知上下游)的情况。下图是有赞 DevOps 平台关于某一应用的时效情况:

二、效能改进的切入点

2.1 理念导入

万事开头难。虽然研发团队对在业界如日中天的「开发运维」已有一定的认知,但重点关注放在工具的运用上,目的是提升本团队的工作效率。而经过一系列尝试后,大家已经隐约意识到,「持续集成」才是在频繁交付的压力下提升研发效率的高杠杆点,而「规范单测」和「环境治理」是保障持续集成的前提,于是效能改进团队携手研发团队、质量保障团队和运维团队共同商议决定,将这两项工作进行深入宣贯。思考路径如下:

1)如果有足够覆盖率的高质量单测用例,就能保护业务代码的逻辑,在不增加额外测试成本的情况下,经得起任何变更和调整;

2)如果有健康稳定的测试环境,代码就能在被提交到代码仓库后,自动触发执行静态代码检查和单测用例,快速验证新增代码的正确性和健康度,经得起频繁交付下质量保证的考验;

3)基于单测用例,可以根据业务场景组合形成集成用例,在健康稳定的测试环境下,无人值守地持续进行集成,自动触发打包和部署,并验证业务逻辑,甚至发布上线(一般实践是发布到预发环境),降低发布周期,提高发布频率。

2.2 志愿试点

如果能找到一支愿意参与试点的小组,再让受益者向其他同行们分享改进成果,是一种不错的实践,这比我们仅仅通过理论说教更能让人信服。彼时,有赞效能改进团队在调研过程中,与 U 小组沟通比较通畅,其技术组长也非常认同基于频繁交付的敏捷开发方法,这为我们推广单测实践找到了突破口。

此外, S 小组的 G 君和 Z 小组的 C 君是研发人员中的极客用户,积极参与并沉淀了关于如何写好单测的最佳实践,非常乐于向同事们进行分享。于是,我们把握住机会,在推广单测必要性和期望达成目标的基础上,连续组织了好几场技术分享,使其余技术人员快速掌握了单测编写的方法,将单测改进工作迅速得以推广和落实。下图是分享材料的截取内容:

2.3 侧翼助攻

从开发到上线的整个过程中,存在着三类角色:研发、质量保障、运维。随着业界在自动化测试和自动化运维领域的不断成熟,有赞的质量保障和运维团队深知其价值,故在 DevOps 领域的研究和实践中一直走在行业前沿,并在落地推广过程中长期保持积极状态,充当了急先锋的作用。一方面,质量保障团队与开发约定,提测时必须保证单测覆盖率,否则就退回拒测;另一方面,运维加强环境治理,规范了「Dev 环境」「QA 环境」「Pre 环境」的使用姿势和工作台能力。多点共同发力,提高了技术团队提升单测能力的主动性。下图是某业务线单测覆盖率达标应用的增长情况:

2.4 工具支持

除了规范行为之外,在管理工具上也提供了不少配套功能。有赞的研发过程用自研的「起码效能平台」进行管理,为方便开发人员的使用,故增加了与 DevOps 平台联动的快捷通道,可一键生成配套的环境、支持两边系统状态同步、自动化执行结果如未达到阈值就限制进入下一环节、等等。下图是有赞 DevOps 平台的持续交付流水线功能局部:

2.5 氛围打造

为帮助技术团队提升对工程实践的感知度,效能改进团队也做了很多有趣好玩的周边:

1)CI ( Continue Intergrate ,持续集成)指示灯。我们用树莓派和 LED 灯搭建了一套告警装置,树莓派通过网络连接了 DevOps 平台,当订阅的应用在 DevOps 平台上运行失败(一般是单元测试执行失败、集成测试执行失败、覆盖率未达标等场景下)时,对应的树莓派就收到信息,并触发红灯闪烁,提醒应用的管理员及时关注,敦促本团队中的代码提交者尽快修复。效果如下图:

插曲:偶尔也会有开发同事晚上回家后连入公司 VPN 进行远程办公,此时办公室现场早已熄灯关门,如果该同事的代码提交到仓库,触发 DevOps 单测用例执行失败时,就会看到如下图的诡异画面(有一次差点吓坏了我们的 HR 妹子):

2)CI 大屏。公司有几套闲置不用的触摸屏,原来是地推时放在商场里用作广告宣传的,被我们搬出来旧物利用,连上公司网络,安置在办公区域,用来展示各大应用在 DevOps 平台上的状态。一方面,对已经接入 DevOps 平台应用的开发人员来说,是一种提醒和相互竞争;另一方面,对尚未接触 DevOps 的开发人员来说,也起到了一种广告示范的效果。下图是大屏的数据展示:

插曲:由于经常会有客户来公司访问,所以走过路过的,也偶尔会被驻足观看,行政部后来也索性就把它定位成带领客户游览的必经「景点」之一了。下图是有赞工作人员在向客户介绍大屏展示的内容:

小结

正如前文提及的,有赞效能改进团队并不是一个人在战斗,质量保障团队和运维团队也在其擅长的领域,为推动工程实践的落地发挥着积极的作用,与此同时,开发团队自己也在努力突破舒适区。正所谓:

开发运维心所系,单测保障护我体。

三套环境在治理,红灯照亮赢契机。

从精益的角度看,强化工程实践的能力,能减少浪费并大幅度提升研发效率,是值得投入和加以改善的。而回顾有赞的落地过程,一方面要做宣传和理念导入(最好能借助志愿者和试点团队的力量和标杆示范作用),另一方面在工具层面加以强化,使之成为一项无法回避的功能,进而强化肌肉记忆,再配合 CI 指示灯、大屏等实践,让理念植入研发人员的内心,有了一种更有仪式感的传播。

Vol.260

如果读者对效能改进也有兴趣,欢迎加入有赞效能改进团队,请将简历投递至:feijie@youzan.com,我们共同探讨和实践。

红灯区:DevOps 建设的思考和实践的更多相关文章

  1. 技术沙龙|京东云DevOps自动化运维技术实践

    自动化测试体系不完善.缺少自助式的持续交付平台.系统间耦合度高服务拆分难度大.成熟的DevOps工程师稀缺,缺少敏捷文化--这些都是DevOps 在落地过程中,或多或少会碰到的问题,DevOps发展任 ...

  2. 沙龙报名 | 京东云DevOps——自动化运维技术实践

    随着互联网技术的发展,越来越多企业开始认识DevOps重要性,在企业内部推进实施DevOps,期望获得更好的软件质量,缩短软件开发生命周期,提高服务稳定性.但在DevOps 的实施与落地的过程中,或多 ...

  3. 腾讯IVWEB前端工程化工具feflow思考与实践

    本篇文章主要介绍腾讯IVWEB团队从0到1在工程化的思考和实践.feflow的全称是Front-end flow(前端工作流),致力于提升研发效率和规范的工程化解决方案.愿景是通过feflow,可以使 ...

  4. 平安银行在开源技术选型上的思考和实践 RocketMQ

    小结: 1. https://mp.weixin.qq.com/s/z_c5D8fvHaYvHSczm0nYFA 平安银行在开源技术选型上的思考和实践 平安银行·吴建峰 阿里巴巴中间件 3月7日 随着 ...

  5. [转] 基于NodeJS的前后端分离的思考与实践(五)多终端适配

    前言 近年来各站点基于 Web 的多终端适配进行得如火如荼,行业间也发展出依赖各种技术的解决方案.有如基于浏览器原生 CSS3 Media Query 的响应式设计.基于云端智能重排的「云适配」方案等 ...

  6. Java Web前后端分离的思考与实践

    第一节 Java Web开发方式的变化 Web开发虽然是我们常说的B/S模式,其实本质上也是一种特殊的C/S模式,只不过C和S的选择余地相对要窄了不少,而且更标准化.不论是采用什么浏览器和后端框架,W ...

  7. 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行

    [微信支付]分享一个失败的案例 2018-06-04 08:24 by stoneniqiu, 2744 阅读, 29 评论, 收藏, 编辑 这个项目是去年做的,开始客户还在推广,几个月后发现服务器已 ...

  8. 古有七步成诗,今有六步完成DevOps上华为云DevCloud实践

    引言: 在“DevOps能力之屋(Capabilities House of DevOps)”中,华为云DevCloud提出(工程方法+最佳实践+生态)×工具平台=DevOps能力.华为云DevClo ...

  9. 【数据库】_由2000W多条开房数据引发的思考、实践----给在校生的一个真实【练耙场】,同学们,来开始一次伟大的尝试吧。

      ×   缘起---闲逛博客园 前几天的时候,在某一QQ群看到一条消息“XXX酒店开房XXXBTXX迅雷BT下载”,当时是一目十行的心态浏览,目光掠过时, 第一反应我想多了~以为是XX种子(你懂的~ ...

随机推荐

  1. python paramiko登陆设备

    一,单线程 - shell交互 def chan_recv(chan): data = chan.recv(1024) # 收1024数据 sys.stdout.write(data.decode() ...

  2. python——logging模块

    简介: 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.不同的事件,被区分在不同的等级中,故通过log分析,可以很轻易地分析 ...

  3. SVN常见错误解决办法和批量add等命令

    批量添加所有更改文件 svn add . --no-ignore --force 提交文件 svn commit -m "up" File already exists: file ...

  4. python-jenkins 操作

    Python-Jenkins Doc:http://python-jenkins.readthedocs.io/en/latest/index.html 实例代码: import jenkins je ...

  5. Java源码之ArrayList

    本文源码均来自Java 8 总体介绍 Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类.Set和List两个类继承于它.Set中不能包含重复的元素,也没有顺序来存放. ...

  6. Office Shared-Addin : Favorite的下载、安装和使用(2020.2.22)

    Favorite是一个可以用于Office常用组件.VBA的共用加载项,32位和64位都兼容. 如果是Office 2007及其以上版本,界面显示为Custom UI+任务窗格. 如果是Office ...

  7. CLOUD信用管理设置

    1.参数设置(管理员账户) 2.客户管理-信用管理设置 3.信用检查规则设置 4.信用档案设置 5.涉及集团公司,母公司与子公司的设置 6.信用档案-对象类型可为客户及集团客户 7.信用特批权限设置 ...

  8. [LC] 76. Minimum Window Substring

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  9. SpringMVC配置前端控制器的路径问题

    在使用SpringMVC时,都需要在web.xml中配置一个前端控制器DispatcherServlet 控制器是一个servlet,但这个路径配置就有很多种,之前都是以扩展名配置的路径,如*.do, ...

  10. SQL数据库的查询方法

    简单查询: 一.投影 select * from 表名 select 列1,列2... from 表名 select distinct 列名 from 表名 二.筛选 select top 数字 列| ...