騰訊以及各大廠的 C++ 開發(fā)環(huán)境是什么樣的?
在各大技術(shù)論壇、微信群里,程序員們經(jīng)常為編程語言、IDE開發(fā)環(huán)境之類的問題撕得不可開交。
這天就看到了一個(gè)知乎問題:

下面有一位騰訊員工的回答,分享一下,原文鏈接我放到了文末。
簡(jiǎn)單介紹下騰訊微信事業(yè)群后臺(tái)開發(fā)環(huán)境。
微信事業(yè)群比較特殊,喜歡自己搞一套東西自己用,有些基礎(chǔ)設(shè)施跟騰訊其他事業(yè)群的不太一樣。
硬件:
現(xiàn)在通常是macbook pro+ 遠(yuǎn)程Linux主機(jī)。遠(yuǎn)程主機(jī)方面當(dāng)前已經(jīng)舍棄了以前集體戶式的開發(fā)機(jī),每人擁有一臺(tái)相對(duì)獨(dú)立的云主機(jī),我的配置是8核Xeon Gold + 16GB + 500GB,考慮到這臺(tái)機(jī)絕大多數(shù)時(shí)間只是跑個(gè)編輯器,性能還是挺富余的。
軟件:
代碼編輯:老員工通常是vim,基本沒見過emacs。新員工很多開始用vs code了。我身邊絕大部分人是用vim的,大家有時(shí)會(huì)互相分享一些自己使用的插件,但是每個(gè)人的配置都大不一樣。編輯器是網(wǎng)上程序員撕逼大戰(zhàn)的主戰(zhàn)場(chǎng)之一,但是現(xiàn)實(shí)中同事之間倒也沒有因?yàn)榫庉嬈鳡?zhēng)執(zhí)過,大家還是很文明的,新人剛來的時(shí)候我們這些老vim用戶也會(huì)安利他們學(xué)一下vim,但人家最終選擇了vs code我們也沒說啥不是。
版本控制:目前基本都遷移到git了,以前是用svn。vim黨基本都是直接用git命令,有些vs code的用戶會(huì)在mac上用圖形化的前端。
編譯系統(tǒng):現(xiàn)在是基于bazel搞的一套東西,開發(fā)階段編譯代碼時(shí)使用一條指令將本地代碼diff發(fā)送到編譯機(jī)來編譯,這樣可以共享很多中間文件,速度蠻快的。以前是在本地開發(fā)機(jī)編譯,有些比較大的模塊編一次幾十分鐘,而且編譯吃掉太多cpu還會(huì)導(dǎo)致vim卡頓……
工具鏈:用的是GCC那一套,由于后臺(tái)服務(wù)都是微服務(wù),每個(gè)小模塊都可選使用gcc4或者gcc7構(gòu)建,最近我寫了個(gè)小模塊用了c++17,就是用gcc7編譯上線的。希望哪天可以支持clang,我比較喜歡clang的編譯報(bào)錯(cuò)信息……
微信后臺(tái)開發(fā)的一天(理想情況Orz):
-
掀開mac
-
打開outlook把收件箱的紅點(diǎn)全點(diǎn)掉
-
切到item2,這時(shí)mosh已經(jīng)自動(dòng)重連到了開發(fā)機(jī),tmux的一堆窗口已經(jīng)在等著你了
-
vim...patchbuild...vim...patchbuild...git
-
期間夾雜吃飯、午休、散步、帶薪拉屎
-
mac切到chrome,打開微信變更系統(tǒng),提單、編譯、同步到測(cè)試機(jī)、灰度上線一氣呵成
-
蓋上mac,下班回家
-
//享受夜生活
其他一些碎碎念:
微信的后臺(tái)開發(fā)環(huán)境一直有很多槽點(diǎn),但也一直在改進(jìn),每年都能看到一些進(jìn)步?,F(xiàn)在還沒解決的比較影響開發(fā)效率的應(yīng)該就是代碼的語義分析工具了。目前大家寫代碼的環(huán)境都是沒有精確的跳轉(zhuǎn)和補(bǔ)齊能力的,考慮到大家的環(huán)境很不統(tǒng)一,估計(jì)也沒什么動(dòng)力統(tǒng)一去搞。
由于微信的后臺(tái)代碼量非常非常大,如果暴力把所有代碼都加到一個(gè)工程里,ycm之類的東西根本跑不動(dòng),按一下tab卡5分鐘還不一定能緩過來(gdb的時(shí)候也是不怎么敢按tab的)。后臺(tái)C++項(xiàng)目都是基于bazel的BUILD文件管理依賴,總體上來說比較粗放,基本上每個(gè)新人剛來的時(shí)候都會(huì)折騰一下這個(gè)東西,試圖搞定基于BUILD的補(bǔ)全方案,但最后性能和準(zhǔn)確性上很難滿足日常使用的需求。目前我的解決方案是用universal-ctags定期給常用目錄下的文件生成tags,寫代碼的時(shí)候憑經(jīng)驗(yàn)去跳。
在微信寫業(yè)務(wù)非常傻瓜化,微信的微服務(wù)框架svrkit準(zhǔn)備了一堆配套工具來生成代碼,新起一個(gè)服務(wù)就是寫一個(gè)protobuf文件,里面定義好接口,然后用這個(gè)文件生成整個(gè)服務(wù)的框架代碼,再把業(yè)務(wù)邏輯填進(jìn)去就好了。微信的C++基礎(chǔ)庫里面大到消息隊(duì)列,小到string的trim都有提供,寫普通的業(yè)務(wù)代碼需要什么功能基本都可以找到,完全就是堆積木,對(duì)普通的業(yè)務(wù)部門來說,面試造火箭入職擰螺絲一點(diǎn)都不夸張。
微信的開發(fā)最討厭的事情有兩個(gè):一個(gè)是別人寫的代碼沒有注釋,另一個(gè)是自己寫代碼還要寫注釋。這造成了很多工具、功能、邏輯的細(xì)節(jié)都是口口相傳,或者沉沒在浩如煙海的km文章、郵件里。沒事去看看別人的代碼總會(huì)有驚喜……有時(shí)是驚嚇。當(dāng)然這一點(diǎn)最近也在慢慢改變,基礎(chǔ)能力相關(guān)的組件開始開辟一些wiki、git issue之類的進(jìn)行系統(tǒng)的介紹了。
作者:亞里士缺德
鏈接: https://www.zhihu.com/question/265829202/answer/1081457634
來源:知乎
