似乎只有一个人说到了比较明确的原因:线上生产机的升级不归研发管。
因为新的C/C++版本,往往需要新的编译器。而升级新的编译器,往往需要连带glibc/libstdc++等一堆底层库一起升级。
对于研发自己的机器,升不升,折不折腾,都是自己说了算的,无所谓。然而对于线上的生产环境,尤其这种底层库底层包,升不升,研发最多只能提建议。甚至很多严格点的公司,研发根本没有直接接触生产机的权限,代码提交到仓库之后,就是统一编译后自动部署,而这套编译系统和自动部署系统,本身的环境研发是控制不了的。
所以,研发要想升级线上编译机和生产机的编译器版本,就需要跨部门协作。而在这个过程中,往往会有很多问题,尤其是阐述升级的必要性上,往往会有一个灵魂拷问:“能带来多大的收益”——问题在于,升级编译器到底能带来多少收益?谁能说得清?写代码更快了?还是bug更少了?就算真的是,那具体提升多少?有数据支持吗?
反过来,这么升级,老代码的兼容性如何?源码兼容还是二进制兼容?线上正在跑的老二进制需不需要全部拿来重编一遍?能保证在新版本的编译器上0 error 0 warning编过吗?重编完了要不要重测一遍?测试方案、实施方案、切换方案、回滚方案有没有?评审过了没?
上面的都没有?只是你们研发自己想爽一点?那行,这就是非关键非业务非紧急需求,慢慢排期吧,大家手上都一堆活呢。
最后,这种步骤会重复的在每一次需要升级的时候都要重来一遍。
归根结底,这个问题的本质就是大公司里的部门墙太高,以至于很多人懒得为了这么点“小需求”去走一遍流程。所以,谁说搞IT搞互联网的没有办公室政治的?这就是典型的办公室政治。
C++并不是完全前向兼容的。一个最简单的问题:添加新的关键字的时候,之前用了这个单词的旧代码自然会崩了无法编译。
一些细节也多有变化。比如你给定一个值去初始化一个vector中的所有元素时,老版C++会给vector中的每一个元素调用构造函数,用你给的值初始化。而新版C++会先用你给的值初始化一个元素,然后将这个元素复制到vector中的所有元素头上。当你的拷贝构造函数不幸在这种情况下语义不那么一致时,就会产生行为上的变化。
还有各种旧版特性被deprecate,然后过几年被移除的情况。
这是语言层面上的问题。
另一半问题是工程层面上的。
一直跟进最新版的编译器是需要付出成本的。需要了解新版语言和编译器的特性,并且要在代码中注意规避已经deprecate的、已经不是最佳实践的特性。虽然这些成本未必高,但是要必须持之以恒地不断付出。一旦停下,工程的语言版本也随之凝固了。
节省这些成本是很自然的考虑,甚至很多项目启动时开发人员都未必会有这个意识。等到项目已经积累到一定规模了,有可能已经和语言/编译器版本高度绑定,更新编译器的成本欠帐积累得非常大,那自然更不想更新。毕竟旧版语言/编译器又不是不能用。
不过,工程上的问题也有工程上的办法解决。比如将大项目模块化,每个子模块规模足够小,更新成本足够低,逐步替换。即使出问题,规模也可控。
但是这些办法并不会降低更新的成本,只是将一次付清改成分期支付。只要项目决策者认为新版语言带来的新特性不值得付出成本 ,那就不会有解决。
再继续深究下去就会离开工程和技术上的领域,进入管理层面:技术,或者说技术带来的更佳的开发效率,到底有多重要?
有人觉得提高技术更重要,技术可以提高开发效率,进而带来更高的产出。
也有人觉得技术不重要,差不多就行。效率低无所谓,堆人加班就行了。甚至技术水平高了还有可能是坏事,会不好招人。
如果只是改编译选项的标准,那当然简单。
只要当前编译器支持,升高支持级别那根本就不叫事儿,我们这哪怕一个项目组员,自己偷偷改了编译器选项,比如从 -std=c++11 改成 -std=c++14,然后只要他自己编译过了,下回的测试不崩,以后不出事,基本就没人会来问责。
问题就是,当前使用的编译器很可能就不支持你想要的新版本标准。那就得换编译器。
而换编译器,就是大事了。
我们很多项目往往都是直接把编译器放进版本管理系统内的。也就是说项目跟编译器一起走,严格避免未来找不到能编译对应项目的编译器的问题。
所以你要真想换编译器,那你就把整个编译器提供好,整理一个能直接提交进版本管理的工具链,你负责维护新的工具链,那你只管升。
所以你问为什么有些公司无法轻松使用更新的C++版本?
答:因为他们无人维护编译器。
但凡有专人维护编译器,那么升级编译器对他来说就会是一项业绩,那么,自然就有人愿意升级了。
这是聪明的CTO玩法,傻蛋笨才完全相信人家PPT上写的东西。
我用VC6盖了一栋摩天大楼,支撑了行业半壁,形成了一个生态系统。你现在用最新的编译器build一下,理论上没问题,但是代码一大,意外太多了,包括负负得正。
什么时候可以搞新技术,得有松耦合的业务,时间要求不高,可以慢慢折腾的项目出来驱动。用技术驱动业务是Google,IBM的事情。大多数吃饭的公司不等客户掏钱来驱动技术升级,自己想通过技术引导业务,要么蠢死,要么饿死。
知乎上傻白甜的程序员特别多,整天在鄙视xx公司技术多落后,似乎换上最新的技术他就能指点江山一样了,幼稚的一匹。这种人通常也没有技术定心,发展高度有限。不看实际情况的追求新技术都是傻X,没有例外。
以上都是针对千人以上的做行业应用公司,几十条枪,或者少数技术驱动的公司就别来杠了,杠烦。
————————————————————
看到评论区有人说屎山的,统一回复。
对于大公司来说,新人谓之屎山的代码,大多都支撑了公司的主营业务,是公司的核心价值所在。别动不动就屎山,自己hold不住的就是屎。别说,这种屎大多数现在的程序员还不一定拉得出来。如果老一辈人他们真的屎,公司也发展不成大公司,大公司之所以是大公司,天时地利人和都不可或缺,所以技术绝对不会是最差的。而且按照技术发展趋势,程序员的专业水平是逐渐下降的,20年前的程序员跟现在的程序员完全是两种职业要求。我有时看着我们招的985欲哭无泪,什么时候高等教育衰退的这么厉害了。现在程序员对工具,对框架,对外部的依赖比以前高的太多太多,对基础的掌握又低了太多。打一个不恰当的比方,就像打完解放战争的战士跟和平时期的战士的区别,战斗意志,战斗技巧,资源使用,职业精神,都差别非常的大。新生代程序员脑袋里只有一堆所谓的优秀开源组件,框架,工具集。去哪家每家公司都是打的一个套路。这个饭越吃越傻,对人的依赖也越来越小,所以知乎上经常动不动来个:我30了,准备上个培训班转行程序员行不行之类的话题。
技术的发展方向就是逐渐脱离技术,从这个角度来说,能力的弱化是必然的,就像计算机以前是科学家的玩具,后来成为程序员的玩具,再现在普通人也能玩的很溜,技术的发展总有一天,什么都不懂的人也能写程序,你们这些程序员就可以下岗了。迟早的事。而且不会很远。
趁着最后的时间窗口,赶紧把屎拉了,把钱挣了,早点退休才是正道。折腾啥狗屁技术,为了研究螺丝刀是不是最好的,连航空母舰都不造了,你说这是不是傻。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有