一個企業級的應用,即使是(shì)諸葛亮級別的設計人員,最初的考慮都不可能盡善(shàn)盡美,會存在(zài)設計不夠或者設計過頭的情(qíng)況。加上業務的發展可能與(yǔ)當(dāng)初的推想不(bú)一致,這樣就使得上線初期穩穩當當的一個係(xì)統(tǒng),在若幹輪的需求驅動下,就變成了補丁之上打補丁,活成自(zì)己討厭的樣子。當然,我(wǒ)們也可以(yǐ)把鍋往最初的(de)設計和(hé)開(kāi)發上麵扔(rēng),但(dàn)還是(shì)解決不了(le)係統維護越來越困難的事實,“累了,毀滅吧”想推倒(dǎo)重構的(de)想法其實是(shì)大家喜聞樂見的。
然而對於企業(yè)級的應用,係統的重構,不管是對(duì)軟件供應商,還是對(duì)企業(yè)本身,還都是個痛苦的過程。重構不僅要需要考慮眾多的技術、業務因素,也需要考驗(yàn)甲乙(yǐ)雙方的管理(lǐ)水(shuǐ)平,協調能力等等(děng)。如(rú)果涉及到軟件供應商(shāng)的更換,那麽這個事情就難上加難了。
大家所期待的,是重構後係統更加(jiā)適應現在的業務,使新的需求(qiú)、新的業務開發更加絲滑,大(dà)家所擔心的,其實是傷(shāng)筋動骨後,係統如何能夠保證業務(wù)的穩(wěn)定性和準確性,大家對於重構(gòu)的態(tài)度其(qí)實是:像一個少女等待他(tā)的男朋友,既(jì)怕他不來,又怕他(tā)亂來。
對於喜歡(huān)的部(bù)分,主要靠設計和(hé)開發的大牛們來實現,而對於害怕的部分,就主要看我們交付的兄弟們(men)了。
雖然如此,但是現在如果去百度一下,如何確保係(xì)統重構(gòu)時的業務準確性,甚至你去問chatgpt(沒錯,我問過了),得到的答案絕大部分與設計和開發有關,卻很少有測試和實施的部分。
主要原因是實施方麵與業務相關性太強了,要總結這方麵的共性(xìng),無非就(jiù)是(shì)數據遷移要準確(què)、回(huí)歸(guī)測試要充分之(zhī)類的,至於(yú)如何保證,那就(jiù)要開始說業務特性,但說業務,有點無從下嘴的感覺。
當然,今日份的骨(gǔ)頭,我啃了。
電信運營商(shāng)的計費係統可能是最不敢在重構時(shí)亂來的企業級應用了(le),“計費”這兩(liǎng)個字就說明需要極強的(de)準確性。在計費係統的重構實施中,對(duì)於如何確保業務準確性,形成(chéng)了自己固(gù)定的一個自己固(gù)定的套路,也就是對賬。計(jì)費係統的工程(chéng)實施人員,很多從事的第一項工作就(jiù)是對賬。當然,對於發量充足(zú)的新手(shǒu),這時候自然(rán)要發出靈魂三(sān)問:
我是誰?你是計費係統實施人員。
我(wǒ)從哪兒來?剛從公司總部出差而來。
要(yào)到哪兒去?你要(yào)對賬。什麽是對賬?
(頭發絲落在了地上,沒聽見一點(diǎn)聲響,憂傷的悲傷的音樂響起)。
本(běn)文的目的,首先(xiān)是介紹一下(xià)計費對賬的這個套路,給新手一些指引,也順便讓計費專業的同(tóng)學更好(hǎo)地理(lǐ)解計費係統的實施(shī)過程。當(dāng)然,高度還是要有,也想對給企業(yè)級應用重構實施(shī)的準確性保證提供一點方法論,給其他專業的同學一點點那種“他山之石(shí)”的(de)感覺。
對於被這麽硬核強(qiáng)扯到“對賬(zhàng)”這個名詞一臉無辜(gū)的同學(xué),還是要先(xiān)給對賬做個定義,這個詞源頭應該來自於會(huì)計專(zhuān)業(可能與計費係統的前身(shēn)與財會有很大關係有關),在計費專業,對賬這個詞的意思(sī)一般是,對重(chóng)構前(老係統)和重構後(新(xīn)係統)的係(xì)統運行的結果,進行差異比對的過程。隻有這個比對的差異到了(le)足夠小,一般是一(yī)致率到99.99%,才說明新係統的計費結果是準確的。你(nǐ)可能認為這種手段比較極端,但是(shì)本著(zhe)我能崩潰,程序不能崩潰的(de)原則,這(zhè)種手段其(qí)實是很必要的,不然計費係(xì)統永遠沒底氣(qì)上線。
聰(cōng)明如你,其實已經發(fā)現,對賬其實是一種回歸測試(shì)手段(duàn),因為如果對任何程序:“輸入 + 程序處理 = 輸出”的話,那麽對賬就是對輸出的比對,用來確認新的程序是否存在(zài)不能兼容(róng)老的程序的問題。
也就是說(shuō),對賬其(qí)實就(jiù)是使(shǐ)用相同的數據源輸入(有時候未必能做到,可以使用盡可能一致),經過不同的(de)程序處理(老係統和新係統)後,通(tōng)過比對輸(shū)出,來對新程序的(de)正確性進行判斷,並且通過修改程序來糾正新程序的錯誤的一個過程(chéng)。當然,對(duì)於一(yī)個大的係統重構,這個程序處理應該替換為係統處理,因為整個大的(de)係統處理的流程、配置、資料結構都可能出現大的修改(gǎi),差異的原因,也(yě)往往需要從程序、流程、資料、配置等幾個大的方(fāng)麵去尋找。
計費對賬在計費係統重構時,非常重要,甚至可以(yǐ)說,工程實施的(de)很多工作(zuò),都是(shì)圍繞對賬來進行的。基本上,計費係統的(de)所有工程實施人員,從事的第一項工作就是對賬,其實這並不是因為對賬是個簡單的工作,恰(qià)恰相反,對賬是所有工程實施工作中最難(nán)的,它需(xū)要有(yǒu)紮實的業務功底,也需要非常熟悉新老係統。
那為什麽基本上所有的工程實施(shī)人員第一課都是對賬呢?原因很簡單,從業務學習的角度來說,對賬是一個最(zuì)好的切(qiē)入方式,也是一個相對容易上(shàng)手的方式。但是,也因為這個工作要做好,實際比其他任何的工程實施工作要複(fù)雜,要難,所以基本上所有的新手壓力(lì)都(dōu)非常巨大。
首先要說個無(wú)用的(de)廢(fèi)話,對賬的(de)準備最重要的是,對於計費係統的重構實施的進度,到了能夠對賬的程度。這(zhè)其實也是實(shí)施中一個(gè)重要的裏程碑點:
研發方麵,至少已經到了大部分需求(qiú)都已經開發完成(chéng)並(bìng)測試(shì)通過。
部署(shǔ)方麵,程序已(yǐ)經在新的部署環境(jìng)下部署完成並且穩定運行。
數據遷移方麵,基(jī)本的靜態資料(批價配置)和用戶資料數據遷移已(yǐ)經可以完成。
當(dāng)然,大家都懂這些事(shì)情不卷(juàn)是不可能的,不能指望所有(yǒu)的料都準(zhǔn)備好了再下鍋,所(suǒ)以如果沒有完成的部分,要留(liú)下遺留問題列表,免得對賬的兄弟(dì)在這些坑下麵越挖越深(shēn)。
除了項目進(jìn)度已經到了可以對賬的程度,對賬本身還需要如下準備:
這個可能很多人存在疑(yí)問,老係統的程序輸出結果(清單(dān)、賬單等)在老係統就有,而新係統既然已(yǐ)經能(néng)夠部(bù)署完成,準生產環境已經(jīng)具備,那麽環境還存在問題嗎?主要(yào)需要說明的是,我們盡量不要使用老係(xì)統程序曆史的輸出結果(guǒ)(生產環境的輸出(chū)結(jié)果)來比對。因為我們要保證(zhèng)係統的輸入是相同的,這個輸(shū)入,不僅僅包含計費係統要處理的數據源(話單),也包括計費係統的用戶(hù)資料,套餐的配置資料,其實還包括一些更加動態(tài)的資料(如累積量)這些都要(yào)保持穩定,而(ér)生產係統的(de)這(zhè)些資料,都是在不停的(de)變化(huà)中,如果使用生產係統的結果(guǒ),那麽就需要有可靠的手段來能夠排除這些(xiē)變化的(de)部(bù)分,這就加大的(de)對賬的難度。所以,新(xīn)老係統(tǒng)的環境我們(men)還是需(xū)要準(zhǔn)備的。
前麵已經說到,計費的數據源(yuán)不僅僅包含了(le)我們要處理的數據(原始話單),也包括了處理數據過程中要用到的用戶資料、配(pèi)置等(děng)。對於老係統,直接使用生產的備份數據(jù)即可,對於新係統,需要(yào)將這份數據遷移到(dào)新的對賬環境中。
對賬的人(rén)員(yuán)往往是一個團隊,人數看項目的大(dà)小,大的項目可能多達十多人。內部還要分(fèn)組,一般來說,我們按照模塊分組,比如租費、語音、流量等等。除了對賬人員(yuán)以外,配合對賬的(de)角色也不能缺:
係統運行:熟悉新係(xì)統、老係統的運行(háng)人(rén)員都需(xū)要有,負責新老係統的跑賬。
業務專家:熟悉新係統、老係統的業務處理流程和邏輯(jí)的專家,參與差(chà)異(yì)結果分析(xī)和確(què)認。
資料割接人員(yuán):參與資料割接的人員擔任,負(fù)責解釋資料遷移的邏輯,參與差異結果分析和確認。
對賬腳本的作用是(shì)從新老係統(tǒng)的(de)對賬環境抽取輸出結(jié)果,然後對輸出結果(guǒ)進行比(bǐ)對,生成差異。這(zhè)個當然要提(tí)前準備好(現在我們有(yǒu)專門的工具來做(zuò))。對於腳本如何編寫,這涉及到對(duì)賬的方法,在(zài)下文(wén)討論。
之所(suǒ)以認為對賬這個事情,對於其(qí)他的係統有(yǒu)借鑒的意(yì)義,也是因為這個過(guò)程,有很多共通(tōng)的地方(fāng),比如差異的生成,其實很多係統都有類似(sì)的方法來比(bǐ)對兩邊(biān)數據的(de)一致性,大家的方法也都差不多。
要(yào)生成兩個係統的差異,首先要確(què)定的是,對於處理的結果,我們如何確定是來(lái)自於同一(yī)個輸入的數據源,這就是數據比對唯一字段,一般而言是字(zì)段的組合。在計費係統中,比如語音業務(電話撥打),一般就是用計(jì)費號碼、開始時間、結束時間標(biāo)記是否同一條話單(同一個(gè)數據(jù)源),在差異生成前,應該先確定(dìng)這三個字段(話單屬性(xìng))是否可以做為唯一字段。
在選擇唯一字(zì)段的時候,需要盡可能的選用不是程序產(chǎn)生的屬性,而要選用話單數(shù)據源中就有的屬性,比如對於某些交換機產生(shēng)的話單,結(jié)束時間並不會填,由開始時間+時長計算出來,這(zhè)時候,就最好使用開始時間和時長做為唯一字段。當然,如(rú)果確定一個屬(shǔ)性新老係統都絕對不會存在算法差異,作為唯一字段也是可行的,現在計費對於語音業務,計費號碼一般也是(shì)通過話單類型(主被(bèi)叫、呼轉等)和主被叫號碼判斷而(ér)來,不會存在差異,也可以作(zuò)為(wéi)唯一字段使(shǐ)用。
比對字段確(què)定哪些輸出的結(jié)果需要和老係統一致(zhì)。比如對於計費,金額是最(zuì)敏感的字段,肯(kěn)定需要參與比對,同樣(yàng),一般參與比對(duì)的還有賬務科目(涉及到賬單展示和財務列收),這就能夠(gòu)確定金(jīn)額和賬務科(kē)目是比對字段(duàn)。
參考字段的意思(sī)就是對賬分析原因時,可(kě)能會用到的(de)字段,比如新老係統(tǒng)的批價的費率標記,計費時(shí)長等等(děng),這些字段隻用來做參考而(ér)放入對賬結果中。
確定這(zhè)三類字段後,對賬腳本或者程(chéng)序使用唯一字段,生成如下四種記錄:
老有新無(wú):老係統存在的結果記錄在新係統中不存在(zài)。
新有老無(wú):新係(xì)統存在的結果記錄在(zài)老係統中不存在。
不一致:新(xīn)老係統都存在此(cǐ)記(jì)錄,但是比對字段不一致。
一致:新(xīn)老係統都存在此記錄,結果也一(yī)致。
很多剛開始接觸對賬的新手,會不明白為何(hé)有新有老無或者老(lǎo)有新(xīn)無(wú)的差異。這種差異產生的原因,一方麵是因為我(wǒ)們的程序(xù),不(bú)僅會輸出正常有處(chù)理(lǐ)結果(guǒ)的話(huà)單(dān),也會輸出一些因各種原因無法(fǎ)處理的錯單,而實際上,計費的整個流程中,有多個程序在(zài)處理,如預(yù)處理、批價、合賬(zhàng)、入庫等流程(chéng),在每一步,都可能產生(shēng)錯單。如果某條原始(shǐ)記錄,在某個流程中處理成了錯單,那(nà)麽在(zài)結果中就無法找到,這就(jiù)造成了新(xīn)有老無或者老有新無的情況。當然還有一(yī)種可能,就是因為新係統的業務處理規則與老係(xì)統不同,故意拋棄了一些話(huà)單不進行處理,比如一些原始話單的時長為0的話單,就可(kě)能存在老係統不處理,新係統處理的情況,這種情況下,也會造成老有新無和新有老無(wú)的情況。
輸出差(chà)異結果後,就開始對差異的結果進行分析。分析結果,了解新老係統的處理流程和處理邏輯是非常必要的。
前麵提(tí)到的,輸入+程序處理(lǐ)=輸出。這對於一個(gè)程序,實際是明確的,但是,其實這兒的程序處理,並不是指單個程序, 這中間會有很多個程序(xù),實際(jì)上,是多個(gè)程序。程序(xù)的輸出,也不可能隻包括一種(zhǒng),肯定有多個(gè)的輸出。舉實際的例子,比如語音話單:
輸入 = 聯采(cǎi)話(huà)單。
程序A = 預處理 輸入=聯采話單 正常輸出= 預處理正常話(huà)單 過濾輸出 = 預處理過(guò)濾話單 錯單輸出= 預處理錯(cuò)誤話單
程序B = 撿重 輸入=預處理正常話單 正常輸出 撿重(chóng)正常話單 錯單輸出(chū)= 撿重錯誤(wù)話(huà)單
程序C = 批價 輸入= 撿重正常(cháng)話單 正常輸(shū)出 = 批(pī)價正常話單 錯單輸出 = 批價錯誤話單
程序D = 合賬入庫 輸入= 批價正常話單 正常輸出 = 合賬正常話單 錯單輸出 = 合賬錯誤話單。
甚至在老係統或(huò)者新係統(tǒng),可能將程序A分拆成A1,A2,這些都是很正常的情況。而實際上我們比對的結果,一般來說,是合賬後的正常話單(dān),所(suǒ)以(yǐ),產生差異,在期間任何一個環節都可能出現(xiàn)問題。
這些話單主(zhǔ)要是因為在中間這麽多程序中,都會因為各種無法處理(無法找到費率、無法找到用戶資料等等)而丟掉一些話單(錯單),或因為處理規則不同,過濾(lǜ)一些話(huà)單(過濾單)。造成比對中存在老有新無和新有(yǒu)老無的(de)情況(kuàng)。所以(yǐ)分析的要點是:
對於結果不一致的話單,則更加複(fù)雜。對於計(jì)費,結(jié)果的不一致往(wǎng)往因為找到了不同的費率引起,前麵提到的參考字段有有了大的用處。
對於計(jì)費,一般(bān)來說,不一致的差異一般都是這三種情況造成:
我們的比對的第一(yī)步,是從(cóng)資料開始,首先,就是比較資(zī)料割接的對不對(duì),原來老係統,用戶有ABC三個銷售品,而在新係統隻有AB兩個,老係統用C銷售品進行了批價,這時候你就要去質疑資料割接(jiē)的人員,為何C銷售品在係統中沒有體現,是否存在問題。
麵對(duì)上麵同樣的問題,你先去(qù)找了銷售品割接人員,銷(xiāo)售品割接人員告訴你,已經跟(gēn)配置約定好,原(yuán)來(lái)的BC銷售品,目(mù)前都對應到B銷售品,那麽,你就要去檢(jiǎn)查(chá),是(shì)否B銷售品涵蓋了原來BC銷售品所有的批價邏輯?如果檢查到(dào)有(yǒu)資費缺失,那就要去聯(lián)係配置人員,為何這(zhè)條資費沒有被配(pèi)置。
如果檢查到配置是有的,條件也(yě)符合,那最終的懷疑對象是程序邏輯,程(chéng)序為何沒有按(àn)照配置(zhì)進行批價?這時(shí)候去找研發人員,跟配(pèi)置人員與資料割接人員一起討論。
如果(guǒ)係統重構的新老係統廠家不一樣,那麽對於新係(xì)統廠家而言,老係統(tǒng)的程序方(fāng)麵的黑盒子(zǐ)很多,甚至於對部分(fèn)對賬的新手,新係統都可以叫(jiào)做黑盒子,正因為這樣所以在對賬之前,需要請教新老係(xì)統(tǒng)的業務專家,至少熟悉兩(liǎng)邊的處理流程,清楚(chǔ)流程中每一個(gè)程序的輸入輸出(chū),對大概的處理邏(luó)輯也需要做(zuò)一個大致(zhì)的了解。另外(wài),也需要請教用戶資料、靜態資料(資費配置)的割(gē)接人員,新老係統的模型差(chà)異以及割(gē)接(jiē)邏輯。當然這些問題也基本上都有文檔輸出(chū),比如前期的流程調研文檔,用於數據割接的(de)模型差異文檔,用戶某些單(dān)獨需(xū)求的專題設計文(wén)檔等等,這些文檔都需(xū)要一一看過先有個整體(tǐ)的印象。
在(zài)對賬期(qī)間,不(bú)管是新老係(xì)統的業務(wù)專家還(hái)是程序研發(fā)人員還是數據割接人員,他們(men)都會很(hěn)煩.因為(wéi)對賬的團隊人會非(fēi)常之多,但是,作為對賬人員的你肯定(dìng)需要不停的是騷擾他們,你的目的是,不管是新係統還是老係統,不管是(shì)程序(xù)還是資料還是配置,這中(zhōng)間的黑(hēi)盒子越來越(yuè)少。
對於新老係統的對賬環境,有時候硬件環境並不能與生產等同,所以運行大量(liàng)的數據還是需(xū)要很多的時間,所以,對賬中一般會采用這(zhè)樣的原則:從小到(dào)多,從代(dài)表業務到全業務這(zhè)種方式.所謂從小到多,是指先對小的業(yè)務量,比如一天,從代表業務到全業務,是指先完成某類業務(如語音),確(què)認資料割(gē)接和配置割接沒有大的問題後,再進行其他業務的(de)對賬。這樣做的(de)好處一個是不需要把大量的時間放在運行上,另外也不會(huì)被(bèi)海量的數據搞得對賬(zhàng)無從下手。當(dāng)然,一般(bān)在對賬之初,就會列出一個對賬的計劃,會包含(hán)這(zhè)個部分的內容。這是一個典型的例子:

對賬開始的時候,初始的差異肯定是(shì)非常大的,首先還是不要被巨大的差異嚇倒(dǎo),因為大的差異,完全可能就是那麽幾個原(yuán)因引起。
找(zhǎo)差異時,首先(xiān)要找(zhǎo)共(gòng)性最多(duō)的去分析(比如按(àn)照(zhào)參考字段的差異去分析)。
找到差異後,要把同類錯誤的話單更新原因,再找下一類沒(méi)有更新原(yuán)因的差異,也要(yào)盡量找共性最多的。
切記前期對賬時,如果某條話單找不到原因,不要鑽牛角尖,因為這種話單(dān),可(kě)能被多個原因覆蓋,非(fēi)常難於分析。當你一個個原因找到後,可能問題就解決了。