Intentional Software
2009 年 4 月 20 日
幾年前,我當時的同事 Matt Foemmel 對我們用來建構軟體的工具不滿意,設法與 Charles Simonyi 取得聯繫,以進一步了解神秘的 Intentional Software。他所看到的讓他印象深刻,並說服我和其他 ThoughtWorkers 也參與其中。我們所看到的是一個具有驚人潛力的工具,但我們對保密性和缺乏發布的急迫性感到沮喪。這種沮喪在上週結束了。
上週,我出發前往 Chris Sells 的 DSL Devcon,而 Intentional 的產品經理 Magnus Christerson 建議我順道拜訪,看看他們的進度如何。經過幾年的「馬上就要」後,我感到不確定,但與 Intentional 定期保持聯繫的同事 Rebecca Parsons 說,現在是好時機。
我在他們位於貝爾維尤的辦公室度過了一個迷人而興奮的一天。並不是我看到了什麼特別新的東西 - 這些都是已經存在一段時間的想法和功能 - 但我看到了以前從未見過的真實性和成熟度。事實上,Intentional 在幾週前發布了他們產品的 1.0 版。通常的做法是從山頂上宣傳突破性產品的 1.0 版發布。只有 Intentional 會進行這樣的發布,卻不費心告訴任何人。事實上,在我撰寫本文時,他們的網站上沒有提到他們的產品 - 如果你想要更多資訊,你必須與他們交談。
有什麼
這不是對其工具(稱為 Intentional Domain Workbench)的全面討論,我沒有時間將類似內容彙整起來。但我希望我零碎的想法和觀察會很有趣。Intentional Domain Workbench 是一個 LanguageWorkbench,事實上,它是我創造這個術語的系統之一。Language Workbench 是一個允許人們設計 DomainSpecificLanguages 的工具:不僅解析它們,還能建構一個包含豐富編輯功能的全面環境。在 Intentional 的案例中,這是一個 ProjectionalEditing 環境。
他們舉的一個範例是我用於 書籍介紹 的狀態機範例。此工作台允許您在其架構定義語言中定義語義模型狀態機的架構。為了操作狀態機,您定義語義模型的投影。Intentional Domain Workbench 的一個顯著特點是它支援同一個語義模型的多個投影。對於狀態機範例,他們已在討論範例時使用過的幾個 DSL 中定義投影:XML、自訂語法和 Ruby。這三個投影都是可逆的,表示您可以透過它們編輯,更新語義模型和其他投影。在投影之間切換只需選擇一個功能表項目。
他們也有流暢 C#、命令查詢 C 和狀態機圖中的唯讀投影。儘管他們尚未設定圖表為可編輯,但工作台可以處理可編輯的圖表表示。在另一個範例中,他們展示了一個電子電路,可以在樹狀結構屬性表投影和電路圖投影中編輯。
電路圖也顯示了工作台的另一個強大功能 - 將範例執行與程式定義流暢整合的能力。在電子電路案例中,這表示您可以提供電路的各種元素屬性,模型將計算電路各個部分的阻抗,並在您編輯電路時顯示它們。當然,您可以建構一個自訂程式來執行這種操作 - 但重點是,這種行為很容易作為工作台中 DSL 定義的一部分而產生。
將範例執行與程式定義結合是試算表的特點之一 - 也可能是試算表成為 LayProgrammers 環境如此成功的原因。這也是推動 Jonathon Edwards 的許多 有趣而瘋狂的想法 的一個概念。我的感覺是,語言工作台中有趣的 DSL 將具有這個特點,特別是如果它們旨在供非程式設計師使用。
您可以結合執行與規格的另一種方式是使用測試案例。他們有一個使用 Capgemini 建置的退休金工作台範例,允許精算師使用完整的數學符號輸入公式,以及類似的 FIT 表格來顯示測試案例。當您編輯公式時,這些測試案例會隨著適當的紅/綠行為而執行。
退休金工作台也說明了多種語言的結合。當您在螢幕上查看退休金文件時,您正在查看三種獨立的語言:散文處理文字、公式的數學符號,以及測試案例表格。這些語言是獨立開發,但整合在工作台的核心資料結構(稱為 Intentional Tree)中。這個整合也延伸到執行 - 您可以進入測試案例,並深入了解數學公式中的中間值。
為了讓這些事情執行,您必須在語意模型中包含行為。Intentional 已開發出自己的通用語言,其工作名稱為 CL1,用於執行此操作。CL1 看起來像是 C# 的超集,但這樣的觀點再次是核心語意模型的投影。我發現這是一個與 JetBrains MPS 類似的功能,他們有自己的「基礎語言」,可以投影到類似 Java 的通用語言。越來越多這些工具使用此工作台中通用語言進行編寫。
預期的工作方式是開發人員使用 Intentional Domain Workbench 建置特定領域的工作台。他們提供一個執行時間(Intentional Domain Runtime),讓他們在沒有語言編輯功能的情況下執行。因此,Capgemini 使用 Intentional Domain Workbench 建置退休金工作台作為自己的產品。Intentional Domain Workbench 允許您定義新的模型架構和投影,而退休金工作台允許您使用這些語言建置退休金計畫。
Intentional 系統主要安排在 .NET 生態系統中。工作台和執行時期都執行在 CLR 上,且其核心部分是用 C# 編寫的。工作台讓產生 .NET 組件變得非常容易,這些組件可以自動載入工作台進行測試或與執行時期一起執行。自訂工作台可以為任何環境產生程式碼,而 Intentional 已與另一位合作夥伴合作,涉及產生 Java 程式碼,以便人們可以在自訂工作台中指定行為,然後在 Java 環境中部署產生的系統。
實作中一個有趣的方面是,它們使用許多小轉換,而不是一個大型轉換來處理表示轉換。舉例來說,從語意模型產生 C# 程式碼涉及約十二個小型轉換,排列在類似多階段編譯器的管線中,最後一個步驟是從 C# AST 轉換為文字。它們的許多內部設計都用於讓此方法有效率,因此您可以放心地將許多小型轉換串聯在一起,而不用擔心任何效率成本。另一個結果是,用於產生程式碼的轉換管線與用於編輯投影的轉換管線非常類似。
使用投影編輯的工具常遇到的問題是它們如何處理版本控制。通常的答案是讓多人同時編輯相同的儲存,這讓許多嚴肅的開發人員感到害怕。Intentional Domain Workbench 內建版本控制機制,會記錄對 Intentional Tree 所做的所有變更,並可以在樹狀結構層級進行提交和合併。然後,您可以透過執行另一個投影來查看不同語言的差異。
這種版本控制方法的一個有趣功能是,您可以提交衝突,而衝突會以衝突的形式提交到儲存庫中。與文字檔案不同,它們不會搞亂您的文字 - 您有真正的資料結構,因此您可以找到衝突並修復它們。開發人員使用此功能將無法解決的衝突提交到分支,以便更熟悉衝突區域的開發人員可以更新分支並修復它。
在 Intentional Tree 而不是文字上進行編輯的事實也改變了一些其他事情。例如,無序集合會加上標籤,以便在編輯器中變更元素順序時不會觸發衝突。您還可以包含特定於網域的衝突偵測和解決行為。
公開
從歷史上來看,Intentional 缺乏發布一直是一個問題,它們的保密性是另一個問題。要看到 Intentional Domain Workbench 的任何真實內容,需要 Neal Ford 所稱的 UnforgivenContract。Intentional 提供了一些 公開演講,但他們實際上都歸結為「相信我們,我們有一些非常酷的技術」。我們知道他們確實有,但無法向人們解釋原因。
因此,我滿懷期待地等待 Magnus 和 Shane Clifford(他們的開發經理)在 DSL DevCon 上的演講。他們說他們終於要揭開序幕。他們會嗎?人們會如何反應?
他們令人擔憂地開始,使用通常不會透露的 Powerpoint,但隨後他們轉向展示工作台,序幕終於揭開。要評估反應,請 查看 Twitter。
- @pandemonial 非常感動!太棒了!多個網域、多種語言,沒有問題得不到解答
- @csells 好吧,觀看一個即時電路在 C# 檔案中呈現並運作非常酷。
- @jolson 兩個字來形容 Intentional Software 的電子產品展示:天啊。就這樣,我的大腦終於爆炸了。
- @gblock 這不是關於炫目的展示,而是關於徹底改變我們所知的世界的。
- @twleung 好吧,精算公式的 IntelliSense 真是太棒了
- @lobrien 這就像看到一個 100 英里/加侖的化油器:天啊,有人會買這個並把它放在保險庫裡!
之後,有幾個人說這是他們看過最重要的示範,甚至將其比作 所有示範之母。對許多人來說,感覺整個軟體開發世界剛剛發生了改變。
(非常感謝 Chris Sells 及其團隊組織這次會議並邀請我發言。他們還製作了一個 演講影片。)
那麼現在呢?這一切比示範所能揭示的更多。現在我們希望親自體驗工作台並全力測試它。假設它通過了測試,我們希望在商業專案中使用它,並看看它實際上如何運作。尚未有任何使用 Intentional Domain Workbench 設計的系統上線,而且正如任何敏捷主義者所知,在您每週將其部署到生產環境之前,您永遠無法真正了解某件事。
不久後,另一個與此相似的主要工作台 - JetBrains 的 Meta Programming System - 將會以開源形式發布 1.0 版本。因此,今年很可能是這些語言工作台最終走入光明,並看到其第一個外部試點專案的一年。(我也應該提到 MetaEdit 工作台已經推出了一段時間,儘管它並沒有太大的知名度。)我不知道這些工作台是否會改變我們所知的程式設計面貌,畢竟我曾經認為 Smalltalk 將會是我們的未來;但這些工作台確實有潛力帶來如此深遠的改變。我當然很興奮,我們現在正處於這個旅程的下一階段,更公開的階段。