沒有一種架構(gòu)是可以滿足所有迭代的需求的
前言
是架構(gòu)設(shè)計作為軟件生命周期的一部分,并不是說開始的時候 設(shè)計完成后就會一成不變,軟件的生命周期包含了迭代、維護(hù)、重構(gòu)等過程,架構(gòu)設(shè)計亦是如此,所以說架構(gòu)是需要變化的,目的就是適應(yīng)當(dāng)前情況的開發(fā)場景。
而架構(gòu)產(chǎn)生的時間,必定是受到當(dāng)時的約束條件,如人力、團(tuán)隊(duì)技術(shù)積累、時間、業(yè)務(wù)定位等等需求。所以,當(dāng)前架構(gòu)可能并不能滿足未來的需求,我們要開放對待這個問題,只要當(dāng)前的架構(gòu)符合一定的設(shè)計原則,未來進(jìn)行架構(gòu)的演進(jìn)就不是問題。
“架構(gòu)”這個詞解釋也沒有一個明確的定義,每個層級,每個場景都有自己的解釋,所以到底什么是架構(gòu)呢?
軟件架構(gòu)的定義
軟件架構(gòu)(software architecture),是一系列相關(guān)的抽象模式,用于指導(dǎo)大型軟件系統(tǒng)各個方面的設(shè)計。
-摘自百度百科
其實(shí)軟件開發(fā)和蓋一棟大樓一樣,都需要規(guī)劃、設(shè)計、實(shí)施等一系列的階段,最開始設(shè)計建筑圖紙,主體架構(gòu),還要考慮綠化、材料、安全等因素。經(jīng)過一系列的決策,才有一套成熟的建筑施工方案,按照規(guī)范建造,才能保證質(zhì)量和速度。
而開發(fā)一個軟件或前端工程也是一個“建筑”的過程,我們要通過業(yè)務(wù)來定位系統(tǒng)間的關(guān)系,討論技術(shù)棧和框架的選用,根據(jù)當(dāng)前團(tuán)隊(duì)的技術(shù)水平進(jìn)行技術(shù)的選型、考慮各個模塊間的界限和交互,上線部署策略,問題回滾策略等一系列的決策才能設(shè)計出符合當(dāng)前情況的技術(shù)架構(gòu)。
前端開發(fā)過程中需要怎樣的架構(gòu)
大體來看基本要求點(diǎn)如下:
- 符合當(dāng)前的業(yè)務(wù)定位
- 前端架構(gòu)必須具有可實(shí)施性
- 必須匹配當(dāng)前技術(shù)儲備
- 有足夠的人力資源去完成
- 具有可伸縮、可擴(kuò)展性
【因地制宜】應(yīng)該是開始設(shè)計架構(gòu)的基本準(zhǔn)則,每套架構(gòu)的產(chǎn)生都有他的外界因素影響,所以,各個公司,各個團(tuán)隊(duì)之間的架構(gòu)不能照搬,如果強(qiáng)制搬過來,可能會適得其反,就像你那 alibaba 的技術(shù)架構(gòu)去搬到 初創(chuàng) 公司,那是根本行不通的,人員,資源不匹配,是沒辦法去實(shí)施架構(gòu)的。
因此我們在項(xiàng)目前端開發(fā)的生命周期中期望的架構(gòu)應(yīng)該具有哪些要點(diǎn)呢?
- 準(zhǔn)確的業(yè)務(wù)定位,業(yè)務(wù)可能是影響架構(gòu)的主要因素之一,所以我們要找準(zhǔn)業(yè)務(wù)上的定位
- 明確與其他系統(tǒng)之間的關(guān)系,確定與其他系統(tǒng)的層次關(guān)系,相互間的通訊依賴等
- 設(shè)計好系統(tǒng)內(nèi)子模塊之間的關(guān)系,如A業(yè)務(wù)模塊需要與B模塊交互,該采取怎樣的方式
- 基礎(chǔ)模塊明確,項(xiàng)目中,必定含有基礎(chǔ)模塊去提供一些公用的方法,數(shù)據(jù)去提供給各個子模塊
- 組件規(guī)劃,這就是再細(xì)一層的規(guī)劃了,制定組件的交互方式,開發(fā)范式
- 開發(fā)規(guī)范和上線流程,用于指導(dǎo)開發(fā)中的過程
架構(gòu)設(shè)計 setp
設(shè)計需要進(jìn)行一系列的技術(shù)及非技術(shù)的相關(guān)工作
- 收集利益相關(guān)者的需求,產(chǎn)品經(jīng)理、業(yè)務(wù)人員、項(xiàng)目負(fù)責(zé)人等
- 與相應(yīng)技術(shù)人員進(jìn)行討論,確定架構(gòu)上的潛在限制和要求
- 尋找可行性的技術(shù)方案
- 細(xì)化技術(shù)方案細(xì)節(jié),確定一些功能列表中的技術(shù)可行性
- 確定風(fēng)險點(diǎn)
- 與技術(shù)人員反復(fù)討論,集合大家意見
- 對技術(shù)方案進(jìn)行demo的概念驗(yàn)證
- 結(jié)合當(dāng)前業(yè)務(wù),細(xì)化架構(gòu)的部分實(shí)施細(xì)節(jié)
- 進(jìn)行排期
架構(gòu)設(shè)計原則
不同的架構(gòu)師可能會有不同的觀點(diǎn),但是能被人大多數(shù)架構(gòu)師認(rèn)同的有一下三點(diǎn)
- 不多也不少:不做多余的設(shè)計,也不缺少核心部分
設(shè)計過少則為設(shè)計不足,會使一個框架的伸縮性和擴(kuò)展性不強(qiáng),不能靈活的面對即將產(chǎn)生的業(yè)務(wù)需求的迭代。 設(shè)計過度也不一定是件好事,針對未來的技術(shù)框架或者需求的變更,我們不能保證目前的架構(gòu)就一定能兼容這些變化,過度設(shè)計反而會讓我們一會的架構(gòu)重構(gòu)產(chǎn)生很多無用的開發(fā)變更,增加成本反而得不到相應(yīng)的輸出價值。
- 演進(jìn)式:不斷的演進(jìn)以架構(gòu)適應(yīng)當(dāng)前的環(huán)境
適應(yīng)環(huán)境能夠生存下來的物種,并不是那些最強(qiáng)的,也不是最聰明的,而是那些對變化做出快速反映的。 -達(dá)爾文
演進(jìn)事架構(gòu)是指在開發(fā)過程中,預(yù)先設(shè)計好重要的部分如系統(tǒng)模塊通信,功能模塊劃分,具體組件顆粒度等,然后在編碼過程中,再進(jìn)行細(xì)顆粒度的劃分,遇到不適合的地方,進(jìn)行快速的反應(yīng),找到最優(yōu)解,最理想的狀態(tài)是,20%的計劃,80%的演進(jìn)設(shè)計
- 持續(xù)性:長期的架構(gòu)的改進(jìn)
持續(xù)性和演進(jìn)式有一定的共同性,演進(jìn)式的目標(biāo)是在開發(fā)過程中進(jìn)行架構(gòu)的細(xì)化,持續(xù)性則指在迭代過程中進(jìn)行框架的進(jìn)階,在迭代過程中,難免會出現(xiàn)架構(gòu)不符合當(dāng)前狀況的情況,我們要靈活應(yīng)對,進(jìn)行持續(xù)性的優(yōu)化,這樣才能在迭代開發(fā)過程中,做到最優(yōu)框架的目的
【延遲決策】有時候“拖延癥”也并不一定是壞處,哈哈,開個玩笑,在我們設(shè)計架構(gòu)的時候,會經(jīng)歷一系列的方向決策,但是一個框架的發(fā)展并不是總是一帆風(fēng)順,當(dāng)遇到演進(jìn)方向決策的時候,沒有找到最優(yōu)解,我們可以進(jìn)行延遲決策,等等,也許就會有答案,這樣也許會比當(dāng)時匆忙做出的決定要更符合預(yù)期。
前端架構(gòu)設(shè)計的層次
不同階段構(gòu)成架構(gòu)的因素是不同的,基于這個思路,架構(gòu)設(shè)計可以分為四個層級
1.系統(tǒng)級
對于其他業(yè)務(wù)系統(tǒng),我們該如何設(shè)計之間的通信、協(xié)作、交互。比如A系統(tǒng)承載了內(nèi)容庫模塊,B系統(tǒng)需要用其中的選擇內(nèi)容組件,我們設(shè)計了一套csi。去托管通信
- 對于前后端的服務(wù)通信方式。ws or http,鑒權(quán),config記錄等
- 對于報錯收集處理的基礎(chǔ)信息建設(shè)
- 是否采用微前端等架構(gòu)
2.應(yīng)用級
應(yīng)用級是指多個子應(yīng)用直接的關(guān)系設(shè)計,可能是子應(yīng)用,子模塊,lib包、共享模塊等,也就是架構(gòu)設(shè)計的進(jìn)一步細(xì)化
- 腳手架的設(shè)計,可以規(guī)范應(yīng)用的基礎(chǔ),有利于快速的構(gòu)建子模塊或者子應(yīng)用,加入一些格式化插件,可以有效的防止一些不符合要求的代碼上傳到遠(yuǎn)程倉庫
- lib包設(shè)計,可以把一些公用的,細(xì)顆粒度,重復(fù)利用性高的作為一個lib包抽取
- 組件系統(tǒng)模板,基礎(chǔ)組件設(shè)計好模板,有利于提高開發(fā)效率
3.模塊級
模塊級是深入到子應(yīng)用的級別的層次,顆粒度更加細(xì)化,包含一些設(shè)計模式和UI層面的規(guī)定,比如,單項(xiàng)還是雙向數(shù)據(jù)流,采用的UI模板,公共css等
4.代碼級
代碼級的層級用于規(guī)范開發(fā)人員的代碼,提高代碼質(zhì)量,此層次要做的工作有:
- 初期的開發(fā)指導(dǎo)文檔
- 開發(fā)過程中的 codeReview
- 定期的技術(shù)交流分享
- 開發(fā)文檔或代碼注釋的生產(chǎn)
架構(gòu)并不是只限于技術(shù)選型