C++ 构建太慢的 5 个信号

在这里插入图片描述
从我的个人经验来看,我们每天庸庸碌碌,忙于处理各种各样的任务,但却并一定不了解这些处理方式背后的真实原因。与之相应地,我们自然也都不清楚每个决定背后的原因。在工作和个人生活上,大都如此。大家遵循着一种特定的模式处理日常事务,尽管这个模式并一定是最有成效的,但大家早已习以为常。

不过,还是有一些迹象或警告的信号暗示出这些模式在工作效率方面的“损失”。为了方便讨论,我们可以通过审问自己,为什么会以某种特定方式做(或不做)某件事,如果答案是:“因为总是这样做的”、“我们(完全)没有别的方法”、“如果没坏,就不用去修”,或是我最喜欢的理由:“尽管工作量大,但这就是解决的办法”。这些回答,都表明了其实有一个更好、更有效率的方式来完成这些任务。

因为长期在一家专注于减少任务构建和开发时间的公司工作,我对这些信号早已见怪不怪了。任务进展得越慢,如 C++构建,这样的信号就出现得越多。

所以,如果你正在进行 C++构建,以下任何一个信号出现,都意味着你的构建速度太慢,需要优化了。而市场上也有一些伟大的发明,可以用来优化任务,或者帮助我们更好地决策。不论这些工具是洗碗机还是搜索引擎,能解决问题,何乐而不用呢?

但首要的,还是要识别下面这些信号。

在这里插入图片描述

信号#1:谁的构建出错了

如果你发现自己在不停地寻找那个破坏构建进程的人,这意味着提交的冲突已远超过你的处理能力,很明显你也没能参与每次提交。但如果你是通过信息发射源(Information Radiator)定位构建中断的原因,那问题不大。你需要确切地了解是谁打破了构建:找到创建提交的人。我们都希望能参与每一次提交,但是,这个过程需要频繁地构建。如果构建太慢,就不能用这种方式进行。否则,你将白白浪费太多时间,却一事无成。

另一个问题是自动化。备受赞誉的自动化进程也参与每一次提交,而且通常在构建失败时发送一个通知,出错者也将因此卷入一场修复、重新提交的紧张竞赛中(相信你也了解自动化工具和平台本身也有漏洞)

同时,也不要忘记封闭提交和封闭签入。字面理解,即创建提交时需要封闭签入,这些操作让构建保持清洁。

在这里插入图片描述

信号#2:新的团队焦虑:“通宵构建会成功吗?”

如果你“提交后不停地祈祷构建成功”,或者如果你痛苦地发现,夜间的构建再一次失败了(而且你没有任何能在白天交付的清洁构建)。这是一个信号。如果夜间构建让你焦虑不安,那就寻求专业的帮助吧。我指的不是那些治标不治本的药片,而是从根源上彻底解决问题的方案。

当你的构建速度快如闪电,你可以一直进行构建。我再重复一遍:一直。一个构建失败了(希望只是其中的一次提交出错)别担心,另一个会很快跟上。你有听过“Joel 测试”吗,Joel 推荐在白天进行构建。所以,在晚上,除了睡觉不要做任何事,远离焦虑(与构建有关的焦虑),回归美好生活。

在这里插入图片描述

信号#3:“让我们减少测试”

敏捷和高速的发布需要我们在一些测试上做出让步。测试把本来冗长的构建时间拉得更长,所以你时常禁不住想:“到此为止吧,让我们跳过这一步。”另一个情境是忽略一些失败的测试结果,然后盲目推进。错误!大错特错!这些测试是构建的保护网,而安全保护再多也不为过。集成测试、回归测试(完整的)、单元测试——这些工作,都是必不可少的,以确保产品质量和用户体验,你不能不重视。

在 C++ 的情况下,运行更多的测试尤其重要,一个错误的组件引发另一个组件错误,这种连环效应是尤其常见的。如果你不但能在每个构建/提交上运行单元测试,而且还可以运行集成测试,这样就可以有效避免跨团队的挫败和毫无意义的责备,同时省下大量时间。QA 团队也会因此感激你,因为他们能够集中精力研究产品的新特性,而不是一直在监督产品质量上浪费时间。

所以,不停地测试,就像没有明天一样,就像测试是生命的必需品一样(实际上产品的生命力依赖于测试),测试多多益善。你应该根据产品和用户的效益做决定,而不是为了缩短构建时间而仓促了事。你的思考过程应该更多地遵循这样的思路:“完整的回归测试?”确定。集成测试?当然。”

在这里插入图片描述

信号#4:“什么是静态代码分析?”

当你逼着自己要记住什么是静态代码分析,另一个坏信号出现了。这意味着你现在没有做过,甚至你从来没有试过。不过这确实是一个让人头疼的过程。从头到尾一行一行地检查这些代码,确实是不容易,对构建时间的影响也不容忽视。然而,静态代码分析的好处确是巨大的。毕竟,代码质量是基础,静态代码分析能高效定位有问题的模式,还可以检测代码中的安全漏洞(这是近来的热门话题)。但对构建时间的影响呢?我们还是不要去想这个问题吧。

在这里插入图片描述

信号#5:“我不要增加这个会拖慢我的构建”

今天的所谓奢侈品,会成为明天的必需品。在开发进程中增加工具集和功能集,如开源工具、第三方商业库、以及扩展当前的基础架构(测试覆盖面),对构建大有裨益。但是,如果你忽略了这些“奢侈品”,原因不是预算问题,而是构建时间会延长,这也是一个不好的信号。不论构建时间多长,都应该积极进行扩展,增加各种有效的工具集,扩大测试覆盖面(甚至在没有构建单元帮助的情况下添加预提交测试)。

该如何处理这些信号?

首先,不论如何,适当的情绪发泄是好的,但是,看到这些信号之后却无动于衷,这才不好。你还有很多选择(控制修复)。你可以选择重新编排代码,储备硬件库存,或者可以使用 Incredibuild,保持代码(以及基础架构和硬件设施)完整。所以,现在能够微笑面对了吗?
未想到的路

在这里插入图片描述

“未想到的路”更像是“未选择的路”的延伸。在耗尽你的耐心之前,我想进行另一种解释。寻找快速构建的方法更像是“未想到路”,而不是“未选择路”。一旦真正看到了这些信号,也许你就会灵光一现,立刻想到优化构建时间的最佳方法!希望我的建议能为你带来一些灵感,剩下的就靠你自己了。

点击了解 Incredibuild 加速 C/C++ 构建编译的解决方案,并获取试用 License!

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

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

相关文章

保险行业106短信群发营销时这些问题规避后效果倍增!

保险行业在使用106短信群发进行营销时,确实存在一些需要规避的问题。当这些问题得到妥善处理后,营销效果往往会倍增。以下是一些建议,帮助保险行业规避这些问题,提升106短信群发营销的效果: 1.个性化与精准定位&#x…

华为ensp中PPP(点对点协议)中的PAP认证 原理和配置命令

作者主页:点击! ENSP专栏:点击! 创作时间:2024年4月8日14点31分 PPP协议(Point-to-Point Protocol)是点到点协议,是一种常用的串行链路层协议,用于在两个节点之间建立点…

windows一键休眠,一键唤醒

1.使windows睡眠不可用,cmd以管理员身份运行: powercfg.exe /hibernate off 2.桌面创建快捷键 Rundll32.exe Powrprof.dll,SetSuspendState Sleep

On-Page SEO:什么是页面优化?如何进行页面优化?(附清单)

本文原文链接: https://ahrefs.com/blog/zh/on-page-seo/ 在本指南中,你将学习如何优化你的内容,以便在 Google 上获得更高的排名。 我们将分享经过验证、易于遵循的页面优化中真正重要的内容的建议。 需要一份清单吗?你也可以…

qt 打印日志

在 Qt Creator 中,将 QDebug、QInfo、QWarning、QCritical 和 QFatal 打印的日志输出到指定文件,需要设置 Qt 的消息处理机制。这通常涉及到安装一个自定义的消息处理器,该处理器将日志消息重定向到文件。以下是一个基本的步骤指南&#xff1…

Unity-超级方便的Excel 读写插件

超级无敌棒棒糖🖌 🌭功能介绍🍕 Demo准备一个数据类准备一个Excel导入Excel行数据转换导出到Excel 🍱新增映射字段类型 🌭功能介绍 💡.Excel 行数据转对象:把导入的Excel 每一行数据进行自动映…

边缘智能网关为企业数字化转型提供强有力支持-天拓四方

一、企业背景 随着信息技术的飞速发展,企业对于数据处理和通信的需求日益增长。特别是在工业4.0、智能制造等领域,企业面临着海量的数据采集、实时分析、远程监控等挑战。传统的中心化数据处理模式已难以满足这些需求,企业需要寻求一种更加高…

spring加载类初始化顺序

今天看spring官网的时候,提到了Ordered执行顺序。我当时记得PostConstruct注解会在bean加载后执行,现在又来了一个执行顺序,直接给我整蒙了。 于是我写了一个简单的dom来看看,它是什么: Service("t2ServerImpl&q…

编程新手必看,学习python中元组数据类型内容(10)

1、Python3 元组 Python中的元组是一个不可变的序列类型,用于存储一组有序的数据。 元组的主要特点包括: 不可变性:一旦创建,元组的内容不能更改,这使得它们成为保护数据不被修改的理想选择。有序性:元组…

Git - 如何重置或更改 Git SSH 密钥的密码?

Git 使用 ssh 方式拉取代码时,报 ssh password login,提示输入密码,这时很容易误填为 Git 的登录密码,其实这时需要输入 SSH 证书的密码,下面直接提供更改以及重新导入证书的方式。 首先需要确认你的本地是否有 SSH 钥…

隐藏在计算过程中的数据超限

【题目描述】 输入两个正整数,输出,保留5位小数。输入包含多组数据,结束标记为n=m=0。提示:本题有陷阱。 【样例输入】 2 4 65536 655360 0 0 【样例输出】 Case 1: 0.42361 Case 2: 0.00001 【题…

学习记录14-运算放大器2

目录 前言 一、理想放大器 二、虚断 二、虚短 虚短的两个使用条件 1.虚短概念 2.如果我们将运放的同相端和反相端颠倒会怎样呢? 总结 前言 主要讲述运算放大器的虚短虚断 一、理想放大器 如果没有基础或只是想简单了解,可以看我前一篇文章&am…

vue项目初始化和部署

目录 1. 技术简介... 2 2. 安装Node.js. 3 3. 全局安装Vue CLI (脚手架工具) 5 4. 创建一个新的Vue项目... 6 5. 在阿里云虚拟机安装和配置Nginx. 9 6. 将Vue项目打包部署到Nginx下... 14 7. 访问部署的项目... 14 1. 技术简介 Vue.js(通常简称为Vue&#x…

java算法day46 | 动态规划part08 ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 完全背包问题&#xff0c;只不过装入背包时需要附加一个判断条件。 class Solution {public boolean wordBreak(String s, List<String> wordDict) {boolean[] dpnew boolean[s.length()1];dp[0]true;for(int j1;j<s.length();j){for(int i0;i<wordD…

每日一题(力扣)---插入区间

官方网址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals按照 st…

外包干了6天,技术明显进步

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

正则表达式替换<>中的内容

有 xml的字典如下&#xff1a; <sys:String x:Key"ButtonLogin">登录</sys:String> <sys:String x:Key"ButtonCancel">取消</sys:String> <sys:String x:Key"ButtonLive">实时成像</sys:String> 想…

使用单点登录(SSO)如何提高安全性和用户体验

什么是单点登录&#xff08;SSO&#xff09; 对于所有大量采用云应用程序的组织来说&#xff0c;有效的身份管理是一个巨大的挑战&#xff0c;如果每个 SaaS 应用程序的用户身份都是独立管理的&#xff0c;则用户必须记住多个密码&#xff0c;技术支持技术人员在混合环境中管理…

文档管理系统解决方案(word原件)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 数据备份技术 3.系统功能设计 3.1.功能清单列表 3.2.基础数据管理 3.3.位置管理 3.4.文档使用 3.5.文档管理 软件全套资料包获取方式①&#xff1a;软件项…

Pytorch数据结构:Tensor(张量)及其维度和数据类型

文章目录 Tensor基础1.1、Tensor的维度&#xff08;Dimensions&#xff09;1.1.1、举例说明1.1.2、高维Tensor 1.2、.dim()和.size()方法1.2.1、.dim()方法1.2.2、.size()方法1.2.3、.shape属性1.2.3、示例代码1.2.3.1、一维Tensor1.2.3.2、二维Tensor1.2.3.3、三维Tensor 1.3、…