1. 程式人生 > >你的專案框架是否被過度設計了?

你的專案框架是否被過度設計了?

1. 重構中的過度設計

技術人員最喜歡做的一件事就是 重構 ,因為技術宅們都看不上別人的程式碼,特別是需要在別人程式碼上加新功能的工作更是看不上,架構師們是技術宅的升級版,所以更加看不上別人的架構設計,所以 重構 是經常做的事情,小的是功能模組的重構,大的是整個系統的重構, 重構本身並沒有問題,但是需要看的是重構的時機,是不是應該重構了? 我們以一個例子來詳細說說 重構 中的 過度設計 吧,你也可以想想要是遇到這樣的系統,你是架構師,你怎麼做? 假如有個初創公司,是幫企業做OA系統的,最開始的時候是由三個程式設計師小哥開發出來的,系統架構很簡單,是個 AllInOne 的設計,開發語言PHP,就像下圖一樣。


每當客戶有新需求,基本的操作就是 加個表 --- 加個邏輯模組 --- 修改一下介面 --- 上線 ,而且一般OA系統是部署在客戶內部的,所以每次修改都是針對單獨客戶進行開發。 公司發展的越來越好,有了一些大公司買了他們的OA,有錢了,請了個架構師過來優化優化技術架構,架構師叫小明(每次都黑小明),小明來了一看現有設計,我去,這怎麼行?三天後,給出了他的建議

  • 首先,資料層都在一個庫裡面,以後資料量大的話資料庫效率太低了,首先要分庫分表,把使用者資料表和事件表橫向和縱向的拆分一下,雜湊到不同的機器上去,減輕單臺機器的壓力。

  • 其次, AllInOne 的設計太臃腫了,要把各個模組 微服務

     化,把 許可權 模組,附件管理 模組拆分出去成為一個微服務,提供API給其他模組使用,方便維護,後續新增新功能做一個 微服務 就行了,和其他模組的耦合性急劇降低。

  • 在資料層和業務層之間加一個代理層,用個開源的中介軟體,以後資料端再有分庫分表操作,對上層遮蔽細節,業務人員不用關心底層資料庫細節,專心寫業務邏輯就行了。

  • PHP效能不太行,並且介面做出來不好看,前端分離還不徹底,改成Nodejs+Angularjs來進行前後端分離,前端人員專注頁面,做出更絢麗的頁面來,後端人員專注業務邏輯,使用 RESTAPI 進行資料互動。

  • docker部署,每個服務啟一個docker,對運維人員友好,而且有很多工具可以看各個docker的健康狀況。

於是,整個系統變成下面這個樣子了。


臥槽,好高大上,乍一看,這就是一個目前比較流行的架構圖了,有資料層,有中介軟體層,有業務層,有前端展示層,資料層支援分庫分表,可以無限擴充套件,業務層微服務化,也可以無限擴充套件,docker部署,一個image搞定部署,簡直了!除了訊息佇列沒有用上以外,其他的流行東西用了個遍啊。 那麼,開始幹吧,把人員分成兩撥,一撥繼續維護現有系統,接客戶新需求,一撥開始重構,一個月時間,把資料和功能模組梳理了一遍,然後開始定各個服務中的介面,又用了小一個月,然後全部人員投入進去開始編碼,又忙活了三個月,終於重構完成了,再花一個月時間追上這4個月新來的需求,牛逼的架構上線了! 如果小明夠厲害並且開發人員也給力的話,最好的情況就是上線後一切正常,你不是重構麼?客戶完全感覺不到有變化,繼續使用得很high。但這種概率幾乎為零,最有可能的情況是什麼呢?

  • 客戶說,臥槽,少了個功能了,臥槽,數不對了,這都是小事,新系統嘛,總歸有一些問題,解決這些bug就好了。

  • 某天發現登入不上了,如果在之前,跟蹤一下程式碼就知道哪裡有問題了,立刻解決了,現在已經微服務了,你說是網路問題還是許可權服務問題還是邏輯問題呢?要跟蹤可沒那麼容易。

  • 某天發現數據寫入和讀取都有問題,最後查問題發現是開源的中介軟體偶爾抽風了,要修改的話,得看中介軟體的原始碼了,跪了吧。。。。

  • 最關鍵的是,你會發現,上了這個新的架構以後,是耦合性降低了,但開發一個新功能的工作量比以前多了,效率反而降低了。

這就是一個典型的 過度設計 , 過度設計 特點:

完全脫離了業務場景來進行技術架構的設計就是過度設計 。

這個例子中的業務場景是一個OA系統,OA系統的主要資料是企業的人和人的資料,一個企業能有多少人?一個初創公司,能接入10萬人的大公司做OA已經非常不錯了吧?即便是10萬人的大公司,人的資料也就10萬條,我們在成100,算單個表1000萬條資料吧,單臺MySql完全可以hold得住,所以第一條分庫分表的設計在這個場景下就完全沒有必要,企業主最關心的是什麼?是資料的安全可靠,所以你在這裡把MySql換成Orecle,企業主覺得安全也會買單,並且你收入還能更多,而且換成Orecle的話,單個表上億問題也不大,何必分庫分表? 好,就算你資料量巨大,需要分庫分表,那你整個中介軟體幹嘛?中介軟體的作用是遮蔽底層資料沒錯,但還有個場景是資料讀寫分離,一般是在大資料量並且有高併發需求的系統使用,你一OA系統,能有多高的併發?需要用中介軟體這麼高階的東西麼? 再看看 微服務 ,為了降低系統的耦合度使用了 微服務 ,同樣場景也不對,什麼時候需要把服務拆分出來呢?只有在當前服務已經耗費了單臺機器太多的資源了,單機扛不住了,才會把功能比較獨立的模組拆分成微服務出去,因為 微服務 雖然降低了系統的耦合度,但是需要更多的考慮到系統的可用性和網路因素造成的問題,對開發人員的要求更高,一個OA系統,能有多大的計算量? 後面的前後端分離啊,docker部署啊,你想想各自的必要程度如何?一個OA是否需要絢麗的介面?一個OA系統的更新頻率有多高?是否需要docker這樣的東西來幫助部署?成本如何?再看看是否是 過度設計 ? 最後,我覺得上面這個系統,比較合理的修改設計是:

  • 把資料庫加上一個主從同步,保證資料的可靠性,別數據庫掛了,那客戶可會跟你拼命,這是最重要的。

  • 把系統的SQL語句梳理一遍,看看有沒有什麼慢SQL,然後做針對性的優化,比如加索引,改SQL之類的。

  • 把後端的服務加上詳細的Log資訊,這樣出了問題也好查問題,並且可以把Log收集起來做分析,看看系統的瓶頸在什麼地方,然後再在區域性做優化也好重構也好,這樣對系統的侵入性最小。

這樣下來,系統的效能應該有提升,資料可靠性也增強了,並且也耗費不了多少資源,通過Log分析,一個區域性一個區域性的優化,直到發現了一個大坑需要拆分服務了,再進行服務的拆分,如果你有更好的建議,歡迎留言討論啊。

2. 重構的理由

我覺得重構得滿足以下幾個條件的大部分,才有重構的必要,第一個條件是必須滿足的。

  • 現有系統的所有功能模組和對外介面都瞭解得非常清楚了。如果你沒把對外介面瞭解得非常清楚,重構完了以後外部的依賴系統必然要跟著改,那就是個無底洞了。

  • 現有系統有明顯的重大BUG,並且在現有條件下無法解決或者很難解決。如果僅僅是系統有BUG,那麼解決BUG就好了,完全沒有必要為了BUG來重構,只有當確實BUG已經無法解決或者解決的成本實在太高了,才有重構的必要。

  • 文件缺失或者維護人員大量離職導致目前系統的可維護性降低,很難新增新功能。如果大家都很熟悉現有系統,可以很快的在上面迭代新功能,你重新來一個系統幹什麼呢?

  • 現有系統在可預見的未來無法支撐業務的發展了。只有當業務部門已經跑到了技術部門前面了,可以預見得到業務發展的方向了,再來審視目前的系統,發現已經無法繼續支撐了,這時候才需要重構現有系統。

而重構最忌諱的用以下理由來重構系統

  • 現有程式碼太臃腫,實現不完美。難道你重新實現一個就完美了?

  • 這個系統的技術棧太陳舊,沒有使用最新的技術流,以後肯定會落伍。難道用了新技術就不會落伍?

  • 現有系統沒有考慮高可用的情況,要是出問題了就是大問題。

  • 這個語言就不適合做這個系統,得用XXX語言來實現。雖然說每個語言都有他擅長的場景,但是一個既有系統更換實現語言,是一件成本非常高的事情。

總而言之,重構一個系統最需要考慮的就一個詞: 成本 ,需要衡量各方面的成本後,再考慮是否需要重構,這樣的重構才是有意義的重構。

相關推薦

專案框架是否過度設計

1. 重構中的過度設計 技術人員最喜歡做的一件事就是 重構 ,因為技術宅們都看不上別人的程式碼,特別是需要在別人程式碼上加新功能的工作更是看不上,架構師們是技術宅的升級版,所以更加看不上別人的架構設計,所以 重構 是經常做的事情,小的是功能模組的重構,大的是整個系統的

的簡歷已經機器人篩選

簡歷篩選是難題?初創公司 Riminder用機器學習提高招聘效率 思齊 • 2017-05-16 • 企業服務 不會讓 HR 失業,只是幫 HR 提升效率 對於應聘者們而言,投遞簡歷的時間也是一門玄學,不過對於 HR 們來說,何時收到簡歷並不重要,

的部落格搜尋引擎收錄嗎?

持續原創輸出,點選上方藍字關注我 目錄 前言如何判斷自己的部落格被百度收錄了?如何操作? 準備一個百度站長賬號驗證網站所有權HTML驗證生成站點地圖如何自動推送?總結 前言 大部分人寫部落格都希望讓別人訪問到,但是GitHub和Coding都做了防爬蟲的處理,因此我們託管在其上的部落格就無法被搜尋引

Android 專案中用得最多最火的第三方框架可能都在這裡有沒有錯過?

平時讀部落格搜 GitHub 多了,總會發現一些大家都在比較推崇的第三方框架,覺得非常不錯暫時又用不到,於是就打算把它們都收藏起來,需要用到的時候就不用到處問到處搜了。收藏得多了,本著熱愛分享擁抱開源的思想,於是貼出來給大家分享交流。如有紕漏,敬請拍磚指正。 歡迎眾收藏愛好

如果的博客封號

情況 ron 51cto博客 直接 廣告 級別 文章 言行 影響 什麽情況會被封博客? 您的一些行為觸犯了51CTO博客規則: 禁止發布違反法律法規的行為和內容; 禁止作出威脅他人人身安全、法律安全的行為; 禁止發布對網站的運營安全有潛在威脅的內容; 禁止作出侮辱、損害「

閑置的社交帳號註銷嗎?

社交帳號在移動互聯網時代,你有多容易愛上一款應用,就有多容易恨上一款應用。愛恨之間是如此的模糊,讓眾多互聯網巨頭都小心翼翼、如履薄冰。在此前抗議特朗普限制移民政策時Uber沒有參與,直接導致了一場聲勢浩大的用戶運動:刪除Uber(#DeleteUber)。而就在近段時間,#DeleteFacebook運動又流

Django專案執行時出現self.status.split(' ',1)[0], self.bytes_sent,ConnectionAbortedError: [WinError 10053] 的主機中的軟體中止一個已建立的連線。

1 [02/Nov/2018 09:46:51] "GET /new_industry/category HTTP/1.1" 200 2891792 2 Traceback (most recent call last): 3 File "C:\Program Files\Python36\l

的ERP專案實施為啥質量高不

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Beego框架:部落格專案環境搭建和Model設計

#準備工作: a.下載goland,安裝go環境,在mysql建立資料庫beego_blog,然後匯入beego_blog.sql b.然後安裝beego和開發工具 go get -u github.com/astaxie/beego go get -u github.com/bee

的異常別自己 “吃” 掉都不知道!

我們在開發企業應用時,由於資料操作在順序執行的過程中,線上可能有各種無法預知的問題,任何一步操作都有可能發生異常,異常則會導致後續的操作無法完成。此時由於業務邏輯並未正確的完成,所以在之前操作過資料庫的動作並不可靠,需要在這種情況下進行資料的回滾。 這叫事務。事務的作用就是為了保證使用

的異常別自己"吃"掉都不知道

我們在開發企業應用時,由於資料操作在順序執行的過程中,線上可能有各種無法預知的問題,任何一步操作都有可能發生異常,異常則會導致後續的操作無法完成。此時由於業務邏輯並未正確的完成,所以在之前操作過資料庫的動作並不可靠,需要在這種情況下進行資料的回滾。 這叫事務。事務的作用就是為了保證使用者的每一個操作都是可靠

程式設計師因薪資不滿拒絕offer,HR怒懟:一輩子只能是個程式設計師

職場上,公司與求職者是處於一種平等關係,你看重我能力,而我看重的是薪資和發展平臺。對於雙方來說,接受與拒絕都很正常,被拒絕也應該理性看待。但是就有一名程式設計師在求職過程中,公司看重他的技能,讓HR和他談薪資,而該程式設計師對於該公司給出的薪資並不滿意,從而禮貌拒絕了。可是沒想到該HR卻生氣稱:估計

手把手教從零開始搭建SpringBoot後端專案框架

原料 新鮮的IntelliJ IDEA、一雙手、以及電腦一臺。 搭建框架 新建專案 開啟IDE,點選File -> New Project。在左側的列表中的選擇Maven專案,點選Next。 填寫GroupId和ArtifactId 什麼是GroupId和Ar

小白經濟學丨國慶出行,高速堵嗎?

從2012年,我國宣佈了重大節假日高速免費了之後,今年已經是第七個年頭了,相信很多人對這一政策的認識已經從一邊倒的拍手稱讚,慢慢開始鬆動了。從被認為是一個“讓利於民”、“便民”的政策,到現在,越來越多人似乎開始隱隱覺得哪裡有些不對,國慶的出行討論,也越來越離不開的一個字,就是“堵”。

#程式設計師又人黑!大叔確定才25歲不是52歲嗎?

現在的網際網路時代離不開程式設計師在背後的努力,程式設計師更是要立志改變世界的那一群人,但是網上黑程式設計師的段子確實層出不窮,有個靠譜的說法就是本來是程式設計師自黑的段子,但是傳的多了,大家便信以為真這就是真實的程式設計師。比如不修邊幅、滿臉痘痘、單身等,鍾愛

的爬蟲又真是蠢的可以!用這個不再擔心封爬蟲!

  Spider 當 start_urls 未被指定,會呼叫 start_requests() ,該方法可以用於在爬取資料之前,先進行模擬登陸。 import scrapy from scrapy.http import Request from scrapy.selec

聽說的爬蟲又?那是不會這些

目錄    前言    Spider    Middleware    瞎比比 前言 上一篇文章《爬蟲利器初體驗(1)》中,我們舉了個簡單的栗子,但是在真實的開發中這樣的爬蟲程式碼很容易就會被封掉

再這麼配培養基,的細菌都毒死

文章目錄 微生物培養基的前世 過氧化氫的產生導致許多微生物不能生長 實驗設計 具體實驗方法 三種不同環境樣品分離培養實驗 非培養高通量測序與分離培養結果比較 總結 **Ref

【VIP視訊網站專案三】專案框架搭建、專案路由配置、資料庫表結構設計

一、專案路由的設計 視訊網站前臺頁面路由設計 路由 請求方法 模板 作用 / GET Index.html