动态

详情 返回 返回

前端工程化系列一:序言 - 动态 详情

1. 關於這個系列

我認為,工程化是前端各類細分技術領域中最為基礎而關鍵,最具有知識廣度與深度因而學習曲線較為陡峭,但同時也是對整體開發效率、質量增益最大因而對個體而言最具有學習價值的高階技能之一。

具體來説,工程化領域向上可以探索學習各種構建工具、靜態代碼分析工具、CI/CD 與開發工作流等具象工具;橫向可認真研判、梳理、落地各類研發規則,提前幫助業務開發者做出技術選擇,以實現更高效而規範地業務迭代;向下可以深入挖掘編程、集成、發佈、運維等各個研發階段的目標、最佳實踐與核心矛盾,引入或自研各類工具實現研發任務的自動化與高效的質量防劣化措施。綜合來看,效率收益明確,技術探索空間比常規的前端功能開發高出許多,是一個非常適合中高階工程師發展的方向

但也許正是因為這種紛繁複雜,社區很少見到關於前端工程化兼具體系化、實用性、深度的高質量知識總結,大多數資料還是過度聚焦在具體工具的應用、優化與原理層面,並未觸及所謂前端工程化的根本內核,碰巧我個人一直對這個方向抱有濃厚興趣,加上最近幾年工作內容主要聚焦在大規模複雜工程的治理上,沉澱的不少經驗與思考,因此計劃撰寫一系列文章,覆蓋前端工程的階段拆解,各階段的目標與核心矛盾,相關的工具、實踐、管理策略、最佳實踐等內容,希望能一次性講好工程管理這個高級話題,感興趣的同學歡迎關注我的個人公眾號。

2. 為什麼需要工程化

談到工程化,相信有經驗的同學腦海中都會自然浮現出一系列技術名詞,例如:Webpack、ESLint、Typescript、Jest、Babel、 CI/CD、灰度等等,這些技術無疑都能解決一部分 工程問題,但也無疑都比較複雜,且不論性能優化、底層原理這些高級課題,單是想把它們用好就已經需要花費比較非常多時間精力不斷學習實踐,那麼我們為什麼要花時間去研究它們呢?

答案很簡單,一言蔽之 —— 在項目規模增長後,長期保持可持續發展與質量穩定,關鍵點在於:規模化、持續可發展、穩定性

首先,規模化是一切的前提,假如工程項目只需要服務於極少數的用户,或者功能非常單一,或者只需要適應有限種類的工作環境,或者只有少量開發人員,或者只有極短的生命週期,那麼許多工程化管理舉措可能根本沒有引入的必要,只會讓事情變的 過度複雜

舉個例子,假設需要開發一個面向小團體的簡易信息採集工具,受眾、功能、執行環境都非常單一,且工具的存活週期只在天級別,可能只需要一人天就能完成,總代碼行數控制在數百行內,在這種簡單需求上疊加過多工程化工具顯然是不合時宜的。例如,沒必要為此設計出多麼精巧的 CI/CD 規則,因為代碼變更與發佈頻率都非常低;也沒必要精心編寫單測,因為未來並不會持續迭代,單測收益很低。這種場景本質上是編程問題,而不是工程問題,聚焦於解決 編碼問題 就行。

但假如項目規模發生變化,例如受眾羣體從少量個體擴大成千上萬甚至更多時,問題的複雜度就會開始幾何式增長,我們需要解決複雜環境的兼容問題,解決高併發帶來的性能問題,解決告訴迭代帶來的質量下降問題,解決墨菲定律引發的邊緣 Case 問題等等,最終解決方案的複雜度也必然會隨之發生劇變,我們需要投入的人力、時間也必然隨之劇烈增長。此時問題的本質,就會從“如何編碼”蜕變躍遷為“如何協作”問題,更具體的説:在開發人數、需求複雜度持續增長的情況下,如何藉助工程化技術持續保持高效開發與高質量產出。

總之,工程化與編程是兩件完全不同的事情,編碼的目標是滿足功能需求;而工程化的目標則在於抵抗規模化引發熵增所帶來的無序、低效,以及緩解問題進一步劣化

3. 什麼是工程化

那麼,什麼是前端工程化呢?這個問題很重要,但很多同學對此可能還比較霧裏看花,始終着眼於某些具體工具而沒有抓住工程化的本質,在介紹具體手段之前有必要花點時間先深入討論下。前端工程化是“軟件工程”學科在前端領域的具體實踐,而軟件工程需要解決的核心課題是如何在規模化協作中保持更高的開發效率,產出更穩定的工程製品。

我們可以將開發一個項目或者功能點的過程大致可歸納為如下步驟:

從左到右,前期的需求分析、方案設計是一個推導與定義目標的過程,是後續所有工作的一切的起點,決定了項目整體是否順利是否需要返工等,但內容多數聚焦於人與人之間的溝通,並沒有太多自動化空間,因此不作贅述。

進入編碼階段後,我們需要做出許多架構、技術選型、工程化方面的設計與決策,在團隊成員水平不齊、項目時間跨度大的情況下,保證最終產出的一致性、可讀性、健壯性、正確性,進而確保項目長期可維護。具體來説,我們可能需要制定許多編碼規範以約束個體的編碼行為,這些規範可能需要細緻到類型、函數、代碼行,甚至變量命名的粒度,而為了保證這些規範的執行,進而我們需要引入一系列代碼靜態分析工具保障每一段、每一行代碼都是風格統一、正確,且最終組合成全局最優解。

編碼完成進入聯調測試階段後,需要開始引入“服務端”、“測試”等角色協同完成功能測試,變更進入“預交付”狀態,但通常並不穩定,多數時候還會持續發生迭代微調。為此,需要重點關注工程的“可測試性”,需要在生產環境之外設置一套可獨立運行、支持多版本、可持續部署的測試環境,確保測試行為不會對應用狀態造成預期之外的副作用。其次,還需要一些技術手段監控調用鏈路上可能發生的異常,幫助開發者快速識別問題、解決問題。

初步完成測試工作後,相關代碼分支就需要開始推進合入倉庫主幹,這是一件嚴肅的事情,因為所有對主幹施加的變更都會體現為最終產物的質量。為此,需要結合應用的發佈策略,考慮在多人、多分支並行開發的情況下,以何種方式將功能分支安全地合入確保應用的穩定性;並且,在這一階段需要嚴格地實行許多自動化的非自動化的檢查,保證代碼質量不會隨長年累月迭代發生明顯的質量下滑。

代碼合入後,接下來就需要考慮如何將其發佈到線上供用户消費,小項目可以選擇一次性將變更推送到生產環境,這確實有助於提升整體迭代速度,即使出現問題,由於用户體量小,一般也不至於出現過大的負面影響。但對於大型項目則複雜許多,在龐大體量下,任何細微問題都可能影響到大面積用户,因此理所當然的對質量非常敏感,對變更一般會持比較謹慎、穩健的態度,為此通常需要設計一套方法論與工具,漸進式地將變更逐批推送到用户側,且一旦發現問題能夠隨時回滾到變更前的狀態。

變更發佈上線後,開始被分發到用户側使用,此時期望應用在不同環境、不同用户手上都能保持穩定的功能與性能表現,但我們不可能肉身盯着每一位使用者的操作行為與系統反饋,因此需要使用一些技術手段收集代碼的執行情況並彙總上報,以這些數據觀測應用在線上的表現,實現一種“後置”的可觀測效果,避免潛在問題進一步擴散放大。

綜上,如果説工程化的世界觀,在於抵抗規模化引發熵增所帶來的無序、低效;那麼方法論層面,則是通過合理地組合串聯各種自動化工具、固化約束、優化流程等手段,形成一種相對統一、標準化、自動化的協作環境,降低個體思維天然的“隨機性”所帶來的效率損耗與質量風險,它不一定能帶來多麼驚為天人的結果,但能持續保證過程質量與產品質量的 baseline,規避多數低級或嚴重問題。

不過,要實現成熟的工程化模型並不容易,不是簡單引入幾個工具,寫幾篇規範文檔就能宣告完成了,許多細微問題、隱患隨機散落在研發過程的各個階段中,需要被有意識地觀測歸納,提煉為清晰的問題定義,進而尋求縱深方向上的全局最優解。這個過程需要有比較強的技術視野與認知,才能正確發現、定義問題,並以優雅的方案解決問題;需要對各階段使用的技術棧有比較深入的理解,才能設計出 ROI 最優的組合方案;需要有一定的創造性與技術功底,在必要時創造出更有針對性,更有效率的工程化工具;還需要始終保持好奇、精益求精、孜孜不倦的態度,如同維護產品一般自驅地持續觀測研發過程,持續迭代工程模型以適應工程本身隨時間推進所發生的變化。

在後續的章節中,我會深入介紹研發各個階段的特點、問題、工具等,幫助讀者在上述理論基礎上,更深入理解各個維度的方法論。

4. 總結

這是前端工程化系列的先導篇,內容更多聚焦在軟性的認知調節上,下一篇文章我會展開講解開發階段的核心問題與相應的工程治理策略、工具、高效編碼方案等,感興趣的同學可關注我的個人公眾號,持續圍觀,有問題的同學也歡迎微信溝通:

Add a new 评论

Some HTML is okay.