網際網路大公司價值上億的項目背後,團隊成員是怎麼高效協作開發的?
和我自己開發辣條項目時有什麼區別?
看完本文,保證讓你大開眼界!
我總結了 30 個提升團隊研發效能的錦囊,完整覆蓋項目的各研發流程,分享給大家~
項目研發流程1. 技術選型
想要提升團隊開發效率,在投入項目開發前,必須確認項目的技術選型。比如項目選用哪種程式語言、選用哪個開發框架、選用哪些依賴庫、選用哪個測試框架、選用哪種資料庫、選用哪些中間件等等。
技術選型是一門大學問,通常不是由一位技術大牛或架構師一錘定音的,而是要大家開會討論,結合具體的業務場景進行分析,並且對技術進行充分的研究,最後共同確認一個較為合適的選型方案。
技術選型的考量要素非常多,比如:
團隊成員對技術的熟悉程度。團隊成員對技術越熟悉,培訓成本越小,開發效率越高。在一個都是 Java 工程師的團隊提出使用 C++ 簡直不講碼德!
團隊對技術的掌控度。團隊內至少要有一個人非常了解該技術,懂得最佳實踐,能夠指導團隊正確運用技術,並解決疑難問題。
技術的主流程度和生態。技術越主流,文檔、實踐和解決方案就越多,而使用冷門技術可能出現無法解決的問題,整段垮掉!
技術和業務的貼合程度。技術是為業務服務的,因此必須結合具體的業務場景去選用技術。比如在只有幾個用戶使用的小網站中運用微服務框架是一個愚蠢的選擇。
2. 開發工具
工欲善其事,必先利其器。
在開發前,選擇一款優秀的開發工具,並且學習如何高效地使用它吧!很多開發工具都自帶了代碼檢查、代碼格式化等功能,還有很多快捷鍵,這將大大提升我們的開發效率和開發體驗。
目前比較主流的開發工具有 、、 等等,不必沉迷於某一款開發工具無法自拔,可以針對項目的類別和體積進行選擇。
除了本地的開發工具外,還可以使用雲端的開發工具,比如 ,無需下載任何軟體,直接在瀏覽器中進行開發和調試、實時瀏覽。對於小型項目的開發也許是一個不錯的選擇。
Cloud Studio 在線開發3. 代碼規範
在開發前,為團隊或項目制定一套代碼規範太有必要了。
好的代碼規範能夠幫助團隊成員閱讀理解他人的代碼,提升協作開發效率和團隊氛圍。
試想,如果你習慣代碼縮進兩格,而其他同學都縮進四格,會不會感到很懊惱?
4. 腳手架
在開發一個新項目前,通常由架構師或熟悉技術框架的同學來搭建項目的基本結構、編寫 Demo,其他同學只需要在此基礎上遵循規範進行開發(複製粘貼)就好。
如今,項目結構越來越複雜,我們不可能手動創建一個又一個文件。
懶人推動世界,很多框架自帶了腳手架,能夠讓我們通過輸入一兩行命令,快速生成項目的基本結構、默認配置文件、甚至是可直接運行的 Demo,避免了不必要的重複工作,大大提升開發效率!
比如前端框架 的腳手架 和前端框架 的腳手架 。
腳手架演示5. 低代碼構建
低代碼是指少寫代碼或不寫代碼。通過對應用場景的極致抽象和模板化,將寫代碼的工作交給機器來自動生成。
就像現在網上很多 App 和網站製作平臺,只需要在界面上選擇元素、點點拖拖,就能夠自動創建出應用,根本不需要寫任何代碼,哪怕是不會編程的人也能輕鬆使用。
低代碼構建在企業中非常流行,是提升團隊開發效率的神器,幾乎每個大公司都有自己的低代碼構建平臺。業界比較知名的代碼平臺有 Google 的 和微軟的 等。
Power Apps 畫布的圖像6. 內部依賴倉庫
在開發中,我們經常需要下載大量的依賴包,還要將開發好的依賴包進行上傳。
但是,通常軟體依賴源都是國外的伺服器,比如 和 源,從國內下載依賴的速度非常慢。雖然下載慢的問題可以通過配置國內鏡像源得到一定程度的解決,但是無法直接在公有軟體源上傳私有包。
因此,通常企業都會在內網搭建私有軟體源,即內部依賴倉庫,便於內部依賴管理,大大提升拉取效率。
目前最常用的內部依賴倉庫是 。
Nexus 倉庫7. 本地開發熱更新
很多年前,在我還有一雙清澈的雙眼的時候,我在本地開發網站都是改一行代碼,然後切換到瀏覽器裡刷新看效果,然後再改代碼,再刷新,如此往復,非常難受。尤其是開發後臺應用時,哪怕在代碼中改了一個字母,都要去重啟項目!
現在想想,效率實在是太低了。
如今,本地開發熱更新是程式設計師開發提效必備的神器,啟動一個開發伺服器,讓它自動監聽代碼文件。當代碼更新時,運行中的項目也會自動更新,從而省去了無止盡的刷新和重啟。
在前端,比較知名的熱更新工具有基於 HMR 技術(模塊熱替換 hot module replacement)的 ;在 Java 後端有 熱部署插件 。
JRebel 簡化流程8. Serverless
Serverless 是最近幾年逐漸流行的概念,翻譯過來就是 「無伺服器」。
以前,我們要搭建網站的後臺,首先要買伺服器,然後將一個大而全的項目包部署到伺服器上,整體對外提供服務,所有的系統資源和進程都需要由我們自己來管理。
單體架構
隨著雲計算時代虛擬化、容器、微服務等技術的發展,人們將大項目的通用部分抽象成一個個細小的服務,每個服務只提供一個或幾個功能,獨立部署在比伺服器更輕量且無狀態的容器中,共同對外提供服務,組成一個完整的系統。
Serverless 架構
而 Serverless 不是指完全不需要伺服器,而是讓開發者感受不到伺服器的存在。
什麼意思呢?其實就是把對伺服器的需求外包給廠商,我們只管寫代碼,讓他們負責部署和運維。我們花錢,他們辦事!
目前國內有很多 Serverless 服務提供商,如阿里雲、騰訊雲、LeanCloud 等,使用這些 Serverless 服務後,我們無需再關心伺服器的運行,只需要專心寫業務邏輯就可以了,能夠大大提升開發和維護效率,省時省心。
9. 代碼託管
很多年前,我們的代碼幾乎都存在自己的電腦裡,通過 U 盤或者網絡傳輸代碼文件來實現合作開發。
而如今,代碼託管平臺已經成為團隊合作開發的靈魂。
相信很多小夥伴都接觸過 ,世界上最大的代碼開源託管平臺。每個人都可以把自己的代碼發布到 上,作為一個代碼倉庫,隨時隨地遠程管理。還可以搜索和瀏覽其他人發布的代碼倉庫,以此實現高效地合作開發,促進項目的完善。
為了保證代碼的安全保密性,一般在公司或團隊內部都會自己搭建一個代碼託管平臺,比較知名的有 ,可以針對不同的項目為成員分配權限,更好地管理團隊的代碼。
GitLab10. 本地代碼檢查
在代碼提交之前,首先應該在本地進行代碼檢查,及時發現一些低級的語法錯誤,防止被團隊的其他同學嘲笑。
大多數集成開發工具自帶了代碼檢查功能,邊敲代碼邊檢查,非常爽。
此外,我們還可以配置 ,在代碼提交前自動執行代碼檢查, 項目可以通過 插件實現,還能配合 實現代碼自動修復。
ESLint11. 代碼提交規範
團隊越大,規範就越重要。
只有代碼編寫規範還不夠,還要在團隊內製定一套代碼提交規範,通常是約定式提交規範,即讓成員在提交代碼時填寫指定格式的 ,比如下面的格式:
[可選的正文]
[可選的腳註]
指定代碼提交規範不僅能夠幫助成員快速理解每次提交的改動點,提升代碼審查效率;更大的作用是讓一些自動化工具理解提交信息以進行一些有意義的工作,比如生成 (代碼改變日誌)。
可以參考一些大公司的代碼提交規範,並通過 和 等插件實現自動修復不規範代碼。
commitlint 代碼提交規範檢查12. 代碼審查
在團隊開發中,寫代碼可不能像自己練習編程時一樣肆無忌憚。
在合作開發時,可以為每位開發者分配一個分支,在自己的分支編寫和提交代碼,也可以按照需求來建立分支。確認開發測試完成後,發起一個 MR(Merge Request 合併請求),將小分支的代碼合併到公共的主線分支即可。
分支合併
主線分支的代碼通常是能夠直接發布上線、穩定運行的。因此,為了保證項目代碼的質量,每次合併代碼到主線分支前,必須要進行代碼審查(CR,即 Code Review),就是讓同事或上級閱讀和審批你的代碼,覺得沒有問題後,才能夠執行代碼合併。
通常,代碼變更越大、項目越重要,代碼審查所需人數越多,越能夠發現一些個人無法發現的風險和問題。因此,代碼審查是大公司研發流程的關鍵一環和重要防線。雖然不能直接提升研發效能,但是能有效避免線上事故的發生,減少程式設計師不必要的工作量和心理壓力。
代碼審查13. CI/CD 流水線
CI/CD 即持續集成/持續交付。
在敏捷開發時代,哪怕是一個小團隊,每天也會有幾次的代碼提交,如果長期不合併,可能就會出現代碼衝突。
代碼衝突
因此,持續集成的意義在於,通過每天定時將各個開發人員的代碼合併到同一個代碼倉庫中,以儘早發現代碼衝突和錯誤,幫助團隊更緊密地開發協作。
當我們開發完項目,想要發布上線時,要先登錄伺服器,然後在伺服器上拉取代碼倉庫中的項目代碼,然後執行打包命令,最後通過腳本運行項目。
如果只需要在一臺伺服器上部署,其實還不算太麻煩,但是如果要在幾十臺機器上部署呢?要一臺一臺地登錄伺服器然後重複著上述工作麼?
懶人推動世界,這時我們就需要持續交付,將構建部署的每個步驟由人工轉變為機器自動操作,原理類似編寫了一個自動化構建腳本,在代碼合併到倉庫時觸髮腳本的執行,在各機器上自動拉取新代碼並打包發布。
目前主流的 CI/CD 平臺是 老爺爺,可以配合代碼託管平臺 等實現完全自動化打包、構建、發布,再也不用開發人員一臺臺登錄機器去執行重複的命令了,不僅大大提升了團隊研發效率,還保證了發布流程的規範和安全性。
Jenkins 爺爺
畢竟總有些內鬼程式設計師借著發布的名義偷偷登錄伺服器執行 。
14. 監控告警
為了在第一時間發現線上項目存在的問題,我們通常會在代碼中添加告警邏輯,當某段代碼執行異常時通過郵件、簡訊、微信、電話等方式聯繫項目負責人。
但有時,我們可能會針對某些指標在一段時間內的統計值設置告警。比如當機器內存佔用超過 80% 且持續 5 分鐘才告警。這些告警邏輯和業務本身關係不大,如果都寫死在代碼裡,不僅耗時,而且難以維護。
可以在團隊內搭建監控告警平臺,通過在機器上部署代理或者在代碼中使用上報 SDK 等方式來讓告警平臺統一收集項目運行時的各個指標,比如機器負載、網絡負載、異常信息等。
監控告警平臺提供配置界面,可以靈活地配置告警規則,比如 1 分鐘內收集到 2 個報錯就發郵件告警、收集到 5 個報錯就發簡訊等。
完善的監控告警平臺還能夠對歷史告警信息進行管理和詳情查看,以及可視化展示各指標圖表等。不僅減少了我們開發時的工作量,也能幫助我們更快地分析和排錯。
Zabbix 是比較知名的開源監控解決方案,幾乎能對任何 IT 基礎架構、服務、應用程式和資源進行監控和告警,全面且專業。
Zabbix 監控15. 日誌平臺
通常,已上線的項目出現問題時,我們會通過查看日誌文件來定位和排查問題。
如果項目比較小,僅僅在單臺伺服器上部署,那麼只需要登錄這臺伺服器,輸入命令來查看日誌即可。
但團隊的項目量級較大時,通常會部署到多臺機器上,而且每臺機器上的日誌量都非常大,以人工的方式一臺臺登錄伺服器,然後在數以萬計的日誌中去找到自己想要的關鍵信息,是非常低效又噁心的!
雜亂的日誌
日誌不講武德,可以搭建一個統一的日誌平臺來治治它們。將各臺機器上分散的日誌收集到日誌平臺,然後通過可視化的界面去集中管理和搜索日誌,大大提升了查閱日誌的效率和體驗。
目前比較主流的技術是 ( + + + ) ,使用它可以搭建一套企業級日誌平臺,輕鬆管理上百萬甚至是上億的日誌數據。
Kibana 日誌可視化16. 接口文檔平臺
現在很多的項目都採用前後端分離的方式進行開發,前端同學寫界面,後端同學提供接口。如果沒有一個規範的接口文檔,聲明每個接口的協議、請求參數、響應參數等,很容易導致前端請求錯誤。
傳統的方式是由後端同學手動編寫接口文檔,接口改動時,文檔也要改動,非常低效且不利維護。
其實,我們可以將接口文檔平臺化,通過 等工具自動生成精美的接口文檔網站,開發者還可以在網站上直接測試各個請求,告別了手動編寫文檔的低效繁瑣,提升了開發和協作效率。
Swagger 接口文檔17. 接口測試平臺
測試是對研發質量的保障。
我們寫完代碼後,不僅要在本地測試,還要在測試環境、預發布環境、線上環境都進行測試驗證。項目越大,對測試的要求越高,也就越麻煩。
通常我們會使用 、 等工具進行接口測試,簡單易用。但是有些時候,本地網絡(公網)和測試環境(內網)的網絡不互通怎麼辦?
可以在團隊內部搭建接口測試平臺。提供一個 web 界面,無需下載任何軟體,就可以輕鬆地創建各種接口測試,編寫各種測試用例,創建測試計劃。最棒的是還能切換不同的測試環境,以及多人共享測試等等。大大提高了測試效率和質量。
18. 即時協作
天下武功,無快不破。為追求更高的協作效率,可以使用一些即時協作工具。
比如在協作開發同一個項目時,可以使用開發工具 的 插件,支持多人連線,團隊成員可以同時對文件進行編輯,甚至還能看到對方的光標!
Live Sharing with VS Code
在多人編寫同一個文檔或表格時,可以使用騰訊文檔,實時看到其他成員的光標位置和對文檔的改動,尤其是在開會時,這個功能將非常有用。
騰訊文檔
使用即時協作平臺不僅可以提升效率,還能以最快的速度發現衝突,發現有人正在寫爛代碼可以直接打字提示他。
19. 團隊知識庫
團隊在開發項目的過程中,肯定會產生很多有用的知識,比如技術選型過程、線上事故的分析處理過程、技術文檔、產品文檔、業務介紹等。這些知識是團隊成員共同積累的財富,日後可能要給其他同學閱讀學習,因此必須妥善保存。
以前的做法是,大家把想共享的文件傳到一個公共的網盤中,需要時下載到自己的電腦上。當網盤的文件更新時,還要再重複下載,非常地低效。
現在的項目團隊,一般都有自己的團隊知識庫,通常是雲端網站的形式,所有的成員可以在知識庫中上傳想要保存和分享的文檔,也可以直接在知識庫中編寫文檔。想要學習知識的同學直接登錄知識庫網站,搜索文檔即可,還能夠對優秀的文檔進行收藏。
團隊知識庫不僅能夠更好地維護和沉澱團隊的知識,還能提升大家編寫和閱讀文檔的效率,更好地進行知識協作共享。
比較不錯的在線團隊知識庫有阿里語雀、騰訊樂享、Wiki、Confluence 等。
語雀知識庫20. 進程監控
有時,我們線上運行的項目進程可能因為某些意外而退出,而且沒有被任何人及時發現,這可能會對團隊造成巨大的損失。
為了保證線上項目的高可用,可以開啟進程監控,當項目進程退出時,自動重啟該進程並且向負責人發送告警,一定程度上減少了事故的影響,也省去了手動重啟進程的操作。
可以自己編寫進程監控腳本,也可以使用一些現成的監控程序,比如 和 等。
Monit 監控21. 前端監控統計
前端監控主要包括對頁面的性能監控、錯誤監控和用戶行為監控。對於 C 端項目而言,前端監控非常重要。通過性能監控,可以分析頁面性能的不足,優化頁面,提升用戶體驗。通過錯誤監控,可以在用戶進行某些誤操作時第一時間通知到項目負責人,並進行相應的處理。通過行為監控,可以獲取 UV、PV、IP、點擊流等等,從而分析用戶的使用習慣,改進產品。
如果沒有前端監控平臺,開發者要自己收集各用戶行為指標,且只能通過不斷地測試來分析頁面性能的不足,會產生很多額外的工作量。
有很多現成的前端監控平臺,比如百度統計、專注錯誤監控的 、騰訊的 等,直接申請帳號接入即可,省去了自己搭建的麻煩。
百度統計22. 任務調度平臺
在日常開發中,少不了執行定時任務,比如每天檢測數據是否正常、定時發送郵件、同步數據等。如果把這些任務都寫死在代碼中去執行,即使用一些定時任務框架,當任務多了,也會變得難以管理。而且無法控制任務的執行狀態,還有可能導致一些單次任務的重複執行,造成風險!
因此,需要統一的任務調度平臺來管理任務。可以通過平臺界面實時查看各任務的執行情況,還能夠靈活地控制任務的啟停、執行參數、超時時間等。甚至可以將任務調度到多臺機器同時執行。降低風險的同時提升了管理定時任務的效率。
有一些優秀的開源任務調度平臺如 和 ,可以直接搭建使用。
XXL 任務調度平臺23. 配置中心
任何項目都離不開配置,比如資料庫連接密碼、第三方服務調用地址等。
如果把配置都寫死在代碼中,或者是項目包裡的配置文件中,當配置需要修改時,我們就不得不修改項目文件,提交代碼,重新打包,再發布上線,非常麻煩。
而且有些時候,由於多個項目使用了相同的配置,在改動一行配置時,可能要去修改多個項目,不僅麻煩,而且存在漏改的風險。
因此,我們需要一個配置中心來集中管理那些經常變化的、同時被多個項目使用的配置。
比較好用的配置中心有攜程的 、阿里的 等,可以直接在界面上創建和發布配置,還能對配置進行版本控制,靈活地升級和回退。使用配置中心能夠提升配置管理的效率,同時避免重複地改動項目的配置文件。
攜程 Apollo 配置中心24. 鏈路追蹤
假設我們的項目中有一個功能依賴多個第三方接口,該功能的平均執行時間是 50ms。
/**
* 獲取用戶詳情(依賴三個接口)
*/
function getUserDetail() {
let user = getUserById(); // 得到用戶基本信息 10ms
user.account = getUserAccount(); // 得到帳戶信息 20ms
user.idcard = getUserIdCard(); // 得到用戶身份證信息 20ms
return user;
}
結果有一天,這個功能執行超過了 10 分鐘!那怎麼排查出是哪個第三方接口出現了問題呢?
當出現複雜的調用關係時,我們可以使用鏈路追蹤系統,通過給每個請求環節綁定唯一 id 並上報時間的方式串聯起整條調用鏈路。在鏈路追蹤系統提供的界面可以輕鬆地查看整個請求的調用過程,能夠幫助我們更快地定位請求中的問題,優化接口的性能。
SkyWalking 鏈路追蹤系統25. 容器管理平臺
以前,團隊的項目都是直接部署在伺服器上,簡單粗暴。但是隨著時間的推移,項目會越來越大,最終成長為一個巨石應用。
滾雪球
隨著雲計算、容器、微服務等技術的發展,對於一些大型的巨石項目,我們可以將其拆分為獨立的微服務,部署在一個個相互隔離的容器中。容器就像一位少女,輕量、優雅而迅速。
一個項目可能需要同時部署多個容器,我們需要對這些容器進行管理和資源的分配。而容器比伺服器的粒度更細,數量可能是機器數的幾倍,手動去管理他們是很難的。
Docker 容器
因此我們需要容器管理平臺,統一管理容器,自動分配資源,並根據容器的資源佔用情況進行彈性伸縮,極大地提升運維效率。
K8S(Kubernetes)可以說是最知名的容器管理平臺了,很多大公司也都提供容器管理平臺的雲服務,可以直接接入。
K8S26. 中臺
問個問題,如果讓你連續開發 5 個電商系統,當你開發第 6 個電商系統的時候,你會怎麼做呢?
肯定要將前 5 個電商系統中能用上的代碼粘貼過來對吧!
如果你意識到重複開發的麻煩,你就知道有一個中臺會多香了,說是提升百倍效率一點也不誇張!
中臺的概念近幾年來在國內十分火熱,可以簡單地理解為被很多系統共用的中間件的集合。
中臺又分為業務中臺、技術中臺、數據中臺、組織中臺等。就拿業務中臺來說,就是抽象傳統的業務場景,把後臺的火藥等資源整合成前臺打仗需要的炮彈,隨取隨用。
回到上述問題,我們是不是可以將前 5 個電商系統中用到的技術和工具,抽象成一個中臺呢?
中臺出現之前,由於團隊的分散,我們總是在重複建設一個又一個的輪子。而如今,幾乎所有的網際網路巨頭都在建設自己的中臺,比如支付中臺、直播中臺、電商中臺等。如果要開發一個新的系統,我們根本不用從零開始,直接使用中臺資源就能很方便地完成,很快啊!
27. 腳本管理
在開發中,我們經常需要編寫一些腳本(可以將腳本理解為簡單的程序),來幫助我們更快捷地完成某項任務。
比如我們要去重啟一個進程,需要執行關閉進程、清理文件、啟動進程三個步驟,可能要輸入很多行命令才能完成。
do stop
do clear
do start
不妨直接將三個步驟的命令塞到一個 shell 腳本文件裡,再次重啟進程時,只需要一行命令就行了,很快啊!
./restart.sh
但如果我們想在其他的系統上多次使用這個腳本,怎麼辦呢?是把編寫好的腳本放在自己的電腦上,還是直接扔到伺服器上呢?
更好的方式是使用腳本管理平臺,團隊成員可以將自己編寫的各種語言的腳本都發布到該平臺上,想在其他系統或伺服器中使用該腳本時,直接請求腳本的在線連結,腳本將自動下載、執行和清理。
腳本管理平臺尤其適合運維同學使用,某種程度上也是通過自動化提升了效率。
28. 可視化數據管理
團隊開發肯定離不開資料庫,並發量高一點還需要使用緩存、消息隊列等中間件。
無論是本地開發,還是在測試、線上環境驗證,我們都經常需要查看資料庫或者緩存裡的數據是否正確。最直接了當的方法就是打開小黑框,用官方提供的命令行連接資料庫,然後輸入查詢命令去查看,這也是很多高級工程師現在還在堅持的做法,因為有 B 格。
但是,如果用了分庫分表技術,一份完整的數據被分散到多個資料庫和數據表中,使用命令行來查看就比較麻煩。因此,我們需要可視化的數據管理平臺,比較常用的是本地軟體 、 等。
為了更方便地管理數據,團隊內部還可以搭建在線的可視化數據管理平臺,比如面向 資料庫的 ,開發者無需在本地安裝任何軟體,直接打開網站,輸入密碼,就能夠瀏覽和操控數據啦!
phpMyAdmin 資料庫管理29. 項目管理
提到項目管理,大家可能覺得和技術研發同學沒什麼關係,其實不然。
通過項目管理平臺,我們能夠看到每個需求的優先級和排期,可以合理規劃自己的研發安排,掌控進度。有重要的信息,也可以貼到需求詳情下,相對正式,能夠及時同步到所有需求的參與者,規避一些風險。
而如果沒有項目管理平臺,對需求進度沒有一個好的把握,說不定摸魚就摸過頭了。
有很多開箱即用的項目管理平臺,比如 和 。
30. 企業通訊
通訊軟體是團隊溝通協作、高效辦公的靈魂,比如騰訊的企業微信、阿里的釘釘、字節跳動的飛書。
這些企業通訊軟體早就不只是支持團隊即時溝通的工具了,而是大而全的企業辦公門戶。
像騰訊的企業微信,集成了文檔、待辦、會議、通訊錄、工作檯、雲盤、電話等辦公必備的工具,成員可以通過軟體快速地找到並使用這些功能,大大提高了辦公效率。還可以在通訊軟體中設置機器人,實現業務的自動告警。
其實,大廠中還有很多提升研發效能的技術,比如流量回放、壓測平臺、試驗系統、故障演練系統等,這裡就不一一介紹了。
此外,每個團隊負責的業務不同、情況不同,也都會有提升自己研發效能的獨門秘技,要根據實際的場景去選用技術,否則可能適得其反。
希望大家能利用好現有的技術、發掘新的技術,不斷提升研發效能,感受技術帶來的美好。