流程即代碼:云研發(fā)、低代碼 IDE——Uncode(代碼流程圖生成器)
在先前的一系列《云研發(fā):研發(fā)即代碼》文章里,我們介紹了軟件工程的代碼化閉環(huán)。同時(shí),在《Water:云研發(fā)架構(gòu)模式》介紹了設(shè)計(jì)這樣的開發(fā)環(huán)境里,我們所需要的一些模式。今天呢,作為這一系列的落地實(shí)踐,我們將介紹云研發(fā) IDE的設(shè)計(jì)思想,以及如何實(shí)現(xiàn),當(dāng)然還有一點(diǎn)兒早期代碼:https://Github.com/inherd/uncode。
第一次聲明:這是一個(gè)概念性 IDE 的設(shè)計(jì),暫不適合任何生產(chǎn)環(huán)境。
在開始真正閱讀之前呢,為了能更好地讓大家理解,我們要回顧一下軟件工程行業(yè):
-
DevOps 理念在國(guó)內(nèi)的軟件行業(yè)有了長(zhǎng)足的發(fā)展,在包括傳統(tǒng)企業(yè)(銀行、制造業(yè))在內(nèi)的公司里已經(jīng)廣泛接受,并進(jìn)行了大規(guī)模推廣。
云原生技術(shù)已經(jīng)成為市場(chǎng)的主流趨勢(shì)。云遷移與遺留系統(tǒng)上云是市場(chǎng)的一大熱門話題。
中臺(tái)方法論在實(shí)踐上還缺少真正的成功案例。
低代碼/無代碼平臺(tái)逐漸成為新的建設(shè)目標(biāo)。
云開發(fā)有了越來越多的中小規(guī)模應(yīng)用案例。
AI 代碼生成正在被小范圍驗(yàn)證。
從整個(gè)行業(yè)而言,人們的關(guān)注點(diǎn)一直是如何提升技術(shù)生產(chǎn)力?現(xiàn)在技術(shù)到了一個(gè)新的階段了,而需求的轉(zhuǎn)換大大限制了人們的開發(fā)速度。于是無論我們的 DevOps 和云開發(fā)實(shí)施得再好,也會(huì)陷入需求與技術(shù)隔離的瓶頸。這就是為什么我們需要云研發(fā) 理論體系 :),通過代碼化的方式,一站式解決需求到設(shè)計(jì),再到代碼的問題。
對(duì)于云研發(fā)理論來說,我已經(jīng)設(shè)計(jì)好了理論基礎(chǔ)、軟件架構(gòu)、開發(fā)模式,并且對(duì)其中的一系列東西進(jìn)行了驗(yàn)證,如:文檔代碼化、需求代碼化、代碼的代碼化 等。
我們需要一個(gè)容器,把這些內(nèi)容、模式、代碼整合到一起,這就是 Uncode,一個(gè)概念性的云研發(fā) IDE。
Uncode,一個(gè)云研發(fā) IDE
Uncode 是一個(gè)面向云研發(fā)時(shí)代設(shè)計(jì)的下一代概念性 IDE。特性:
-
流程化為領(lǐng)域語言。Process as code
一切皆 DSL。萬物代碼化
開發(fā)環(huán)境即流程。
簡(jiǎn)單來說,你可以在這個(gè) IDE 上完成:需求的編寫,轉(zhuǎn)換需求為設(shè)計(jì),設(shè)計(jì)關(guān)聯(lián)代碼,禪模式編程,開發(fā)完即可上線。
與之相對(duì)比的是,傳統(tǒng)的一站式 DevOps 門戶,盡管你可以通過跳轉(zhuǎn)來完成,但是無法相互關(guān)聯(lián)和設(shè)計(jì)。與之相近的是 GitOps,即將應(yīng)用系統(tǒng)的聲明性基礎(chǔ)架構(gòu)和應(yīng)用程序存放在 Git 版本庫中。但是它們都不閉環(huán),也不完整。
云研發(fā) IDE 模式:流程即領(lǐng)域語言
回到軟件開發(fā)上,我們的軟件開發(fā)需求始于一個(gè)大特性或者史詩故事,這些故事會(huì)轉(zhuǎn)換為一個(gè) feature
,如 Cucumber 中的:
-
# author: Phodal HUANG
# status: doing
# language: zh-CN
功能: 第一個(gè)用戶故事
-
場(chǎng)景打開 Uncode
假如我在 Terminal工具里
當(dāng)輸入 uncode
那么則能在 UncodeIDE 里打開當(dāng)前項(xiàng)目
需求設(shè)計(jì)人員在這一步之前,將需求轉(zhuǎn)換為了故事,故事與特性之間的關(guān)系記錄在這個(gè) feature
中。開發(fā)人員從 IDE 中看到需求,標(biāo)記了對(duì)應(yīng)的狀態(tài)status
,就可以進(jìn)入代碼的設(shè)計(jì)階段。
在設(shè)計(jì)這個(gè)階段,我們先設(shè)計(jì)了 design
的三種類型:flow
、model
、ui
,對(duì)應(yīng)于流設(shè)計(jì)、模型設(shè)計(jì)和 UI 設(shè)計(jì)。而我們要在 Uncode 中實(shí)現(xiàn)的部分便是需求與模型、流和 UI 的綁定。圍繞模型,我們還得構(gòu)造統(tǒng)一的領(lǐng)域語言,用于自動(dòng)化關(guān)聯(lián)接口與設(shè)計(jì)。從模式上來說,這個(gè)和無代碼/低代碼的開發(fā)是相似的。
唯一不同的是描述方式。使用領(lǐng)域特定語言來描述內(nèi)容,我們才能對(duì)系統(tǒng)進(jìn)行合理地重構(gòu)。
云研發(fā) IDE 模式:一切皆文件
Linux/Unix下的哲學(xué)核心思想是『一切皆文件』。
在現(xiàn)今的開發(fā)環(huán)境之下,我們?cè)?span id="qsh1b7padf" class="candidate-entity-word" data-gid="12689667">看板上挑選卡片,又或者是通過低代碼編輯器生成,使用的存儲(chǔ)介質(zhì)都是數(shù)據(jù)庫。而數(shù)據(jù)庫這些東西并不存在于開發(fā)環(huán)境中,而是放置于遠(yuǎn)程服務(wù)器上。這就造成了另外一個(gè)痛點(diǎn),無法簡(jiǎn)單反向關(guān)聯(lián)、需求與代碼隔離等等。
于是,作為云研發(fā) IDE 的第二個(gè)模式,將所有的內(nèi)容使用文件保存,并且使用版本管理工具(如 Git)進(jìn)行管理。如我們的需求以類似于代碼的形勢(shì)存儲(chǔ)在數(shù)據(jù)庫中,可以實(shí)現(xiàn)以下特性:
-
“不可偽造”
“全程留痕”
“可以追溯”
“公開透明”
“集體維護(hù)”
沒錯(cuò),這就是一個(gè)區(qū)塊鏈系統(tǒng)。一旦需求發(fā)生了變化 ,你可以即刻感知到。不過,一旦你的代碼與模型不相符合,你的代碼就無法提交,或者模型被自動(dòng)修改 :(。
云研發(fā) IDE 模式:開發(fā)環(huán)境即流程
作為一個(gè)集成開發(fā)環(huán)境,現(xiàn)有的 一站式 DevOps 軟件研發(fā)管理協(xié)作平臺(tái)都應(yīng)該只被當(dāng)作管理和展示用途。而從設(shè)計(jì)本身來說,一個(gè) Dashboard 和一個(gè)開源工具,本身就分工。
我們?cè)诖a庫上有了需求,那么我們可以借助于 IDE:
-
將需求以看板的形式在本地重新可視化出來。
將設(shè)計(jì)領(lǐng)域的語言在本地可視化出來,并將之與代碼進(jìn)行關(guān)聯(lián)。
高亮需要所有修改的代碼塊。如 Controller、View 等。
將模型的修改反向關(guān)聯(lián)到設(shè)計(jì)上,以實(shí)時(shí)追蹤設(shè)計(jì)的正確性。
我們還可以做一些不那么正確的事情 ,如鎖定開發(fā)人員的修改范圍。
云研發(fā) IDE 模式:填空式/選擇式編程
對(duì)于軟件架構(gòu)師來說,人們經(jīng)常有這么一些痛點(diǎn):
-
面對(duì)的是缺乏經(jīng)驗(yàn)的開發(fā)者,難以快速地推進(jìn)系統(tǒng)的開發(fā)。
開發(fā)者缺乏對(duì)系統(tǒng)的了解,在錯(cuò)誤的地方修改錯(cuò)誤的代碼。
因此,回到 TypeFlow 的觀點(diǎn)上,我們既然已經(jīng)設(shè)計(jì)好了模型,設(shè)計(jì)好了輸入和輸出,那么我們一定能生成中間的方法及其返回值,并為其設(shè)計(jì)一個(gè) mock 的對(duì)象。如:
-
@RequestMapping("/")
Stringhome {
return"Hello, World!"
}
這種模式對(duì)于業(yè)務(wù)應(yīng)用開發(fā)來說,非常易于實(shí)現(xiàn) —— 生成綁定過程中的各類函數(shù)等等。
選擇式編程。而一旦我們?cè)诮M織內(nèi)的所有代碼都被索引之外,我們有能力通過識(shí)別輸入和輸出,以及對(duì)應(yīng)的方法名,就能在 IDE 中推薦對(duì)應(yīng)的方法讓你選擇。
云研發(fā) IDE 基礎(chǔ)要素
就這么一看,我們只需要搞好 IDE 的事情即可。然而, 并非如此,我們還要做的事情還有一些:
-
開發(fā)即部署。即 local dev 便是 dev server,可直接接入現(xiàn)有的系統(tǒng)。
萬物即 DSL。具備一定等級(jí)的程序語言設(shè)計(jì)能力。
API 的 API。即將現(xiàn)有的內(nèi)部、外部 API 進(jìn)行抽象化設(shè)計(jì),以提供快速可用的 API。
開發(fā)即部署 —— 云開發(fā)環(huán)境
從開發(fā)層面來看,我們一直在往復(fù)地浪費(fèi)本地環(huán)境和線上開發(fā)環(huán)境,與此同時(shí)還有對(duì)應(yīng)的測(cè)試運(yùn)行時(shí)間、構(gòu)建時(shí)間等。我們需要一個(gè)于云開發(fā)環(huán)境的機(jī)制。
加速聯(lián)調(diào)、測(cè)試過程。當(dāng)我們的本地環(huán)境上云之后,一旦需要與其它系統(tǒng)對(duì)接時(shí),所有的開發(fā)、測(cè)試效率將大大提升。譬如說,我們的接口需要多提供一個(gè)參數(shù),傳統(tǒng)模式之后,我們要在本地運(yùn)行,再通過流水線構(gòu)建和部署。而現(xiàn)在,不再需要這個(gè)過程了,只需要配置好 Gateway,輕輕松松進(jìn)行開發(fā)。
加速環(huán)境搭建。我們不再需要在本地配置開發(fā)環(huán)境,只需要 1-click 就可以在本地 IDE 里直接調(diào)試。
市面上已經(jīng)有一個(gè)勉強(qiáng)配合的概念:Nocalhost
抽象的抽象:DSL
對(duì)于需求、設(shè)計(jì)、開發(fā)、測(cè)試等的抽象,一直是我在去年研究的重點(diǎn),它包含了:
-
需求的抽象
設(shè)計(jì)化為抽象
架構(gòu)描述語言
統(tǒng)一建模語言
版本管理抽象
構(gòu)建工具抽象
即將這一系列的步驟轉(zhuǎn)換為領(lǐng)域特定語言 —— 只有將流程、工具、行為進(jìn)行抽象,我們才得以優(yōu)化整個(gè)系統(tǒng)。
膠水設(shè)計(jì):API 的 API
軟件開發(fā)是一項(xiàng)復(fù)雜的團(tuán)隊(duì)活動(dòng)。在一個(gè)系統(tǒng)里,我們要與大量的內(nèi)、外部系統(tǒng)進(jìn)行關(guān)聯(lián)。而為了簡(jiǎn)化開發(fā)人員的負(fù)擔(dān),我們需要提供一個(gè)新的 API 來將現(xiàn)有的 API 進(jìn)行封裝。
如在現(xiàn)有的模式之下,為了記錄一個(gè)日志,我們需要在依賴管理工具中引入對(duì)應(yīng)的依賴,再添加相當(dāng)?shù)拇a。而所有的 API 都是在更新的,這一系列應(yīng)該將由 IDE 本身來完成。在這種模式之下,我們只需要輸入對(duì)應(yīng)的 snippets
,便能完成這一系列的自動(dòng)化過程操作。
技術(shù)細(xì)節(jié)
最后,我們還是回到代碼上:https://github.com/inherd/uncode/
架構(gòu)設(shè)計(jì)
我決定使用我設(shè)計(jì)的新架構(gòu)設(shè)計(jì)套路來展示一上 Uncode IDE 的架構(gòu)。由于不確定性較大,現(xiàn)有的系統(tǒng)是一種介于單體與微架構(gòu) 模塊化的方式設(shè)計(jì)的,我想了想后來就稱之為流體模式。一種在持續(xù)演進(jìn)的過程中,不斷進(jìn)行不可預(yù)料地拆分架構(gòu)單元的模式。
在驅(qū)動(dòng)方式上,由四種模式構(gòu)成:
-
模塊化。
管理和過濾器。主要進(jìn)行領(lǐng)域特定語言的設(shè)計(jì)
搭檔模式(sidecar)。將諸如語言解析等獨(dú)立為進(jìn)程,通過進(jìn)程調(diào)用來實(shí)現(xiàn)跨平臺(tái)
容器橋。將 UI 展示與邏輯相隔離,讓 IDE 的大部分組件與 UI 無關(guān)。
同時(shí)系統(tǒng)的物理設(shè)計(jì)上,打算采用領(lǐng)域驅(qū)動(dòng)的方式進(jìn)行。
框架選型
考慮到這是底層開發(fā) 系統(tǒng)編程,我們:
-
使用 Rust 來作為主要開發(fā)語言
在 UI 展示上,暫時(shí)使用 Tauri(WebView 容器) React 來展示需求(本地看板)與設(shè)計(jì)(建模等)。
使用 TypeScript 作為 UI 部分開發(fā)語言
使用 RPC 作為與多個(gè) DSL 的通信協(xié)議
……
依舊地,這個(gè)項(xiàng)目將繼續(xù)在 Inherd 小組上開發(fā)~~。
FAQ 及其它
代碼:https://github.com/inherd/uncode/
vs Intellij IDEA or VSCode / Theia
并非完全競(jìng)爭(zhēng)關(guān)系,編碼這部分的功能,還是這兩貨比較流行。Uncode 不會(huì)在前期造這方面的輪子,只是顯式地集成它們,或者被集成。
Uncode 優(yōu)先解決 DevOps 的本地化,將其融入開發(fā)的開發(fā)過程的問題。
其它
最后一次聲明:這是一個(gè)概念性 IDE 的設(shè)計(jì),暫不適合任何生產(chǎn)環(huán)境。 歡迎加入云研發(fā)的微信研討群。