本文轉(zhuǎn)載自 下次老板讓你重構(gòu)系統(tǒng)凑术,讓他看看這篇文章
面對遺留的老系統(tǒng)翩蘸,人人都很不爽,都想推倒重來淮逊。但是要如何推倒重來呢催首?
??上個月,有個以前的同事問我:“你在的時候泄鹏,為什么不把原來的系統(tǒng)都重做了郎任,我們明明有實力啊”。
??我說:“我們也做了很多事情嘛命满,系統(tǒng)穩(wěn)定性涝滴、安全性、增加冗余胶台、理清各模塊職責歼疮、API通訊機制的建立、內(nèi)部分層的整理诈唬『啵”
??他說:“對,但我還是想知道铸磅,你為什么不把系統(tǒng)重做了呢赡矢?”
??于是我問:“我離職之后,后來似乎多投了不少人重做系統(tǒng)阅仔?結(jié)果怎么樣呢吹散?”
??他說:“結(jié)果,結(jié)果就是做業(yè)務要同時操作三四套系統(tǒng)……”
??就我所見八酒,把原有系統(tǒng)“推倒重來”的喜好不只程序員有空民,使用者更有。拿我?guī)啄昵暗哪欠莨ぷ鱽碚f,剛?cè)肼毨洗髠兙蛠砀矣懻撓到y(tǒng)重做的打算:需要多少人界轩,多少錢画饥,多長時間,能把原有系統(tǒng)推翻重來浊猾。畢竟大家每天都忍受切膚之痛:速度慢抖甘、經(jīng)常出錯、不安全葫慎、客戶抱怨衔彻、架構(gòu)糟糕…… 所以都想拿出“敢叫日月?lián)Q新天”的勁頭,來個干脆的徹底解決幅疼。
??這種心情可以理解米奸,但在我任內(nèi)“重做系統(tǒng)”一直沒有被提上日程,整個技術(shù)團隊所做的都是“改良”的工作爽篷,內(nèi)容就像我上面說的:系統(tǒng)穩(wěn)定性悴晰、安全性、增加冗余逐工、理清各模塊職責铡溪、API通訊機制的建立、內(nèi)部分層的整理泪喊。這個選擇我有充分把握棕硫,而且在我看來,如果斷然“推倒重來”袒啼,我未必能比繼任者做得更好哈扮,甚至可能更糟糕,因為“推倒重來”絕不是那么簡單的事情蚓再。
??眾所周知滑肉,軟件開發(fā)的難點之一就是控制復雜度
。但是在不同的領域摘仅,復雜度有不同的表現(xiàn)靶庙。對于純互聯(lián)網(wǎng)業(yè)務,或者IT基礎架構(gòu)來說娃属,其復雜度在于軟件本身六荒,架構(gòu)的制定、類庫的選擇矾端、編碼的質(zhì)量等等掏击。對于其它IT系統(tǒng)——尤其是公司迅速成長,業(yè)務不斷復雜化的IT系統(tǒng)——而言秩铆,其復雜度并不在于軟件本身砚亭,安全、性能、負載的問題都套用現(xiàn)成的IT解決方案钠惩,真正的復雜度來自系統(tǒng)承載的業(yè)務本身,比如最簡單的:系統(tǒng)里有哪些單據(jù)族阅,各種單據(jù)承載什么信息篓跛,用在什么場景,這些單據(jù)是怎樣流轉(zhuǎn)的坦刀,各種單據(jù)存在怎樣的約束關(guān)系愧沟,出現(xiàn)異常情況應當如何處理才能保證業(yè)務數(shù)據(jù)的一致性……這些問題沒有準確而穩(wěn)定的答案,IT再怎樣努力也是白搭鲤遥。
??對于已經(jīng)能在線下規(guī)范運行的業(yè)務沐寺,或者是有經(jīng)典解決方案的工作(比如財務、倉庫管理)盖奈,這些知識都是現(xiàn)成的混坞,可以直接拿來用。但對于新興領域钢坦、新興業(yè)務來說究孕,往往不存在“經(jīng)典解決方案”。加上很多公司成長速度飛快爹凹,一開始并沒有構(gòu)筑好的IT基礎(其實是業(yè)務架構(gòu)基礎)厨诸。典型的情況就是:業(yè)務概念混亂不清,業(yè)務邏輯層也是雜亂無章禾酱,很多系統(tǒng)里干脆把數(shù)據(jù)庫當作業(yè)務邏輯層(這可不是說笑微酬,因為數(shù)據(jù)庫無法推脫責任了)。結(jié)果颤陶,混亂的業(yè)務邏輯依附于糟糕的IT系統(tǒng)颗管,亂上加亂最終成了一鍋粥。對IT來說指郁,已有業(yè)務的問題層出不窮忙上,每次出問題都需要花費大量精力,尋找蛛絲馬跡來“破案”闲坎;對業(yè)務來說疫粥,新增業(yè)務往往會影響到原有業(yè)務,但誰也不知道會不會影響腰懂,會如何影響梗逮。系統(tǒng)日漸龐大的另一面是內(nèi)部日趨無序,復雜度和維護成本飛速增長绣溜,遠遠超過可控范圍慷彤。
??吊詭的是,許多人的解決辦法不是 針對問題的根本原因
,評估業(yè)務復雜度
底哗、整理業(yè)務邏輯
岁诉、整理業(yè)務關(guān)系
,反而認為 “推倒重來”跋选、新做一套系統(tǒng) 就能解決涕癣。持這種觀點的人,通常對系統(tǒng)與業(yè)務的關(guān)系也有誤解前标。
??對希望“推倒重來
”的人來說坠韩,系統(tǒng)和業(yè)務的關(guān)系,有點像車輛對人員:一輛車我開了一段時間覺得不好炼列,就想換一輛車來開只搁,這是很自然的。但是在信息化深入工作各個角落的今天俭尖,系統(tǒng)和業(yè)務的關(guān)系遠不是“車輛對人員”那么疏遠氢惋,而更像“心臟起搏器對人”,或者“人造骨骼與肌肉”的關(guān)系目溉,已經(jīng)如膠似漆纏在了一起明肮,系統(tǒng)對業(yè)務的支持越多越廣(暫時不論質(zhì)量),雙方糾纏得也就越緊密缭付。更換心臟起搏器或者人造骨骼的難度柿估,遠遠比換車的難度要大,所以需要慎重考慮陷猫,不能單純因為心臟起搏器“不那么好”就輕率決定更換秫舌。對系統(tǒng)來說,也是如此绣檬。
如果要對基礎不好的遺留系統(tǒng)做脫胎換骨的改造足陨,我有幾點經(jīng)驗可以參考:
第一,一定要有非常優(yōu)秀的業(yè)務人員和開發(fā)人員娇未。
??對業(yè)務人員來說墨缘,不但要熟悉自己手頭的操作,還必須明白操作背后的邏輯零抬,并且需要超越本職工作镊讼,能從全局角度來思考自己的業(yè)務(有時甚至要讓自己操作更復雜,來提高系統(tǒng)安全性等收益)平夜,這樣才能真正把握住業(yè)務的復雜度蝶棋。對開發(fā)人員來說,要能夠完整理解領域知識忽妒,同時必須有高超的編程能力來應對遺留代碼玩裙,敢于出手而不是畏縮不前兼贸,謹慎出手而不是貿(mào)然行動——如果原有系統(tǒng)開發(fā)人員的技術(shù)能力可以打30分,全新開發(fā)系統(tǒng)的技術(shù)要求是60分吃溅,那么要成功改造遺留系統(tǒng)的技術(shù)人員溶诞,往往需要有80以上的分數(shù)才能勝任。
第二决侈,“推倒重來”往往不如“逐步改良”很澄。
??所謂“逐步改良”
,指的是大家先通過討論確認未來系統(tǒng)的設計藍圖颜及,然后需要開發(fā)用于過渡的接口層。于是蹂楣,新開發(fā)的模塊一定要嚴格按照新的規(guī)范開發(fā)(這也就是我說的“理清各模塊職責俏站、API通訊機制的建立、內(nèi)部分層的整理”)痊土,同時通過過渡的接口層與原有系統(tǒng)對接肄扎,原有的模塊則在理清業(yè)務邏輯的情況下,按需切出合適的接口赁酝,逐部分在測試通過的情況下進行遷移犯祠。最終新的系統(tǒng)是像拼圖一樣慢慢拼出來到最后一天才成型的,而不是平底蓋樓造起來的酌呆。在這個過程中衡载,最關(guān)鍵的是找到合適的切入點,搭建出合適的接口或者接口層隙袁。這些工作就像蓋房子的腳手架痰娱,哪怕之后不會用到,中途也不能省略菩收,還必須仔細對待梨睁。當然,這是一個考驗人的工作——我曾經(jīng)遇到過數(shù)據(jù)庫事務里跨庫連表的查詢娜饵,這個糟糕的設計嚴重阻礙了單數(shù)據(jù)庫實例拆分成多實例的進展坡贺,回想起來真是如噩夢一般。
??如果你對改造遺留系統(tǒng)有自己的見解箱舞,或者在這個過程中有什么有意思的經(jīng)歷遍坟,歡迎留言給我。
??最后推薦一本有意思的書褐缠。其實不管是軟件開發(fā)還是社會變革政鼠,對于不喜歡的現(xiàn)狀,大家往往喜歡來個“干脆”队魏、“徹底”的解決方案公般,但真正成功的往往不是這些方案万搔。在第二次世界大戰(zhàn)結(jié)束時,世界上到底發(fā)生了哪些事情官帘,遇到了哪些問題瞬雹,又是怎樣重建社會秩序的呢?廣西師大《理想國》叢書第9冊《零年:1945現(xiàn)代世界誕生的時刻》
刽虹,用翔實的文筆全面記錄了“終戰(zhàn)”之后的情景酗捌,許多畫面相信會讓讀者大吃一驚——很多時候“文明”堪稱被打回原形,“零年”這個名字可謂名副其實涌哲。