C++ 重构技巧

在这里插入图片描述多年前,当 C++ 还不够成熟的时候,全球代码库很小,我们可以轻松地阅读、审核代码,然后将其用于构建项目,产生无限可能。或许这种情况可能从未出现,但我们可以想象一下,如果程序虽然简短简单,但很完整,不需要扩展功能。这种情况下,可能没必要进行代码重构。然而,如果需要检查或更新代码库,无论是扩展代码库,还是基于不同语言改进代码库,亦或是仅为了检查效率而审核代码库,重构代码都很有必要。

重构代码的原理是在不改变代码的前提下改进现有代码。实质上,就是在提高设计和整体可读性的同时,确保功能完好。代码重构提高了效率、可读性、可维护性和可扩展性。让我们从语法和语义两个方面进行简单的补充说明。

重构为何如此重要?

重构的目的在于使代码更具可维护性。通过提高可读性,使故障诊断和调试变得更简单。此外,对于需要完成新增功能、平台迁移或采用编程语言最新和最重要功能的新手人员,重构能够减轻他们的大量推演工作。

切记,随着新功能的添加,内聚性会降低。内聚性指的是模块各组件之间的关联程度,一般而言,功能应具有高度内聚性。添加一个新功能可以提高多功能性,但它不是一个高度集中的函数或类,而是更广泛和不集中。而重构的目的之一就是提高内聚性。

尽管严格来说,代码重构并非用于清除漏洞,但通过重构,确实可以发现漏洞。例如,当几乎相同的代码块仅略有不同时,细微的差异并不总是像复制粘贴错误那样有意为之。代码重构是预防性维护的重要一步,有助于为未来的开发人员明确遗留功能。

重构的另一重要需求是准备新功能的代码库。需要添加新功能时,一种很好的方式就是先对代码进行必要变更,以便引入新功能,而不改变实际运行。因此,我们可以检查回归,确保代码已准备就绪,可引入新功能,但功能仍可正常运行。接下来,就可以引入新功能。这可能需要改变原先的测试,因为系统行为可能随新功能的变化而改变。将重构代码作为第一步,可以有效降低功能扩展所带来的风险。

我们应在何时重构?

理想情况下,重构应在构建现有代码库之前完成。另一方面,也许您想对遗留的 C++ 代码库进行现代化改造。在任何情况下,当您处理用于添加新功能或更新现有功能的代码时,它提供了清理现有功能的绝佳机会。尤其是,对于那些不熟悉项目的人来说,这是了解已有内容的绝佳时机。重构工作不仅会改善项目(至少在可读性方面),而且会使开发人员在需要进行下一组增强时更加容易。

代码异味

术语代码异味是指可以快速发现的东西,通常对应于代码中更深层次的问题。然而,需要切记的重要一点就是,代码异味通常是问题的一个指标,而不是问题本身。此外,它并不总是表示存在问题。一个很好的例子是有一个特别长的函数。它可能看起来可疑,并最终指向一个隐藏着细微缺陷的区域。也就是说,拥有一个长函数本身并不是一个错误。

还有一种观点认为,只要程序员看到有改进的机会,就应该进行重构。因此,当他们察觉到问题时,就应采取行动。事实上,有人建议,这不应该是一项有计划的任务,而应是一项例行的工作,以确保当前的代码库始终处于良好状态。我们的想法是,如果定期完成小的重构任务,那么就没有必要为一个更为有意和明确的重构项目安排时间。

我们在何时不应重构?

尽管出色的代码重构有这么多好处,但是否有放弃该过程的最佳时机? 当然有,在有些情况下,所需的时间和精力会导致截止日期出现问题。代码重构可能会非常耗时,而且在有些情况下,在进入下一步之前,必须先完成大块代码。当截止日期很紧张时,代码重构的回报可能确实在递减,甚至在最坏的情况下,会使您超过时间线的临界点。这是一个代价高昂的错误,可以通过适当的安排来避免。归根结底,重构可能比你想象的要花更长的时间,所以应有相应的计划。

前面的例子中说的就是一种可以置之不理的情况,直到有一段合适的时间可供操作。然而,有时出于相反的原因跳过重构则是明智的做法。我说的是你不能置之不理的情况。具体来说,代码需要显著更新,并且可能需要完全重写。因此,代码重构的效率比重新开始要低。

为什么在 C++ 中重构代码这么难?

因为存在一系列与代码库重构相关的固有问题。例如,如果团队不熟悉系统的当前状态或出于对设计的考虑,他们就需要花时间了解最新状况。开发人员必须对功能有所理解,确保不会干扰正常功能。例如,在没有必要知识储备的情况下尝试对代码库进行现代化升级,很容易导致某种漏洞,若不进行大量测试,可能难以捕捉到这种漏洞。

除了可能影响任何语言的问题之外,C++ 开发人员发现代码重构更具挑战性,部分原因是语言很复杂。这种复杂性与语言扩展功能(如宏和模板)相结合,更不用说语言本身很大,而且语法很难处理。

幸运的是,您可以遵循一些非常好的基本重构步骤,一些 IDE 可以帮助您使用重构工具。

有些 IDE 包含重构工具

一些 IDE 至少在某种程度上支持重构。虽然并非每个 IDE 都能处理该过程中的所有步骤,但该功能无疑将有助于节省开发和测试时间。当比较现代 IDE(比如 Visual Studio 和 Eclipse)时,很明显两者都具有代码重构功能。有些是内置的,而更高级的重构功能则可以通过使用扩展来实现。我们的最佳 C++ IDE 列表中还包括 JetBrains 的 CLion,其中包括多项自动重构功能。

例如,Visual Studio 具有多个可用于 C++ 的内置重构操作,其中许多可从 Quick Action 上下文菜单中获得。如果需要更多功能,那么 Visual Studio Marketplace 有无数的扩展可以提供帮助。Visual Studio 的一个常用扩展是 Visual Assist,由 Whole Tomato Software 提供。这提供了多种功能来帮助程序员,包括更高级的重构技术。

点击了解 Incredibuild 加速 C++ 构建的解决方案!

C++ 重构的顶级技术

只要能在正确的时间内完成,重构显然就是一项值得做的工作。此外,有的情况下最好将重构视为一系列微重构,其中每个微重构都是源代码中的一小部分更改。这些微小的更改带来了明显的好处,为了更好地利用它们,我们建议采用重命名、提取、内联和搬移对象等顶级技术。关于该主题的宝贵资源是 Martin Fowler 与 Kent Beck 合著的著作《Refactoring》。

重命名

说到命名,很多人从一开始就搞错了。它可能从一开始就被懒散地或不恰当地命名,或者,功能已经发展到名称无法再准确描述的地步。值得庆幸的是,对类、变量或函数进行这种类型的更改并不像使用出生证明那样困难。

此操作可以像使用标准文本编辑器复制和替换特定名称一样简单,尽管在涉及 C++ 和一般编码时,范围很重要。这些更改是要在全局范围内进行,还是特定于某个函数或类? Visual Studio 提供了 Rename 功能,如下例所示。
在这里插入图片描述图 1:带有通用 “calculate(…)” 函数的简单代码库

右键单击 “calculate” 会显示上下文菜单,其中包含 Rename 选项。选定该选项后,将显示实体重命名选项。

在这里插入图片描述
图 2:可以从 Visual Studio 的上下文菜单进行重命名

在这里插入图片描述
图 3:Visual Studio 中的变量重命名选项

一旦 “calculate” 被 “add” 替换,考虑到作用域和其他选项,结果就是一个在整个程序中使用的名称更合适的变量。
在这里插入图片描述
图 4:简单代码库,重命名后操作

请注意,代码仅比原来长了几行。这是因为简单的 Rename 方法在第 6 行自行添加了 “int main();” 声明。由于 main 的原型并没有特别的帮助,这是一个很好的例子,说明自动重构可能会产生意想不到的副作用。并非该工具所做的所有自动重构步骤都是最优的,因此,为了简单起见,程序员可能会选择覆盖这些步骤。

提取

可以对变量、函数、类甚至参数进行提取。本质上,它涉及到将代码分解成更小、更离散的块,类似于构建块。

函数提取

在以下示例中,几乎相同的循环用于增加两个不同的值。使用 Visual Studio 的内置函数提取可以采用不同的方法。本例处理两个循环中的第一个,其中创建了一个新函数 “incrementLong(…)”。这个更为通用的函数被调用两次,而不是运行两个不同的 for() 循环。尽管在这个简单的示例中没有任何变化,但更复杂的过程会受益,因为内循环更改只需要进行一次。
在这里插入图片描述图 5:具有重复循环的 Toy 函数,用于添加两个长值
在这里插入图片描述图 6:使用 Visual Studio 将循环提取到其自己的函数

选择用于函数提取的代码后,开发人员会看到少量选项以及新函数签名的预览。

在这里插入图片描述
图 7:Visual Studio 中的 Extract Function 选项

在这里插入图片描述
图 8:Visual Studio 中的单个函数提取

变量提取

如果您了解函数提取用于合并和离散化代码,那么您也了解变量和类会发生什么。变量提取用于从表达式中创建变量以提高代码可读性。考虑以下示例:

在这里插入图片描述
图 9:预变量提取

在这里插入图片描述
图 10:后变量提取

虽然有一个明显的折衷办法是增加变量,但毫无疑问,即使是这个简单的函数也更容易阅读和调试。关于优化和副作用,还有一点需要说明。

具体来说,在预提取的示例中,如果 x 的值在运行时为 0,那么程序在评估之后将立即知道 if() 语句为假。因此,它不会评估 abs(y),更不用说将其与 20 进行比较。在后提取版本中,会对 abs(x) and abs(y) 进行评估。这仅在第二个函数的执行产生任何副作用时才相关。如果是这样,那么在第二个版本中,无论 x 和 y 的值是多少,状态和执行时间都是相似的。

在这种情况下,不仅提高了可读性,而且还提高了可预测性。

类提取

类提取更可能是手动完成的。一旦认识到一组变量(特别是原语)被用于一个共同的目的,就应该创建一个类。

例如,如果会计系统基于美元,则可能会使用一组简单变量和独立函数,例如:

在这里插入图片描述

图 11:会计系统代码片段

随着时间的推移,该系统会不断发展,并且在某一时刻,该功能会支持多种汇率不同的货币,并跟踪特定日期结束时的每种汇率。这样做需要几个更相关的原语和函数,因此是将它们提取到类中的理想位置。

拥有一个 “balance” 类将包含金额、汇率和相关日期的变量,以及用于初始化、检查和报告这些变量的方法。

内联

内联是另一种重构方法,它实际上与提取相反。考虑这样一种情况,函数体非常简单,比函数调用更容易理解。这通常不是有意为之。实际上,创建函数是为了封装更复杂的行为,但随着时间的推移,就像提取越来越复杂的对象一样,那些变得过于简单的对象可以被内联。

图 12:可以内联的简单函数

与其使用 getBalance() 函数充当 wrapper,不如使用内联版本:

在这种情况下,使用较少的函数会使代码更易于阅读。

搬移

搬移对象是一种重构,通常在一个变量或方法被多个类使用时使用。例如,如果 A 类使用 B 类中的方法,且比 B 类使用的多,那么搬移该方法是有意义的。B 类可以使用代码引用新方法,甚至删除它,这取决于重构的级别。

C++ 重构——总结

代码重构是预防维护的重要一步,可以在不更改其功能的情况改进现有代码库。尽管在重构方面有很多好处,但有时您会这样做,有时您不会。尽管 C++ 比 C# 或 Java 之类的语言更难重构,其好处证明这么做是值得的。如果您这样做了,请做出相应计划,因为它可能需要比预期更长的时间才能完成。与任何编码一样,不可避免地会出现隐藏的挑战。

很多重构技术都是可用的,尽管我们在这里只介绍了一些基础知识,但已经足够帮助您入门了。至少,您知道有现代 IDE 和扩展可以在此过程中为您提供帮助。

本着保持简单的精神,我们就讨论到这里。

点击了解 Incredibuild 加速 C++ 构建的解决方案,并获取试用 License!
在这里插入图片描述

相关推荐

CI/CD Pipeline:完整指南

CI/CD Pipeline 是一系列自动化步骤,允许开发人员快速交付更好的代码。CI/CD Pipeline已成为新软件开发流程的核心。从代码集成到部署的所有作都自动化,并在整个过程中嵌入安全性本指南深入探讨了这个概念以及它支持开发人员急需的演进的方式。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1362

如何检测和预防偶发性测试?

如果您曾经有过一次测试,前一刻通过,下一刻不及格,即使没有任何变化,这些不可预测的测试可能会使 CI/CD pipelines 脱轨并减慢发布速度。但偶发性测试不一定是一个永久性的问题。事实上,你可以永久摆脱这些片状的东西,以下是对这个概念和对抗它的武器的仔细研究。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 837

DevSecOps 集成 CI/CD Pipeline:实用指南

随着软件开发几乎每天都在攀升,组织不断尝试以前所未有的速度交付新功能和应用程序。虽然持续集成和持续交付 (CI/CD) Pipeline 彻底改变了软件部署,但它们也引入了新的安全注意事项,这就是 DevSecOps 的用武之地。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 842

当 C++ 用于嵌入式开发:优点和缺点

从小型微控制器到大型工业自动化系统, 嵌入式开发是我们每天使用的设备和产品的核心。在众多可用选项中,C++ 既是一个有前途又有点争议的候选者。在本文中,我们将探讨 C++ 如何适应嵌入式开发领域,以帮助你对项目做出明智的决策。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1522

Incredibuild 新增 Unity 支持:击破构建时间过长的痛点

任何开发过复杂 Unity 项目的团队都会告诉你:构建速度已成为生产流程中的核心痛点。Unity 灵活且强大,但随着项目规模扩大(尤其是包含 3D 资源、复杂着色器和庞大内容管线的项目),构建过程会逐渐变成一项隐性成本。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1518

如何构建成功的测试自动化框架

手动测试是有效的,但速度慢且通常很麻烦。解决方案?自动化测试。自动化带来了其自身的复杂性和挑战;再加上紧迫的发布期限、不断变化的项目要求以及交付完美结果的压力。在本文中,我们将引导您了解测试自动化框架的世界,并向您展示如何构建成功的自动化测试策略以缩短开发周期。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 908

使用 Incredibuild 的 Build Monitor 优化 Build Cache 性能

在现代软件开发中,缓慢的构建会浪费时间和资源。这会影响团队的生产力并延迟项目时间表。构建缓存是一种强大的方法,它通过重用先前构建的输出并避免冗余任务执行来加快构建时间。然而,实现最佳缓存性能并不总是那么简单。缓存命中率通过计算所有可缓存构建任务中的缓存使用或命中部分来衡量构建缓存的有效性。高命中率表示缓存成功重用以前执行的任务,从而加快构建速度。另一方面,低命中率可能表明效率低下,例如冗余任务执行。提高缓存命中率可能具有挑战性,但优化这些可以显著加快构建速度并减少资源消耗。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1112

Docker 101:面向初学者的综合教程

掌握 Docker 已成为软件开发中的一项关键技能。本教程探讨了容器化的世界,包括其核心概念、优缺点,以及开始使用容器化的分步指南。无论是 Docker 的新手,还是希望复习基础知识的更有经验的开发人员,本指南都能满足需求。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1246

使用 GitHub 可重用工作流和 GitHub Actions 简化 DevOps

这篇博文将探讨 GitHub 可重用工作流、它们的优势,以及如何构建它们并将其集成到开发流程中。无论是管理少量存储库还是监督大量项目,学习在 GitHub Actions 中创建可重用的工作流程都可以改变团队的生产力和代码质量。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1350

构建 DevOps 最佳实践:面向 DevOps 和平台工程师的操作指南

DevOps 无疑是当下最流行的软件开发方法,且仍在持续发展。其需求不断增长的原因在于,一旦得到恰当的采用,它能够带来效率提升、速度加快、可扩展性增强以及成本节约等诸多实实在在的好处,绝非空洞的承诺。在本文中,我们将讨论工程师可以遵循的最佳实践,以确保 DevOps 的成功实施。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 871

成本效率在平台工程中的重要意义

本文探讨了创建强大的开发人员平台与保持成本之间的微妙平衡,提供了有关平台工程优化的实用见解。通过可操作的建议,你将学习如何实施平台工程计划,在不破坏资金的情况下提供最大价值,最终创建一个更可持续、更高效的开发生态系统。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1001

如何在保持安全/合规的同时更快地构建应用程序:DevOps 指南

当今 DevOps 工作流程的主要挑战之一是“速度与安全性的困境”。在本指南中,我们将探讨 DevOps 团队面临的一些最紧迫的挑战。我们还将讨论 Incredibuild 如何帮助您在不牺牲 DevOps 合规性的情况下更快地交付高质量和安全的应用程序。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1067

什么是 GitOps?平台工程师入门指南

随着我们的系统变得越来越复杂,GitOps 作为下一个进化步骤出现的地方。这篇博文将探讨 GitOps 的基本原则、基本组件以及它为平台工程提供的优势。我们还将讨论采用 GitOps 的挑战,以及 Incredibuild 等工具如何支持 GitOps 工作流。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1035

更快的应用程序开发:确保安全与合规

快速软件开发是所有应用程序开发人员的首要任务。不幸的是,速度的代价通常是安全。在本文中,我们将解释为什么安全性和合规性至关重要,以及 DevSecOps 如何为快速、安全和合规的开发铺平道路。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 894

平台工程:易用性与灵活性

平台工程已成为不断发展的软件开发领域的一门关键学科,它围绕设计和维护可简化软件交付流程的内部开发平台展开。在这篇博文中,我们将探讨易用性和灵活性在平台工程中的重要性,我们在实现这种平衡时面临的挑战,以及类似 Incredibuild 这样的解决方案如何帮助我们找到最佳平衡点。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1106

如何在 CMake 上设置新项目以获得成功

从处理依赖项到确保正确编译和链接代码,正确的构建系统可以节省 你时间并避免潜在的麻烦。本教程介绍了 CMake 的受欢迎程度、基本设置和最佳实践,以及使用它时的常见陷阱。我们还探讨了代码生成器和自定义目标等高级主题。最后,你将会更加有效地利用 CMake,助力项目取得长期成功。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1370

深入了解 DevOps 基础架构:可追溯性的关键作用

在当今竞争激烈的软件环境中,快速交付强大的应用程序至关重要。尽管如此,在不影响质量的情况下保持速度可能是一项艰巨的任务,这就是 DevOps 中的可追溯性发挥作用的地方。通过提供软件开发生命周期 (SDLC) 的透明视图,可追溯性可以提高代码质量、确保合规性并提高效率。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1325

在 C++23 中使用智能指针进行现代内存管理 — 第 2 部分:共享指针

在本系列的第 1 部分中,我们探讨了托管内存语言以及 C 和旧式 C++ 中的内存模型。我们看到了智能指针可以提供的价值,并探索了标准智能指针之一:unique_ptr。本文(第 2 部分)将介绍另一个标准的智能指针,即共享指针 (shared_ptr),并探讨它的一些用途。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1241

在 C++23 中使用智能指针进行现代内存管理 – 第 1 部分

C++ 以具有难以处理的内存模型而闻名。在这个由两部分组成的系列的第 1 部分中,我们将解释托管内存语言和传统 C 和 C++ 中的内存管理原则,解释每种方法的问题,然后建议智能指针如何提供帮助。最后,我们将深入探讨一个重要的内置智能指针,即唯一指针 (unique_ptr)。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 968

基础设施在平台工程中的作用

平台工程侧重于设计和构建自助服务工具和环境,以简化软件开发和部署。作为开发人员,我们的任务是快速高效地交付高质量的软件,这需要一个强大、敏捷并无缝集成到我们的工作流程中的基础设施。本指南探讨了现代基础设施如何支持平台工程,使我们能够直面这些挑战。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1100

Incredibuild 收购 Garden.io,加速端到端软件开发

多年来,备受信任的 Incredibuild 以极大加快构建、测试和其他计算密集型开发任务。现在,通过整合 Garden 的尖端流水线优化能力,我们可以为您整个 CI 工作流注入强大动力,从代码提交到部署的每一个环节。Garden 的创新技术通过智能缓存和优化资源分配,消除了 CI 流水线中的冗余工作。这使得反馈周期变得快速流畅,更新可以无缝流动从开发到预发布再到生产环境。再也不用等待构建或部署——Garden 的图形感知引擎确保只有更改过的代码会被重建和重新部署。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 402

隐式编程与显式编程:概念与区别解析

众所周知,软件开发充满了行话和复杂的概念,其中之一就是隐式编程和显式编概念与两者的区别,了解这些区别将直接影响代码运行方式以及维护的顺畅程度。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1239

量化交易策略:定义及其重要性

量化交易是华尔街和硅谷的秘密结合点,在这里数学和算法与金钱和市场相遇。虽然它曾经是金融巨头的专属领域,但现在它比以往任何时候都更易于接触。但不要被愚弄,量化交易仍然是一种高速、高压的游戏,在毫秒间可以赚到或失去财富。你需要一种独特的技能组合,包括技术技能、金融知识和合适的工具来支持你。加入我们,探索量化交易的美妙世界。我们将解释它是什么,如何运作,并揭示提升你的策略的顶级技术。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1614

8大趋势,重塑金融服务行业

谈论“金融服务行业”就像谈论“亚洲大陆”。这是因为,通用行业概念但它掩盖了许多细分领域的细微差别和多样性,以及人们思考、工作和感受方式的巨大差异。银行应用程序和一个量化交易公司都是金融服务公司,但它们的运营方式可能天壤之别。因此当我们看到真正的金融服务行业趋势,涵盖行业大部分的趋势时,说明事情已经变得值得我们深入关注了。让我们来看看目前大家都在关注的金融服务行业的新趋势。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1016

如何正确使用 include-what-you-use

简单地说,由 Google 开发的 include-what-you-use(IWYU)让源代码文件包含代码里用到的所有头文件。这种方法确保在改动了一些接口之后,代码依然最有可能编译成功。之前我写了一篇关于 include-what-you-use 工具的文章,它会建议使用提前声明来加速编译时间,并且检测可能导致可移植性问题的对间接包含的意外依赖。但是,你也可能注意到该工具引起的一些负面问题。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1189

上下文切换给开发团队带来的隐形成本

开发工作的大部分是深度工作,需要全神贯注。进入和退出这种状态都需要时间,这就是为什么大多数开发人员不喜欢被打扰。但对许多开发人员来说,工作中被打扰是常态。会议、紧急支持工单、电子邮件、同事的随意提问,开发者的一天充满了干扰。每一次干扰都会付出代价,削弱开发者的生产力、工作质量和心理能量。我们称这种从一个任务跳到另一个任务的现象被称为“上下文切换”,即使这个概念不被熟知,但它可能正在破坏开发团队的输出质量。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1333

Major European 银行 X Incredibuild

Major European 银行利用 Incredibuild 优化其开发流程,特别是针对其 C++ 编译和 Ninja 构建系统。该实施包括在 EMEA 地区部署了10,500个浮动 helper core 和500多个 initiators,在北美地区部署了4,500个 helper core 和200多个 initiators。这一广泛的支持涵盖了 Major European 银行的300多个产品、2,000个构建配置和每月50,000次构建。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 497

Incredibuild for Mac 来了!

今天,我们很高兴地宣布,Mac 开发者(以及将应用程序移植到 Mac 和 iOS 的 Windows 开发者)不再需要花费数小时等待构建了!Incredibuild 正式支持 Mac 和 iOS 的开发,并带来更快的构建和成本优化。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1239

C++ 头文件优化

C++ 是一种灵活的语言,所以需要一种积极的方法来分析和减少编译时依赖。一种常见的达到这个目的的方法是,将依赖从头文件里转移到源代码文件里。实现这个目的的方法叫做提前声明。简而言之,这些声明告诉编译器某个函数接受和返回哪些参数,而具体的定义则规定了具体的行为。让我们根据下面两种规则来改进编译时长并减少可移植性问题,并且使用 include-what-you-use 这种自动应用这些规则到你的代码库的工具。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1510

开发者为什么需要“不良代码”

在当下,软件开发领域存在着一种错误的观念,是什么呢?与弗莱明的屡次失败而发现青霉素的方式类似,在实际开发中,粗糙的代码可以带来意想不到的结果。在这篇博客文章中,我们将分析“好代码”与“不良代码”的概念,以及为什么开发者们不应该一开始就害怕“不良代码”。

讨论软件开发加速、持续集成/持续交付(CI/CD)、C++、开发者生产力以及所有相关话题。 1243
上一篇: 关于 C++ 依赖管理
下一篇: 企业级 DevOps 究竟是什么?
Incredibuild 官方账号
Incredibuild 官方账号 Incredibuild 企业官方账号 Incredibuild 企业官方账号
博客等级 码龄6年 1001粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值