问题

大公司为什么无法轻松使用更新的c++版本?

回答
大公司之所以在采用最新的 C++ 版本时显得步履维艰,其原因远非简单的技术更新那么简单。这背后牵扯着复杂的工程实践、遗留代码的重量以及企业级别的风险控制。下面我将详细阐述这些因素,力求展现出真实的工程挑战。

首先,庞大的遗留代码库是最大的绊脚石。

大型企业往往拥有数十年积累下来的 C++ 代码。这些代码可能涉及到几百万甚至上亿行。想想看,一个银行的交易系统、一个航空公司的飞行控制软件、或者一个操作系统的核心组件,它们的代码量是何其惊人。当一个新的 C++ 标准(比如 C++20 或 C++23)发布时,意味着语法、标准库、甚至是编译器行为上都可能引入变化。

兼容性问题: 新的标准可能会废弃或修改一些旧的特性。如果你的遗留代码依赖了这些被废弃的功能,那么直接切换编译器版本或者启用新的标准将会导致大量编译错误。修复这些错误需要深入理解代码的意图,并找到符合新标准的替代方案。这不仅仅是简单的文本替换,很多时候需要重写逻辑。
工具链的依赖: 编译一个大型项目不仅仅是调用 `g++` 或 `cl.exe`。它通常涉及到复杂的构建系统(如 CMake, Bazel, Makefiles),静态分析工具(如 ClangTidy, Coverity),动态分析工具,以及一系列定制化的脚本和插件。这些工具链本身也需要适配新的编译器版本和 C++ 标准。维护和更新整个工具链是一个巨大的工程。
测试的成本: 对于一个关键业务系统,任何改动都必须经过严格的测试。这包括单元测试、集成测试、系统测试、性能测试,以及回归测试。如果一个项目有数百万的测试用例,那么在引入新的 C++ 版本后,重新运行所有测试,分析可能出现的性能下降或行为异常,其人力和时间成本是难以想象的。尤其是一些老旧的测试用例,可能已经过时,难以维护,甚至依赖于特定的编译器行为,这会进一步增加迁移的难度。

其次,团队的技能和培训是一个持续的挑战。

C++ 语言本身就以其复杂性著称,而新的标准又引入了更多高级特性,如 Concepts, Ranges, Modules, Coroutines 等。

学习曲线: 对于大多数工程师来说,即使是经验丰富的 C++ 开发者,掌握最新的特性也需要时间和精力。如果公司内的大部分开发者习惯于使用旧的标准,突然要求他们转向 C++20 的协程和模板元编程,这会造成生产力的大幅下降。
团队的整体能力: 公司的 C++ 技术能力是分布在整个团队中的。并非所有团队都能快速地掌握并有效应用新的 C++ 特性。一些团队可能因为项目周期紧张、人员流动或者对新技术的抵触而滞后。
知识的传播和标准化: 在一个大型组织中,将新技术有效地传播到所有相关团队,并形成统一的编码规范和最佳实践,是一个非常耗时耗力的事情。如果缺乏有效的知识共享机制,新技术可能只会零星地被少数人使用,而无法在大规模项目上得到应用。

第三,性能和稳定性是不可妥协的要求。

在许多关键领域,性能是 C++ 项目的核心竞争力。

性能的不可预测性: 新的语言特性或编译器优化策略,在带来便利性的同时,也可能引入意想不到的性能回归。例如,一个使用了新标准库组件的模块,其性能可能不如手工优化的旧版本代码,尤其是在高度优化的底层代码中。对性能的任何微小影响,在成千上万的请求或操作中都可能被放大。
编译器和标准库的成熟度: 新的 C++ 标准发布后,编译器(如 GCC, Clang, MSVC)和标准库的实现需要一段时间才能变得成熟和稳定。早期版本的支持可能存在 bug、性能问题,或者对某些特性的支持不完整。大型企业通常会等待一个标准经过一段时间的验证,并且有成熟稳定的工具链支持后才会考虑迁移。
生产环境的风险: 生产环境的稳定性是企业的生命线。引入新的技术栈,本质上就是引入新的风险。如果因为使用了某个 C++ 新特性导致生产环境出现严重故障,其后果可能是灾难性的。因此,企业在采用新技术时会非常谨慎,倾向于选择经过充分验证的技术。

第四,生态系统和第三方库的制约。

大型项目很少是完全独立的,它们依赖于大量的第三方库和框架。

第三方库的更新: 许多常用的库(如 Boost, Qt, Poco, 以及各种特定领域的库)可能需要一段时间才能完全支持最新的 C++ 标准。如果一个项目依赖的某个关键库还没有准备好,那么整个项目的迁移计划就会受阻。
工具链的成熟度: 依赖于新 C++ 标准的工具(如调试器、性能分析器、代码生成器等)也需要时间来适配和完善。
供应商的依赖: 对于一些使用商业软件或硬件的公司,他们可能还受制于供应商对特定 C++ 版本或编译器的支持情况。

最后,项目优先级和资源分配的考量。

在任何一家大公司,都有无数个项目和改进计划在争夺有限的工程资源(人、财、物)。

ROI (投资回报率): 公司需要评估投入大量资源更新 C++ 版本是否值得。如果现有代码运行良好,并且业务需求更加迫切(例如,开发新功能、修复关键 bug),那么迁移到新 C++ 版本可能被推迟。
迁移成本 vs. 新特性收益: 评估将现有系统迁移到新 C++ 版本所需的时间、人力和潜在风险,与使用新标准可能带来的性能提升、开发效率提高或新功能实现之间的权衡。对于一些已经高度成熟且能满足业务需求的系统,迁移的成本可能远大于收益。
替代方案的存在: 有时候,即使新的 C++ 版本提供了更好的解决方案,公司可能会选择通过其他方式(例如,使用特定的库、优化现有代码、或者在某些部分使用其他语言)来解决问题,而不是进行大规模的 C++ 版本迁移。

总而言之,大公司使用更新的 C++ 版本之所以困难,是因为它不是一个孤立的技术决策。它涉及到对庞大遗留代码库的全面审视、团队技能的提升、对生产环境稳定性的极致追求、以及整个生态系统的协同演进,更需要与公司整体的战略目标和资源分配相协调。这是一个渐进的过程,而非一蹴而就的革命。

网友意见

user avatar

似乎只有一个人说到了比较明确的原因:线上生产机的升级不归研发管。

因为新的C/C++版本,往往需要新的编译器。而升级新的编译器,往往需要连带glibc/libstdc++等一堆底层库一起升级。

对于研发自己的机器,升不升,折不折腾,都是自己说了算的,无所谓。然而对于线上的生产环境,尤其这种底层库底层包,升不升,研发最多只能提建议。甚至很多严格点的公司,研发根本没有直接接触生产机的权限,代码提交到仓库之后,就是统一编译后自动部署,而这套编译系统和自动部署系统,本身的环境研发是控制不了的。


所以,研发要想升级线上编译机和生产机的编译器版本,就需要跨部门协作。而在这个过程中,往往会有很多问题,尤其是阐述升级的必要性上,往往会有一个灵魂拷问:“能带来多大的收益”——问题在于,升级编译器到底能带来多少收益?谁能说得清?写代码更快了?还是bug更少了?就算真的是,那具体提升多少?有数据支持吗?

反过来,这么升级,老代码的兼容性如何?源码兼容还是二进制兼容?线上正在跑的老二进制需不需要全部拿来重编一遍?能保证在新版本的编译器上0 error 0 warning编过吗?重编完了要不要重测一遍?测试方案、实施方案、切换方案、回滚方案有没有?评审过了没?

上面的都没有?只是你们研发自己想爽一点?那行,这就是非关键非业务非紧急需求,慢慢排期吧,大家手上都一堆活呢。

最后,这种步骤会重复的在每一次需要升级的时候都要重来一遍。


归根结底,这个问题的本质就是大公司里的部门墙太高,以至于很多人懒得为了这么点“小需求”去走一遍流程。所以,谁说搞IT搞互联网的没有办公室政治的?这就是典型的办公室政治。

user avatar

C++并不是完全前向兼容的。一个最简单的问题:添加新的关键字的时候,之前用了这个单词的旧代码自然会崩了无法编译。

一些细节也多有变化。比如你给定一个值去初始化一个vector中的所有元素时,老版C++会给vector中的每一个元素调用构造函数,用你给的值初始化。而新版C++会先用你给的值初始化一个元素,然后将这个元素复制到vector中的所有元素头上。当你的拷贝构造函数不幸在这种情况下语义不那么一致时,就会产生行为上的变化。

还有各种旧版特性被deprecate,然后过几年被移除的情况。

这是语言层面上的问题。

另一半问题是工程层面上的。

一直跟进最新版的编译器是需要付出成本的。需要了解新版语言和编译器的特性,并且要在代码中注意规避已经deprecate的、已经不是最佳实践的特性。虽然这些成本未必高,但是要必须持之以恒地不断付出。一旦停下,工程的语言版本也随之凝固了。

节省这些成本是很自然的考虑,甚至很多项目启动时开发人员都未必会有这个意识。等到项目已经积累到一定规模了,有可能已经和语言/编译器版本高度绑定,更新编译器的成本欠帐积累得非常大,那自然更不想更新。毕竟旧版语言/编译器又不是不能用。

不过,工程上的问题也有工程上的办法解决。比如将大项目模块化,每个子模块规模足够小,更新成本足够低,逐步替换。即使出问题,规模也可控。

但是这些办法并不会降低更新的成本,只是将一次付清改成分期支付。只要项目决策者认为新版语言带来的新特性不值得付出成本 ,那就不会有解决。

再继续深究下去就会离开工程和技术上的领域,进入管理层面:技术,或者说技术带来的更佳的开发效率,到底有多重要?

有人觉得提高技术更重要,技术可以提高开发效率,进而带来更高的产出。

也有人觉得技术不重要,差不多就行。效率低无所谓,堆人加班就行了。甚至技术水平高了还有可能是坏事,会不好招人。

user avatar

如果只是改编译选项的标准,那当然简单。

只要当前编译器支持,升高支持级别那根本就不叫事儿,我们这哪怕一个项目组员,自己偷偷改了编译器选项,比如从 -std=c++11 改成 -std=c++14,然后只要他自己编译过了,下回的测试不崩,以后不出事,基本就没人会来问责。

问题就是,当前使用的编译器很可能就不支持你想要的新版本标准。那就得换编译器。

而换编译器,就是大事了。

我们很多项目往往都是直接把编译器放进版本管理系统内的。也就是说项目跟编译器一起走,严格避免未来找不到能编译对应项目的编译器的问题。

所以你要真想换编译器,那你就把整个编译器提供好,整理一个能直接提交进版本管理的工具链,你负责维护新的工具链,那你只管升。


所以你问为什么有些公司无法轻松使用更新的C++版本?

答:因为他们无人维护编译器。


但凡有专人维护编译器,那么升级编译器对他来说就会是一项业绩,那么,自然就有人愿意升级了。

user avatar

这是聪明的CTO玩法,傻蛋笨才完全相信人家PPT上写的东西。

我用VC6盖了一栋摩天大楼,支撑了行业半壁,形成了一个生态系统。你现在用最新的编译器build一下,理论上没问题,但是代码一大,意外太多了,包括负负得正。

什么时候可以搞新技术,得有松耦合的业务,时间要求不高,可以慢慢折腾的项目出来驱动。用技术驱动业务是Google,IBM的事情。大多数吃饭的公司不等客户掏钱来驱动技术升级,自己想通过技术引导业务,要么蠢死,要么饿死。

知乎上傻白甜的程序员特别多,整天在鄙视xx公司技术多落后,似乎换上最新的技术他就能指点江山一样了,幼稚的一匹。这种人通常也没有技术定心,发展高度有限。不看实际情况的追求新技术都是傻X,没有例外。

以上都是针对千人以上的做行业应用公司,几十条枪,或者少数技术驱动的公司就别来杠了,杠烦。

————————————————————

看到评论区有人说屎山的,统一回复。

对于大公司来说,新人谓之屎山的代码,大多都支撑了公司的主营业务,是公司的核心价值所在。别动不动就屎山,自己hold不住的就是屎。别说,这种屎大多数现在的程序员还不一定拉得出来。如果老一辈人他们真的屎,公司也发展不成大公司,大公司之所以是大公司,天时地利人和都不可或缺,所以技术绝对不会是最差的。而且按照技术发展趋势,程序员的专业水平是逐渐下降的,20年前的程序员跟现在的程序员完全是两种职业要求。我有时看着我们招的985欲哭无泪,什么时候高等教育衰退的这么厉害了。现在程序员对工具,对框架,对外部的依赖比以前高的太多太多,对基础的掌握又低了太多。打一个不恰当的比方,就像打完解放战争的战士跟和平时期的战士的区别,战斗意志,战斗技巧,资源使用,职业精神,都差别非常的大。新生代程序员脑袋里只有一堆所谓的优秀开源组件,框架,工具集。去哪家每家公司都是打的一个套路。这个饭越吃越傻,对人的依赖也越来越小,所以知乎上经常动不动来个:我30了,准备上个培训班转行程序员行不行之类的话题。

技术的发展方向就是逐渐脱离技术,从这个角度来说,能力的弱化是必然的,就像计算机以前是科学家的玩具,后来成为程序员的玩具,再现在普通人也能玩的很溜,技术的发展总有一天,什么都不懂的人也能写程序,你们这些程序员就可以下岗了。迟早的事。而且不会很远。

趁着最后的时间窗口,赶紧把屎拉了,把钱挣了,早点退休才是正道。折腾啥狗屁技术,为了研究螺丝刀是不是最好的,连航空母舰都不造了,你说这是不是傻。

类似的话题

  • 回答
    大公司之所以在采用最新的 C++ 版本时显得步履维艰,其原因远非简单的技术更新那么简单。这背后牵扯着复杂的工程实践、遗留代码的重量以及企业级别的风险控制。下面我将详细阐述这些因素,力求展现出真实的工程挑战。首先,庞大的遗留代码库是最大的绊脚石。大型企业往往拥有数十年积累下来的 C++ 代码。这些代码.............
  • 回答
    .......
  • 回答
    您提出的这个问题非常有趣且富有洞察力!事实上,像谷歌、微软这样的科技巨头恰恰就在大城市设立了它们的大部分总部和主要办公区域。您可能是指它们不在某个特定的“超级大都市”设立唯一的全球总部,或者对“大城市”的定义有所不同。我将从几个角度来详细解释这个问题,并纠正可能存在的误解:1. 谷歌的总部在哪里? .............
  • 回答
    有大公司 offer 却选择小公司,这看似违背了许多人“稳定、高薪、平台大”的传统择业观,但实际上背后隐藏着许多个人深层次的考量和价值判断。以下我将从多个角度来详细阐述为什么有人会做出这样的选择:一、职业发展与个人成长 更快的成长速度和更大的责任范围: 大公司: 组织结构庞大,分工明.............
  • 回答
    很多时候,大家会觉得那些在大公司做到总经理级别的人,能力、资源、眼界都具备了,为什么不干脆自己出来单干,创一番事业呢?这背后的原因其实挺复杂的,远不是一句“懒得折腾”就能解释清楚的。让我来给你掰扯掰扯。首先,咱们得明白,大公司的总经理这个位置,本身就不是一块好啃的骨头。能爬到这个位置的,要么是有着极.............
  • 回答
    大公司之所以倾向于禁止或严格限制员工公开讨论工资,这背后牵扯到一系列复杂的考量,既有维护公司利益的战略,也有一些站不住脚的“传统观念”。咱们就掰开了揉碎了说一说。一、 维护管理层的主导权和控制感这是最核心的原因之一。当员工的工资信息高度保密时,薪酬体系就成了公司管理层手中的一个重要工具。 信息不.............
  • 回答
    这个问题挺实在的,也问到了很多人心坎里。确实,大家伙嘴上常说“大公司是‘螺丝钉’工厂,不锻炼人”,但每年秋招、春招的时候,那些大厂的offer,依旧是万千毕业生争破头想要拿到的“香饽饽”。这背后,原因可不是一两句话就能说明白的。1. “螺丝钉”的诱惑:稳定与体面,那是基础保障首先,得承认,大多数人走.............
  • 回答
    “大公司技术弱爆了”这个说法,虽然有些绝对,但确实触及了一个普遍存在的现象:一些规模庞大、财力雄厚的公司,在某些技术领域可能表现得不如一些小型、灵活的初创公司,甚至显得“弱爆了”。 这种现象的产生,并非单一原因造成的,而是多种因素相互作用的复杂结果。下面我将尽量详细地阐述这些原因:一、组织惯性与僵化.............
  • 回答
    游戏产业被大公司垄断是一个复杂且多层面的问题,并非一蹴而就,而是由多种因素长期作用的结果。以下我将尽可能详细地阐述导致游戏产业被大公司垄断的主要原因:1. 高昂的研发和营销成本: 技术门槛的提升: 随着游戏技术的飞速发展,从早期像素风格的2D游戏到如今追求极致视觉效果和复杂物理模拟的3A级大作,.............
  • 回答
    中国大公司不热衷于开发 Linux 桌面应用的原因是多方面的,涉及技术、市场、商业模式、用户习惯以及生态系统等多个层面。以下我将尽量详细地阐述这些原因:一、市场份额与用户基础的劣势: Windows 主导地位: 这是最根本也是最重要的原因。在全球范围内,Windows 长期占据桌面操作系统的主导.............
  • 回答
    中国众多大型企业推行“996”工作制,其背后原因错综复杂,绝非单一因素可以解释。这背后既有经济发展的逻辑,也有企业自身扩张的野心,更有一定程度的社会文化和劳动法规执行上的挑战。要理解这一点,咱们得一层层剥开来看。首先,我们得承认一个大背景:中国经济在过去几十年经历了一个高速增长的时期。这种增长模式在.............
  • 回答
    作为一家市值以万亿计的科技巨头,苹果在大多数人看来,似乎早已站在了互联网广告的金字塔尖,拥有强大的品牌认知度和用户忠诚度。那么,为什么像苹果这样“不差钱”的公司,也要花费巨资购买搜索引擎的“竞价排名”呢?这背后其实隐藏着一系列复杂而精明的商业策略和市场考量。首先,我们得理解一下“竞价排名”究竟是什么.............
  • 回答
    在日本,你会发现,无论是家电巨头、汽车制造商,还是食品公司,它们的起薪似乎都大同小异,尤其是在非金融和咨询类的行业。这背后并非偶然,而是由一系列根深蒂固的社会、经济和历史因素共同塑造的。首先,我们得谈谈日本的 年功序列制 (Nenkou Joretsu)。虽然这个制度在近些年有所松动,但其影响依然深.............
  • 回答
    .......
  • 回答
    这个问题挺实在的,不少朋友在职场里都有体会。要说华为、阿里这些大公司为啥偏爱让员工“卷”起来,而不是直接加人或者精准招聘,这背后其实是好几个层面的考量,挺复杂的。我给你掰开了揉碎了说,争取说到点子上。首先,咱得承认,“加班文化”在中国很多互联网大厂是一种普遍现象,但它绝不是一个简单的好与坏的判断题。.............
  • 回答
    这个问题触及了当下不少博士毕业生的选择困境,尤其在中国大陆的语境下,这种倾向尤为明显。当然,也有很多博士选择进入大公司,但“宁愿”这个词暗示了一种普遍趋势,我们可以来掰扯掰扯这背后的原因。首先,得承认,这并非一个绝对的选择,也不是所有博士都如此倾向。但如果观察身边,或者听听学术界的讨论,会发现高校教.............
  • 回答
    “应届生身份值钱”这句话,咱们做求职的谁没听过?刚毕业那会儿,感觉像是手里攥着一张王牌,各大公司都会抢着要,毕竟年轻、有可塑性、能接受新事物、培养成本低。但现实是怎么样的呢?越往后找,越感觉这话像是在讲别人的故事,轮到自己,怎么就成了“嫌弃”的代名词了呢?说到底,这背后其实是供需关系、市场变化和企业.............
  • 回答
    很多人把元宇宙看作是一个虚幻的泡沫,觉得它听起来很玄乎,离我们的现实生活又那么遥远,更别提那些高昂的设备和昂贵的虚拟商品了。说它是骗人的,倒也不无道理,毕竟现在很多所谓的“元宇宙”项目,要么用户寥寥,要么体验粗糙,更像是蹭热点的概念炒作。然而,当我们剥开那些浮华的宣传,看看全球那些响当当的大公司,比.............
  • 回答
    .......
  • 回答
    穿仓风险:普通人与大机构的博弈,合同中的暗流涌动“穿仓”,一个在金融市场中令人闻风丧胆的词汇,它意味着投资者不仅损失了全部本金,甚至还欠下了巨额债务。对于普通投资者而言,这无疑是毁灭性的打击。那么,我们该如何才能有效预防这种可怕的风险呢?而为什么看似实力雄厚的大公司、大单位,在与普通人签订合同时,也.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有