C++ 开发者的八大痛点

Guy Golan
Guy Golan / 2月 27 2020
C++ 开发者的八大痛点

C++ 开发走过了漫长的岁月。尽管新的语言不停涌现,还是丝毫没有动摇这个跨平台语言的影响力,C++ 赋予了开发者对系统资源和内存最大程度的控制能力。不过,C++ 开发也有其不足之处。本文将详述 C++ 开发人员与我们的产品专家分享的一些痛点,同时也推荐了一些行之有效的应对方法。

在涉及到实现第三方解决方案,或尝试一项新技术时,C++ 程序员通常是积极的决策者。他们一般在具有一定计算能力的计算机或笔记本上工作,也有一些不能经常享受一流的 devOps 管道工具等问题。

以下是八个 C++ 开发的主要痛点:

1 – “我们去喝杯咖啡吧……”
构建编译速度缓慢

构建和编译速度估计是现在最常听到开发人员抱怨的问题了。速度缓慢,也意味着开发者有更多喝咖啡、闲聊的时间,或者因为上下文切换(Context Switching)导致工作质量降低。构建缓本质上也会导致迭代频率降低。

C++17/C++20 针对提升生产力作了一些改变,但并不表示可以缩减编译时间。在这一点上,模板文件就是一个例子,它们反倒延长了编译时间。C++ 组件应该可以大幅减少编译时间,但是需要花费时间进行迁移。

2 – “我不知道这些功能!”
C++ 语言的复杂性和语言功能

C++ 大概是最受欢迎的全栈语言,也是一个复杂的语言。C++ 能直接支持高级类类型(Higher Kinded Types)、维度分析(例如Boost 单元)以及其他的功能范例。在 C++ 17 还包含了标准库以帮助查找 CPU 缓存行大小。

所以,这也难怪很多相对高级的开发者依然在学习隐藏功能,试图探索优化开发的新方式。

 

3 – “谁破坏了构建!”

CI/CD 实施的麻烦 

DevOps 有四大基础支柱——持续集成,持续测试,持续交付,持续监控,以此加强可视化操作,随时洞察执行情况。然而,当进程速度缓慢时,经常会产生服务器故障或其他管道并发症。

更为糟糕的是,如果迭代和发布缓慢进行,测试也会相应减少。工作会越来越复杂,开发者需要找到出错点,这在 C++ 中更为困难。而一个小小的代码错误可能在之后的管道中引发一系列问题。

因为无法手动定位代码错误,最终可能导致团队间的冲突,或不同员工的沟通问题。

4 – “我已经厌烦这些附加的流程了。”
第三方解决方案管理不当导致生产力低下

C++ 缺少补充工具。以依赖关系为例,JavaScript 的程序员可以使用 NPM,或选择其他工具。Java 的开发者广泛使用 MAVEN.但在 C++,主流上没有可信赖的工具可供使用。

也有一些有效的解决方案,但是需要每天地进行维护,这让开发人员慢慢地失去了兴趣。另外,还要考虑到这些解决方案需要进行培训或新员工培训,这些培训更是一种多余的压力和麻烦。开发者不开心=结果糟糕。

5 – “加班开始了。”
已发布的缺陷产品需要打补丁或修复

正如上面所描述的,低效和不恰当的开发进程最终导致缺陷产品,而这些缺陷产品的发布往往是因为时间紧迫。已经发布的产品需要进一步打补丁或修复(开发者的附加工作),这种情况在各个部门越发地常见了。

CISQ 的一项调查发现,在 2018 年,因为劣质软件导致美国公司的损失高达 2.8 万亿美元,其中 18.22% 仅由技术问题造成。

6 – “测试结果怎么样了?”
发布团队和 QA 团队信息反馈迟钝

最理想的情况是,C++ 开发者快速测试、快速得出结果,进而实现快速迭代。这种方式有利于开发者及时进行修复,缩减开发时间,最终高效地将产品推向市场,同时帮助更好地计划和产品设计。但现实往往不如人愿。

构建时间漫长导致迭代减少,这也意味着测试将减少(不稳定测试减少,测试的覆盖范围缩小),或是市场发布的时间延长(如果所有测试都合理且缓慢地开展了)。更糟的是,现存的或遗留项目组中的单元测试开展更为艰难。

7 – “我的机器卡住了!”

机器阻塞和硬件维护问题

典型的开发管道一般包含上千个代码行(LoCs),这些代码有时甚至会压倒强大的个人工作站。这类的机器阻塞问题可以通过本地网络的空闲 CPU 解决,同时避免以任何方式或形式损害其他机器的性能。

毫不夸张,就算事先进行过容量计算,庞大的构建和编译也可能导致开发者机器宕机。除了要应对日常的消极情绪,开发者还要跟 IT 经理打交道,但这些问题 IT 经理通常也无力应对。

8 – “我明天应该做什么?”
无趣的产品设计,糟糕的计划安排

前期产品设计和计划,对整个开发生命周期影响重大。如果在产品交付的最后一刻,所有的工作人员都在手忙脚乱地控制破损或修复缺陷,那么他们就很少有时间去收集有效的数据,也无法专心致志地提高产品质量。

 C++ 开发者的速效“止痛药”

解决上述痛点问题有许多方法,下面列举了使用最频繁、最有效的3种方法。

1 –在代码旁标注通俗易懂的注释

如前所述,用 C++ 编码较为复杂。而且项目的开发通常需要多个团队远程协作,编写数千个代码行,要让大家准确理解工作进展都会变得尤为困难。因此,注释是用“高级”的英语词句描述程序开发目标的一门“艺术”。

注释的撰写最好在实际编写 C++ 代码之前,用一些“高水平”的说明解释程序的进展,切记不要重复一些显而易见的事情。通过一些合适、多样的名称进行说明,大部分程序都可以像普通语言一样通俗易懂。

尤其在项目重新开放,或者新的开发人员需要熟悉产品时,注释的作用就很大了。

2 –使用自动化的 DevOps 管道

简而言之,自动化驱动创新,也让 C++ 开发者更能集中精力享受编写代码或创建功能分支的工作。自动化和编制正成为现代开发管道不可分割的一部分,这并非只是巧合。

高速开发并不意味着服务器瓶颈或其他管道并发症已经根除了。不过,在更高水平测试和代码分析的辅助下,新增的 DevOps 问题,如配置漂移、意外覆盖和团队冲突,也变得更容易察觉和处理。

3 –创建一个加速开发周期

即插即用的分布式进程处理方案,例如 IncrediBuild,充分利用了本地网络或公有云中的闲置 CPU,将每一个工作站转换为拥有数百个内核的超级计算机,加速任务执行。同时,IncrediBuild的低维护也大幅减少了IT管理成本。

使用 IncrediBuild 让整个项目开发都受益不浅,具体包括:

  • 构建、编译加速——速度的提升,意味着无需进行上下文切换,也可以摆脱追求速度而牺牲质量的困扰。增加的构建和测试迭代,让开发周期就像是瑞士钟表一样精确准时,团队也因此将有更多的时间专注质量提升。
  • 腾出时间处理更重要的任务——构建时间缩短让每个迭代拥有更多的处理时间,也让大家可以尝试一些此前没有时间进行的测试,如端到端(End-to-End)、性能和压力测试,如有需要,还可以进行更多手动周期。
  • 零硬件问题—多个 CPU 并行处理任务,有效避免了机器阻塞。让 C++ 开发者可以专注重要的代码编写。另外,还可以借助云计算的弹性扩展,解决企业资源限制的问题。

总结

C++ 开发实现可视化和透明化,如今已不再是天方夜谭。我们可以深入开发管道内部,观察、分析、监控构建进程,找出错误、瓶颈,实时解决问题,优化产品质量。

此外,尽管拥挤的高峰时段和紧迫的截止日期可能对IT基础架构要求较高,但现在,我们可以充分利用公共云中的数千个内核和机器来加速开发,甚至让多个团队远程协作同一个项目。

虽然本文提到的痛点依旧常见,但有了这些解决方案,它们将不再成为你的日常困扰。

订阅博客

阅读 Incredibuild 独家内容

Guy Golan