架構師負責訂規範,你負責執行!

  • 2019 年 10 月 6 日
  • 筆記

心意相通的研發之間,本不需要BB這BB那搞些約束。但寧教我心徒枉然,不教銀光惹塵埃。過分的放縱愛自由,那就是一去不復返了。

本文系稍成點系統的碎碎語,如有共鳴,拍掌,么!

為什麼要有規範

規範是一種束縛,是騰飛前的最後一步加速。大公司免費開源複雜的軟體,有一個非常重要的目的就是想要佔據特殊解決方案的標準制定,想要一個話語權;一項技術趨向成熟的一個標誌也是標準、規範的制定。

對於公司內部來說,規範能夠讓品質和期望不偏離正常水平,是支援多人協作的基石。同時,某些約定有奇特的魔力,能夠讓配合井然有序。

規範會限定鬼才的發揮,但會提高庸才的產出。規範的目的就是讓所有人用正常的思維理解正常的東西。

沒錯,規範就是把你變成一個釘子。無論你是紋釘還是自攻螺釘,都會用一把鎚子給敲下去!規範是一種對功能的閹割和重排序。

臭名昭著的阿里釘釘,釘釘的意思明白了吧。

你即使再牛逼,也給規範按到地,給的工資也就那熊樣!打工很難致富,我想這就是原因。

規範制定的數據來源

環境

不落地的規範,設計的再好,也是廢物。

規範的制定需要一定的公司環境支援,你改變的可能是核心人員的習慣,抵觸肯定是有的。在某些公司里,你的規範可能會遇到很多阻力,你需要慢慢改變,東京不是一天熱起來的。

1、都在忙需求,沒人理規範。 無論從軟體管理的角度來說,還是公司的前途來說,放任需求膨脹、程式碼腐爛的管理人員都是不合格的。這種情況通常發生在小公司。

2、風險暴露期,故障復盤會議不斷。公司的第一代或者第二代程式設計師已經功成身退,留下的坑變成了你現在的工作。要給系統量身訂製一套合適的規範,很難,要考慮兼容。

3、垂直部門太多,各自為政。每個部門都覺得自己的規範牛X,你成為許多撕逼場景的火藥集中地。暗中觀察,故障驅動。

4、外包。還要個鎚子規範,都是甲方給你訂的。尾款別要了直接跑路吧。

數據來源

只有深入業務開發,才有資格進行規範的制定。自以為是、閉門造車是不可取的。即使你的思路再怎麼好,可能到了另外一個公司就會水土不服。

公司內的開發最討厭的就是「我們XX大廠就是這麼乾的」。不好意思,我們水淺王八多,到處是大哥,不吃你這一套。

你需要評估一個規範影響的範圍。比如你搞個編碼規範,對象是最底層逆來順受的碼農,影響就小了點;但如果你做的是後端、前端、測試的統一規範,你就需要承受三方的唾沫。所以溫水煮青蛙,不要打著規範的名義出規範,不積硅步無以至千里,咱們來日方長,細水長流。

怎麼評估規範實施情況

其實,規範這個東西,一個自上而下的強制性措施是比較好的。規範的review應該逐漸形成文化,或者流程中的一部分。但要結合以下特徵進行規範的修正。

1、實施難度。你的規範是否過於繁雜,不好記憶和實施,佔據了研發大量的時間。

2、實施數量。有多少的項目已經合規,你需要維護一個大體的進度表,評估整個實施周期。

3、反對意見。規範會動一部分人的乳酪,或者守舊派的抵制。你需要找出一個折衷點,不能過分混淆視聽,也需要照顧反對者的情緒。通常,將他們的項目排在最後實施,是通過百分比推動的一種簡單方式。

4、效果回饋。一般,規範能夠在效率上、協作上、品質上推進你的工作。一些「最佳實踐「能夠很好的鼓舞整個演進流程。

人工review

經常組織項目review會議,通過不斷的重複達到你的目的。提前找出項目中的典型案例,對不合規的程式碼指出建設性的改進。注意一定要提前了解項目,半吊子的review只會讓別人對規範的正確性產生懷疑。

自動化工具檢測

將規範抽象成一系列工作流,使用支撐工具進行過濾。通過不斷的負回饋進行推進。比如,某些jar包的衝突檢測、命名方式,都可以在持續集成系統中進行判斷。研發只要錯上一兩次,這種約定就基本上在腦海中了。

基礎運維和基礎架構是做這些自動化工具最佳的場所。這也是哪怕某個開源方案再成熟,也要封裝上一層的原因:你可以針對約定和規範編程。

規範和研發文化的推進

每一種規範,對應著一種公司文化,或者代表公司的不同階段。

趨向謹慎的公司,會選擇複雜的流程規範,制約所有員工的活動,避免越軌操作。此類公司生產事故會比較少,因為戰線拉的很長很長,使用普通員工的人海戰術即可完成工作。

本性活潑的公司,流程規範會比較輕量,通過高品質的研發對約定的認同來演進產品。是創新的土壤,對新需求響應快速。

規範和研發文化相輔相成,伉儷情深。

範例

例子:Feign jar包的發布規範。

SpringCloud通過feign方式進行RPC調用,我們採用了發布api jar包的方式進行協作。但隨著項目的增多,jar包的管理成為了顯著的問題。為避免因版本升級、變更引起其他的線上問題,保持線上環境jar包的穩定性,特制定此規範。

jar包依賴

發布的api jar包應該盡量少的依賴其他資源。也就是dependencies部分應該越少越好。依賴必須加入<scope>provided</scope>,版本交由使用方說明。

jar包的名稱和提供的內容,必須可讀:能夠根據字面意思猜測其功能。

jar包升級

jar包一旦發布,必須保證其向下兼容的特性,具體體現在:

一、不允許修改所提供的欄位的類型,比如由int改成String

二、不允許刪除和變更欄位,比如修改欄位的大小寫

三、服務提供方需處理某些參數為空的情況,做到向下兼容

四、對於以上限制無法完成的更改,可提供新的介面和參數,對外暴露新的介面。老介面依然保持可用,直到確認無任何調用

五、不允許使用多態對介面進行擴展,請提供不同的名稱!

六、提供清晰的介面參數,不允許萬能介面(老項目可逐步迭代)

七、介面變更,必須提供wiki文檔

版本號

項目採用三段版本管理,如 2.8.15

版本段

意義

2

大版本迭代,一般是非常重要的技術升級或者業務重構

8

重要的bug修改和大版本迭代

15

大版本迭代中的bug修改,依次遞增

不接受非三段的版本號!jar包不接受覆蓋式發布,需升版本號!

jar包類型

以SNAPSHOT結尾的jar包

如 order-api-1.0.1-SNAPSHOT.jar ,SNAPSHOT為大寫。

研發使用dev帳號發布的jar包,以SNAPSHOT結尾,不帶SNAPSHOT的無法發布到私服。

SNAPSHOT在非線上環境使用,供研發調試介面、測試功能,請在上線前去掉SNAPSHOT,並告知SRE發布正式jar包。

此種jar包所有人都有許可權發布,依賴項目只拉取最新的jar包,各項目成員自行解決開發測試中的衝突問題。

mvn dependency:tree 命令可以查看所有的jar包

不帶SNAPSHOT的jar包

如 order-api-1.0.1.jar

線上正式環境使用,使用SNAPSHOT結尾的jar包上線,會打包失敗。

此種jar包僅SRE有許可權發布。

jar包資訊維護

由於jar包數量多,功能繁雜,需要維護jar包的變更資訊。

目前使用wiki維護jar包的升級資訊。

結尾

規範這東西,不能亂搬。小螺絲扣大螺母,和沒套有啥區別?

嘿,說的就是你,先別搬什麼阿里java開發規範了,你自己的程式碼都爛透了,還真以為有通吃的規範啊。

Tags: