下次老闆讓你重構系統,讓他看看這篇文章

2021-07-16 05:24:24 字數 4520 閱讀 1231

** 

重構的代價很大,為什麼公司不一開始就架構好呢?前期不捨得投入,殊不知其實後期維護的成本也很大,推翻重做的成本更大,而且不是那麼簡單的。

所以古語說 「亡羊補牢」,沒說 「亡羊重蓋牢」。

專業和不專業不僅表現在你的行為上,更體現在你的認知中。

上個月,有個以前的同事問我:「你在的時候,為什麼不把原來的系統都重做了,我們明明有實力啊」。

我說:「我們也做了很多事情嘛,系統穩定性、安全性、增加冗餘、理清各模組職責、api通訊機制的建立、內部分層的整理。」

他說:「對,但我還是想知道,你為什麼不把系統重做了呢?」

於是我問:「我離職之後,後來似乎多投了不少人重做系統?結果怎麼樣呢?」

他說:「結果,結果就是做業務要同時操作三四套系統……」

就我所見,把原有系統「推倒重來」的喜好不只程式設計師有,使用者更有。拿我幾年前的那份工作來說,剛入職老大們就來跟我討論系統重做的打算:需要多少人,多少錢,多長時間,能把原有系統推翻重來。畢竟大家每天都忍受切膚之痛:速度慢、經常出錯、不安全、客戶抱怨、架構糟糕…… 所以都想拿出「敢叫日月換新天」的勁頭,來個乾脆的徹底解決。

這種心情可以理解,但在我任內「重做系統」一直沒有被提上日程,整個技術團隊所做的都是「改良」的工作,內容就像我上面說的:系統穩定性、安全性、增加冗餘、理清各模組職責、api通訊機制的建立、內部分層的整理。這個選擇我有充分把握,而且在我看來,如果斷然「推倒重來」,我未必能比繼任者做得更好,甚至可能更糟糕,因為「推倒重來」絕不是那麼簡單的事情。

眾所周知,軟體開發的難點之一就是控制複雜度。但是在不同的領域,複雜度有不同的表現。對於純網際網路業務,或者it基礎架構來說,其複雜度在於軟體本身,架構的制定、類庫的選擇、編碼的質量等等。對於其它it系統——尤其是公司迅速成長,業務不斷複雜化的it系統——而言,其複雜度並不在於軟體本身,安全、效能、負載的問題都套用現成的it解決方案,真正的複雜度來自系統承載的業務本身,比如最簡單的:系統裡有哪些單據,各種單據承載什麼資訊,用在什麼場景,這些單據是怎樣流轉的,各種單據存在怎樣的約束關係,出現異常情況應當如何處理才能保證業務資料的一致性……這些問題沒有準確而穩定的答案,it再怎樣努力也是白搭。

吊詭的是,許多人的解決辦法不是針對問題的根本原因,評估業務複雜度、整理業務邏輯、整理業務關係,反而認為「推倒重來」、新做一套系統就能解決。持這種觀點的人,通常對系統與業務的關係也有誤解。

對希望「推倒重來」的人來說,系統和業務的關係,有點像車輛對人員:一輛車我開了一段時間覺得不好,就想換一輛車來開,這是很自然的。但是在資訊化深入工作各個角落的今天,系統和業務的關係遠不是「車輛對人員」那麼疏遠,而更像「心臟起搏器對人」,或者「人造骨骼與肌肉」的關係,已經如膠似漆纏在了一起,系統對業務的支援越多越廣(暫時不論質量),雙方糾纏得也就越緊密。更換心臟起搏器或者人造骨骼的難度,遠遠比換車的難度要大,所以需要慎重考慮,不能單純因為心臟起搏器「不那麼好」就輕率決定更換。對系統來說,也是如此。

如果要對基礎不好的遺留系統做脫胎換骨的改造,我有幾點經驗可以參考:

第一,一定要有非常優秀的業務人員和開發人員。

對業務人員來說,不但要熟悉自己手頭的操作,還必須明白操作背後的邏輯,並且需要超越本職工作,能從全域性角度來思考自己的業務(有時甚至要讓自己操作更複雜,來提高系統安全性等收益),這樣才能真正把握住業務的複雜度。對開發人員來說,要能夠完整理解領域知識,同時必須有高超的程式設計能力來應對遺留**,敢於出手而不是畏縮不前,謹慎出手而不是貿然行動——如果原有系統開發人員的技術能力可以打30分,全新開發系統的技術要求是60分,那麼要成功改造遺留系統的技術人員,往往需要有80以上的分數才能勝任。

第二,「推倒重來」往往不如「逐步改良」。

所謂「逐步改良」,指的是大家先通過討論確認未來系統的設計藍圖,然後需要開發用於過渡的介面層。於是,新開發的模組一定要嚴格按照新的規範開發(這也就是我說的「理清各模組職責、api通訊機制的建立、內部分層的整理」),同時通過過渡的介面層與原有系統對接,原有的模組則在理清業務邏輯的情況下,按需切出合適的介面,逐部分在測試通過的情況下進行遷移。最終新的系統是像拼圖一樣慢慢拼出來到最後一天才成型的,而不是平底蓋樓造起來的。在這個過程中,最關鍵的是找到合適的切入點,搭建出合適的介面或者介面層。這些工作就像蓋房子的腳手架,哪怕之後不會用到,中途也不能省略,還必須仔細對待。當然,這是乙個考驗人的工作——我曾經遇到過資料庫事務裡跨庫連表的查詢,這個糟糕的設計嚴重阻礙了單資料庫例項拆分成多例項的進展,回想起來真是如噩夢一般。

最後推薦一本有意思的書。其實不管是軟體開發還是社會變革,對於不喜歡的現狀,大家往往喜歡來個「乾脆」、「徹底」的解決方案,但真正成功的往往不是這些方案。在第二次世界大戰結束時,世界上到底發生了哪些事情,遇到了哪些問題,又是怎樣重建社會秩序的呢?廣西師大《理想國》叢書第9冊《零年:1945現代世界誕生的時刻》,用翔實的文筆全面記錄了「終戰」之後的情景,許多畫面相信會讓讀者大吃一驚——很多時候「文明」堪稱被打回原形,「零年」這個名字可謂名副其實。

上個月,有個以前的同事問我:「你在的時候,為什麼不把原來的系統都重做了,我們明明有實力啊」。

我說:「我們也做了很多事情嘛,系統穩定性、安全性、增加冗餘、理清各模組職責、api通訊機制的建立、內部分層的整理。」

他說:「對,但我還是想知道,你為什麼不把系統重做了呢?」

於是我問:「我離職之後,後來似乎多投了不少人重做系統?結果怎麼樣呢?」

他說:「結果,結果就是做業務要同時操作三四套系統……」

就我所見,把原有系統「推倒重來」的喜好不只程式設計師有,使用者更有。拿我幾年前的那份工作來說,剛入職老大們就來跟我討論系統重做的打算:需要多少人,多少錢,多長時間,能把原有系統推翻重來。畢竟大家每天都忍受切膚之痛:速度慢、經常出錯、不安全、客戶抱怨、架構糟糕…… 所以都想拿出「敢叫日月換新天」的勁頭,來個乾脆的徹底解決。

這種心情可以理解,但在我任內「重做系統」一直沒有被提上日程,整個技術團隊所做的都是「改良」的工作,內容就像我上面說的:系統穩定性、安全性、增加冗餘、理清各模組職責、api通訊機制的建立、內部分層的整理。這個選擇我有充分把握,而且在我看來,如果斷然「推倒重來」,我未必能比繼任者做得更好,甚至可能更糟糕,因為「推倒重來」絕不是那麼簡單的事情。

眾所周知,軟體開發的難點之一就是控制複雜度。但是在不同的領域,複雜度有不同的表現。對於純網際網路業務,或者it基礎架構來說,其複雜度在於軟體本身,架構的制定、類庫的選擇、編碼的質量等等。對於其它it系統——尤其是公司迅速成長,業務不斷複雜化的it系統——而言,其複雜度並不在於軟體本身,安全、效能、負載的問題都套用現成的it解決方案,真正的複雜度來自系統承載的業務本身,比如最簡單的:系統裡有哪些單據,各種單據承載什麼資訊,用在什麼場景,這些單據是怎樣流轉的,各種單據存在怎樣的約束關係,出現異常情況應當如何處理才能保證業務資料的一致性……這些問題沒有準確而穩定的答案,it再怎樣努力也是白搭。

吊詭的是,許多人的解決辦法不是針對問題的根本原因,評估業務複雜度、整理業務邏輯、整理業務關係,反而認為「推倒重來」、新做一套系統就能解決。持這種觀點的人,通常對系統與業務的關係也有誤解。

對希望「推倒重來」的人來說,系統和業務的關係,有點像車輛對人員:一輛車我開了一段時間覺得不好,就想換一輛車來開,這是很自然的。但是在資訊化深入工作各個角落的今天,系統和業務的關係遠不是「車輛對人員」那麼疏遠,而更像「心臟起搏器對人」,或者「人造骨骼與肌肉」的關係,已經如膠似漆纏在了一起,系統對業務的支援越多越廣(暫時不論質量),雙方糾纏得也就越緊密。更換心臟起搏器或者人造骨骼的難度,遠遠比換車的難度要大,所以需要慎重考慮,不能單純因為心臟起搏器「不那麼好」就輕率決定更換。對系統來說,也是如此。

如果要對基礎不好的遺留系統做脫胎換骨的改造,我有幾點經驗可以參考:

第一,一定要有非常優秀的業務人員和開發人員。

對業務人員來說,不但要熟悉自己手頭的操作,還必須明白操作背後的邏輯,並且需要超越本職工作,能從全域性角度來思考自己的業務(有時甚至要讓自己操作更複雜,來提高系統安全性等收益),這樣才能真正把握住業務的複雜度。對開發人員來說,要能夠完整理解領域知識,同時必須有高超的程式設計能力來應對遺留**,敢於出手而不是畏縮不前,謹慎出手而不是貿然行動——如果原有系統開發人員的技術能力可以打30分,全新開發系統的技術要求是60分,那麼要成功改造遺留系統的技術人員,往往需要有80以上的分數才能勝任。

第二,「推倒重來」往往不如「逐步改良」。

所謂「逐步改良」,指的是大家先通過討論確認未來系統的設計藍圖,然後需要開發用於過渡的介面層。於是,新開發的模組一定要嚴格按照新的規範開發(這也就是我說的「理清各模組職責、api通訊機制的建立、內部分層的整理」),同時通過過渡的介面層與原有系統對接,原有的模組則在理清業務邏輯的情況下,按需切出合適的介面,逐部分在測試通過的情況下進行遷移。最終新的系統是像拼圖一樣慢慢拼出來到最後一天才成型的,而不是平底蓋樓造起來的。在這個過程中,最關鍵的是找到合適的切入點,搭建出合適的介面或者介面層。這些工作就像蓋房子的腳手架,哪怕之後不會用到,中途也不能省略,還必須仔細對待。當然,這是乙個考驗人的工作——我曾經遇到過資料庫事務裡跨庫連表的查詢,這個糟糕的設計嚴重阻礙了單資料庫例項拆分成多例項的進展,回想起來真是如噩夢一般。

最後推薦一本有意思的書。其實不管是軟體開發還是社會變革,對於不喜歡的現狀,大家往往喜歡來個「乾脆」、「徹底」的解決方案,但真正成功的往往不是這些方案。在第二次世界大戰結束時,世界上到底發生了哪些事情,遇到了哪些問題,又是怎樣重建社會秩序的呢?廣西師大《理想國》叢書第9冊《零年:1945現代世界誕生的時刻》,用翔實的文筆全面記錄了「終戰」之後的情景,許多畫面相信會讓讀者大吃一驚——很多時候「文明」堪稱被打回原形,「零年」這個名字可謂名副其實。

spring讓你喜歡上他

秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路 寫入記憶體而不是寫入硬碟 非同步處理而不是同步處理 分布式處理 用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。用我這個方案,無論是電商平台 秒殺,...

BugkuCTF 你必須讓他停下

開啟頁面後發現頁面一直在閃動,不難猜到是js在作怪。開啟之後果然發現了重新整理 這不會要了伺服器的命?i want to play dummy game with others but i can t stop stop at panda u will get flag flag is here 給...

讓老闆記得你最擅長的20

讓老闆記得你最擅長的20 職場明星亮眼的生涯,也許不容易複製,但在擁抱成功的準備上,絕對要有故意的心態。故意親近學習典範 故意擴大專業領域 故意讓老闆看見特長 生涯 路其實可以靠自己一步步走出坦途。乙個人在人力市場的價值,是從兩種截然不同的因素衍生出來的 潛力價值以及經驗價值。我們基本上是帶著滿滿一...