- Unity3D高級編程:主程手記
- 陸澤西
- 2444字
- 2022-01-07 14:46:13
1.2 軟件架構(gòu)的思維方式
前面對軟件架構(gòu)進(jìn)行了一個深入的解釋,對什么是軟件架構(gòu)、為什么需要軟件架構(gòu)、怎樣才算是優(yōu)秀的軟件架構(gòu)進(jìn)行了詳細(xì)的分析。
本節(jié)我們介紹在構(gòu)建軟件架構(gòu)的過程中需要使用的幾種思維方式。我們在生活和學(xué)習(xí)中常常有思維方式的轉(zhuǎn)換,構(gòu)建軟件架構(gòu)也同樣需要不同的思維方式。
對于軟件架構(gòu)設(shè)計來說,我們應(yīng)從思維方式入手,先學(xué)習(xí)如何建立抽象構(gòu)建架構(gòu)的思維方式。
架構(gòu)既承載了我們對這個項目的抽象思維,也幫助我們厘清了業(yè)務(wù)體系的方向。如果要問軟件研發(fā)、架構(gòu)設(shè)計中最重要的能力是什么,我會毫不猶豫回答是抽象能力。
抽象能力是一個比較重要的能力,它不僅在生活中很重要,在進(jìn)行軟件架構(gòu)設(shè)計時尤其重要。一個項目在最初的設(shè)計中是沒有可見實體的,需要我們憑空創(chuàng)造出一個能看到或想象的目標(biāo)實體,這個目標(biāo)實體大概率會指向軟件形成的最終形態(tài),不會偏離很多。抽象能力在這個特殊時期發(fā)揮了重要作用,它可以幫助我們在沒有形成任何可見、可幻想的實際目標(biāo)之前,為目標(biāo)描繪出一個大致的輪廓,這樣我們在實現(xiàn)架構(gòu)的途中就有了一個可見的標(biāo)準(zhǔn)和目標(biāo)。因此,實際工作中抽象能力的強(qiáng)弱,直接決定我們所能解決問題的復(fù)雜度和規(guī)模大小。
軟件架構(gòu)設(shè)計和小朋友搭積木無本質(zhì)差異,只是解決的問題域和規(guī)模不同罷了。架構(gòu)師先要在大腦中形成抽象概念,然后以模塊的形式進(jìn)行拆分,設(shè)計子模塊之間的溝通方式,再依次實現(xiàn)子模塊,最后將子模塊組合起來,形成最終的系統(tǒng)。我們常說編程和架構(gòu)設(shè)計就是搭積木,優(yōu)秀的架構(gòu)師受職業(yè)習(xí)慣的影響,眼睛里看到的世界都是模塊化組合方式。
可以這樣認(rèn)為,我們生存的世界都是在抽象的基礎(chǔ)上構(gòu)建起來的,離開抽象,人類在對事物進(jìn)行構(gòu)建時寸步難行。
一篇名為《優(yōu)秀架構(gòu)師必須掌握的架構(gòu)思維》[1]的文章就很好地對抽象能力進(jìn)行了分析,以下三種抽象能力源自這篇文章。
第一種:分層思維
分層是我們應(yīng)對和管理復(fù)雜性的基本思維武器。
面對一個復(fù)雜的系統(tǒng),我們一開始總是無從下手,就好比一下子在我們面前擺了很多的問題,雜亂無章。這很大程度上會導(dǎo)致我們慌張、焦急、惶恐。分層思維,能很好地幫助我們抽象一個復(fù)雜系統(tǒng)的架構(gòu)層次,從而清晰地描述有多少層面的事務(wù)需要我們解決,以及解決層級的先后次序。
構(gòu)建一套復(fù)雜系統(tǒng)時,我們把整個系統(tǒng)劃分成若干個層次,每一層專注解決某個領(lǐng)域的問題,并向上提供服務(wù)。這樣的抽象做法,讓復(fù)雜的事務(wù)變得更加清晰、有序。有些層次并不一定是橫向的,也可以是縱向的,縱向的層次貫穿其他橫向?qū)哟危Q為共享層,如圖1-1所示。

圖1-1 分層抽象設(shè)計
下面介紹幾個用分層思維作為抽象方法的架構(gòu)案例。
對于一個中小型的Spring Web應(yīng)用程序,我們一般會設(shè)計成三層架構(gòu),如圖1-2所示。

圖1-2 Spring Web設(shè)計
Linux操作系統(tǒng)是經(jīng)典的分層架構(gòu),如圖1-3所示。TCP/IP協(xié)議棧也是經(jīng)典的分層架構(gòu),如圖1-4所示。

圖1-3 Linux操作系統(tǒng)分層架構(gòu)

圖1-4 TCP/IP分層架構(gòu)
如果你關(guān)注人類文明進(jìn)化史,你會發(fā)現(xiàn),今天的人類世界也是以分層方式一層一層搭建和演化出來的。今天的互聯(lián)網(wǎng)系統(tǒng)可以認(rèn)為是現(xiàn)代文明的一個層次,其上是基于互聯(lián)網(wǎng)的現(xiàn)代商業(yè),其下是現(xiàn)代電子工業(yè)基礎(chǔ)設(shè)施,諸如此類。
第二種:分治思維
分而治之也是應(yīng)對和管理復(fù)雜性的一般性方法,圖1-5展示的是一個分治的思維流程。
2015年我在思考Unity3D手游項目發(fā)布流程時,用分治法對發(fā)布流程進(jìn)行抽象分解,首先把code(編碼)作為主中心,再把除了code以外的事項拆分成打包發(fā)布、資源部署到外網(wǎng)、檢測、版本控制、設(shè)置項目管理平臺等部分。最后將拆分出來的大塊問題進(jìn)行細(xì)化,分解成具體的某個小問題,如圖1-6所示。

圖1-5 分治抽象設(shè)計
對于一個無法一次解決的大問題,我們先把大問題分解成若干個子問題,如果子問題還無法解決,則繼續(xù)分解成子子問題,直到可以直接解決為止,這就是分解(divide)的過程;然后將子子問題的解組合成子問題的解,再將子問題的解組合成原問題的解,這就是組合(combine)的過程。
在生活中分治思維可解決大問題、復(fù)雜問題。特別是當(dāng)你遇到那些從未處理過的問題,或者特別復(fù)雜以至于超出你能力范圍的問題時,把它進(jìn)行分解、拆分、解剖、撕裂。把大問題先分成幾大塊的問題,再從這幾大塊問題入手,對每個大塊問題再分解,拆分成小塊問題。倘若小塊問題仍然無法解決,或者還是沒有思路,則再拆分,再解剖,再分解,直到分解到你能開始著手解決為止。這樣一步步、一點點,把小問題解決了,就是把大問題解決了。隨著時間的推移,不斷解決細(xì)分的小問題,大問題便可迎刃而解。

圖1-6 發(fā)布流程設(shè)計
第三種:演化思維
經(jīng)常有人討論:架構(gòu)是設(shè)計出來的還是演化出來的?基于多年的經(jīng)驗,我認(rèn)為架構(gòu)既是設(shè)計出來的,同時也是演化出來的。對于互聯(lián)網(wǎng)系統(tǒng),基本上可以說是三分設(shè)計,七分演化,既在設(shè)計中演化,又在演化中設(shè)計,是一個不斷迭代的過程。
在互聯(lián)網(wǎng)軟件系統(tǒng)的整個生命周期中,前期的設(shè)計和開發(fā)大致占三分,在后面的七分時間里,架構(gòu)師需要根據(jù)用戶的反饋對架構(gòu)進(jìn)行不斷的調(diào)整。我認(rèn)為,架構(gòu)師除了要利用自身的架構(gòu)設(shè)計能力外,也要學(xué)會借助用戶的反饋和進(jìn)化的力量,推動架構(gòu)的持續(xù)演進(jìn),這就是演化式架構(gòu)思維。
當(dāng)然,一開始的架構(gòu)設(shè)計非常重要,架構(gòu)確定,系統(tǒng)基本就成型了。同時,優(yōu)秀的架構(gòu)師深知,能夠不斷應(yīng)對環(huán)境變化的系統(tǒng)才是有生命力的系統(tǒng),架構(gòu)的好壞很大部分取決于它應(yīng)對變化的靈活性。所以具有演化式思維的架構(gòu)師,能夠在一開始設(shè)計時就考慮到后續(xù)架構(gòu)的演化特性,并且將靈活應(yīng)對變化的能力作為架構(gòu)設(shè)計的主要考量。
從單塊架構(gòu)開始,隨著架構(gòu)師對業(yè)務(wù)域理解的不斷深入,也隨著業(yè)務(wù)和團(tuán)隊規(guī)模的不斷擴(kuò)大,漸進(jìn)式地把單塊架構(gòu)拆分成微服務(wù)架構(gòu)的思路,就是演化式架構(gòu)的思維。如果你觀察現(xiàn)實世界中一些互聯(lián)網(wǎng)公司(如eBay、阿里、Netflix等)的系統(tǒng)架構(gòu),就知道它們大部分走的是演化式架構(gòu)的路線。
圖1-7所示的是建筑的演化史,在每個階段,你可以看到設(shè)計的影子,但如果時間線拉得足夠長,演化的特性就出來了。

圖1-7 建筑的演化史
綜上所述,我們強(qiáng)調(diào)了抽象思維在架構(gòu)設(shè)計中的重要性,以及抽象思維的幾種用法,包括分層思維、分治思維及演化思維,它們在抽象的架構(gòu)設(shè)計中起到了很好的作用。
[1] 見https://www.infoq.cn/article/architecture-thought。
- 程序員面試筆試寶典(第3版)
- 數(shù)據(jù)庫系統(tǒng)教程(第2版)
- JavaScript 從入門到項目實踐(超值版)
- OpenCV for Secret Agents
- Mastering C# Concurrency
- 深度學(xué)習(xí):算法入門與Keras編程實踐
- 零基礎(chǔ)學(xué)單片機(jī)C語言程序設(shè)計
- .NET 3.5編程
- Windows Phone 7.5:Building Location-aware Applications
- C語言程序設(shè)計
- 開源項目成功之道
- Delphi開發(fā)典型模塊大全(修訂版)
- Modernizing Legacy Applications in PHP
- HTML5游戲開發(fā)實戰(zhàn)
- Java EE項目應(yīng)用開發(fā)