這一篇,我們從重構
這個場景來看看系統架構的設計中過度設計
這個坑。
首先,我們這裡說的重構,和《重構:改善既有**的設計》這本書中的重構不太一樣,這是本好書,他主要說的是**級別的重構,這種重構是需要在編碼的時候時時刻刻進行的,更多的是一種程式設計思想的訓練,而我們這篇的重構
主要是說系統設計的重構
。
在說之前先聊聊架構師這個職位吧,這個職位最近兩年特別特別火,哪個公司沒個架構師好像都不好意思跟人打招呼,各位架構師打上這個標籤後頭上就頂了乙個光環了,本人也認識各個公司的一些架構師,我認識的架構師分成幾種:
為什麼說架構師呢?因為大部分架構上的坑都是從乙個不好的設計開始的,而現在的各個系統的設計都是由架構師來操刀的。
技術人員最喜歡做的一件事就是重構
,因為技術宅們都看不上別人的**,特別是需要在別人**上加新功能的工作更是看不上,架構師們是技術宅的公升級版,所以更加看不上別人的架構設計,所以重構
是經常做的事情,小的是功能模組的重構,大的是整個系統的重構,總之,都是不重構不舒服斯基
。
重構本身並沒有問題,但是需要看的是重構的時機,是不是應該重構了?
假如有個初創公司,是幫企業做oa系統的,最開始的時候是由三個程式設計師小哥開發出來的,系統架構很簡單,是個allinone
的設計,開發語言php,就像下圖一樣。
每當客戶有新需求,基本的操作就是加個表 --- 加個邏輯模組 --- 修改一下介面 --- 上線
,而且一般oa系統是部署在客戶內部的,所以每次修改都是針對單獨客戶進行開發。
公司發展的越來越好,有了一些大公司買了他們的oa,有錢了,請了個架構師過來優化優化技術架構,架構師叫小明(每次都黑小明),小明來了一看現有設計,我去,這怎麼行?三天後,給出了他的建議
臥槽,好高大上,乍一看,這就是乙個目前比較流行的架構圖了,有資料層,有中介軟體層,有業務層,有前端展示層,資料層支援分庫分表,可以無限擴充套件,業務層微服務化,也可以無限擴充套件,docker部署,乙個image搞定部署,簡直了!除了訊息佇列沒有用上以外,其他的流行東西用了個遍啊。
那麼,開始幹吧,把人員分成兩撥,一撥繼續維護現有系統,接客戶新需求,一撥開始重構,乙個月時間,把資料和功能模組梳理了一遍,然後開始定各個服務中的介面,又用了小乙個月,然後全部人員投入進去開始編碼,又忙活了三個月,終於重構完成了,再花乙個月時間追上這4個月新來的需求,牛逼的架構上線了!
如果小明夠厲害並且開發人員也給力的話,最好的情況就是上線後一切正常,你不是重構麼?客戶完全感覺不到有變化,繼續使用得很high。但這種概率幾乎為零,最有可能的情況是什麼呢?
完全脫離了業務場景來進行技術架構的設計就是過度設計
。
這個例子中的業務場景是乙個oa系統,oa系統的主要資料是企業的人和人的資料,乙個企業能有多少人?乙個初創公司,能接入10萬人的大公司做oa已經非常不錯了吧?即便是10萬人的大公司,人的資料也就10萬條,我們在成100,算單個表1000萬條資料吧,單台mysql完全可以hold得住,所以第一條分庫分表的設計在這個場景下就完全沒有必要,企業主最關心的是什麼?是資料的安全可靠,所以你在這裡把mysql換成orecle,企業主覺得安全也會買單,並且你收入還能更多,而且換成orecle的話,單個表上億問題也不大,何必分庫分表?
好,就算你資料量巨大,需要分庫分表,那你整個中介軟體幹嘛?中介軟體的作用是遮蔽底層資料沒錯,但還有個場景是資料讀寫分離,一般是在大資料量並且有高併發需求的系統使用,你一oa系統,能有多高的併發?需要用中介軟體這麼高階的東西麼?
再看看微服務
,為了降低系統的耦合度使用了微服務
,同樣場景也不對,什麼時候需要把服務拆分出來呢?只有在當前服務已經耗費了單台機器太多的資源了,單機扛不住了,才會把功能比較獨立的模組拆分成微服務出去,因為微服務
雖然降低了系統的耦合度,但是需要更多的考慮到系統的可用性和網路因素造成的問題,對開發人員的要求更高,乙個oa系統,能有多大的計算量?
後面的前後端分離啊,docker部署啊,你想想各自的必要程度如何?乙個oa是否需要絢麗的介面?乙個oa系統的更新頻率有多高?是否需要docker這樣的東西來幫助部署?成本如何?再看看是否是過度設計
?
最後,我覺得上面這個系統,比較合理的修改設計是:
我覺得重構得滿足以下幾個條件的大部分,才有重構的必要,第乙個條件是必須滿足的。
而重構最忌諱的用以下理由來重構系統
總而言之,重構乙個系統最需要考慮的就乙個詞:成本
,需要衡量各方面的成本後,再考慮是否需要重構,這樣的重構才是有意義的重構。
原文:
架構的坑系列 重構過程中的過度設計
軟體架構 2016 06 03 08 47 02 發布 您的評價 5.0收藏 2收藏 在說之前先聊聊架構師這個職位吧,這個職位最近兩年特別特別火,哪個公司沒個架構師好像都不好意思跟人打招呼,各位架構師打上這個標籤後頭上就頂了乙個光環了,本人也認識各個公司的一些架構師,我認識的架構師分成幾種 最近還有...
軟體開發過程中的過度設計
在軟體設計過程中,總有以下感慨 1.總以為自己了解了使用者的細節需求 2.在設計階段,花很多時間針對需求中的某些小功能做設計 3.使用者在實際使用中很少使用問題2的 某些小功能 總之,在設計過程中,使用80 的時間處理了20 的不常用的功能,而80 的主要功能,由於在設計階段考慮不周,導致問題百出。...
使用jquery過程中遇到的坑
最近在使用jquery過程中發現了幾個小問題,不知道有沒有其他人遇到。問題一 假的dom結構,比如input的乙個選中狀態,用jquery中的attr 進行新增和刪除,在google除錯中看到是正常的,但是傳給後台的值是不對的。我找了很久才發現原因,我的dom結構是假的。只是表面上看起來好像刪除掉了...