主頁 > 軟體工程 > 這樣才是代碼管理和 Commit 的正確姿勢! | 研發效能提升36計

這樣才是代碼管理和 Commit 的正確姿勢! | 研發效能提升36計

2022-02-11 07:57:23 軟體工程

image.png

 

專欄策劃|雅純

志愿編輯|張晟


軟體交付是以代碼為中心的交付程序,其中代碼的作用有幾點:第一,最終的制品要交付成什么樣,需要通過代碼描述清楚;第二,代碼定義了系統和軟體是怎樣作業的;第三,代碼定義了系統的運行環境是怎樣的,所有這些都是圍繞代碼,

那我們的代碼管理和軟體配置管理應該怎樣做呢?

我們先看一個例子,下圖是某個團隊的代碼組織結構,這樣的代碼組織結構會有什么問題呢?

image.png

問題1:代碼組的命名方式混亂

我們發現在最上層的目錄中叫risk-managenment,這是一個系統,這個系統是風險管理,但是子目錄寫的是叫“qinglong”,那“qinglong”是應用還是團隊,我不知道,然后下面還有一個玄武,下面還有一個aTeam,中英文混雜,這樣的命名方式是很混亂的,

問題2:用代碼塊存盤外部二進制檔案

在android-sdks里面會存放很多sdk檔案,這些檔案是很大的,這個代碼庫存盤很多外部二進制檔案,我們知道在代碼庫直接存這樣的大檔案,對整個代碼庫的資源消耗是非常大的,

問題3:同一歸屬的代碼保存在不同的代碼組

在aTeam目錄下有一個data-model,但是其他相關的檔案都在玄武下,就是data-console、data-task、data-ui,我們不知道它具體是什么,但是我們知道這幾個大概率是同一個應用或者是同一個產品,所以它在兩個不同的層級也是不合理的,

問題4:公共庫保存在子代碼組里

再下一個是common-lib,通過名字來理解就是公共庫,但是這個公共感覺只給玄武這個子代碼組使用,

問題5:應用的檔案(或測驗)與應用分開存放

最后還有一個docs目錄下有risk-docs和data-docs,一個是針對風險控制的系統,一個是針對資料地系統,那這個里面檔案也是一個代碼庫,檔案代碼庫和測驗代碼庫,它和應用是分開存放的,這也是不合理的,

好的代碼庫組織形式是怎樣的?

問題:假設所有的代碼都保存在一個代碼庫,且所有人均可訪問,代碼庫應該怎么組織?

我們認為代碼庫是可以分組的,代碼組(+子代碼組)+代碼庫=大庫,

基于這個邏輯,我們再看看剛才那個例子里合理的代碼組的結構應該是怎樣的,

 

image.png

 

如上圖所示,整個代碼庫是一個系統,這個系統有兩個應用,一個是risk,一個是data,每個應用下面是有很多的服務和檔案,它們有一個公共的Model,叫common-lib,這是被所有的應用所依賴的,所以我們把屬于同一個應用的Git倉庫放在一起,讓common放到該有的地方去,不是按照團隊,而是按照應用組劃分,這樣劃分,結構就更加清晰了,這里我們稍微總結了一些實踐的建議,

  • 代碼庫的內容:

-軟體的源代碼(ProductionCode);
-將檔案(和測驗)的git庫放到其相關應用組下;
-不要將制品(如系統二進制包)保存在代碼庫中,如果確實需要,以LFS或類似方式存放;
(小編推薦:云效代碼管理Codeup為企業提供免費不限容量的LFS存盤)

  • 代碼庫的組織結構:

-按照系統、應用和模塊的層次來組織代碼庫;
-同一個系統/應用層級的所有內容位于同一個代碼組下;

  • 代碼庫的可見性:

-通用代碼庫放在其通用級別都可以訪問的位置;
-除核心演算法等少數代碼庫外,建議對代碼庫的訪問在同一系統/應用下對所有相關人員公開;

代碼組織完了以后,開發者就可以圍繞代碼庫來進行協作,整個代碼庫的協作程序就是:一切皆Commit,無論是rebase還是merge,都是Commit,

那對于Commit,我們有什么要注意的呢?

什么是好的Commit

我們總結了3點建議給到大家:

 

image.png

 

1.Samll

Git庫要盡可能地小,尤其是目前的基礎設施現狀下,雖然你的一個倉庫里可以放多個應用,但是維護起來的成本會很大的,還有管理方面,不要在Git上存盤構建產物和其他二進制檔案,把構建產物放在構建倉庫上,雖然給別人方便了,卻很難知道這個構建產物是現在的代碼產生出來的還是之前產生出來的,這是很難去追溯的,對于二進制檔案,如果確有必要(例如游戲的素材),建議使用LFS的方式來保存,

2.Linear

避免無意義的merge,盡量用rebase操作,其次是避免無效commit,有很多代碼庫commit記錄很長,但是里面80%都是無效的,例如都是fix1、fix2這樣的commit,都卻不知道它具體做了些什么,這種顯然是不合理的,對于這種冗長的commit串列,有時候可以在merge的時候squash一下,

3.Atomic

原子性,指操作的原子化,原子性有什么好處呢?一個Commit解決一個特定的問題,比如說我就是修復一個UTcase,或者是加一個UT或者是加一個功能,或者是加一個API,這些明確的問題對應到一個commit,很容易追溯,解決的問題不能很大,不能寫了2000行代碼解決了一個feature,一起提交,這是非常危險的,作為開發者,做的好的應該是快速有階段性的成果,并且持續地有反饋,持續地貼近目標,反之,開發者的體驗不好,相關協作者的體驗也不好,因為別人不知道你做了多少了,很有可能跟你發生mergeconflict,

下面列舉一些Commit的反模式:

1.無效的commit

如Mergebranch'develop'of https://codeup.aliyun.com/abc/xyzintodevelop第一個問題,在幾乎所有公司里面都是隨便拉開一個代碼,本地和遠程都有這種情況,本來一個rebase搞定的事情,這樣做會導致很多無效的commit,甚至對commit追溯能力會產生很大地影響,

2.巨型commit

一個commit里面包含了大量的代碼變化,且屬于多個實作目的,就像codereview,有些人提的mergerequest,一下子過來3000多行代碼,作為reviewer,你完全不知道他做了什么,這是非常危險的,

3.半成品的commit

如包含有基本語法問題或實作錯誤的代碼的commit半成品的commit,例如,到飯點了,不管了,先提交一把,這樣的代碼連編譯都過不了,這個顯然是不好的,沒有任何意義,

4.分支間的互相merge

最后一個是分支間的互相merge,從develop合到master,又從master合到develop,互相合來合去,一旦這種合并多了以后,commit就會很難追溯,因為不知道源頭在哪,我們建議代碼庫應該有一個唯一的主干,單向往主干merge,盡量避免反向merge的情況,

(小編推薦:云效代碼管理Codeup的主干開發模式,就提倡輕量的commit評審 和主干研發,幫助企業避免分支間的復雜合并~)

軟體配置管理

問題:軟體配置經常被修改,被發布,它屬于代碼嗎?

軟體配置其實是另外一種形式的代碼,有可能大家在實際作業中配置不是存在Git倉庫里面的,可能是在一個配置中心或者其他類似系統里面,但無論在哪里,本質上,我們可以把配置等同于某種型別的代碼,

下圖是大家常見的靜態配置和動態配置,或者說啟動相關的配置和運行相關的配置,

 

image.png

 

啟動相關配置

  1. 啟動相關配置是構建到鏡像中或者作為啟動引數傳進去的,
  2. 啟動之后不再修改了,不需要去動態監聽它的變化,
  3. 對這類配置的修改,一般需要重新創建或者重啟容器,

以此類推,哪些配置是啟動相關的呢?比如DB連接串、容器CPU規格、啟動模式等(比如有的壓測應用啟動的時候區分master模式和worker模式),其它像DNS服務地址等,諸如此類的我們都認為是啟動相關的配置,

運行相關配置

  1. 通常是通過監聽某個服務或檔案來獲取和更新的,比如說我要看一下我的白名單是什么,我去讀一下白名單,
  2. 配置的更新是不需要修改容器和Pod,
  3. 運行中的容器需要持續監聽配置的變化,當有變化后自動生效、無需重啟,

我們舉一下場景實體說明一下:

  1. 大促時期調整日志級別,只記錄ERROR級別的日志,
  2. 服務的黑白名單,為了限制某些IP的訪問,將其列入黑名單,
  3. 特性開關,通過開關打開或關閉某個feature,
  4. 監控采樣頻率,由每分鐘采樣一次調整為每5分鐘采樣一次,

這些配置不需要也不應該每次修改都重新部署應用,他們都屬于運行相關的配置,

我們再來看一個demo示例里面哪些是啟動相關的,哪些是運行相關的,我們列舉一下:

 

image.png

 

這是啟動的時候就會需要的一個引數,

 

image.png

 

我們將secret檔案注入到Deployment中,應用自動從檔案感知secret的值,無需重啟,因此它是運行時的配置,越內層的配置,修改成本越高,

 

image.png

 

從另外的角度看一下配置,它有不同的層次,代碼、鏡像、Pod和系統,代碼中的配置位于最內層,修改成本是最高的,因此,如果是編碼級別的修改,要經過所有的階段才能上線,如果運行階段的話,我是不需要動前面的部分,

最后,留一個問題給大家:運行環境相關的配置是屬于哪一種?歡迎大家在評論區留言互動,

軟體交付的終態是提供穩定可預期的系統,要做到這點,需要確保:1.運行環境的一致性;2.軟體制品的一致性,所以下篇,我們將開始分享如何保證運行環境的一致性,以及環境中大家常見的痛點和應對方案,敬請期待!

image.png

閱讀上篇:構建制品不一致,后續作業都是白費

點擊下方鏈接免費使用云效代碼管理Codeup

https://www.aliyun.com/product/yunxiao/codeup?channel=yy_rccb_36

 

image.png

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/423672.html

標籤:其他

上一篇:這樣才是代碼管理和 Commit 的正確姿勢! | 研發效能提升36計

下一篇:如何確保在mongoDB中僅填充兩個欄位之一

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more