銜尾之蛇:前端技術架構與工程的持續演進

管理員賬號

2019-12-25


銜尾蛇(Ouroboros),一個存在于多種文明、宗教和神話故事中的符號,一條吞食自己尾巴的蛇,形象要么是一個圓環,要么是一個類似莫比烏斯環的閉合紐帶,后者非常接近數學中的無窮大符號「∞」。

軟件開發技術是原子性的,與具體的業務需求無關。實際問題的解決依賴技術,但往往并不直接依賴技術,所以催生出各式各樣的架構模式以適應具體的業務需求。軟件開發并不僅受技術架構單方面的影響,人的因素同樣不容忽略,以規范、有序、高效為目標的工程旨在使用技術手段降低人可能導致的負面影響,而且必然是在項目的既有技術架構的基礎之上實施的。

反過來看,工程生態的繁盛為技術進一步發展提供了必要的基礎。

技術推進架構演進,架構支撐工程實施,工程為技術發展提供生態土壤,三者之間首尾相連同步演進的關系與銜尾蛇的形象頗為相似。

RockfordLhotka 在 Expert C# Business Objects 一書中提出分層軟件架構模型,不論是數據、服務還是表現層,均依托于當時的技術背景。分層軟件架構模型如下圖所示。

分層軟件架構是實現關注點分離的必要途徑,層級之間的劃分是一種架構設計上的約定而非職能上的切割。各個層級之間往往沒有絕對明確的分界線。不同類型、場景、規模的項目在層級上的劃分可能會存在很大差異。

軟件開發技術的發展不斷地推進著架構的演進。在 Expert C# Business Objects 一書出版十幾年后的今天,五層架構模型雖然并未完全過時,但其中個別細節相較于十幾年前已經有了很大的變動。比如,以當前技術背景為依托的前后端分離架構,在業務邏輯層和客戶端之間可能需要一個中間渲染層承擔SSR(服務器端渲染)能力,如下圖所示。

軟件工程(SoftwareEngineering)一詞正式得名有多種來源,認可度相對較高的一種說法是來自于NATO在1968年舉辦的首屆軟件工程會議。工程的核心是結合實際情況建立科學的、規范的設計和生產流程,降低生產成本。將這一理念帶入軟件開發領域便形成了軟件工程。

作為一門與計算機科學技術平行的一級學科,軟件工程的核心思想是以工程的理念進行軟件開發和管理,目的是解決軟件危機。典型的軟件危機包括:

?成本超標,包括硬件成本、人員成本、時間成本等。

?性能不理想且功能不穩定。

?開發過程混亂無序難以管理。

?代碼不規范,維護成本高。

從經濟學的角度來看,軟件危機的問題是昂貴的成本沒有換來對應的收益,這也是工程學與學術研究之間最大的不同。

而軟件工程的基礎必然無法脫離學術研究所產出的可用技術以及在技術可行性前提下建立的軟件架構。

代碼和流程是軟件工程的核心關注點。從代碼的角度考慮,工程的目標是保證軟件的高可用性、可擴展性、可伸縮性、性能以及安全,這些要素共同組成了軟件的技術架構。在架構之外,工程從更宏觀的角度完善開發和維護流程的管控,強調項目迭代的規范性、 有序性、可控性和高效性,并根據架構特征提供額外的輔助功能。也就是說,架構是工程的子集,兩者的關系可以簡單地概括為如下圖所示的內容。

將以上理論帶入前端范疇便得出了前端工程化的完整定義:

前端工程化=前端技術架構+前端工程服務體系

在以上理論基礎上,前端工程化的工作便可以分為技術架構和工程效率兩部分。

▊ 技術架構

技術架構面向代碼,分治與聚合是架構的兩個基本要素。分,即將問題化整為零,各個擊破;合,即將各個模塊化零為整,融會貫通。這種理念不僅僅是軟件架構的根本,也同樣適用于其他的工作領域。具體到實際開發工作,在進行軟件架構設計之前往往需要充分的預備工作,比如編程語言的選擇、技術規范的制定以及根據業務類型進行合理的技術選型等。

?編程語言:對于編程語言選型單一的前端來說,編程語言的意義并不僅僅是一種工具,而且是一種思維模式。在充分了解語言特性的前提下制定適用于業務類型的開發規范和技術棧,是前端架構師的必備能力。

?技術規范:技術規范的優劣并沒有絕對的評判標準,其唯一的原則是一致性。統一的技術規范能夠顯著提高團隊協作和項目迭代的效率,這種優勢隨著團隊規模和項目量級的增長被逐步放大。

?組件化:組件化是代碼復用的一種經典實施模式。前端組件的定義不僅停留在 UI 層面,而且融入了一些面向對象的理念,比如封裝性、擴展性、可組合性、可復用性等。

?前后端分離:前后端分離的宗旨是將前端開發與后端開發解耦,進而實現開發、維護、部署甚至發布的相對獨立性,實現高開發效率和快速響應問題。

?性能:性能是評估應用程序高可用性最重要的指標之一,對于用戶群體廣泛、設備多樣、場景復雜的互聯網產品來說,性能也是搶占市場的核心競爭力之一。

▊ 工程效率

工程效率面向流程,基本的原則是在保證產品功能的前提下盡可能地減少迭代所消耗的成本。具體到實際工作中,成本又可以細分為人力成本和溝通成本。以這兩者為突破點,工程效率的目標便很明確了:

?降低開發本身所消耗的人力成本。

?降低跨團隊協作消耗的溝通成本。

開發

業務的需求、功能的量級,甚至不同的開發階段都有可能影響協作開發的具體模式。根據協作模式的不同可以將開發工作分為個人獨立開發、團隊內協作開發和跨團隊協作開發?;诖?,開發階段的效率提升集中在以下3點:

?減少重復性體力勞動。

?建立規范的代碼版本管理規范。

?輔助跨團隊并行開發。

構建

在前端領域,構建是一個比較新的詞匯,隨著前端技術的演進,對于構建功能的需求和相關工具也在不斷進化。時至今日,構建已經成為現代前端開發不可或缺的一部分,也是前端工程服務體系中最重要的環節之一。前端構建的針對點有以下方面。

?編程語言:構建針對編程語言的相關功能可以理解為編譯(Compile),即將源代碼轉變為客戶端可執行代碼的過程。除了原生的JavaScript和CSS以外,CSS預編譯、特定開發框架的編譯均屬于此類。

?性能優化:比如壓縮混淆、自動生成 CSS Sprite、動態模塊按需加載等。

?部署策略:比如給靜態資源URL加入Hash指紋和CDN路徑等。

?開發效率:比如文檔生成、動態構建等。

?審查評估:比如規范審查、性能評估等。

測試

既定的技術選型和編碼規范是測試的必要前提,React、Vue等框架的發展令UI測試可以在一定程度上映射為字符串測試。此外,端到端測試和集成測試的環境仿真也是必不可少的前置工作。

部署

部署最核心的地方并不是對不同類型資源的處理,而是在于對流程的控制。這項原則對于任何職能部門來說都是適用的。此外,作為應用發布前的重要環節,部署需要做到穩定和精準。

持續集成和持續交付

開發、構建、測試和部署組成了一個完整的迭代流程,工程化的第一步是合理地使用工具以提高各個環節獨立的工作效率;第二步是搭建自動化流程來提高跨團隊協作的效率,削減迭代整體所消耗的時間成本;最終的目的是持續化。

監控與統計

監控和統計可以輔助開發團隊快速定位問題的癥結,從而縮短修復問題的時間,間接地提升了產品的競爭力。除此之外,監控和統計也是持續化工程體系不可或缺的一部分。

Serverless不是一種具體的技術或框架,而是一種軟件架構理念,一種基于云的解決方案。CNCF將其定義為:為實現構建和運行不需要服務器管理的應用程序的解決方案。Serverless將支撐后端業務邏輯的基礎設施和與環境相關的工作交付給云計算平臺,開發者的關注核心聚焦于前端交互邏輯和后端業務邏輯。在Node.js打破前后端編程語言壁壘之后,Serverless更進一步地弱化甚至消除了前后端領域的知識邊界,在其支撐下,傳統的技術研發職能體系被重新洗牌,前后端職能單一化不僅利于架構的多樣化和擴展性,同時從工程角度也更具效率。目前業務不乏基于Serverless的優質解決方案,比如Google的Firebase、騰訊的云開發等。雖然現在Serverless仍未完全占據軟件研發的主流市場,但其未來可期。

本文節選自博文視點新書《前端技術架構與工程》

本書所有內容遵循一個基本出發點:業務是架構和工程的核心。一切編碼方案均是為了解決業務的功能需求,在此基礎之上以分治和聚合為基本原則設計合理的軟件架構,最后進一步規范工作流程和產品發布策略,這便是工程化的理論模型??偨Y為一句話:以業務為出發點,架構聚焦于代碼,工程聚焦于流程。

讀者評論

相關專題

相關博文

  • Spring Cloud微服務分布式云架構 - Spring Cloud集成項目簡介

    稀罕你干嘛 2017-11-01

    Spring Cloud集成項目有很多,下面我們列舉一下和Spring Cloud相關的優秀項目,我們的企業架構中用到了很多的優秀項目,說白了,也是站在巨人的肩膀上去整合的。在學習Spring Cloud之前大家必須了解一下相關項目,希...

    稀罕你干嘛 2017-11-01
    391 1 1 1
  • 整合spring cloud云服務架構 - 企業分布式微服務云架構構建

    整合spring cloud云服務架構 - 企業分布式微服務云架構構建

    稀罕你干嘛 2017-11-02

    今天正式給大家介紹了Spring Cloud - 企業分布式微服務云架構構建,我這邊結合了當前大部分企業的通用需求,包括技術的選型比較嚴格、苛刻,不僅要用業界最流行的技術,還要和國際接軌,在未來的5~10年內不能out。作為公司的架構師...

    稀罕你干嘛 2017-11-02
    115 2 1 1
  • 整合spring cloud云服務架構 - common-service 項目構建過程

    稀罕你干嘛 2017-11-03

    我們將對common-service整個項目進行剖析,將整個構建的流程給記錄下來,讓更多的關注者來參考學習。 首先在構建spring cloud的common-service之前,我們需要準備的技術: Maven(項目構建)、Sprin...

    稀罕你干嘛 2017-11-03
    238 0 1 1
kof雅典娜赚钱方法中文