循序漸進的中臺研發(fā)

一、前言

1.1 讀者對象

本文適合后端資深工程師、架構(gòu)師,或從事中臺、平臺類研發(fā)的普通工程師閱讀。中臺技術不是一門具體的軟件技術,沒有一定之規(guī),需要從業(yè)者根據(jù)自身業(yè)務特點選擇適合的設計。本文根據(jù)筆者親身中臺項目經(jīng)歷寫成。筆者負責的是中型互聯(lián)網(wǎng)公司的核心業(yè)務系統(tǒng)的中臺化改造工作,考慮到自身業(yè)務規(guī)模和研發(fā)資源,我們的改造工作從細節(jié)做起,逐步探索適合我們自己的中臺之路。所以本文強調(diào)要循序漸進地將業(yè)務系統(tǒng)改造為業(yè)務中臺。其中的內(nèi)容不算高大上,而是腳踏實地。此外,筆者負責的系統(tǒng)的業(yè)務模型側(cè)重流程化,所以在介紹一些具體做法時難免會存在局限性,無法顧及更廣泛的場景,請讀者見諒。

1.2 中臺思想的產(chǎn)生

中臺強調(diào)的是復用,而復用這個思想在軟件領域早已有之。在 Martin Fowler 的《重構(gòu)》一書指出了代碼重復,即代碼沒有被復用是首當其沖的壞味道。而業(yè)務系統(tǒng)的能力無法被復用,同樣也是業(yè)務系統(tǒng)架構(gòu)的壞味道。但就如同重復的代碼不易被發(fā)現(xiàn)一樣,重復的業(yè)務能力更加難以發(fā)現(xiàn)。這些業(yè)務能力重復的壞味道隱藏在了代碼實現(xiàn)、系統(tǒng)架構(gòu),甚至組織架構(gòu)中。因此,需要架構(gòu)師、業(yè)務負責人獨具慧眼,發(fā)現(xiàn)并解決這些問題,從而提高業(yè)務研發(fā)效率和質(zhì)量,加快業(yè)務發(fā)展速度,降低業(yè)務試錯成本,提升系統(tǒng)技術升級效率,打破程序員996的死結(jié)。而這一切最終就形成了我們現(xiàn)在所說的中臺。

二、循序漸進的中臺研發(fā)

強調(diào)中臺研發(fā)要循序漸進,原因是中臺研發(fā)難度高,并且目前可參考的案例不多(介紹較詳細的主要是阿里的 TMF)。因此不能對中臺盲目跟風、急功近利、倉促上“碼”。否則,不僅無法起到中臺應有的作用,反而還會打擊團隊士氣、浪費研發(fā)資源。

如何循序漸進地落地中臺呢?前文說過,中臺要解決的是業(yè)務能力重復這個壞味道,而這個壞味道隱藏在三個層面:代碼實現(xiàn)、系統(tǒng)架構(gòu)、組織架構(gòu)。這三個層面的問題彼此影響,但總體而言,代碼實現(xiàn)的問題最為底層,也往往是大部分問題的根源。而問題越往后,層次越高,難度越大。所以,落地中臺,我們最好也要先從最簡單的代碼實現(xiàn)層面入手。

看到這里,可能有人要笑了,難道中臺就等同于代碼重構(gòu)嗎?當然不是,筆者只是建議先從代碼問題入手。當然,如果研發(fā)資源充足,又有對中臺研發(fā)經(jīng)驗豐富的架構(gòu)師帶領,那自然可以有更高的起點。但這樣的條件不是所有企業(yè)都具備的。當然,中臺的目標是業(yè)務可配置化,將業(yè)務研發(fā)變?yōu)榈痛a,甚至無代碼的配置過程,但支撐起低代碼、無代碼的系統(tǒng),實際還是需要用代碼來實現(xiàn)。

說這么一大段,筆者的意思無非是說,中臺固然美,但代碼始終是基礎。代碼寫不好,中臺不要想。

話題回到如何循序漸進地落地中臺。對這個問題,筆者同樣認為也需大致三個階段。這三個階段和壞味道的三個層面不是一一對應,但反映了相同的由簡到難的思想。

中臺實施的三個階段:

  1. 重點突破:通過解決重點業(yè)務場景中的業(yè)務研發(fā)效率低,業(yè)務能力復用難的問題,探索適合本業(yè)務本系統(tǒng)的中臺方向,積累經(jīng)驗。
  2. 由點及面:在突破了重點方面的復用難題之后,將現(xiàn)有的中臺改造經(jīng)驗推廣至更多業(yè)務場景,同時探索針對新問題的解決之道。
  3. 打破邊界:在解決現(xiàn)有業(yè)務系統(tǒng)的問題之后,要將開拓思路,將業(yè)務中臺的能力拓展至完整業(yè)務鏈路,打破系統(tǒng)和組織的邊界,而非僅局限于現(xiàn)有系統(tǒng)范圍。

2.1 重點突破

俗話說萬事開頭難,這一步很關鍵,往往也很難走。筆者在17年下半年開始對所負責的重點業(yè)務系統(tǒng)進行改造時(后續(xù)簡稱項目 A),實打?qū)嵉幕税肽陼r間。這其中自然有筆者之前對中臺研發(fā)毫無經(jīng)驗的原因,但也部分說明了此項工作的不易。

以筆者經(jīng)驗為例,此階段的工作又可分為三個部分:

  1. 組件拆分
  2. 組件裝配
  3. 業(yè)務 DSL

2.1.1 組件拆分

中臺的核心思想是復用,但如果業(yè)務系統(tǒng)是一塊鐵板或一團亂麻,那就談不上復用,這時就需要拆分。我們要將系統(tǒng)拆分不同的業(yè)務組件。通過分析現(xiàn)有需求、設計文檔、系統(tǒng)代碼,以及和具體研發(fā)工程師、產(chǎn)品經(jīng)理,包括測試人員分析討論,找出此重點業(yè)務場景下歷史和后續(xù)可能需求之間的變與不變。接下來,將不變的部分梳理規(guī)范,使之成為可以復用的核心業(yè)務流程。而變化的部分,在核心業(yè)務流程之上,通過定義并實現(xiàn)擴展點的方式給予支持,形成擴展組件。

整個系統(tǒng),就是由核心流程和擴展組件組成。

但俗話說,軟件開發(fā)唯一不變的就是一直在變。所以,現(xiàn)在的核心組件,可能會成為以后的擴展組件。所以核心業(yè)務流程也需要按照面向接口編程的原則進行抽象定義,使之易于擴展替換。

2.1.2 組件裝配

有分便有合。業(yè)務系統(tǒng)拆分為組件之后,還需裝配在一起,形成整體后方可使用。那業(yè)務組件如何裝配?使用 Spring,這往往是程序員首先想到的組件裝配方式。但我們需要的功能要遠超出 Spring 所能提供的范圍,主要包括:

  • 組件路由:為不同的業(yè)務場景或業(yè)務請求選擇合適的業(yè)務組件。通常使用職責鏈模式實現(xiàn)。
  • 組件編排:將組件編排為一個整體,實現(xiàn)完整功能。組件的組合有多種方式,簡單的串聯(lián)、狀態(tài)機、職責鏈等都是組件編排的實現(xiàn)方式。
  • 組件配置:組件是一個靜態(tài),在運行時為同一個組件指定不同的配置,從而適應不同的場景,使之易于復用。

因為篇幅限制,本文不深入介紹組件裝配的實現(xiàn)方式,留在后續(xù)文章中詳解。

2.1.3 業(yè)務 DSL

業(yè)務 DSL 的核心思想是使用領域?qū)僬Z言,或者配置語法,實現(xiàn)簡潔高效且易于理解的業(yè)務配置化能力。

上一小節(jié)提到的組件裝配,因為所需功能超出了 Spring 這樣的框架的功能范圍,所以需要自行設計實現(xiàn)。在為自己業(yè)務中臺設計組件裝配功能時,首先要思考如何使用,然后再思考如何實現(xiàn)。如何使用是方向,只有方向?qū)α?,實現(xiàn)才有意義。

在筆者負責的中臺類項目中,首先要解決的痛點是接口適配問題,即如何讓不同業(yè)務場景下的不同接口和不同參數(shù)組合對于上層系統(tǒng)來說變成一個統(tǒng)一的接口。因此,筆者項目中的業(yè)務 DSL 的主要內(nèi)容是由配置路由信息、請求參數(shù)映射配置、響應數(shù)據(jù)解析配置等三部分組成。而實際的組件路由等能力則隱藏在了 DSL 實現(xiàn)細節(jié)中。

2.1.4 小結(jié)

image

筆者在對項目A落地后實施的幾個業(yè)務需求研發(fā)工作進行評估后發(fā)現(xiàn),通過中臺對業(yè)務研發(fā)效率的提升,節(jié)約了至少3個人月的開發(fā)時間。雖然項目A本身花費了同樣3個人月的研發(fā)時間,但通過前期技術架構(gòu)升級,加快了后續(xù)業(yè)務需求的研發(fā)速度,相當于用當下的時間為未來發(fā)展鋪平了道路。節(jié)約的這3個月中,有對支付成功率顯著提升的業(yè)務改進,也有業(yè)務重點發(fā)展方向,保守估計也會有千萬元級的收入提升,收益顯著。更重要的是為后續(xù)系統(tǒng)研發(fā)工作指明了方向,使得業(yè)務研發(fā)和技術改進可以兼顧,并相互促進,不斷提升,形成良好的正向循環(huán)。

2.2 由點及面

接下來我們要將中臺能力從一個場景推廣到多個業(yè)務場景,這時需要針對不同場景配置不同業(yè)務流程。在具體實現(xiàn)時會涉及如業(yè)務身份識別、擴展點定義、組件編排、組件路由等具體問題。

2.2.1 業(yè)務身份識別

因為中臺要支持多個業(yè)務方,很多業(yè)務場景,因此這里涉及到業(yè)務身份的識別問題。通過識別業(yè)務身份,定位不同的業(yè)務配置、數(shù)據(jù)模型等內(nèi)容,避免不同業(yè)務的執(zhí)行過程相互干擾。

我們的業(yè)務并不需要使用阿里的“人貨場”這樣三級復雜的業(yè)務身份抽象規(guī)則,而是簡單的分為了業(yè)務方 + 業(yè)務場景兩個維度。通過網(wǎng)關服務,將業(yè)務身份固化在對遺留接口的定義中。對于新接入的業(yè)務方,采用顯式傳遞業(yè)務身份標識 + 密鑰的方式實現(xiàn)。

2.2.2 定義擴展點

為了使中臺具有適合不同業(yè)務場景的能力,我們將中臺之上的各種業(yè)務組件都定義為擴展點。我們的擴展點分為兩級:Step 和 Action。Step 是一級擴展點,Step 可以通過組件編排成為不同的流程 Flow。Step 背后基于 StepTemplate 實現(xiàn)。StepTemplate 對應的就是具體的編程實現(xiàn)的業(yè)務組件。StepTemplate 需要依賴 Action 完成具體的業(yè)務邏輯。Action 的物理形式是接口,擴展包的配置文件中需要指定哪些接口被定義為了 Action。如果一個接口被定義為 Action,那 Step 通過配置聲明,就可以靜態(tài)或動態(tài)地選擇適合的 Action 完成整個業(yè)務處理。

2.2.3 流程(組件)編排

Step 可編排組合為流程。為簡化設計和使用,我們的流程為極簡流程,僅為單向流程,不包含條件判斷和循環(huán),后續(xù)會增加并發(fā)流程,但僅此而已。這么做是考慮到現(xiàn)有需求不需要復雜的流程編排,同時可以簡化設計實現(xiàn),并方便使用者定義流程,方便調(diào)試跟蹤。

為了實現(xiàn)對流程編排的靜態(tài)檢測功能,我們在 Step 中實現(xiàn)了對輸入輸出參數(shù)的配置功能,通過檢查流程上下步驟之間出入?yún)⒌钠ヅ淝闆r,靜態(tài)檢查流程配置的正確性。

2.2.4 組件路由

上一小節(jié)的組件編排只能定義一個粗粒度的業(yè)務流程,在這個粗粒度的業(yè)務流程中,一定存在各種分支流程。那這些分支流程需要對應不同的業(yè)務策略。這里的一個問題就是如何將特定請求路由至特定策略中。這便是組件路由的意義。

組件路由有兩種實現(xiàn):表驅(qū)動和職責鏈。表驅(qū)動雖然高效,但只能解決簡單業(yè)務。因此,職責鏈是應用更普遍的實現(xiàn)方式。在我們的中臺項目中,Step 對 Action 的動態(tài)路由就采用了職責鏈的設計。具體職責鏈能力有平臺提供,業(yè)務組件只需聲明配置即可擁有職責鏈的能力。

在阿里 TMF 1.0 中,過長的職責鏈會導致節(jié)點之間相互影響。如果某節(jié)點的過濾規(guī)則不完備,就可能導致錯誤的選擇。要解決這一問題,需要引入配置隔離,例如我們的中臺項目中每個 Step 對其 Action 職責鏈中的候選者可進行配置,控制范圍。

2.2.5 小結(jié)

image

在更多的業(yè)務場景中落地中臺,必然會遇到各種技術和業(yè)務問題。因篇幅原因無法一一介紹,而我們的中臺系統(tǒng)能力也是在不斷建設完善過程中。

2.3 打破邊界

上一個階段是在一個團隊所負責的業(yè)務系統(tǒng)上實施中臺改造,在逐步將上述關鍵技術點完成后,就可以考慮進入第三階段。第三階段的目標是打破團隊組織架構(gòu)的邊界,將完整業(yè)務鏈路上原本分散在各系統(tǒng)上的業(yè)務能力下沉到業(yè)務中臺之上。這里的技術工作同第二階段沒有本質(zhì)區(qū)別,就是繼續(xù)完善中臺的設計,使業(yè)務能力可以快速正確的被復用。

這一階段的難點不僅在于技術,更在于人。如何讓各層面的領導層認同中臺化的工作,并推動相應組織架構(gòu)的調(diào)整,這既需要現(xiàn)有中臺系統(tǒng)貨真價實的技術能力以及成功案例支持。同時也需要領導層對中臺這一方向的認可。這需要中臺工作負責人從技術、業(yè)務,以及公司長遠發(fā)展角度去推進中臺項目在更大范圍落地。

因為這一部分的工作已經(jīng)超出了技術范疇,所以這里就不再具體介紹。

三、總結(jié)

筆者早期的職業(yè)生涯中,更多的是關注如何通過編程技術,如代碼重構(gòu)、設計模式、單元測試等手段,提高代碼的復用能力。但經(jīng)歷過多家不同類型的軟件公司之后,筆者發(fā)現(xiàn)寫壞代碼的速度永遠快于好代碼,代碼重構(gòu)的速度永遠趕不上代碼退化的速度。因此,隨著中臺的風潮,我的觀點也發(fā)生了變化:代碼的問題,不能單純靠代碼的方法解決,而是需要通過以架構(gòu)手段為主的綜合治理;架構(gòu)師寫代碼的目的在于讓普通開發(fā)人員少寫代碼。即便普通開發(fā)人員要寫代碼,那一定要個架構(gòu)師的代碼隔離開來。

筆者的這些思想其實是和中臺思想不謀而合。在18年筆者所負責的系統(tǒng)落地了第一階段的中臺化改造之后,業(yè)務研發(fā)速度成倍提高,系統(tǒng)質(zhì)量持續(xù)穩(wěn)定,手下的小伙伴也終于不用擔心項目搞不完要加班了。第一階段的成功讓我們信心倍增,所以我們從19年開始就在構(gòu)思如何在更大范圍內(nèi)落地中臺。當然,這不是一個簡單的事情,沒有參考,研發(fā)資源短缺,都限制影響了中臺的研發(fā)速度,但我們相信只要業(yè)務持續(xù)發(fā)展,那中臺研發(fā)就是有意義,有回報的工作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容