開發了一個又一個項目,擼了一個接一個的輪子,已然習慣了各式各樣的軟件開發流程。每一種模式自有自己的優缺點,也各自有自己的適用場景。而隨着歷史車輪的緩緩前進,開發流程都在不斷地演進,以致於諸多的人都在想:未來的開發是怎樣的?
我亦是如此。(PS:為了讓大家更好地理解此文,我先説一下我相關的一些上下文)
2017 年,為了解決微服務和 BFF 的最後一公里問題,我開始研究 Serverless,並寫下了國內第一本 Serverless 相關的電子書《Serverless 應用開發指南》。過程中,有幸進入了一個 APP 插件化的項目,順帶學會了移動端的 “微服務” 相關的思想。
隨後在 2018 年,便思考着在前端如何去做微服務,寫下了國內最早的微前端電子書《微前端的那些事兒》,後來出版《前端架構:從入門到微前端》。自此,大抵説得上是掌握了應對大型應用和輕量級應用的架構設計方案。
2019 年初,我開始思考開發流程的各種自動化,便基於自身的經驗和開源社區的項目,構思了低代碼/無代碼系統架構的設計,也就有了國內最早的低代碼架構設計的文章《無代碼編程》。隨後,我不斷去探索嘗試一些更好的解決方案,其中一個方案便是《雲研發:研發即代碼》。(PS:不好意思走得太快了)
裝逼到此結束。
雲研發路線圖
有了上述的各種蛛絲馬跡,我想很多人已經有了一個大體上也能有點印象:
這個圖略微複雜一點(有些線也沒劃上),它展示的是組織內前後端能力複用的過程。而雲開發、低代碼之所以能在某些組織內落地,很大一部分原因也來自於:持續性的能力複用。有了這張圖,我們可以很容易推層出其中的實施過程。
按照這個路線圖,我把整個過程劃分為四部分:
1. 雲開發。即軟件的開發流程都可以在雲端完成,所有相關人員只需要一瀏覽器就能完成工作。
2. 低代碼。需求的變更,可以影響到代碼的生成。
3. 萬物代碼化。由低代碼到無代碼、雲研發的關鍵技術。
4. 雲研發。某個需求的變更,能直接完成部署。如需求對數值的更改,能直接映射到代碼的修改,並上線。
如果你還沒有放棄此文的話,讓我們繼續往下走。
實施過程
總體來説,我把實施過程劃分為了四步:
1. 構建能力複用平台
2. 精心設計膠水式框架及能力
3. 完成生命週期閉環:定製膠水語言
4. 建立雙向反饋,以持續優化:同構
事實上,如果你熟悉 DevOps 的實施流程的話,它與這個實施過程還是相似:
1. 閉環
2. 建立反饋
3. 持續優化
稍有有點不同的是,雲研發的建立過程要更為精細化許多。
1. 構建能力複用平台
繼續從上圖中的左下角的方塊講起。近幾年,中台十分火熱,不斷有新概念,也不被地被置疑。我並非一箇中台專家,從個人的角度來看待,中台更像是一個垃圾回收站。而受部門牆的影響,大型組織下的部門的核心業務,到底不會交由中台來管理?便是另外一個問題。
但是不論中台的結果怎樣,它做了一件有了不起的事情,引發了管理者對於服務複用的思考。提升複用率,意味着提升組織的整體效能,減少了一定的內部浪費。
同樣的,這種複用的機制,也出現在組織內的前端基礎建設、APP 基礎設施建設等等。它們出現的本質就是為了提升組織級的開發效率,減少創造重複的輪子。
所以,落地組織級別的雲研發有一個很大的前提是,能實現組織內的技術能力複用。這裏的組織是相對的,因為大公司的某一部部門本身類似於中型公司的開發能,以此類推。所以,在公司這一級別上,他們可能會有各種重複的輪子,其主要受限於各自的場景及未來的假設之間的差異。
2. 精心設計膠水式框架及能力
技術能力複用,意味着:我們可以把上述的每個技術能力視為一個個的樂高。在構建應用的時候,我們只需要學會如何去組裝它們即可。而為了組裝它們,我們需要:
1. 編制它們之間的粘合規則。
2. 設計粘合適配層,用於防腐和適配未來的新架構。
3. 製造各種粘合劑,以便於連接系統的各個部分。
因此,我們還需要一些支持快速粘合的技術作為支撐:
後端接口快速適配。從過程中有,微服務 -> BFF -> Serverless -> Serverless Components,直到把基礎設施弱化
前端組件快速複用。這一點上便有:組件 -> 微前端架構 -> Web Components
APP 快速接入。從技術上來説有:小程序、APP 插件化、H5 等
一旦完成了這些技術能力,就可以關注於如何完善膠水層。
3. 完成生命週期閉環:定製膠水語言
只憑上述的兩步,我們大可以完成一個簡易的雲研發系統。但是而為了系統的未來演進,還需要一些更先進的能力,以便於我們解耦各個開發過程。這樣一來,我們可以輕鬆更換其中的組件,而不至於因為組件的替換,引起系統架構的巨大變化。
譬如,我們已經有了 Web 部分的快速開發,現在要支撐起 APP 的快速開發。我們不需要一起改動上下游的代碼,只需根據定義好我們的接口,各自的改動都是獨立的不受影響的。哪怕我們是通過採購的供應商,也可以輕鬆地替換供應商,避免供應商鎖定。這樣的接口包含了結構和數據,所以我傾向於 DSL(領域特定語言)來完成。
通過在線 IDE 隱藏膠水細節。
創建 DSL(領域特定語言)連接生命週期的兩兩節點。(PS:節點間的 DSL 是不同的)
建立起系統的閉環。如通過運營數據節點裏,可以直接創建用户故事,來優化系統
儘管這些膠水語言會在前期增加系統的複雜度,但是它無往而不利。
4. 建立反向反饋,以持續優化:同構
有過使用 DreamWeaver、WinForm 等拖拽式開發經驗的開發人員,都對這種形式的低代碼開發有點反感。其中的主要因由有,當我修改完代碼之後,無法反饋到設計上。也因此造成了一個問題,拖拽只適用於設計階段。當後期代碼發生變更時,便無法進行演進。
解決這個問題的辦法,除了更新代碼生成機制,還有一種方式是通過 DSL (領域特定語言)來建立反向反饋。如設計專用的工具,來將代碼的修改同步設計上,同時改變架構設計的 DSL 代碼。換句話來説,通過 DSL 來建立起步驟之間的橋樑。
架構同構。即已完成的代碼進行解析,其生成的架構設計與模型設計是一致的。
設計同構。對已設計的前端組件進行解析,其與 UI 設計圖生成的模型是一致的。
需求同構。對已編寫的測試用例篩選解析,其與原始的需求是一致的。
……
簡單地來説,我們要保證系統的各個節點的一致性。最終所呈現的結果是:如果節點間不一致的話,那麼只能是原始需求有問題。為此,開發人員進行的代碼修改,應當是通過 DSL 的形式一步步回溯,直至自動修改了需求,或者映射到需求的問題上。
所以,需要把生命週期的每一個過程都代碼化。
三個要素
在那篇《雲研發:研發即代碼》 中,我們介紹了雲研發的三要素,在這裏仍然是我麼有和的。
1. 微架構:膠水。微架構,即以模塊化的組合方式協同構建大型應用(前端、後端、APP等)的架構方式。每個微應用都可以獨立開發、獨立部署、獨立運行,對應的替換的方式有模塊化、子模塊的方式,微服務、APP 插件化(獨立構建、獨立運行)、微前端等。
2. 代碼化:膠水標準化。代碼化,即通過創建領域特定語言來描述某一特定的事物或流程,以用於描述它在數字世界的孿生。
3. 協作設計:文化。從諸多組織實施 DevOps 的過程,我們就可以看到:要打破部門牆並不是一件容易的事。這事實上,這才是雲研發的成功關鍵,要讓打通生命週期,意味着要打通一個個的部門牆。讓各方達到目的一致,怕是得由各種績效來保證。
有了這些理論與要素之後,剩下的就是一步步的往上堆砌代碼了。
雲開發
隨着持續部署、DevOps 在各個企業的推進,越來越多的企業已經有完善的基礎設施,軟件開發團隊只需要一個在線的 IDE,就可以完成開發工作,這就進入了雲開發時代。
什麼是雲開發?
在過去的一二年裏,有越來越多的雲廠商,選擇了雲開發的模式。值得注意的是,我們在這裏定義的雲開發和國內雲廠商定義的雲開發略有不同。國內雲廠商所針對的是輕量級的應用開發,這裏我們所針對的是所有場景下的雲開發模式。換句話來説,支持輕量級應用開發是一個必由之路(MVP)。
對於一個雲開發產品來説,它具備了這麼一些關鍵要素:
1. 雲 IDE。
2. 分鐘級部署的基礎設施
3. 生命週期打通
依舊,最難的仍然是生命週期打通。
1. 雲 IDE
在這裏,我們所討論的是雲 IDE 集成開發環境。它意味着,我們需要將其作為入口,封裝各種細節。也因此,它並不僅僅是一個編輯器能完成的。
只是呢,我們可以基於成熟的開源的雲編輯器來完成基礎部分:
VSCode Online(業內:騰訊雲 Coding)
Eclipse Theia (兼容 VS Code,業內:華為 DevCloud)
Monaco Editor(VS Code 基於 Monaco)
隨後,通過插件來擴展我們所需要的各種能力,打通一個個的環節。
2. 分鐘級部署的基礎設施
在雲開發的模式下,我們需要多種模式的快速部署:
輕量級場景。如 BFF / Serverless 小程序
開發態容器化(可選)。即在瀏覽器修改代碼時,有一台類本地的環境在後台運行,並實現快速預覽。
常規部署。
這些模式都已經具備一定的成熟度,只是需要基礎設施來配套上開發者的手速。
3. 生命週期打通
在我們解決了代碼問題之後,我們還需要做各種集成,以保證:
1. IDE 支持與需求的相關聯。
2. 代碼與版本控制系統的關聯。
3. 臨時的流水線與部署環境。
……
當然了,各個地方有了 API 之後,就不是問題了,唯一要考慮的可能是服務器成本。而這個成本呢,可以從開發機器上補回來。
如何驗證雲開發是成熟的?
如何驗證一個雲開發平台是成熟的?
關於這一點非常的簡單:自舉—— 它用於雲開發的代碼使用雲開發環境完成的。
低代碼
雲開發和低代碼並沒有太多的聯繫,既然我們不在雲環境開發,依舊可以選擇低代碼技術。唯一有意思的是,它們所需求的基礎設施是相似的。既然如此,那麼為什麼我們在選擇架構的時候,不多走一步呢?
什麼是低代碼?
PS:關於『無代碼編程』 的更多內容可以在我的 GitHub 上查看如何設計:
https://github.com/phodal/lowcode 。
這裏我們只是介紹它的幾個關鍵因素:
1. 生命週期自動化
2. 流程代碼化、數據化
3. 持續完善的基礎設施
過程同樣不復雜,但是它的場景比較有限,遠不如雲開發來得實在一點。不過,對於這些有限的場景來説,低代碼有非常大的優勢 —— 特定的場景,模式是特定的,能大大節省成本。
1. 生命週期自動化
低代碼最吸引人的一點是,拖拉拽就可以快速預覽和上線。這意味着,在這種模式之下,融合了軟件開發生命週期幾個步驟,需求、設計、編碼、構建、部署、運營( 運維),並實現了部分的自動化。
為此在這個要素上,它同理於雲開發模式,只是要求的範圍更大。所以,我們需要打通更多地環節,才能實現更多的自動化。
2. 流程代碼化、數據化
在低代碼的流轉過程中,系統需要存儲中間態的結構化數據,或者是領域特定語言編寫的數據,以解耦不同環節。
對於一個組織而言,如果計劃購買一個低/無代碼編程平台,那麼需要一箇中間態的語言或者數據。我們已經在先前解釋了其目的,這裏就不重複介紹了。
3. 持續完善的基礎設施
在實施低代碼時,它需要大量的基礎設施,如:
大量快速可用的後端 API
分鐘級部署後端 API
UI 組件集豐富
……
除此,過程中還會有各種的新需求接入,因此還需要不斷地完善:
方便與第三方服務集成。
靈活性。支持多語言等。
對應基礎設施接入機制。
低代碼的複雜度
我們嘗試降低一部分開發者得難度的同時,也意味着我們需要將這部分複雜度拉由自身來不來解決。
萬物代碼化
代碼化是我們實現從低代碼到無代碼的一個過程,關於如何實踐其的代碼化,可以關注我後續的文章。在那一篇《雲研發:研發即代碼》中,我們把其劃為了六步:
1. 需求代碼化。使用 DSL 描述需求,並能轉換為設計 DSL。
2. 設計代碼化。完善設計 DSL,併成架構模型和 UI 設計。同時,實現設計結果到需求的反饋。
3. 代碼代碼化。創建通用語言,以生成不同語言的代碼。同時,代碼來反饋到設計。
4. 構建構建化。代碼提交自動創建構建,構建自動銷燬。
5. 部署代碼化。代碼描述部署方式,並實現各個環境的自動化、自部署。
6. 運營代碼化。所有運營、運維操作都可以通過 DSL 來描述;根據線上反饋結果,能自動創建需求優化。
為了配合它,還需要其它的代碼化模式:
文檔代碼化。
合規代碼化。
……
嗯,這就是人生的樂趣。所以,是時候準備招一些能造飛機的程序員了。從畢業生中培養,或許是一個更好的主意。
雲研發
最後,讓我再稍微總結一下這篇文章。
什麼是雲研發
它需要我們在這篇文章裏提到的一系列要素,並整合起來:
1. 代碼化。
2. 全生命週期打通。
3. 協作式設計。
所以,整體的實施過程便是:
1. 具備基本的遠程編程能力及自動化部署。即代碼無需在本地
2. 在雲端能完成軟件開發的完整生命週期。能在雲端完成所有的軟件開發的工作,並且配套
3. 雲研發平台上的雲研發平台。(自舉)
4. 藉助於代碼化的方式,將軟件開發的每一個步驟都變成代
5. 實現開發全流程的自動優化。如自動化的藍綠部署,自動化選擇方案,自動化優化。
6. 無人編程。Human Over
無代碼
真正的無代碼,可以使得碳基生物已經不需要存在了。
再回顧一下這圖:
其它
就這麼多,湊點字數到 5000。
示例代碼:
https://github.com/phodal/story
https://github.com/phodal/design
https://github.com/phodal/code
https://github.com/phodal/chapi