聊聊架構設計做些什麼來談如何成為架構師

来源:https://www.cnblogs.com/Zachary-Fan/archive/2018/07/13/architecturetoarchitect.html
-Advertisement-
Play Games

閱讀目錄 架構的定義 架構是做什麼? 做架構的最佳實踐 什麼是好架構 如何成為架構師 結語 又有2周時間沒冒泡了,最近實在沒有大塊的時間來寫文章,就當找個理由。。。 也因為碎片化的時間多了,所以開始刷某乎了,關註了架構相關的板塊,也順手回答了一些問題。發現有很多同道中人正在經歷著我前兩年經歷的階段, ...


閱讀目錄

  

  又有2周時間沒冒泡了,最近實在沒有大塊的時間來寫文章,就當找個理由。。。

  也因為碎片化的時間多了,所以開始刷某乎了,關註了架構相關的板塊,也順手回答了一些問題。發現有很多同道中人正在經歷著我前兩年經歷的階段,對於做架構沒有相對具象的一些理解,更沒有系統化的認識。所以把最近回答的一些內容整理一下,權當記錄,留給3年後的自己~

  按慣例,容許我裝X開頭~

 

一、架構的定義

  在軟體開發領域,自從架構這個詞被廣泛傳播之後,產生的架構模式也非常多,架構關註點也在增加。但回到“道”的層面,架構的定義或者說本質還是:

  架構,又名軟體架構,是有關軟體整體結構與組件的抽象描述,用於指導大型軟體系統各個方面的設計。

                                 ————摘自《百度百科》

 

二、架構是做什麼?

  很多做業務功能的增刪改查開發感受到無趣的小伙伴常把做架構想象成一片樂土,沒有嘈雜的業務聲音干擾,可以專心做一番牛X的技術。會把架構單純的理解成,牛X的性能、牛X的TPS、高可用,支撐了多少PV等等。但是其實這些只是架構很小的一部分,並不是全部。在互聯網時代之前都是C/S程式的天下,那個時候並沒有對性能等有像現在這樣的關註度,但是就已經有架構之說了。 世上本無架構,只是由於團隊越大越需要對整體的規則做約定,好讓大家往同一個方向發力,避免各自為戰,產生大量的內耗,所以才逐漸形成了架構。這條路就是“世上本無路,只是因為走的人多了變成了路”。

  為什麼說一個軟體架構是很重要的呢?當我們的團隊人數只有2、3個人,甚至只有1個人單槍匹馬的情況下,可能架構凸顯的作用不是那麼的明顯,但是如果團隊大了之後相信下麵的這些現象會比較常見:

  • 新上一個系統,往往不是獨立存在的,一般都需要與現存的系統進行交互,而需要集成交互的地方可能還很多,哪些集成是本系統需要實現的?同時,一般會劃分為多個階段開發,怎樣界定系統的邊界呢?
  • 軟體系統是一個由多個模塊組成的整體。因此當上游開發與我們負責的模塊銜接老是出問題時,自己再做更多的努力也無法扭轉上游模塊的質量差帶來的負面效果。(我想大家這時候肯定是抓狂的。)
  • 每次看到別人寫的代碼,老覺得自己來寫的話肯定不會這麼寫。比他寫的更好。(我們做技術的,自我感覺良好是個常態:)。)
  • 在某些場景下,自己腦子裡有多套方案來實現,但是對孰優孰劣沒太大感覺,最終基本上就是拍腦袋選了一個。
  • 某塊代碼維護的次數多了,特別是中間由多個人接手過後,代碼風格各異,難以理解。
  • 相似的代碼在好幾個地方出現,特別是一些非業務性的代碼,比如日誌處理等。再甚是在大型的分散式系統中,不同子程式使用了不同的同類型中間件,同樣導致維護成本大增。
  • 在2個相依賴項目邊界處的設計產生了分歧,並且站在各自的角度看都有道理。

  任何事物都是有兩面性的,並不是說上面的這些問題,我們通過架構就要往另外一個極端去走。比如在大型的分散式系統中,不同子程式的確有必要在某些時刻選擇同類型的其它中間件。如Kafka和RabbitMQ雖都是MQ,但在特定的場景下能發揮的價值是無法相互替代的。

  所以我們做架構有一點也是比較重要的,就是去Balance,選擇一個投入產出比最優的方案。關於這點第四段中會多說幾句。

  除此之外,架構的主要目的是為了讓大家往同一個方向,在同一個標準之上去發散擴張。一是把控硬性的下限標準,提高整體的最短版,二是提高上限水平位,也就是天花板位置,提供更大的發展空間。好比造一幢大樓,把框架結構設計好搭好,讓大家形成一個共識,什麼是承重牆不能破壞,什麼是創變空間可以自定義。在這樣的基礎下各自發展。這個看上去是個限制,但卻是做架構最重要的任務,所謂再多的文檔,再多的最佳實踐都比不上一條約束。降低複雜度、降低理解難度,是實實在在的收益。最怕的就是憑空假設帶來的過度浪費。

  更甚之,我們做架構追求的理想國度是一個大家擁有一致共識的世界,架構是大家都像吃飯喝水這樣習以為常的習慣。去理解或者接手其它人負責的項目的時候就好像是自己寫的一樣。這個時候就消滅架構了,就好比現在沒有人會教你如何吃飯一樣。(就當YY一下吧:)。)

 

三、做架構的最佳實踐

  上面提到更多的是做架構的目的,那麼要做好架構,主要就是要做好抽象,做抽象的方式是類比,做類比的方式可以使用用例圖。所以建議大家多畫圖,通過畫圖來將大腦中抽象的結果直觀的體現在前面,再來進一步分析合理性。主要推薦2種圖的類別,一種就是前面提到的用例圖。如下圖:

 

 

  另外一種是魯棒圖,如圖:

  整個過程的主要目的是:

  • 描述其與外部實體(系統和最終用戶)的交互。
  • 標識系統和外部實體間的信息和控制流。

  最後附一篇之前整理的《軟體開發中會用到的圖》的文章地址,有興趣的同學可以擴展閱讀下:https://www.cnblogs.com/Zachary-Fan/p/developdiagram.html

 

  理想的世界里,我們程式的邊界設計恰好匹配於業務邊界。然而我們作為工程師首先要承擔業務需求的壓力,只能擠時間去做這些非業務性工作。也因此老項目的業務邊界也並不總是如新項目那樣明晰。

  這意味著做任何架構的改動要考慮優先順序,特別在拆分業務領域之前認真地思考業務的邊界。排定優先順序,考量拆分的收益與風險。劃分業務的邊界,則需要更多的思考拆分後的未來將如何溝通協作,然後再考慮技術因素。在技術因素前,主要考量這幾點:

  • 是否擁有獨立的團隊來維護,以及是否擁有發展為一項獨立業務的潛力。(非必要的情況下,一定要避免共用內核的開發方式)
  • 圍繞領域而非 feature,有明確的維護團隊,避免過於細粒度。
  • 拆分或者組合之後,能否改善現有的協作流程。
  • 能否幫助區分核心、非核心業務,改善穩定性。 

  上面這些完成了之後,便是選擇合適的中間件、技術框架來滿足技術層面的要求,這個的選拔主要以下麵幾點來考量:

  • 如果是直接引入第三方的中間件的話,成熟度如何?是否有大公司在用?(有大公司的口碑背書的肯定大大加分)
  • 近期的社區活躍度如何?(用於考量是否有更多的人在一起踩坑,降低各自遇到坑的數量和概率)
  • 硬指標,當前場景的硬性要求是否滿足。如性能、對關鍵部分或者未來的可擴展性等。
  • 軟指標,複雜度、可維護性等。這裡可以羅列幾個競品的優劣勢。
  • 最重要的是要自己去親自驗證上面的幾點,並且做一定的模擬工作。
  • 如果曾經用過或者有其中一部分的經驗可復用,這是加分項,畢竟在使用的過程中才發現hold不住它,那是災難性的!

 

四、什麼是好架構

  之前有聽到過一句話,概括的很精辟。好的架構必須需要貼合業務,那麼把業務+技術演變成一個數學公式來表達可以理解為:2個數字的和等於10,求如何組合能得到最大的乘積。那不是3*7,也不是4*6,而是5*5。

  所以架構不是生搬硬套,為了架構(搞事情)而架構,趕時髦,或者說裝X。我們應避免通過個人的主觀意願來主導。比如自己覺得某個中間件好,就”拿著錘子到處找釘子“,這一敲下來,看著不錯,但是帶來的成本和風險被忽略了。可能有更好的解決方案,或者完全沒必要在當下敲這一釘子下去。  

  好的架構需要評判投入產出比,收益更高的就是更好的架構,就如下圖的公式。產出可以理解為我們因此獲得的好處(諸如可靠性、安全性、可擴展性、可維護性、可伸縮性、性能等),成本是我們改造花費的投入,如人力物力和時間。特別註意的是風險這點,是很重要也是很容易被大家忽略的一點,是起到指數級作用的。選擇的方案再好,如果都是一些hold不住的技術,那麼風險就是無窮大,導致減號右側無限趨近於0,最終的結果就是收益是負數,投入的成本打水漂,甚至還要加上其它額外的付出。

  

 

五、如何成為架構師

  上面提到的這些關註點都是架構師的職責,另外特別重要的一點是,架構師必須要是個有追求的“好碼農”!!!(劃重點)。軟體架構師不像建築師,其面對的本身是一個抽象的事物,如果再脫離了實操,這基本和紙上談兵無異。所以實際工作中的難點、要點都得清楚,並且能夠給出解決方案或者方向。另外只有熟悉實操才能更準確的評估成本

  成為了一個真正的“好碼農”就向架構師邁出第一步了。而後呢,需要不斷以深 --> 廣 --> 深 --> 廣的節奏去開疆擴土,擴大自己的知識領域,當然需要以貼近當前工作內容的知識為主,這是第二步。到了這還沒完,還有打造三板斧:業務能力、溝通能力、個人魅力。

  題外話,在國內,純技術的架構師沒有應用型的架構師吃的開。所以此文皆以應用型架構師的職能要求為參考。

 

六、結語

  回到文章開頭,架構的表現形式有很多,從本質上單體應用的架構設計思想和分散式系統是一致的,所謂服務化其實也是模塊化的思想,只是維度的不同,導致用到的一些工具或者環境不同,但這都是“術”層面的東西。光學這些招數,永遠也學不完。架構之路漫長,繼續前行,共勉。

 

 

作者:Zachary_Fan
出處:https://www.cnblogs.com/Zachary-Fan/p/architecturetoarchitect.html

 

 

如果你想及時得到個人自寫文章的消息推送,歡迎掃描下麵的二維碼~。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTML介紹 Web服務本質 瀏覽器發請求 --> HTTP協議 --> 服務端接收請求 --> 服務端返迴響應 --> 服務端把HTML文件內容發給瀏覽器 --> 瀏覽器渲染頁面 HTML是什麼? 超文本標記語言(Hypertext Markup Language, HTML)是一種用於創建網頁的 ...
  • 一個div同時設置background-color和background-image的話,color是處於img層下方的,無法實現遮罩效果,所以需要再創建一個div作為其子div,然後設置子div的背景顏色,介紹兩種方法: 第一種,代碼如下: 第二種,通過after偽元素設置,代碼如下: 借鑒文章出 ...
  • 我通常上網使用兩個瀏覽器,safari用於一般上網;Chrome安裝SwitchyOmega插件,在不同的代理中切換,來保證某些網站的上網速度。 但是這種方式到了手機上就有點懵,幾乎所有的iPhone瀏覽器都不支持代理的自動切換和設置,所以只能選一個相對相容性比較好的網路方式一直用下去。很不爽利。。 ...
  • 一、對象 1.字面量創建對象 2.數據描述和存取描述設置 3.get和set 4.數據描述和存取描述檢查 二、prototype 1.prototype釋義 2.prototype與__proto__ 3.prototype之共用性 4.prototype之繼承性 三、類 1.類的封裝 1.混合的構 ...
  • 技術交流群:821039247 安裝node config模塊 在config文件夾下麵創建 文件,這是環境配置的預設的文件,如果沒有別的配置,則為預設這裡配置。如果要設置自己的環境配置文件,可以直接新建 ,如dev環境 即可,然後在 裡面配置相關啟動設置,載入對應環境文件即可。 在 裡面編輯如下內 ...
  • 因為是新入門antd-pro這個的小白,所以在mock數據和伺服器數據切換這裡搞了將近2天才弄好,配置如下,供各位初學者參考,如有錯誤的地方,請大神指出~叩謝!! 下麵開始乾貨: 1、.roadhogrc.mock.js這個文件沒有任何修改。 2、.webpackrc.js 文件中添加proxy,如 ...
  • 微信展示列表效果藉助於 wx:for 簡單寫一個列表(wxml文件中): 對應的數據源(js文件中): 寫一個點擊監聽: 效果: 以上、可以實現列表的item點擊效果,但是無法到點擊的item對應的數據源數據 解決方法: 給有點擊事件的組件添加一個 data-any 屬性 any可以是任意數據類型。 ...
  • transition從效果上看是一種平滑過渡的動畫,本質上是線上性時間內將屬性從開始值過渡到結束值。例如獲得焦點,點擊滑鼠等動作導致CSS屬性值的變化是瞬間完成的,感覺有點生硬。用transition可以指定在某時間段內將屬性值平滑過渡,增強用戶體驗。 4個子屬性 transition-proper ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...