如何交接復(fù)雜的遺留系統(tǒng)?
一半以上的新項(xiàng)目,都始于交接。交接期有長有短,交接形式多種多樣。不管怎樣,從客戶關(guān)系、團(tuán)隊(duì)工作方式等各方面,交接期都奠定了項(xiàng)目進(jìn)入穩(wěn)定交付或維護(hù)期的基調(diào)。
2020年10月,Thoughtworks的C團(tuán)隊(duì)從客戶團(tuán)隊(duì)交接了一個(gè)有近20年歷史的支付網(wǎng)關(guān)系統(tǒng)。這個(gè)支付網(wǎng)關(guān)主要向英語系地區(qū)的企業(yè)提供信用卡支付,儲蓄卡支付等支付相關(guān)的功能,每個(gè)月的交易額過億。
2021年1月起,C團(tuán)隊(duì)正式接手該項(xiàng)目的日常運(yùn)維工作。不僅需要保證系統(tǒng)穩(wěn)定運(yùn)行,提供7×24小時(shí)On Call支持,還要響應(yīng)日常業(yè)務(wù)的需求,同時(shí)保證整個(gè)支付網(wǎng)關(guān)符合支付卡行業(yè)數(shù)據(jù)安全標(biāo)準(zhǔn)(Payment Card Industry Data Security Standard,縮寫為 PCI-DSS)。
在交接的過程中,團(tuán)隊(duì)面臨很多的挑戰(zhàn),嘗試了很多辦法,同時(shí)沉淀了一些經(jīng)驗(yàn)。我們將通過這篇文章將經(jīng)驗(yàn)和實(shí)踐分享出來,希望幫助到更多人。
挑戰(zhàn)
作為一個(gè)歷史悠久的“大齡”支付網(wǎng)關(guān),在交接過程中我們遇到了一系列的挑戰(zhàn),大致可以分為下面兩類:
1. 業(yè)務(wù)復(fù)雜度高
業(yè)務(wù)上,這個(gè)支付網(wǎng)關(guān)光是在卡支付的場景下就同時(shí)支持8種技術(shù),還有信用卡相關(guān)的安全功能,數(shù)不清的報(bào)表和各種增值服務(wù)。
技術(shù)上,總共有100多個(gè)服務(wù)和300多個(gè)代碼庫,部署在超過200個(gè)EC2上;服務(wù)之間耦合嚴(yán)重;許多服務(wù)沒有部署流水線、沒有測試環(huán)境甚至沒有源代碼;經(jīng)常需要手工操作生產(chǎn)環(huán)境數(shù)據(jù)庫來解決問題;操作系統(tǒng)和軟件包版本非常陳舊等。
項(xiàng)目管理上,沒有總結(jié)和沉淀出完整而清晰的業(yè)務(wù)和技術(shù)文檔。
2. 交接內(nèi)容多、時(shí)間短、范圍不明確
交接開始前,團(tuán)隊(duì)接受到的信息只有100多個(gè)服務(wù)的名字,內(nèi)容非常有限;交接的時(shí)間周期比較緊張(初步計(jì)劃只有30個(gè)工作日),沒有足夠的時(shí)間去了解到系統(tǒng)的所有功能。
實(shí)踐
1. 分階段制定目標(biāo)、建立重點(diǎn)
我們一般如何衡量一個(gè)遺留項(xiàng)目維護(hù)的質(zhì)量呢?
- 短期:至少做到跟前團(tuán)隊(duì)一樣。也就是說,在客戶團(tuán)隊(duì)成員離開時(shí),團(tuán)隊(duì)能具備足夠的知識和技能來處理線上事故和日常業(yè)務(wù)工作。
 - 長期:體現(xiàn)Thoughtworks不一樣的地方。對項(xiàng)目的業(yè)務(wù)、技術(shù)和發(fā)展歷史有足夠了解,足以給出一個(gè)改進(jìn)計(jì)劃,在未來一個(gè)比較長的時(shí)間里落地、給客戶帶來更大價(jià)值。
 
鑒于項(xiàng)目的復(fù)雜度,在有限的交接期內(nèi)達(dá)到這個(gè)目標(biāo)基本是不可能的。但是如果將時(shí)間軸拉長,分階段來實(shí)施,就比較容易做出一個(gè)切實(shí)可行的計(jì)劃;同時(shí),也能最大化交接期的價(jià)值,讓團(tuán)隊(duì)從第一天起就朝著一個(gè)方向努力。
基于此,團(tuán)隊(duì)從實(shí)際情況出發(fā),將項(xiàng)目分為三階段:
通過對項(xiàng)目不同階段目標(biāo)的一致認(rèn)識,減少了一些團(tuán)隊(duì)在交接期的焦慮與慌亂,從而想出更多創(chuàng)造性的點(diǎn)子,并勇敢的嘗試、反饋、迭代,達(dá)到各個(gè)階段的目標(biāo)。
2. 利用C4模型梳理系統(tǒng)架構(gòu)
通常處理的問題都是業(yè)務(wù)問題,如果不能把一個(gè)個(gè)服務(wù)放在業(yè)務(wù)流程中去理解就沒有意義。因此,我們在交接完一個(gè)獨(dú)立服務(wù)或者若干個(gè)有關(guān)聯(lián)的服務(wù)后,都會試圖用C4模型畫出他們的C1(System Context Diagram)和 C2(Container Diagram)兩個(gè)高級別的圖,以可視化的方式展示出系統(tǒng)輸入、輸出和各服務(wù)的依賴關(guān)系。
實(shí)踐證明,畫圖的過程可以幫助大家更好地吸收碎片化知識,有利于整個(gè)團(tuán)隊(duì)將知識匯總和沉淀。同時(shí),相比于反復(fù)的解釋說明,圖是一種更有效的語言。
有些比較獨(dú)立的模塊相對比較容易畫,但是涉及到不同版本API的支付流程,就需要不斷地獲取更多的信息來完善,反復(fù)跟客戶確認(rèn)。有些環(huán)節(jié)甚至在交接結(jié)束后依舊沒能打通或者沒時(shí)間梳理,只能在交接后,作為深入理解期的目標(biāo)繼續(xù)完善。
支付系統(tǒng)C1簡化圖(簡化版)
3. 通過結(jié)對在團(tuán)隊(duì)內(nèi)部分享上下文
在第一階段交接的過程中,我們和客戶團(tuán)隊(duì)是“1+1”的模式進(jìn)行知識交接,業(yè)務(wù)知識是像孤島一樣分散在各個(gè)成員那里。另外,我們團(tuán)隊(duì)又因?yàn)槊總€(gè)人加入項(xiàng)目的時(shí)間和技能背景的不同,對一些背景信息、業(yè)務(wù)上下文、技術(shù)實(shí)現(xiàn)的掌握有一些差距。
因此,在進(jìn)入項(xiàng)目交接的第二階段開始,對于大部分的工作內(nèi)容,我們都通過結(jié)對的方式來進(jìn)行。根據(jù)不同的業(yè)務(wù)和優(yōu)先級,我們劃分了幾個(gè)重要的主題,比如:日常需求相關(guān)的任務(wù),PCI 相關(guān)的任務(wù)和生產(chǎn)環(huán)境的變更等。我們會通過專長和對服務(wù)的熟悉程度分工結(jié)對,讓這兩個(gè)人可以成為團(tuán)隊(duì)內(nèi)相應(yīng)領(lǐng)域的專家。
這樣的好處有主要有:保證對應(yīng)的知識能在團(tuán)隊(duì)中傳播開來,消除知識孤島;避免某個(gè)成員因?yàn)檎埣賹?dǎo)致重要的任務(wù)不能進(jìn)行;重要的線上操作可以多一個(gè)人幫忙檢查。
在安排 Primary On Call 和 Secondary On Call 的時(shí)候,采取“Dev + DevOps”的組合,保證有足夠的技能應(yīng)對線上事故。在線上事故發(fā)生的時(shí)候,兩個(gè)人一起結(jié)對配合處理。
雖然結(jié)對在前期會影響效率,但能確保團(tuán)隊(duì)中至少兩個(gè)人熟悉特定的業(yè)務(wù),最終可以讓整個(gè)團(tuán)隊(duì)擁有響應(yīng)事故的能力。從現(xiàn)在的結(jié)果來看,正是這種結(jié)對的形式,保證了整個(gè)團(tuán)隊(duì)的“高可用”。
4. 通過線上事故演練提升團(tuán)隊(duì)On Call的信心
7 × 24 小時(shí) On Call 對團(tuán)隊(duì)來說,無疑會是一個(gè)非常大的挑戰(zhàn)。在正式接手系統(tǒng)之前,團(tuán)隊(duì)感受到了比較大的壓力。這些壓力一方面是因?yàn)榇蟛糠猪?xiàng)目成員缺少 On Call 的實(shí)戰(zhàn)經(jīng)驗(yàn),另外一方面因?yàn)樵诮唤拥牡谝浑A段里,我們?nèi)鄙賹I(yè)務(wù)實(shí)現(xiàn)細(xì)節(jié)和系統(tǒng)的深入了解。
On Call工程師不僅要參照標(biāo)準(zhǔn)處理流程,還需要在短時(shí)間內(nèi)評估線上問題造成的影響并精準(zhǔn)地解決,那么用以前發(fā)生過的事故來演練就成了我們在深入理解期的最好的學(xué)習(xí)方式。
在正式承擔(dān)On Call的職責(zé)前,我們每個(gè)迭代都會有一個(gè)模擬線上事故處理的活動,主要流程為:
- 組織者會去從過去的線上故障里挑選一個(gè)有代表性的事故來模擬,比如是某一個(gè)與其他網(wǎng)關(guān)集成服務(wù)的事故;
 - 團(tuán)隊(duì)約定2個(gè)小時(shí)來模擬線上事故,組織者還原當(dāng)時(shí)場景,其他成員在不知情的情況下按照自己的理解進(jìn)行適當(dāng)?shù)淖穯?
 - 分成兩個(gè)小組,根據(jù)現(xiàn)有的情況定位問題,并給出解決方案;
 - 組織者進(jìn)行復(fù)盤,梳理相關(guān)知識點(diǎn)。
 
通過以上方式,我們得以快速適應(yīng)On Call的節(jié)奏。到現(xiàn)在為止,我們團(tuán)隊(duì)的每個(gè)成員都有作為Primary On Call的經(jīng)驗(yàn)了。
結(jié)語
在交接的三個(gè)月里,我們持續(xù)地改進(jìn)交接方式,最終將項(xiàng)目成功地從客戶團(tuán)隊(duì)手中接過。無論是交付主管,還是和我們合作的客戶團(tuán)隊(duì)都對我們的工作提出了稱贊。在摸索交接的過程中,我們嘗試了不同的方式讓我們的交接平滑順利,并將對交接有幫助的實(shí)踐分享出來,希望對大家有所幫助。
【本文是51CTO專欄作者“ThoughtWorks”的原創(chuàng)稿件,微信公眾號:思特沃克,轉(zhuǎn)載請聯(lián)系原作者】


















 
 
 







 
 
 
 