腾讯以及各大厂的 C++ 开发环境是什么样的?
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自|深度学习与计算机视觉
看网上各种 editor、IDE 以及各种工具的比较和撕逼,就 Linux C/C++ 开发来讲,让我们看看一线互联网公司更偏爱哪种?
微信事业群比较特殊,喜欢自己搞一套东西自己用,有些基础设施跟腾讯其他事业群的不太一样。
硬件:
软件:
版本控制:目前基本都迁移到git了,以前是用svn。vim党基本都是直接用git命令,有些vs code的用户会在mac上用图形化的前端。
编译系统:现在是基于bazel搞的一套东西,开发阶段编译代码时使用一条指令将本地代码diff发送到编译机来编译,这样可以共享很多中间文件,速度蛮快的。以前是在本地开发机编译,有些比较大的模块编一次几十分钟,而且编译吃掉太多cpu还会导致vim卡顿……
工具链:用的是GCC那一套,由于后台服务都是微服务,每个小模块都可选使用gcc4或者gcc7构建,最近我写了个小模块用了c++17,就是用gcc7编译上线的。希望哪天可以支持clang,我比较喜欢clang的编译报错信息……
微信后台开发的一天(理想情况Orz):
掀开mac 打开outlook把收件箱的红点全点掉 切到item2,这时mosh已经自动重连到了开发机,tmux的一堆窗口已经在等着你了 vim...patchbuild...vim...patchbuild...git 期间夹杂吃饭、午休、散步、带薪拉屎 mac切到chrome,打开微信变更系统,提单、编译、同步到测试机、灰度上线一气呵成 盖上mac,下班回家
其他一些碎碎念:
在微信写业务非常傻瓜化,微信的微服务框架svrkit准备了一堆配套工具来生成代码,新起一个服务就是写一个protobuf文件,里面定义好接口,然后用这个文件生成整个服务的框架代码,再把业务逻辑填进去就好了。微信的C++基础库里面大到消息队列,小到string的trim都有提供,写普通的业务代码需要什么功能基本都可以找到,完全就是堆积木,对普通的业务部门来说,面试造火箭入职拧螺丝一点都不夸张。
微信的开发最讨厌的事情有两个:一个是别人写的代码没有注释,另一个是自己写代码还要写注释。这造成了很多工具、功能、逻辑的细节都是口口相传,或者沉没在浩如烟海的km文章、邮件里。没事去看看别人的代码总会有惊喜……有时是惊吓。当然这一点最近也在慢慢改变,基础能力相关的组件开始开辟一些wiki、git issue之类的进行系统的介绍了。
https://www.zhihu.com/question/265829202/answer/1081134174
https://www.zhihu.com/question/265829202/answer/1102971774
版本控制:收费的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多,一个是从头折腾一遍代价太大,目前没有足够的动力。
写代码用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
代码编辑工具: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定位比较类似的东西吧。
其他经历
代码也是SSH+Vim+跳板机组合,当年也没有远程的VSCode这类工具可用。
虽说作为实习员工不接触核心模块,但翻看过组内代码,没有风格规范(tab空格混搭...),没有CR,没有CI,有些组件要口口相传才知道怎么跑起来。实话说,技术建设没达到我想想的水平吧,也有些好的地方,比如C++11到位了(但2018年的时候有C++11用,好像在鹅厂还是走在靠前了...),有blade编译(基本就是bazel),有一套挺好用到傻瓜的上线系统(一直点下一步就上完了,跟安装游戏一样...)。另外我在时还是SVN,貌似最近才迁的Git。
但反过来想,技术建设上可做的东西那么多,服务还是那么高的性能和可用性,也许是另一种程度上的叼炸天呢...?
碎碎念
我个人来讲,倾向一种“掌握最基础的工具走遍天下”的思想,比如vim和screen,不论到何种条件下,只要不是CoreOS那种极端的东西,总会有vim和screen可以用,相比emacs和tmux,即使没有任何自己习惯的配置文件,也能达到过得去的效率,从而可以尽快投入到自己要做的事情上。
https://www.zhihu.com/question/265829202/answer/1081368688
也有部分人重度使用VIM,直接ssh到linux机器上写代码,配置几个插件效率也是很高的,而且据观察,这些人中高手较多。VIM写代码的人有个特点,脑子里记录了很多关键函数、符号、文件等,跳转非常快,配合cscope和grep和正则搜索老的代码库,学习成本相对高点。
相比VIM,Emacs用的倒是很少。
公司也买了很多JetBrains的全套License,如果编译是标准CMake工程,而且也不是那么巨量,CLion配置好+MinGW,写代码效率会大增。不过有些强依赖Linux编译,而华为也没有给员工配置桌面Ubuntu等系统,这种还是最终同步代码到Linux编译机上去编译,或者直接push到远端,用CI编译。
2. 版本管理
3. 编译脚本
https://www.zhihu.com/question/265829202/answer/1086040231
一开始腼腆不知道问老人,就自己搜搜内部的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了。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~