这是真的“技术驱动”的公司吗?

news2024/11/15 18:49:05

 软件交付团队的DevOps能力,恰恰是技术能力的最好体现。

f8cc4576746593db866e2a5cd6e7a996.png

01

“我们是技术驱动的公司”

跟我们合作的软件供应商,每次发生软件变更或升级就一地鸡毛,而且经过屡次沟通,都没有什么本质改善。

当我们跟他们的高层投诉时,他们的高层也承认问题,但给出的理由是“我们是一家技术驱动的公司,我们聚焦在为用户提供更新、更丰富的功能,但是忽略了这些变更对现有客户的影响。”

坦白说,我完全不能接受软件变更出现各种问题是因为“技术驱动”,相反,变更问题恰恰反映了他们的技术能力不足,进而严重影响了他们的DevOps能力。

从他们的屡次软件变更或升级所引起的问题,我们总结了他们存在以下问题:

  • 沟通——新功能开发和缺陷修复过程中没有跟客户进行沟通,实际效果要发布后客户才能验证;提供的发布说明语焉不详,缺乏对客户影响的具体说明;也不能提供详尽的软件变更执行手册,缺乏具体的执行失败预案。

  • 质量——质量不可靠,缺乏详尽的测试报告说明做了什么测试;大部分测试只是执行过程,没有验证结果(比如仅涵盖页面是否可以打开);没有针对客户环境的测试环境;完全不知道变更对现有的客户的实际影响。

  • 发布——范围大,过程繁杂;研发有提供执行过程给驻场工程师,但如果驻场工程师遇到问题,缺乏预案及时处理;缺乏统一的验收流程;发布执行时间动辄数小时,无法回滚。

  • 组织——组织内部按照职能分工,责任割裂;驻场工程师受到最大的客户压力,但无法推动各产品的研发部门进行跟进和改善;客户无法直接接触到产品研发部门;缺乏既能对接客户又能拉动整个内部组织的角色。

可以看到,他们存在的问题,像极了我们十年前做DevOps转型前的模样。

而他们在软件变更上所出现的种种问题,就是DevOps能力不足的问题,也是技术能力不足的问题。

02

DevOps能力也是技术能力的体现

我们从整个软件交付的端到端过程来详细分析一下怎样算好的DevOps能力:

  • 需求方面:通过需求管理工具记录需求细节,并与代码管理工具、发布管理工具整合,形成全流程跟踪;在理解需求时,对验收条件达成一致,并通过BDD(Behavior Driven Development,行为驱动开发)的方式把验收测试自动化;

  • 设计方面:高内聚、低耦合,选择合适的架构确保重用性、敏捷性、扩展性之间的平衡。

  • 编程方面:TDD测试驱动编程自动化单元测试;通过Pull Request等方式强制代码审核;所有代码在持续集成流水线中完成标准的静态代码质量检查、安全漏洞检查、测试执行、打包等;通过容器简化开发、测试、部署、迁移过程。

  • 测试方面:除了通过TDD、BDD实现自动化持续测试外,可以快速创建测试环境,快速模拟生产环境的数据和场景;有标准的非功能性需求自动化测试套件。

  • 发布方面:软件包版本化管理,有统一的软件包仓库;发布登记、审批、管控检查、部署、验收一律自动化,发布出现问题具备一键回滚能力。

以上目标的实现,无不需要过硬的技术能力。核心是自动化一切重复的、可标准化的过程,但落地自动化的细节,充满了技术上的挑战,这里需要引入各种开源工具、整合已有的系统和工具、适配现有的流程,涉及到很多技术和工具。

在我们公司,DevOps做得最好的团队,就是技术能力最强的团队,他们可以实现每天n次发布的能力,也自研了很多工具实现这个能力。

03

提高DevOps能力的建议

这里给大家一些提升DevOps能力的建议。有一些是技术相关的,有一些是技术以外的。研发效能的提升,当然不会只是技术驱动。

  • 价值优先——在收到需求时,要深入理解这个需求的价值,价值最好是可以量化的,比如每个月能节约多少人力和成本。因为实现DevOps持续交付的前提是大而复杂的需求被拆分成多个最小且可独立交付的需求。拆分需求,需要理解需求的价值,从而理解需求背后的需求,理解用户最急切需要解决的核心痛点是什么,从而设计出MVP(最小可用产品)。不能明确价值的需求,可以不做。

  • 需求拆小,速度优先——先做需求的MVP,快速解决核心痛点。这不仅关乎实现价值的速度,也是为了保持开发人员的激情。前前后后折腾几个月憋大招容易让人泄气,也容易偏离方向,几个星期甚至几天一个交付的持续交付让人激情澎湃。

  • 以终为始——以验收条件达成一致作为确认需求的其中一步,先充分理解什么是完成,再动手去做。通过BDD行为驱动测试框架把验收条件变成自动化验收测试,成为将来回归测试的一部分。

  • 流水线包含更多——CI/CD流水线除了编译、执行自动化测试、打包、部署外,还应该包含静态代码检查、安全漏洞检查、合规管控检查等,把软件发布所需要所有标准化过程都涵盖在内,取代所有人工操作。

  • TDD、BDD成为习惯——TDD测试驱动编程成为每个程序员的编程习惯,BDD行为驱动开发成为每个团队对每个需求的开发习惯。

  • 容器化——简化部署过程,确保环境一致性,提高软件可迁移性。

  • 合适的架构满足服务等级和弹性要求——根据业务影响等级制定合适的RTO、RPO指标以及业务流量波动特征设计相应的架构和基础设施配置。架构设计也是赋能敏捷交付的必要条件,架构层面的解耦也是实现系统最终敏捷性的要件。

  • Clean Code,代码是唯一可信的——类、方法和变量的命名能直接体现其作用,代码即文档。

  • 自动化一切,包括非功能性需求——发布登记、审批、管控检查、部署、验收一律自动化。

  • 发布拆小,频繁发布——每次发布的范围最小化,最好每次发布只包含一个需求的上线。通过自动化,消除频繁发布所需要的额外开销。

  • 提高系统可观测性——对系统进行自动的健康检查和异常监控,比用户更早发现问题;日志集中到统一日志查看平台,减少需要登录到生产服务器的情况。

  • 上云,增加选择——云的弹性伸缩能力,为系统架构设计带来更多选择;丰富多样的PaaS和SaaS产品也为团队带来更强的能力。

  • 平台工程——开发人员只需要关注业务需求的开发,代码一旦提交,各种测试、检查、部署和运行都可以交给平台。当然,平台给予开发人员便捷性的同时,也有明确的适用范围,会对开发人员提出很具体的要求,只有满足的系统才能在平台上部署和运行。

04

总结

要避免每次软件变更上线都一地鸡毛,需要提升DevOps的能力,要对整个软件交付过程进行技术升级,只有修炼好内功,才能为客户提供持续的良好体验。内功,也就是软件交付团队的研发效能,恰恰是技术能力的最好体现。如果连自己内部的问题都解决不了,又谈何解决客户的问题呢?

觉得文章不错,顺手点个“点赞”、“在看”或转发给朋友们吧。

f0cbd2aea037866bc284dff9058e9c7a.png

相关阅读:

什么?PO也要关注系统稳定性?

软件技术奇葩说:速度与稳定性哪个更重要?

如何实现具备韧性的技术与架构?

关于作者


b81a421c44e53b279eea9c6814b3c050.jpeg

7ecd7f66de11ca903ebd41d561a735e7.jpeg

关注公众号看其它原创作品

坚持原创高质量软件交付相关文章

觉得好看,点个“点赞”、“在看”或转发给朋友们,欢迎你留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/901348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM面试题-1

1、什么是JVM内存结构? jvm将虚拟机分为5大区域,程序计数器、虚拟机栈、本地方法栈、java堆、方法区; 程序计数器:线程私有的,是一块很小的内存空间,作为当前线程的行号指示器,用于记录当前虚拟…

数据结构:队列Queue详解

文章目录 一、队列的概念和特点二、队列的使用三、队列的简单实现四、循环队列 一、队列的概念和特点 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。进行插入操作的一端称为队尾,删除操作的一端称队头。 入队列&#xff…

使用Nginx调用网关,然后网关调用其他微服务

问题前提:目前我的项目是已经搭建了网关根据访问路径路由到微服务,然后现在我使用了Nginx将静态资源都放在了Nginx中,然后我后端定义了一个接口访问一个html页面,但是html页面要用到静态资源,这个静态资源在我的后端是…

windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动

前两天由于项目需要,一个windows上的批处理任务(kitchen.bat),需要接到mq的消息通知后执行,为了快速实现这里我们通过springboot写了一个jar程序,用于接收mq的消息,并调用bat文件。 本程序需要实…

【欧拉计划】偶数斐波那契数

题目链接:偶数斐波那契数 解法一:暴力枚举 看见题目,第一反应就是先找到小于400万的所有斐波那契数,再从这些斐波那契数中筛选出偶数进行求和。 由于递归方法求斐波那契数的时间复杂度较高,故这里采用迭代的方法。 先…

C++笔记之全局函数做友元与类做友元

C笔记之全局函数做友元与类做友元 code review! 文章目录 C笔记之全局函数做友元与类做友元1.全局函数做友元2.类作友元 1.全局函数做友元 代码 #include <iostream> using namespace std;class MyClass { private:int x; public:MyClass(int a) : x(a) {}friend void…

互斥锁概念使用

互斥锁的创建两种方式 1.动态方式 #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <string.h> FILE *fp; void *func2(void *arg) {pthread_detach(pthread_self());printf("this is func2 thread\n");char str2[]…

mybatis入门的环境搭建及快速完成CRUD(增删改查)

又是爱代码的一天 一、MyBatis的介绍 ( 1 ) 背景 MyBatis 的背景可以追溯到 2002 年&#xff0c;当时 Clinton Begin 开发了一个名为 iBATIS 的持久化框架。iBATIS 的目标是简化 JDBC 编程&#xff0c;提供一种更直观、易用的方式来处理数据库操作。 在传统的 JDBC 编程中&…

【大数据】Flink 详解(五):核心篇 Ⅳ

Flink 详解&#xff08;五&#xff09;&#xff1a;核心篇 Ⅳ 45、Flink 广播机制了解吗&#xff1f; 从图中可以理解 广播 就是一个公共的共享变量&#xff0c;广播变量存于 TaskManager 的内存中&#xff0c;所以广播变量不应该太大&#xff0c;将一个数据集广播后&#xff0…

代码随想录算法训练营day39 | 62. 不同路径,63. 不同路径 II

目录 62. 不同路径 63. 不同路径 II 62. 不同路径 类型&#xff1a;动态规划 难度&#xff1a;medium 思路&#xff1a; 应用二维数组的动态规划&#xff0c;到达某个方格的方法数目&#xff0c;为这个方格的上一个方格和左一个方格的方法数目和。 需要先初始化第一行和第一…

ubuntu安装Microsoft Edge并设置为中文

1、下载 edge.deb 版本并安装 sudo dpkg -i microsoft-edg.deb 2. 设置默认中文显示 如果是通过.deb方式安装的&#xff1a; 打开默认安装路径下的microsoft-edge-dev文件&#xff0c;在文件最开头加上: export LANGUAGEZH-CN.UTF-8 &#xff0c;保存退出。 cd /opt/micr…

【Redis】什么是缓存击穿,如何预防缓存击穿?

【Redis】什么是缓存击穿&#xff0c;如何预防缓存击穿&#xff1f; 缓存击穿是指一个 Key 非常热点&#xff0c;大并发集中对这一个点进行访问&#xff0c;当这个Key 在失效的瞬间&#xff0c;持续的大并发就会穿破缓存&#xff0c;直接请求数据库。缓存击穿和缓存雪崩的区别…

代码随想录-字符串01 344.反转字符串541. 反转字符串II替换空格翻转字符串里的单词左旋转字符串

题目目录 ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer 05.替换空格 ● 151.翻转字符串里的单词 ● 剑指Offer58-II.左旋转字符串 344.反转字符串 344.反转字符串 很经典的字符串考察点&#xff0c;考察对双指针的熟悉程度。 解法是通过双指针从字符串数组两边向中…

JavaScript函数式编程【进阶】

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

Linux 安全技术和防火墙

目录 1 安全技术 2 防火墙 2.1 防火墙的分类 2.1.1 包过滤防火墙 2.1.2 应用层防火墙 3 Linux 防火墙的基本认识 3.1 iptables & netfilter 3.2 四表五链 4 iptables 4.2 数据包的常见控制类型 4.3 实际操作 4.3.1 加新的防火墙规则 4.3.2 查看规则表 4.3.…

7-7 验证“哥德巴赫猜想”

分数 20 全屏浏览题目 切换布局 作者 徐镜春 单位 浙江大学 数学领域著名的“哥德巴赫猜想”的大致意思是&#xff1a;任何一个大于2的偶数总能表示为两个素数之和。比如&#xff1a;24519&#xff0c;其中5和19都是素数。本实验的任务是设计一个程序&#xff0c;验证20亿以…

认识负载均衡||WEBSHELL

目录 一、负载均衡 1.nginx负载均衡算法 2.nginx反向代理-负载均衡 二、webshell 1.构造不含数字和字母的webshell 2.如何绕过 一、负载均衡 1.nginx负载均衡算法 &#xff08;1&#xff09;轮询&#xff08;默认&#xff09;每个请求按时间顺序逐一分配到不同的后端服务&…

听GPT 讲Prometheus源代码--rules

Prometheus的rules目录主要包含规则引擎和管理规则的文件: engine.go 该文件定义了规则引擎的接口和主要结构,包括Rule,Record,RuleGroup等。它提供了规则的加载、匹配、评估和结果记录的功能。 api.go 定义了用于管理和查询规则的RESTful API,包括获取、添加、删除规则等方法。…

类之间的比较

作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 类之间的比较 固定需求式比较器 固定需求式 通过…

恶意软件分析与反制: 深入研究各类恶意软件,介绍分析技术以及如何构建有效的反恶意软件策略

第一章&#xff1a;引言 在数字化时代&#xff0c;恶意软件已经成为网络安全领域的一大威胁。从病毒、蠕虫到特洛伊木马&#xff0c;各类恶意软件不断进化&#xff0c;威胁着个人、组织 ja以国家的信息安全。本文将深入探讨恶意软件的分析与反制方法&#xff0c;帮助读者更好地…