facebook、Netflix 10倍速工程效能提升实践

news/2024/5/3 12:54:28/文章来源:https://blog.csdn.net/yellowzf3/article/details/127382760

工程效能是什么呢?工程效能是研发团队能够持续为用户产生有效价值的效率,包括有效性、效率和可持续性三个方面。

一提到工程效能,大家脑子里马上会浮现持续构建、持续发布、开发流程改进等词汇,往往会忽略有效性。有效性,指的是软件产品给用户带来的价值,如果研发团队辛辛苦苦开发了一个系统,交付给用户后,这个系统并没有很好地解决用户的实际问题,那么研发团队的工作就是无效的。所以,工程效能里首先强调的就是有效性,否则做得再快都是徒劳的。

要想提高工程效能,就必须深入到软件开发的整个过程当中,研究软件开发过程的本质,才能够从纷乱的表象中,找到根本性的原则。如图所示,是软件开发过程闭环图。

41edc714514cbe53d4ea7c9e684dc162.png

软件开发的整个生命周期,包含6个部分:需求分析、软件设计、程序开发、测试、发布、运营。在运营的过程中发现新的需求,于是又从需求分析开始,不断循环迭代。

工程效能提升的关键就是从以上6个环节入手,确保输入和输出的质量与速度,从每个节点的优化,再到整个软件研发流水线的优化。

总结下来,工程效能的优化,可以从以下四个方面进行。

一、优化研发流程

需求分析。关注需求价值的管理,建立需求价值的判定规则,根据公司当前的战略重点,对需求价值、项目价值进行评定,例如,公司当前以拓展市场为主要目标,那么与拓展市场相关的需求优先级就高一些,与之无关的需求,优先级就相对低一些,如OA办公系统、培训系统等。

软件设计。在设计环节,重点是提高设计交付物的简明化,这里并不强调文档交付的格式和标准,需要根据每个团队自身的情况来制定,成熟度比较高的团队,经过了长时间磨合,产品设计人员只需要通过简单的讲解,辅助一些流程图、页面要素定义和原型等,就可以清楚地表达设计意图,开发人员和测试人员也能够很好的理解,这就达到了比较好的状态,不需要设计人员写几十页的设计文档。

程序开发。在给予一定工作自由度的同时,工程师需要遵守相关的规约,如编码规范、文档注释、自测用例的覆盖度等,通过一个个项目来提升自己的职业素养。其次,工程师要快速解决问题,把这一点视为有效工作的标准,不要执着于“玩”一些新技术,把代码质量和按时交付抛在一边,就本末倒置了。另外,工程师在完成自己工作的同时,要积极配合测试人员完成模块测试,帮助接口提供方或调用方完成对接口的联调,如果接口有任何变动要及时通知相关方,接口定义完成后,建议立刻提供MockService给调用方,前后端工作就可以同步进行了。

测试。测试工作的重心放在测试用例的编写、对业务逻辑的梳理和学习上,尽可能把手动测试的工作工具化,从接口到界面尽量用自动化测试工具,许多云测试工具是不错的选择,包括App兼容适配测试等,都可以做到云端测试。

发布。随着虚拟化、云计算等技术的发展,发布技术和工具日益强大,许多公司在开源套件的基础上,都建立起了自己的CI、CD平台,实现DevOps研发、测试、发布、运维一体化,实现了A/B测试、灰度发布等极大提升效率的工程实践。

运营。发布结束并不意味着软件生命周期的结束,实际上万里长征才踏出第一步,产品经理、运营人员、项目经理等核心人员必须关注软件交付后的运营情况,对产品经理来说,这个阶段是验证需求有效性非常重要的环节,然而许多公司的产品研发团队对运营环节重视度不够,久而久之就会与业务方的想法产生隔阂,技术人员不能很好地理解业务需求,导致开发的有效性降低,所以产品研发团队必须在日常工作当中关注运营进展,提高业务敏感度。

二、团队工程实践

开发环境。开发环境包括机器、IDE、版本管理工具等开发所需的软硬件设施。国内许多企业越来越重视这些因素,如给开发人员配备笔记本、台式机、高分辨率的电脑屏幕、移动端开发用的手机,甚至符合人体工学的办公桌椅等,这些都是非常好的实践,提升了员工办公体验的同时,也提高了工作效率。

许多公司也开始重视代码审查,为什么强调做代码审查呢?因为代码审查,一来能够及时发现代码中的问题,并且能够提高开发人员的编码能力,再者能够提高代码质量,促进代码规范的统一,同时也达到了知识共享的目的。代码审核包括增量审核、全量审核,根据员工的特点和所处的阶段可以分别采用。

开发速度与代码质量。在日常开发工作当时,迭代的安排是比较紧凑的,为了应对快速变化的市场,开发人员会做很多的“临时方案”,这些方案逐渐变成了技术债。因此,有计划的还“技术债”能够避免工程质量的坍塌,让系统更持久的运行。同时,开发人员要有意识地做持续重构,通过工程再造、抽象、拆分等措施,把代码和架构持续优化。

左移、右移测试。所谓的左移、右移测试,是相对于常规测试而言的,从图9-6中可以看出,测试的上一个环节是开发,下一个环节是发布,左移测试指的是在开发环节进行前置测试,包括开发的测试用例执行、代码中包含测试代码等,指标包括测试用例代码覆盖率、送测一次通过率等。右移测试指的是在发布环节的测试,即代码部署完成,连接线上数据,进行预发布测试,以及发布完成后在生产环境做冒烟测试、手工测试等。

灰度、蓝绿、红黑发布。灰度发布,也叫金丝雀发布,是指在黑与白之间能够平滑过渡的一种发布方式。在其上可以进行A/B测试,即让一部分用户继续使用产品特性A,一部分用户开始使用产品特性B,如果用户对B没有什么反对意见,那么就逐步扩大范围,把所有用户都迁移到B上面来。金丝雀发布的由来,是以前旷工下矿洞前,会先放一只金丝雀进去探测是否有有毒气体,看金丝雀能否活下来,金丝雀发布由此得名。

蓝绿发布。蓝绿发布 (Blue Green Deployment) 是一种平滑过渡的发布模式。蓝绿发布的操作模式,首先依赖于能够将全站应用划分为对等的A、B两个单元,A先发布新产品代码并引入少许用户流量,B继续运行老产品代码;如果新代码A经线上运行观察没有迹象表明有问题,或者用户行为对A中的变化没有特别的反馈,那么逐步引入更多用户流量,直至所有用户都访问新产品。

红黑发布。这是Netflix采用的部署手段,Netflix的主要基础设施是在AWS上,所以它利用AWS的特性在部署新的版本时,通过AutoScaling Group用包含新版本应用的AMI的LaunchConfiguration创建新的服务器。如果测试不通过,找到问题原因后,直接“干掉”新生成的服务器及Autoscaling Group就可以了;如果测试通过,则将ELB指向新的服务器集群,然后销毁旧的服务器集群及AutoScaling Group。红黑部署的好处是服务始终在线,同时采用了不可变部署的方式,也不像蓝绿部署一样得保持冗余的服务始终在线。

云化提效。中小型软件公司尤其适合云化提效,把测试环境、生产环境部署在云端,通过第三方云平台的成熟套件进行环境搭建,包括机房负载、安全防护、数据库搭建、服务器环境安装等。如果按照传统的方式,需要专业的数据库工程师、运维工程师和网络工程师采用云端的方式,这些都省了,只需要按月付费即可。云化还有一个好处,就是让应用能够实现高可伸缩性,这在过去是一笔巨大的投入,现在云化就像自来水一样,按需付费,人人都可以使用。

三、个人工程实践

个人高效能原则。个人工程效能提升,要关注一些基本的原则,例如,当接收到一个需求的时候,不要着急动手编码,要对模块进行抽象、拆分,做适度的工程化处理,否则随着工程复杂度的增加,代码会变得难以维护,灾难也就不远了。在工程化的同时,还要注重快速迭代原则,回归工程师的本质。工程师的本质就是用工程的方法,解决业务上的实际问题,快速搞定是工程师的基本要求。

番茄工作法。番茄工作法,是一种帮助深度高效工作的方法。具体做法是,选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后在纸上画一个X短暂休息一下(5分钟就行),每4个番茄时段多休息一会儿。

番茄工作法极大地提高了工作的效率,还会有意想不到的成就感。市面上有许多软件、App都提供番茄钟的功能,可以尝试使用,以帮助进一步提升工作效率。

四、文化驱动

之前的文章讲过“奈飞”文化,了解了硅谷科技公司是如何打造高效工程师文化的。好的文化能够帮助团队提高整体效率、帮助公司实现业绩增长。这里就不多展开了。

以上内容,摘自畅销书《技术人修炼之道》,作者黄哲铿,曾担任1号店 技术总监、壹药网 技术副总裁、海尔农业电商CTO,出版过畅销书《技术管理之巅》,擅长互联网大型系统研发、大型技术团队治理、区块链创新等。

13d85e921510d2af8bef79626b9d2206.jpeg

记得关注@技术领导力

与我一起,提升认知与见识

↓↓↓

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依微服务项目本地启动

1.项目地址 https://gitee.com/y_project/RuoYi-Cloud 使用git本地克隆 git clone https://gitee.com/y_project/RuoYi-Cloud2.导入数据库 1.将下图的两个数据库导入ry-cloud数据库 2.导入nacos和seata的数据库里面有键数据库语句直接运行即可 3.下载nacos 1.下载地址 http…

05-运算符

文章目录算数运算符算数运算符执行的优先级顺序赋值运算符一元运算符自增运算符使用比较运算符逻辑运算符运算符优先级 *算数运算符 掌握算数运算符,能写出一些具备运算能力的小程序 数学运算符也叫算数运算符,主要包括加、减、乘、除、取余&#xff0…

ArcGIS中高风险地区热力图制作

一、数据来源及介绍 吉林省长春市中高风险地区名录 登陆微信,查找国家政务服务平台小程序,点击各地疫情风险等级查询,即可查看各地区中高风险地区所在地。 长春市行政边界数据 行政边界数据来源于阿里云数据可视化平台(DataV…

后缀数组原理

一 点睛 在字符串处理中,后缀树和后缀数组都是非常有力的工具,后缀数组是后缀树的一个非常精巧的替代品,比后缀树更容易实现,可以实现后缀树的很多功能,时间复杂度也不逊色,比后缀树所占用的空间也小很多。…

0 引言和准备

14天阅读挑战赛 努力是为了不平庸!这句话可能有些道理 本文概要: 本专栏是想挑战下阅读《趣味算法》一书; 本文主要是开读前,记录一下对本书的理解,和设定一个计划目标。同时,也简单总结了下,对…

DES加密原理描述与分析

目录1.简介2.加密原理2.1 加密步骤2.2 子密钥生成3.解密原理4.安全性5. 3DES 1.简介数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。…

【linux】 第4回 Xshell安装操作

1. 虚拟机关键配置名词解释 1. 虚拟⽹络编辑器说明桥接模式(可以访问互联⽹!!!)配置的地址信息和物理主机⽹段地址信息相同, 容易造成地址冲突NAT模式(可以访问互联⽹!!!)配置的地址信息和物理主机⽹段地址信息不同, 造成不了地址冲突仅主机模式 (不可以访问互联⽹)获取…

GIS Office国产基础软件,助力移动通信基础资源管理建设工程

万物互联,移动5G时代的蓬勃发展,为我们带来高速率、低时延、大连接的网络与通信体验,这离不开移动通信的基础资源管理建设工程。 面对种类繁多、设备资源管理要求极高且庞大的设备量,如何建立一个简单、高效的设备管理流程&#x…

AWS云服务器申请

目录 一、云服务器申请 (一)前言 (二)准备工作 (三)申请 (四)创建实例 (五)配置弹性IP (六)连接服务器实例 (七&am…

Android studio 最新版本(2022.3.1)的Logcat用法

1 1、package: 以包名过滤日志, 预设 package:mine 表示用当前运行的应用包名进行过滤 2、level: 以优先级过滤日志 level:VERBOSE // 显示所有信息 level:DEBUG // 显示调试信息 level:INFO // 显示一般信息 level:WARN // 显示警告信息 level:ERROR // 显示…

Excel的简单编程

Excel的简单编程 主要内容(这张图里有上索引[A,B,C……],左索引[1,2,3……],方便理解语法) 内容同上(该表主要是为了方便复制) 算法d1d2d3d4d5举例语法输出加法12~~~d1d2“B2C2”3减法12~~~d2-d1“C3-B3”…

BSP Day48

今天继续来看看文件的东西 FILE结构体 C语言的stdio.h头文件中,定义了用于文件操作的结构体FILE。这样,我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。可以在stdio.h(位于visual studio安装目录下的include文件夹下)头文件中查…

【交叉编译踩坑指北(三)】Linux下VScode构建数莓派Pico开发环境

写在前面 第二章表明,arm-none-eabi工具虽然单独使用会报错,但是只要结合CMake就可以正常使用.   而Window系统下,使用CMake调用MinGW Makefiles,那么是不是可以在Linux下使用CMake调用Linux原生make(即Unix Makefiles)构建目标文件呢?这个问提就好比出发点相同(都是CMake),…

linux 内核编译问题汇总

一、编译设备树时找不到设备树包含的头文件设备树包中包含的头文件会到kernel/scripts/dtc/include-prefixes/dt-bindings目录下去查找(新版本内核),而dt-bindings目录是软链接到kernel/include/dt-bindings目录下的。include-prefixes下的其它目录也都是软连接,如下所示如果…

【ARM】使用Busybox构建根文件系统

Busybox构建根文件系统介绍下载配置busybox配置交叉编译器取消静态库编译添加vi命令的支持取消简化模块支持mdev中文支持编译完善根文件系统创建必要文件夹复制库启动文件etc/init.d/rcS/etc/fstab/etc/inittab根文件系统的打包测试网络测试程序运行测试自启动测试介绍 BusyBo…

《数据分析与处理》第二周实验

② s “ajldjlajfdljfddd”,去重并从小到大排序输出[‘a’, ‘d’, ‘f’, ‘j’, ‘l’]。 s "ajldjlajfdljfddd" print(sorted(list(set(s))))③ 使用列表推导式求列表a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]所有奇数并构造新列表[1,3,5,7,9]。 a [1,…

Confidential Containers:云原生机密计算基础设施

文/龙蜥社区云原生 SIG 前言部分 机密容器是 Cloud Native Computing Foundation(CNCF)下的一个新的 Sandbox 项目。机密容器项目基于 CPU 可信执行环境(TEE)技术,并与云原生容器以及 Kubernetes 技术结合&#xff0c…

记录清理Oracle归档日志

一、登录数据库 1. 切换到Oracle用户 su命令 – 切换用户身份su命令来自于英文单词“switch user”的缩写,其功能是用于切换用户身份。管理员切换至任意用户身份而无需密码验证,而普通用户切换至任意用户身份均需密码验证。另外添加单个减号(-)参数为完全的身份变更,不保留…

mybatis案例--mapper代理开发

mybatis案例之mapper代理开发 在使用mybatis的代理开发的时候,需要遵循的要求如下 定义接口,要求接口名和映射配置文件名一致接口必须和映射配置文件在同一级包中映射配置文件的namespace需要和接口的全类名一致映射配置文件的sql语句要和接口中的抽象…

一些特殊SQL使用Mybatis的#{}和${}注意点

Mybatis对JDBC进行了进一步封装,使得我们可以更加便捷的使用Java操作数据库。Mybatis获取参数值有两种方式:#{}和${} 在大部分情况下,#{}和${}都能相互替代,使用两者之一即可,更加推荐使用#{},因为可以防止…