腾讯以及各大厂的 C++ 开发环境是什么样的?

来源:https://www.zhihu.com/question/265829202/answer/1082349561

编辑:深度学习与计算机视觉

声明:仅做学术分享,侵删

看网上各种 editor、IDE 以及各种工具的比较和撕逼,就 Linux C/C++ 开发来讲,让我们看看一线互联网公司更偏爱哪种?

作者:知乎用户

https://www.zhihu.com/question/265829202/answer/1081457634

简单介绍下腾讯微信事业群后台开发环境。

微信事业群比较特殊,喜欢自己搞一套东西自己用,有些基础设施跟腾讯其他事业群的不太一样。

硬件:

现在通常是macbook pro + 远程Linux主机。远程主机方面当前已经舍弃了以前集体户式的开发机,每人拥有一台相对独立的云主机,我的配置是8核Xeon Gold + 16GB + 500GB,考虑到这台机绝大多数时间只是跑个编辑器,性能还是挺富余的。

软件:

代码编辑:老员工通常是vim,基本没见过emacs。新员工很多开始用vs code了。我身边绝大部分人是用vim的,大家有时会互相分享一些自己使用的插件,但是每个人的配置都大不一样。编辑器是网上程序员撕逼大战的主战场之一,但是现实中同事之间倒也没有因为编辑器争执过,大家还是很文明的,新人刚来的时候我们这些老vim用户也会安利他们学一下vim,但人家最终选择了vs code我们也没说啥不是。

版本控制:目前基本都迁移到git了,以前是用svn。vim党基本都是直接用git命令,有些vs code的用户会在mac上用图形化的前端。

编译系统:现在是基于bazel搞的一套东西,开发阶段编译代码时使用一条指令将本地代码diff发送到编译机来编译,这样可以共享很多中间文件,速度蛮快的。以前是在本地开发机编译,有些比较大的模块编一次几十分钟,而且编译吃掉太多cpu还会导致vim卡顿……

工具链:用的是GCC那一套,由于后台服务都是微服务,每个小模块都可选使用gcc4或者gcc7构建,最近我写了个小模块用了c++17,就是用gcc7编译上线的。希望哪天可以支持clang,我比较喜欢clang的编译报错信息……

微信后台开发的一天(理想情况Orz):

  1. 掀开mac

  2. 打开outlook把收件箱的红点全点掉

  3. 切到item2,这时mosh已经自动重连到了开发机,tmux的一堆窗口已经在等着你了

  4. vim...patchbuild...vim...patchbuild...git

  5. 期间夹杂吃饭、午休、散步、带薪拉屎

  6. mac切到chrome,打开微信变更系统,提单、编译、同步到测试机、灰度上线一气呵成

  7. 盖上mac,下班回家

其他一些碎碎念:

微信的后台开发环境一直有很多槽点,但也一直在改进,每年都能看到一些进步。现在还没解决的比较影响开发效率的应该就是代码的语义分析工具了。目前大家写代码的环境都是没有精确的跳转和补齐能力的,考虑到大家的环境很不统一,估计也没什么动力统一去搞。由于微信的后台代码量非常非常大,如果暴力把所有代码都加到一个工程里,ycm之类的东西根本跑不动,按一下tab卡5分钟还不一定能缓过来(gdb的时候也是不怎么敢按tab的)。后台C++项目都是基于bazel的BUILD文件管理依赖,总体上来说比较粗放,基本上每个新人刚来的时候都会折腾一下这个东西,试图搞定基于BUILD的补全方案,但最后性能和准确性上很难满足日常使用的需求。目前我的解决方案是用universal-ctags定期给常用目录下的文件生成tags,写代码的时候凭经验去跳。

在微信写业务非常傻瓜化,微信的微服务框架svrkit准备了一堆配套工具来生成代码,新起一个服务就是写一个protobuf文件,里面定义好接口,然后用这个文件生成整个服务的框架代码,再把业务逻辑填进去就好了。微信的C++基础库里面大到消息队列,小到string的trim都有提供,写普通的业务代码需要什么功能基本都可以找到,完全就是堆积木,对普通的业务部门来说,面试造火箭入职拧螺丝一点都不夸张。

微信的开发最讨厌的事情有两个:一个是别人写的代码没有注释,另一个是自己写代码还要写注释。这造成了很多工具、功能、逻辑的细节都是口口相传,或者沉没在浩如烟海的km文章、邮件里。没事去看看别人的代码总会有惊喜……有时是惊吓。当然这一点最近也在慢慢改变,基础能力相关的组件开始开辟一些wiki、git issue之类的进行系统的介绍了。

作者:pansz
https://www.zhihu.com/question/265829202/answer/1081134174

如果说腾讯的话,老项目svn,新项目很多都是git了,通讯环境的话用微信企业版比较多,而项目相关的工作内容有很多会基于网页。开发环境最需要统一的就是版本管理,其它倒是比较自由。

由于C++在腾讯最主要的用途是服务器后端,因此实际上你可以使用任意的编辑器,大厂员工很务实,是很少就这个问题撕逼的。

远古时代(大约十五年前)很多人用SourceInsight3.5,因为它有完美破解版。但是它的致命问题有两个:第一是只支持C语言,C++支持比较糟糕,第二是只支持GBK不支持UTF-8,这个问题在现在来说很致命,都2020年了你几乎不会还允许程序员用GBK写代码,虽然2005年用GBK写代码还挺常见。

SourceInsight4.0改进了这两个支持,能够有限程度支持UTF-8,并且C++支持比前作排版强了半分钱,但售价是天价(四位数以上)。鉴于大厂一般不允许本机装盗版,SI4.0的价格又几乎不可能购买,所以现实中除了可以申请购买SI4的公司,其它公司已经极少有人用它。

自己折腾党有用Vim跟Emacs的很多,当然也有直接用其它IDE的,比如VS,比如Eclipse(嗯,这货确实也可以写C++),比如JB,比如。。。各种选择都可以,服务器后端C++程序员们真的不会对IDE问题过于纠结,自己习惯用哪个就是哪个。

就现在而言,Eclipse原作者的新作品:Visual Studio Code 逐渐成为程序员新宠,它有技术跟历史的必然。虽然它目前还有不少问题,但已经越来越多的人开始使用它。

纠结IDE的项目大都缺乏自己的构建系统,而对于互联网项目来说,CI/CD 机制已经很流行,这意味着C++项目是必须自动构建的,能 CI/CD 也就意味着必须有可以被命令行批处理的构建,进而就脱离了任何指定的IDE。

--

所以你要说开发环境是什么?

那就是:统一的SCM管理,基于Web的问题跟踪及缺陷管理,客户端的项目组成员间通讯,后台服务CI/CD。——至于IDE,可以说并不是开发环境的一部分,只是程序员的个人爱好选择而已。

作者:Xi Yang
https://www.zhihu.com/question/265829202/answer/1102971774

我来厚着脸皮答一个:我们公司并不是大厂,一共只有11个人,主要产品是在Windows、Mac上面的桌面程序和动态库形式的插件(VST、Audio Unit、AAX)。经过几年的迭(zhe)代(teng)之后,目前是这样的局面:

  • 版本控制:收费的PlasticSCM(二进制资源太多,Git LFS糊不上墙)。所有项目、源代码库、二进制库放在一个大repo里,保证编译环境的一致性。

  • 编译控制:使用CMake。每个项目自己都可以单独作为顶层的项目进行生成(而不是整个repo做顶层,那样CMake generate步骤太长了),依赖项目用add_subdirectory(../XXX)引入。二进制库用CMake的add_library(IMPORT)那套设施包装一下。

  • 代码编写:在Windows上用CMake生成VS项目,使用VS编辑。只有我一个人在Linux上用Qt Creator。其它语言的脚本工具(主要是python)现在都用VS Code编辑(其实用啥都行,VS Code主要是好用)。

  • C++基础库:主要使用JUCE自带的(字符串功能还挺全),有时也用用C++标准库。

  • C++版本:使用C++14。更高版本的C++受到我们当前定的Mac SDK版本10.9制约(很多用户用非常老的Mac,没办法)。

  • 编译:各人本地编译。

目前来看,这个结构还算堪用。遗留的问题主要是:

  • CMake对新手难学难写;

  • CMake有分离的generate步骤,有时很麻烦;

  • JUCE的GUI框架非常古旧,大量使用虚函数继承,而不是现在更常见的listener函数。

前些日子想过把CMake换成Bazel。然而Bazel虽然看起来有很多优点,但一个是bug多,一个是从头折腾一遍代价太大,目前没有足够的动力。

作者:TERRY

https://www.zhihu.com/question/265829202/answer/1088614071

谷歌员工比较幸福。c++环境可能是业界最棒。

写代码用cider,就是chrome浏览器。入职会配备一个linux台式机,一个MacBook。大家台式机用的最多,笔记本用来开会。chrome浏览器的好处是使用各种云应用,不需要其它独立软件。office的替代品,Google docs之类的玩意儿,都很方便。

Cider可能是用过的最好的工具,远远好于Facebook的nuclide,动不动会死掉。cider后台,分布式做的非常好,一年遇不到几次无法访问之类的问题。

编译器blaze应该还不错,Facebook的buck就是一伙Google员工跳槽过去做的blaze山寨版,两个东西比较一下还是Google的速度更快点儿。原因不详。

代码review ,Google的critique做的很丑,cl/diff stack支持的很差,这方面Facebook的工具很好。

作者:知乎用户
https://www.zhihu.com/question/265829202/answer/1081446846

回答时间2020.03,坐标百度,应届入职没多久的业务研发菜鸡一枚。

代码编辑工具:SSH+Vim / VSCode Remote(Code-Server)

当前,ssh到开发机,vim编辑还是相对主流的办法,如同回答里另一个前辈所说,ssh下可以使用tmux或screen等辅助工具,实现多term、分屏、下班保存工作现场等。

包括百度在内的很多大厂,ssh连接开发机,都需要经过一个没有任何操作权限的跳板机,这种机制拦住了scp、VSCode Remote等直接使用ssh连接的工具,尽管理解出于安全的考量,实际操作中是会带来少许不便。

所以说啊,什么IDE圣战,根本不是谁的IDE更好用的问题,是面对ssh的黑框框,除了vim、emacs这种东西,根本没得选呀。

不过呢,近一年工程效率的同学,在厂内不断建设VSCode远程版,并和内部系统打通。实话实说,不管什么语言,VSCode真的很香。

代码托管与开发上线流程:Git+自建Git平台+CR+CI

当前开发过程已经感受不到svn的存在,全线进入git时代。代码托管在自建的git平台,有点类似于gitlab吧,只是更迎合厂内需要。

在开发过程中,我见过的重要的在线服务模块,大多是主干开发、分支上线(或者说tag上线),每个特性、修复等(称作story)对应一个commit,一次story不断修改,会使用git commit --amend。重要模块均有强制的Code Review。提交后触发CI流程,自动运行单测、diff、性能测试等。

编译工具:GCC 8.2 + C++11 + 内部云编译系统

翻百度之前的问题,也许看到过“百度GCC被三体人限定在3.4.5”的典故,很明显今天我厂的同学们已经吸取了以往的经验。在2019 Mid之前,主流版本是GCC 4.8,-std=c++11。2019秋季开始推动升级,至今日绝大部分模块都在GCC 8.2下编译,但还没有见到上C++14/17的模块,-std配置啥,由各业务线、模块owner决定,也许是大家都知道没有C++11很难受,C++11到C++14/17香度变化没那么大,大家没什么动力吧...

厂内有一套自己的云编译系统,一行命令,把代码改动push到编译平台,调动编译集群,并把编译产物在pull回来,这套东西不需要自己再解决编译依赖等C++恶心人的地方,编译速度快很多,作为业务研发很少需要和编译工具直接打交道。基本是和bazel定位比较类似的东西吧。

其他经历

只在2018年有一段在腾讯实习的经历。众所周知(?),鹅厂不同bg不同部门技术建设千差万别互不相通,仅供参考吧。

代码也是SSH+Vim+跳板机组合,当年也没有远程的VSCode这类工具可用。

虽说作为实习员工不接触核心模块,但翻看过组内代码,没有风格规范(tab空格混搭...),没有CR,没有CI,有些组件要口口相传才知道怎么跑起来。实话说,技术建设没达到我想想的水平吧,也有些好的地方,比如C++11到位了(但2018年的时候有C++11用,好像在鹅厂还是走在靠前了...),有blade编译(基本就是bazel),有一套挺好用到傻瓜的上线系统(一直点下一步就上完了,跟安装游戏一样...)。另外我在时还是SVN,貌似最近才迁的Git。

但反过来想,技术建设上可做的东西那么多,服务还是那么高的性能和可用性,也许是另一种程度上的叼炸天呢...?

碎碎念

C++领域讨论编辑器、IDE投入太多精力挺亏的,体量大些的服务几乎都不具备拉到本地编写、测试的条件,像是有VSCode用都算是运气好的了。

我个人来讲,倾向一种“掌握最基础的工具走遍天下”的思想,比如vim和screen,不论到何种条件下,只要不是CoreOS那种极端的东西,总会有vim和screen可以用,相比emacs和tmux,即使没有任何自己习惯的配置文件,也能达到过得去的效率,从而可以尽快投入到自己要做的事情上。

作者:知乎用户
https://www.zhihu.com/question/265829202/answer/1081368688

华为,2020年

1.C/C++的IDE

当前华为的C/C++ IDE主要是定制的VS code了。以前大部分都使用Source Insight,由于是美的商业软件,现在不怎么用了,编译基本都需要到Linux上编的,比较常见的一个做法是Samba映射Linux编译机上的代码库到Windows上开发。

也有部分人重度使用VIM,直接ssh到linux机器上写代码,配置几个插件效率也是很高的,而且据观察,这些人中高手较多。VIM写代码的人有个特点,脑子里记录了很多关键函数、符号、文件等,跳转非常快,配合cscope和grep和正则搜索老的代码库,学习成本相对高点。

相比VIM,Emacs用的倒是很少。

公司也买了很多JetBrains的全套License,如果编译是标准CMake工程,而且也不是那么巨量,CLion配置好+MinGW,写代码效率会大增。不过有些强依赖Linux编译,而华为也没有给员工配置桌面Ubuntu等系统,这种还是最终同步代码到Linux编译机上去编译,或者直接push到远端,用CI编译。

2. 版本管理

大多数团队也从SVN切到了Git,华为内网有类似Github一样网站,各个部门基于这个网站搭建各自的CI工程。相比以前的SVN时代,效率提高了不少。

3. 编译脚本

新项目基本都要求用CMake了,有要求做到构建一致性。老的项目也逐渐切换到CMake上。相比老项目巨量的Makefile,CMake还是很赞的,清晰多了。

作者:Kurokawa
https://www.zhihu.com/question/265829202/answer/1086040231

鹅厂不同部门的技术架构千差万别,据说换个部门就像换了公司一样。其中CSIG是原先几个bg合并过来的,所以各自的环境差别也很巨大。

一开始腼腆不知道问老人,就自己搜搜内部的KM,搜到了别的部门的技术方案。等搞明白了才发现组里不用这个,吃了一点点亏。不过我的性子是,如果新工具好的话,应该坚持用新工具,索性我做的项目全新没有历史负担,最后整个业务的环境一直在和原来脱轨了。

旧服务代码一般不敢改,C++版本被三体星人锁死了,印象中还是98。后来新服务我升到C++11,再后来嫌弃C++多线程太麻烦(老框架只有io复用,然后把服务做成异步),我就强推golang写代码飕飕快。老同事用的sublime做编辑器,把linux代码用samba映射出来,补全有延迟,或者干脆用mac。后来我改用VS Code Remote了,直接接到linux容器内做开发,非常轻量且柔顺。

来了之后没多久,鹅厂开始要做开源协同(第一步就是svn迁移到git)。之前在华为,恰好也在搞开源协同,看来是大势所趋。因为在学校就用git,所以对我没啥影响。

后台服务好多年前就搞SaaS了,容器调度+rpc调用,模块化处理之后,模块之间也没有历史负担,语言环境都随意。有个鹅厂自研开源的tars框架,配合内部工蜂git和CI/CD的页面,上线和调度都很傻瓜,鼠标操作。对外API现在也开始采用https+json了。

总而言之,个人感觉现在开发轻便得很,工具环境都算新,有VS Code remote之后,操作系统也没有要求了。网络接入方案和远程办公机制最近也都进步了,现在已经基本上不限制  地理位置/开发办公机器/环境/开发语言  等细节了。之前在华为使用云桌面(无实体机器),办公设备和办公用品不能带出,锁死的java7和win7操作系统,和有限可选择的开发环境。相比在鹅厂确实自由多了。

作者:曾歆勋
https://www.zhihu.com/question/265829202/answer/1081155436

我们组十来个人,用的环境就五花八门了

大神级别:我导师,从来不用IDE,简直是行走的代码库,一个emacs走遍天下

复古流:eclipse党,堪称考古流派,原本有三个人用,其中一个被我策反了

轻量级:vscode,新版本的vscode可以直接连接远程开发机,代码、索引都在远程,编辑在本地,因此本地使用资源极少,非常适合笔记本。在我们组一个同事强力推荐下,很多人转用vscode。

重量级:clion,相比前三种算是高达了,功能强大,傻瓜易用,配置好以后极大提升开发效率。缺点是占用资源极大,我已经加到32G内存了,仍然日常90%+,在我的安利下,也有几个人转用clion了。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文(无广告)。

扫描二维码添加小编↓

你可能感兴趣的:(腾讯以及各大厂的 C++ 开发环境是什么样的?)