騰訊以及各大廠的 C++ 開(kāi)發(fā)環(huán)境是什么樣的?
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
本文轉(zhuǎn)自|深度學(xué)習(xí)與計(jì)算機(jī)視覺(jué)
看網(wǎng)上各種 editor、IDE 以及各種工具的比較和撕逼,就 Linux C/C++ 開(kāi)發(fā)來(lái)講,讓我們看看一線互聯(lián)網(wǎng)公司更偏愛(ài)哪種?
微信事業(yè)群比較特殊,喜歡自己搞一套東西自己用,有些基礎(chǔ)設(shè)施跟騰訊其他事業(yè)群的不太一樣。
硬件:
軟件:
版本控制:目前基本都遷移到git了,以前是用svn。vim黨基本都是直接用git命令,有些vs code的用戶(hù)會(huì)在mac上用圖形化的前端。
編譯系統(tǒng):現(xiàn)在是基于bazel搞的一套東西,開(kāi)發(fā)階段編譯代碼時(shí)使用一條指令將本地代碼diff發(fā)送到編譯機(jī)來(lái)編譯,這樣可以共享很多中間文件,速度蠻快的。以前是在本地開(kāi)發(fā)機(jī)編譯,有些比較大的模塊編一次幾十分鐘,而且編譯吃掉太多cpu還會(huì)導(dǎo)致vim卡頓……
工具鏈:用的是GCC那一套,由于后臺(tái)服務(wù)都是微服務(wù),每個(gè)小模塊都可選使用gcc4或者gcc7構(gòu)建,最近我寫(xiě)了個(gè)小模塊用了c++17,就是用gcc7編譯上線的。希望哪天可以支持clang,我比較喜歡clang的編譯報(bào)錯(cuò)信息……
微信后臺(tái)開(kāi)發(fā)的一天(理想情況Orz):
掀開(kāi)mac 打開(kāi)outlook把收件箱的紅點(diǎn)全點(diǎn)掉 切到item2,這時(shí)mosh已經(jīng)自動(dòng)重連到了開(kāi)發(fā)機(jī),tmux的一堆窗口已經(jīng)在等著你了 vim...patchbuild...vim...patchbuild...git 期間夾雜吃飯、午休、散步、帶薪拉屎 mac切到chrome,打開(kāi)微信變更系統(tǒng),提單、編譯、同步到測(cè)試機(jī)、灰度上線一氣呵成 蓋上mac,下班回家
其他一些碎碎念:
在微信寫(xiě)業(yè)務(wù)非常傻瓜化,微信的微服務(wù)框架svrkit準(zhǔn)備了一堆配套工具來(lái)生成代碼,新起一個(gè)服務(wù)就是寫(xiě)一個(gè)protobuf文件,里面定義好接口,然后用這個(gè)文件生成整個(gè)服務(wù)的框架代碼,再把業(yè)務(wù)邏輯填進(jìn)去就好了。微信的C++基礎(chǔ)庫(kù)里面大到消息隊(duì)列,小到string的trim都有提供,寫(xiě)普通的業(yè)務(wù)代碼需要什么功能基本都可以找到,完全就是堆積木,對(duì)普通的業(yè)務(wù)部門(mén)來(lái)說(shuō),面試造火箭入職擰螺絲一點(diǎn)都不夸張。
微信的開(kāi)發(fā)最討厭的事情有兩個(gè):一個(gè)是別人寫(xiě)的代碼沒(méi)有注釋?zhuān)硪粋€(gè)是自己寫(xiě)代碼還要寫(xiě)注釋。這造成了很多工具、功能、邏輯的細(xì)節(jié)都是口口相傳,或者沉沒(méi)在浩如煙海的km文章、郵件里。沒(méi)事去看看別人的代碼總會(huì)有驚喜……有時(shí)是驚嚇。當(dāng)然這一點(diǎn)最近也在慢慢改變,基礎(chǔ)能力相關(guān)的組件開(kāi)始開(kāi)辟一些wiki、git issue之類(lèi)的進(jìn)行系統(tǒng)的介紹了。
https://www.zhihu.com/question/265829202/answer/1081134174
https://www.zhihu.com/question/265829202/answer/1102971774
版本控制:收費(fèi)的PlasticSCM(二進(jìn)制資源太多,Git LFS糊不上墻)。所有項(xiàng)目、源代碼庫(kù)、二進(jìn)制庫(kù)放在一個(gè)大repo里,保證編譯環(huán)境的一致性。
編譯控制:使用CMake。每個(gè)項(xiàng)目自己都可以單獨(dú)作為頂層的項(xiàng)目進(jìn)行生成(而不是整個(gè)repo做頂層,那樣CMake generate步驟太長(zhǎng)了),依賴(lài)項(xiàng)目用add_subdirectory(../XXX)引入。二進(jìn)制庫(kù)用CMake的add_library(IMPORT)那套設(shè)施包裝一下。
代碼編寫(xiě):在Windows上用CMake生成VS項(xiàng)目,使用VS編輯。只有我一個(gè)人在Linux上用Qt Creator。其它語(yǔ)言的腳本工具(主要是python)現(xiàn)在都用VS Code編輯(其實(shí)用啥都行,VS Code主要是好用)。
C++基礎(chǔ)庫(kù):主要使用JUCE自帶的(字符串功能還挺全),有時(shí)也用用C++標(biāo)準(zhǔn)庫(kù)。
C++版本:使用C++14。更高版本的C++受到我們當(dāng)前定的Mac SDK版本10.9制約(很多用戶(hù)用非常老的Mac,沒(méi)辦法)。
編譯:各人本地編譯。
目前來(lái)看,這個(gè)結(jié)構(gòu)還算堪用。遺留的問(wèn)題主要是:
CMake對(duì)新手難學(xué)難寫(xiě); CMake有分離的generate步驟,有時(shí)很麻煩; JUCE的GUI框架非常古舊,大量使用虛函數(shù)繼承,而不是現(xiàn)在更常見(jiàn)的listener函數(shù)。
前些日子想過(guò)把CMake換成Bazel。然而B(niǎo)azel雖然看起來(lái)有很多優(yōu)點(diǎn),但一個(gè)是bug多,一個(gè)是從頭折騰一遍代價(jià)太大,目前沒(méi)有足夠的動(dòng)力。
寫(xiě)代碼用cider,就是chrome瀏覽器。入職會(huì)配備一個(gè)linux臺(tái)式機(jī),一個(gè)MacBook。大家臺(tái)式機(jī)用的最多,筆記本用來(lái)開(kāi)會(huì)。chrome瀏覽器的好處是使用各種云應(yīng)用,不需要其它獨(dú)立軟件。office的替代品,Google docs之類(lèi)的玩意兒,都很方便。
Cider可能是用過(guò)的最好的工具,遠(yuǎn)遠(yuǎn)好于Facebook的nuclide,動(dòng)不動(dòng)會(huì)死掉。cider后臺(tái),分布式做的非常好,一年遇不到幾次無(wú)法訪問(wèn)之類(lèi)的問(wèn)題。
編譯器blaze應(yīng)該還不錯(cuò),F(xiàn)acebook的buck就是一伙Google員工跳槽過(guò)去做的blaze山寨版,兩個(gè)東西比較一下還是Google的速度更快點(diǎn)兒。原因不詳。
代碼review ,Google的critique做的很丑,cl/diff stack支持的很差,這方面Facebook的工具很好。
https://www.zhihu.com/question/265829202/answer/1081446846
代碼編輯工具:SSH+Vim / VSCode Remote(Code-Server)
當(dāng)前,ssh到開(kāi)發(fā)機(jī),vim編輯還是相對(duì)主流的辦法,如同回答里另一個(gè)前輩所說(shuō),ssh下可以使用tmux或screen等輔助工具,實(shí)現(xiàn)多term、分屏、下班保存工作現(xiàn)場(chǎng)等。
包括百度在內(nèi)的很多大廠,ssh連接開(kāi)發(fā)機(jī),都需要經(jīng)過(guò)一個(gè)沒(méi)有任何操作權(quán)限的跳板機(jī),這種機(jī)制攔住了scp、VSCode Remote等直接使用ssh連接的工具,盡管理解出于安全的考量,實(shí)際操作中是會(huì)帶來(lái)少許不便。
所以說(shuō)啊,什么IDE圣戰(zhàn),根本不是誰(shuí)的IDE更好用的問(wèn)題,是面對(duì)ssh的黑框框,除了vim、emacs這種東西,根本沒(méi)得選呀。
不過(guò)呢,近一年工程效率的同學(xué),在廠內(nèi)不斷建設(shè)VSCode遠(yuǎn)程版,并和內(nèi)部系統(tǒng)打通。實(shí)話實(shí)說(shuō),不管什么語(yǔ)言,VSCode真的很香。
代碼托管與開(kāi)發(fā)上線流程:Git+自建Git平臺(tái)+CR+CI
當(dāng)前開(kāi)發(fā)過(guò)程已經(jīng)感受不到svn的存在,全線進(jìn)入git時(shí)代。代碼托管在自建的git平臺(tái),有點(diǎn)類(lèi)似于gitlab吧,只是更迎合廠內(nèi)需要。
在開(kāi)發(fā)過(guò)程中,我見(jiàn)過(guò)的重要的在線服務(wù)模塊,大多是主干開(kāi)發(fā)、分支上線(或者說(shuō)tag上線),每個(gè)特性、修復(fù)等(稱(chēng)作story)對(duì)應(yīng)一個(gè)commit,一次story不斷修改,會(huì)使用git commit --amend。重要模塊均有強(qiáng)制的Code Review。提交后觸發(fā)CI流程,自動(dòng)運(yùn)行單測(cè)、diff、性能測(cè)試等。
編譯工具:GCC 8.2 + C++11 + 內(nèi)部云編譯系統(tǒng)
翻百度之前的問(wèn)題,也許看到過(guò)“百度GCC被三體人限定在3.4.5”的典故,很明顯今天我廠的同學(xué)們已經(jīng)吸取了以往的經(jīng)驗(yàn)。在2019 Mid之前,主流版本是GCC 4.8,-std=c++11。2019秋季開(kāi)始推動(dòng)升級(jí),至今日絕大部分模塊都在GCC 8.2下編譯,但還沒(méi)有見(jiàn)到上C++14/17的模塊,-std配置啥,由各業(yè)務(wù)線、模塊owner決定,也許是大家都知道沒(méi)有C++11很難受,C++11到C++14/17香度變化沒(méi)那么大,大家沒(méi)什么動(dòng)力吧...
廠內(nèi)有一套自己的云編譯系統(tǒng),一行命令,把代碼改動(dòng)push到編譯平臺(tái),調(diào)動(dòng)編譯集群,并把編譯產(chǎn)物在pull回來(lái),這套東西不需要自己再解決編譯依賴(lài)等C++惡心人的地方,編譯速度快很多,作為業(yè)務(wù)研發(fā)很少需要和編譯工具直接打交道?;臼呛蚥azel定位比較類(lèi)似的東西吧。
其他經(jīng)歷
代碼也是SSH+Vim+跳板機(jī)組合,當(dāng)年也沒(méi)有遠(yuǎn)程的VSCode這類(lèi)工具可用。
雖說(shuō)作為實(shí)習(xí)員工不接觸核心模塊,但翻看過(guò)組內(nèi)代碼,沒(méi)有風(fēng)格規(guī)范(tab空格混搭...),沒(méi)有CR,沒(méi)有CI,有些組件要口口相傳才知道怎么跑起來(lái)。實(shí)話說(shuō),技術(shù)建設(shè)沒(méi)達(dá)到我想想的水平吧,也有些好的地方,比如C++11到位了(但2018年的時(shí)候有C++11用,好像在鵝廠還是走在靠前了...),有blade編譯(基本就是bazel),有一套挺好用到傻瓜的上線系統(tǒng)(一直點(diǎn)下一步就上完了,跟安裝游戲一樣...)。另外我在時(shí)還是SVN,貌似最近才遷的Git。
但反過(guò)來(lái)想,技術(shù)建設(shè)上可做的東西那么多,服務(wù)還是那么高的性能和可用性,也許是另一種程度上的叼炸天呢...?
碎碎念
我個(gè)人來(lái)講,傾向一種“掌握最基礎(chǔ)的工具走遍天下”的思想,比如vim和screen,不論到何種條件下,只要不是CoreOS那種極端的東西,總會(huì)有vim和screen可以用,相比emacs和tmux,即使沒(méi)有任何自己習(xí)慣的配置文件,也能達(dá)到過(guò)得去的效率,從而可以盡快投入到自己要做的事情上。
https://www.zhihu.com/question/265829202/answer/1081368688
也有部分人重度使用VIM,直接ssh到linux機(jī)器上寫(xiě)代碼,配置幾個(gè)插件效率也是很高的,而且據(jù)觀察,這些人中高手較多。VIM寫(xiě)代碼的人有個(gè)特點(diǎn),腦子里記錄了很多關(guān)鍵函數(shù)、符號(hào)、文件等,跳轉(zhuǎn)非???,配合cscope和grep和正則搜索老的代碼庫(kù),學(xué)習(xí)成本相對(duì)高點(diǎn)。
相比VIM,Emacs用的倒是很少。
公司也買(mǎi)了很多JetBrains的全套License,如果編譯是標(biāo)準(zhǔn)CMake工程,而且也不是那么巨量,CLion配置好+MinGW,寫(xiě)代碼效率會(huì)大增。不過(guò)有些強(qiáng)依賴(lài)Linux編譯,而華為也沒(méi)有給員工配置桌面Ubuntu等系統(tǒng),這種還是最終同步代碼到Linux編譯機(jī)上去編譯,或者直接push到遠(yuǎn)端,用CI編譯。
2. 版本管理
3. 編譯腳本
https://www.zhihu.com/question/265829202/answer/1086040231
一開(kāi)始靦腆不知道問(wèn)老人,就自己搜搜內(nèi)部的KM,搜到了別的部門(mén)的技術(shù)方案。等搞明白了才發(fā)現(xiàn)組里不用這個(gè),吃了一點(diǎn)點(diǎn)虧。不過(guò)我的性子是,如果新工具好的話,應(yīng)該堅(jiān)持用新工具,索性我做的項(xiàng)目全新沒(méi)有歷史負(fù)擔(dān),最后整個(gè)業(yè)務(wù)的環(huán)境一直在和原來(lái)脫軌了。
舊服務(wù)代碼一般不敢改,C++版本被三體星人鎖死了,印象中還是98。后來(lái)新服務(wù)我升到C++11,再后來(lái)嫌棄C++多線程太麻煩(老框架只有io復(fù)用,然后把服務(wù)做成異步),我就強(qiáng)推golang寫(xiě)代碼颼颼快。老同事用的sublime做編輯器,把linux代碼用samba映射出來(lái),補(bǔ)全有延遲,或者干脆用mac。后來(lái)我改用VS Code Remote了,直接接到linux容器內(nèi)做開(kāi)發(fā),非常輕量且柔順。
來(lái)了之后沒(méi)多久,鵝廠開(kāi)始要做開(kāi)源協(xié)同(第一步就是svn遷移到git)。之前在華為,恰好也在搞開(kāi)源協(xié)同,看來(lái)是大勢(shì)所趨。因?yàn)樵趯W(xué)校就用git,所以對(duì)我沒(méi)啥影響。
后臺(tái)服務(wù)好多年前就搞SaaS了,容器調(diào)度+rpc調(diào)用,模塊化處理之后,模塊之間也沒(méi)有歷史負(fù)擔(dān),語(yǔ)言環(huán)境都隨意。有個(gè)鵝廠自研開(kāi)源的tars框架,配合內(nèi)部工蜂git和CI/CD的頁(yè)面,上線和調(diào)度都很傻瓜,鼠標(biāo)操作。對(duì)外API現(xiàn)在也開(kāi)始采用https+json了。
總而言之,個(gè)人感覺(jué)現(xiàn)在開(kāi)發(fā)輕便得很,工具環(huán)境都算新,有VS Code remote之后,操作系統(tǒng)也沒(méi)有要求了。網(wǎng)絡(luò)接入方案和遠(yuǎn)程辦公機(jī)制最近也都進(jìn)步了,現(xiàn)在已經(jīng)基本上不限制 地理位置/開(kāi)發(fā)辦公機(jī)器/環(huán)境/開(kāi)發(fā)語(yǔ)言 等細(xì)節(jié)了。之前在華為使用云桌面(無(wú)實(shí)體機(jī)器),辦公設(shè)備和辦公用品不能帶出,鎖死的java7和win7操作系統(tǒng),和有限可選擇的開(kāi)發(fā)環(huán)境。相比在鵝廠確實(shí)自由多了。
https://www.zhihu.com/question/265829202/answer/1081155436
大神級(jí)別:我導(dǎo)師,從來(lái)不用IDE,簡(jiǎn)直是行走的代碼庫(kù),一個(gè)emacs走遍天下
復(fù)古流:eclipse黨,堪稱(chēng)考古流派,原本有三個(gè)人用,其中一個(gè)被我策反了
輕量級(jí):vscode,新版本的vscode可以直接連接遠(yuǎn)程開(kāi)發(fā)機(jī),代碼、索引都在遠(yuǎn)程,編輯在本地,因此本地使用資源極少,非常適合筆記本。在我們組一個(gè)同事強(qiáng)力推薦下,很多人轉(zhuǎn)用vscode。
重量級(jí):clion,相比前三種算是高達(dá)了,功能強(qiáng)大,傻瓜易用,配置好以后極大提升開(kāi)發(fā)效率。缺點(diǎn)是占用資源極大,我已經(jīng)加到32G內(nèi)存了,仍然日常90%+,在我的安利下,也有幾個(gè)人轉(zhuǎn)用clion了。
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

