研发效率破局之道阅读总结(3)工程优化

研发效率破局之道阅读总结(3)工程优化


Author: Once Day Date: 2025年4月22日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…

漫漫长路,有人对你微笑过嘛…

全系列文章可参考专栏: 程序的艺术_Once-Day的博客-CSDN博客


注: 本文内容摘抄于原文,文中"我"代表原作者【葛俊】大佬视角。


参考文章:

  • 研发效率破局之道

文章目录

  • 研发效率破局之道阅读总结(3)工程优化
        • 1. 软件研发环境
        • 2. 如何做好代码审查
        • 3. 如何处理技术债
        • 4. 测试如何应对新的开发模式
        • 5. 各种部署的定义

1. 软件研发环境

按照开发流程,软件研发需要以下几种环境:

  • 开发机器;
  • IDE;
  • 开发过程中使用的各种工具、数据和配置;
  • 本地环境、联调环境;
  • 测试环境、类生产环境

Facebook 从不吝啬在开发机器上的投资。每个开发人员除了有一台笔记本外,还在远程数 据中心有一台开发机器。数据中心的机器用于后端以及网站的开发,为方便描述,我称之为 后端开发机。而笔记本有两个用处:一是用来做移动端 App 的开发;二是作为终端,连接 到后端开发机做后端和网站开发。

两台机器的配置都非常强劲。后端开发机一开始是实体机器,后来为了便于管理和提高资源利用率,逐步转为了虚拟机,但不变的是配置依然强大。在 2015 年的时候,绝大部分机器 配置都能达到 16 核 CPU 、144G 内存。笔记本有两种选择,一种是苹果 MacBook Pro, 另一种是联想 ThinkPad,都是当时市场上顶配或者顶配下一级的配置。

配置高效的研发环境主要包括以下几条原则:

  • 舍得投入资源,用资源换取开发人员时间。
  • 对环境的获取进行服务化、自助化。
  • 注重环境的一体化、一致性,也就是要把团队的最佳实践固化下来。
2. 如何做好代码审查

做好代码审查的一个前提条件就是,要找到适合自己团队的方法。

按照定义,人工检查才是代码审查。机器进行的检查一般叫作代码检查或者代码自动检查。

代码审查的作用很多,主要表现在 5 个方面。

  • 尽早发现 Bug 和设计中存在的问题。我们都知道,问题发现得越晚,修复的代价越大。代码审查把问题的发现尽量提前,自然会提高效能。
  • 提高个人工程能力。不言而喻,别人对你的代码提建议,自然能提高你的工程能力。事实上,仅仅因为知道自己的代码会被同事审查,你就会注意提高代码质量。
  • 团队知识共享。一段代码入库之后,就从个人的代码变成了团队的代码。代码审查可以帮助其他开发者了解这些代码的设计思想、实现方式等。
  • 针对某个特定方面提高质量。一些比较专业的领域,比如安全、性能、UI 等,可以邀请专家进行专项审查。另外,一些核心代码或者高风险代码,也可以通过团队集体审查的方式来保证质量。
  • 统一编码风格。

按照审查方式,代码审查可以分为工具辅助的线下异步审查和面对面审查两类。

  • 工具辅助的线下异步审查,就是代码作者通过工具将代码发送给审查者,审查者再通过工具把反馈传递给作者。可以控制审查时间,减少对自己工作的干扰,会留下文档,方便以后参考。
  • 面对面审查,就是审查者和代码作者在一块儿阅读代码,进行实时讨论。这种方式的好处是快,可以高效地审查不方便用文字讨论的代码。比如,架构问题的讨论就很适合用这种方式。

事实上,有调查显示,代码审查更容易发现架构问题而不是 Bug。所以我的建议是,尽量使用代码设计时审查。具体的方法是,可以使用与门禁代码检查相同的工具,只不过这个时候发出去的 PR 目的是为了讨论,而不是为了入库。讨论结束后删除这个 PR 即可。

在这里插入图片描述

代码审查需要时间,这听起来好像是废话,但很多团队在引入代码审查时,都没有为它预留 时间。结果是大家没有时间做审查,效果自然也就不好。而效果不好又导致代码审查得不到 管理者重视,开发人员更不可能将代码审查放到自己的工作计划中。于是,形成恶性循环, 代码审查要么被逐渐废弃,要么流于形式。

管理者要明确代码审查是开发工作的重要组成部分,并记入工作量和绩效考评。这是成功引入代码审查的前提,再怎么强调都不为过。

成功推进代码审查的关键操作:

  • 代码提交的原子性,是指一个提交包含一个不可分割的特性、修复或者优化,同时这个提交要尽可能小。
  • 提高提交说明的质量,,好的格式应该包含:标题,详细描述,测试情况,与其他工具和系统相关的信息。

代码审查是两个开发者之间的技术交流,双方都要谨记互相尊重的原则。

从审查者的角度来看,在提出建议的时候,一定要考虑代码作者的感受。最重要的一点是, 不要用一些主观标准来评判别人的代码。

在打回提交的时候,一定要礼貌地描述原因。审查要尽量及时,如果不能及时审查要告知作者。

代码审查常常出现问题的一个地方是,在审查过程中因为意见不同而产生争执甚至争吵,所以一定记住代码审查的目的是讨论,而不是评判。讨论的心态,有助于放下不必要的自尊心,从而顺利地进行技术交流,提高审查效率。另外,讨论的心态也能促进大家提早发出审查,从而尽早发现结构设计方面的问题。

审查者切记不要说教,说教容易让人反感,不是讨论的好方法。审查者提意见即可,不一定要提供解决方法。我曾经见过一个团队要求提出问题必须给出对应的答案,结果是大家都不愿提问题了。

想办法增加讨论的有趣性。

3. 如何处理技术债

第一方面,要利用技术债的好处,必要时要大胆“举债前行”。也就是说,在机会出现时, 使用最快的方式完成业务服务用户,抢占市场先机,“不要在意那些细节”。

第二个方面,要控制技术债,在适当的时候偿还适当部分的技术债。

控制技术债主要有以下 4 步:

  • 让公司管理层意识到偿还技术债的重要性,从而愿意投入资源;
  • 采用低成本的方式去预防;
  • 识别技术债并找到可能的解决方案;
  • 持续重构,解决高优先级技术债。
4. 测试如何应对新的开发模式

测试可以保证产品质量,重要性不言而喻。但,要做好测试也比较困难,需要克服很多挑 战。尤其是,持续交付、敏捷开发等开发模式为传统软件测试方式带来了更大的时间压力。

我们先来看看下面这种熟悉的测试方式都有什么问题:

测试人员接到项目后参与需求评审, 然后根据需求文档写用例、准备脚本,等开发提测之后正式开始测试、提 Bug、回归,测 试通过后就结束了,项目交给运维上线,之后投入下一个项目继续重复这样的流程。

这样的流程看似没什么错,但有两大问题:

  • 测试人员非常被动。当需求质量、开发质量较差的时候,测试人员只能被动接受。
  • 但同时,测试又被认为是质量的责任人。如果因为需求质量、开发提测质量差而导致上线 延期,大家通常会首先怪罪测试团队。

这些问题,在新的开发模式下愈发严重。因为这些新的开发模式有一个共同点,就是要缩短 产品的交付周期,对自动化的要求越来越高,能够专门留给传统竖井流程中测试环节的时间 越来越短,自然更难保证质量。

测试左移和右移,就是把测试的范围从传统测试的节点中释放出来,向左和右扩展。

  • 向左扩展,就是让测试介入代码提测之前的部分。比如,扩展到开发阶段,在架构设计时就考虑产品的可测试性,并尽量进行开发自测等。另外,测试可以更进一步扩展到需求评审阶段,让测试人员不只是了解需求,更要评估需求的质量,比如分析需求的合理性以及完整性等。
  • 测试右移,是让测试介入代码提测之后的部分。比如,测试人员在产品上线过程中,利用线上的真实环境测试。另外产品上线之后,测试人员仍然介入,通过线上监控和预警,及时发现问题并跟进解决,将影响范围降到最低。这样一来,测试人员不但有更多的时间进行测试,还能发现在非生产环境中难以发现的问题。

要做好测试左移,有 3 个基本原则:

  • 调整团队对测试的态度。一个有效的办法是,按照功能的维度管理团队,让整个功能团队对产品负责。也就是说,如果产品质量出现问题, 不只是测试团队“背锅”,而是会影响整个功能团队的绩效。
  • 把测试添加到开发和产品需求步骤中。常用的办法是,让测试人员参与到开发阶段的方案设计中,了解开发的实现方式。因为很多开发人员可能只熟悉他负责的那一部分,而测试人员往往对全局更加了解,所以测试人员要评估改动范围以及是否有遗漏的模块 和系统。
  • 频繁测试,快速测试。在测试左移之前,我们需要等待提测,比较被动,不能频繁测试。但测试左移到开发阶段之后,我们就有了很大的自由度去频繁运行测试,从而更好地发挥测试的作用,尽早发现更多的问题。

测试左移,本质上是尽早发现问题、预防问题。基本原则包括:从人的角度出发,让产 品、开发、运维人员统一认识,重视测试;从流程上,让测试融入产品设计和开发步骤中; 快速测试、频繁测试。

其实,软件开发行业早就达成了共识,问题发现得越晚,修复代价越大

5. 各种部署的定义

蓝绿部署(Blue-green Deployment)、红黑部署(Red-black Deployment)和灰度发布(Gray Release ,或 Dark Launch)的定义和流程:

(1)蓝绿部署,是采用两个分开的集群对软件版本进行升级的一种方式。它的部署模型中包括一 个蓝色集群 A 和一个绿色集群 B,在没有新版本上线的情况下,两个集群上运行的版本是 一致的,同时对外提供服务。

  • 首先,从负载均衡器列表中删除集群 A,让集群 B 单独提供服务。
  • 然后,在集群 A 上部署新版本。
  • 接下来,集群 A 升级完毕后,把负载均衡列表全部指向 A,并删除集群 B,由 A 单独提供服务。
  • 在集群 B 上部署完新版本后,再把它添加回负载均衡列表中。

(2)红黑部署,与蓝绿部署类似,红黑部署也是通过两个集群完成软件版本的升级。当前提供服务的所有机器都运行在红色集群 A 中,当需要发布新版本的时候:

  • 先在云上申请一个黑色集群 B,在 B 上部署新版本的服务;
  • 等到 B 升级完成后,我们一次性地把负载均衡全部指向 B;
  • 把 A 集群从负载均衡列表中删除,并释放集群 A 中所有机器。

(3)灰度发布,也被叫作金丝雀发布。与蓝绿部署、红黑部署不同的是,灰度发布属于增量发布方法。也就是说,服务升级的过程中,新旧版本会同时为用户提供服务。

灰度发布的具体流程是这样的:在集群的一小部分机器上部署新版本,给一部分用户使用, 以测试新版本的功能和性能;确认没有问题之后,再对整个集群进行升级。简单地说,灰度 发布就是把部署好的服务分批次、逐步暴露给越来越多的用户,直到最终完全上线。

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

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

相关文章

C# MP3 伴奏

使用建议: 参数调节指南: 低频人声残留:降低CenterFrequency(800-1500Hz) 高频人声残留:提高CenterFrequency(2500-3500Hz) 消除力度不足:提高EliminationStrength(0.9-1.0) 伴奏失真:降低EliminationSt…

大模型面经 | 春招、秋招算法面试常考八股文附答案(四)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…

Springboot 集成 RBAC 模型实战指南

RBAC 模型核心原理 详情可参考之前的笔记:https://blog.csdn.net/qq_35201802/article/details/146036789?spm1011.2415.3001.5331 RBAC 定义与优势 RBAC(Role-Based Access Control,基于角色的访问控制)** 是一种通过角色关联…

如何收集用户白屏/长时间无响应/接口超时问题

想象一下这样的场景:一位用户在午休时间打开某电商应用,准备购买一件心仪已久的商品。然而,页面加载了数秒后依然是一片空白,或者点击“加入购物车”按钮后没有任何反馈,甚至在结算时接口超时导致订单失败。用户的耐心被迅速消耗殆尽,关闭应用,转而选择了竞争对手的产品…

用户需求报告、系统需求规格说明书、软件需求规格说明的对比分析

用户需求报告、系统需求规格说明书(SyRS)和软件需求规格说明书(SRS)是需求工程中的关键文档,分别对应不同层次和视角的需求描述。以下是它们的核心区别对比: ​​1. 用户需求报告(User Requirem…

iostat指令介绍

文章目录 1. 功能介绍2. 语法介绍3. 应用场景4. 示例分析 1. 功能介绍 iostat (input/output statistics),是 Linux/Unix 系统中用于监控 CPU 使用率和 磁盘 I/O 性能的核心工具,可实时展示设备负载、吞吐量、队列状态等关键指标。 可以使用 man iostat查…

神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)

引言 在神经网络的发展历程中,梯度消失和梯度爆炸如同两座难以翻越的大山,阻碍着深层神经网络发挥其强大的潜力。尤其是在处理复杂任务时,这两个问题可能导致模型训练陷入困境,无法达到预期的效果。本文将深入探讨梯度消失和梯度…

“多模态SCA+DevSecOps+SBOM风险情报预警 “数字供应链安全最佳管理体系!悬镜安全如何用AI守护万亿数字中国?

夜深人静,程序员青丝盯着屏幕上自动生成的代码模块陷入沉思。在AI大模型的加持下,仅用一周团队就完成了原本需要半年的开发进度,但代码审查时却发现了不少高危漏洞。“生成效率提升了,但安全漏洞像定时炸弹一样藏在代码里”&#…

Node.js简介(nvm使用)

Node.js是一个基于Chrome V8 JavaScript引擎构建的开源、跨平台JavaScript运行环境。它允许开发者在服务器端运行JavaScript代码,从而实现前后端统一的开发语言。Node.js具有事件驱动、非阻塞I/O模型,使其非常适合于构建高性能的网络应用。 Node.js不是…

PHP日志会对服务器产生哪些影响?

PHP日志是服务器运维中非常重要的一部分,但处理不当会对服务器产生明显的负面影响。下面我们从多个维度深入分析:PHP日志的作用、类型、对服务器的正面与负面影响,以及优化建议,让你全面掌握这一问题。 一、PHP日志是什么? PHP…

Spring AI Alibaba-02-多轮对话记忆、持久化消息记录

Spring AI Alibaba-02-多轮对话记忆、持久化消息记录 Lison <dreamlison163.com>, v1.0.0, 2025.04.19 文章目录 Spring AI Alibaba-02-多轮对话记忆、持久化消息记录多轮对话对话持久-Redis 本次主要聚焦于多轮对话功能的实现&#xff0c;后续会逐步增加更多实用内容&…

分别配置Github,Gitee的SSH链接

文章目录 前言一、为第二个账号生成新的密钥对二、 配置 SSH config 文件1.引入库使用 Host 别名进行 clone/push/pull注意扩展 前言 之前已经在电脑配置过Github一个仓库ssh链接&#xff0c;今天想配一个Gitee仓库的ssh链接。运行 ssh-keygen -t rsa提示已经存在&#xff0c…

Python 获取淘宝买家订单详情(buyer_order_detail)接口的详细指南

在电商运营中&#xff0c;订单详情数据是商家进行数据分析、客户服务和营销策略制定的重要依据。淘宝提供了 buyer_order_detail 接口&#xff0c;允许开发者获取买家的订单详情数据。本文将详细介绍如何使用 Python 调用该接口获取订单详情&#xff0c;并解析返回的数据。 一、…

C语言实战:用Pygame打造高难度水果消消乐游戏

水果消消乐 - 困难模式 以下是一个基于Python和Pygame的水果消消乐游戏实现&#xff0c;包含困难模式的特点&#xff1a; import pygame import random import sys from pygame.locals import *# 初始化 pygame.init() pygame.mixer.init()# 游戏常量 FPS 60 WINDOW_WIDTH …

Doris-BrokerLoad任务监控

BrokeLoad监控 #!/bin/bash target_label$1 user$2 password$3looptrue echo "开始循环了----------------------" while ${loop} dolabel$(mysql -h FE_IP -P9030 -urealtime -ppassword -D offline -e "show load where label${target_label}")if [ -z &…

企业微信私域运营,基于http协议实现SCRM+AI完整解决方案

1、方案介绍 基于企业微信原生功能已实现全场景的能力覆盖&#xff0c;并提供标准化可直接调用的API接口&#xff0c;可以帮助企业轻松实现上层应用的开发及落地&#xff0c;方案采用模拟通信技术可实现PC&#xff0c;手机&#xff0c;ipad三端的同时在线&#xff0c;单服务器…

Oracle Linux8 安装 MySQL 8.4.3,搭建一主一从

文章目录 安装依赖获取安装包解压准备相关目录设置配置文件启动数据库连接数据库socket 文件优化同样方法准备 3307 数据库实例设置配置文件启动 3307 实例数据库连接并查看 3307 数据库实例基于 bin log 搭建主从模式 安装依赖 yum install -y numactl libaio ncurses-compat…

Dataway在Spring Boot中的引入以及使用教程

Dataway是Hasor生态中的接口配置工具&#xff0c;能帮助开发者快速配置数据接口。它支持DataQL和SQL两种语言模式&#xff0c;可将SQL转换为DataQL执行&#xff0c;简化数据查询与交互&#xff0c;无需编写大量代码。接口配置完成后&#xff0c;可进行自测、冒烟测试&#xff0…

进程互斥的软件实现方法

单标志法 算法思想&#xff1a;两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予 int turn 0; //turn 表示当前允许进入临界区的进程号P0 进程&#xff1a; while (turn ! 0); ① //进入区 critical …

力扣150题-- 汇总区间和合并区间

Day 27 题目描述 思路 做法&#xff1a; 特殊处理空数组和数组只有一个元素的情况设置beg&#xff0c;end标记范围的起始和结束&#xff0c;x用来比较元素是否有序&#xff08;初始end和beg都指向nums[0[,x为nums[0]1&#xff09;遍历数组如果当前元素等于x&#xff0c;说明…