文檔代碼化,將文檔以類代碼的領域特定語言的方式編寫,並借鑑軟件開發的方式(如源碼管理、部署)進行管理。它能夠藉助於特定的工具進行編輯、預覽、查看,又或者是經過專屬的系統部署到服務器上。面向非技術人員的文檔代碼化的一種常見架構模式是: 編輯-發佈-開發分離』,
最近一個月裏,我在開發一個基於 Git + Markdown 的全新文檔系統。我定製了一個基於 markdown 的標記語言,以支持起雷達圖、條形統計圖、思惟導圖等圖表的文檔系統。這個系統將在將來幾個月內發佈。固然了,視進度而看,也多是月底。git
過去的幾年裏,咱們一直在討論各類各樣的代碼化,基礎設施代碼化、設計代碼化、需求代碼化……。在個人那一篇《雲研發:研發即代碼》中,設計了一個徹底代碼化的軟件開發流程。而今天咱們將討論另一個有趣的存在:文檔。程序員
在《架構金字塔》中,我將文檔定義爲支撐五層架構模型的一種存在。由於文檔在一個系統中是很是重要的存在,咱們用它來指導開發工做,用它來記錄問題,用它來寫下規範……。總而言之,它很重要,因此咱們從新討論一下這個話題。github
三年前,當我第一次接觸到『架構決策記錄』的概念時,我被它的理念所吸引:web
隨後,我使用 Node.js + TypeScript 寫了一個 ADR 工具。如今,在個人大部分開源薦中,我都會使用它來管理一些技術決策。由於基於這個理論設計的這個文檔系統真很是棒,我能夠查詢到:數據庫
對於一個長期開發的系統來講,它真的很是有用。npm
靜態站點生成是一種混合式的 Web 開發方法,它經過部署預先構建的靜態文件進行部署,來讓開發者在本地構建基於服務器的網站。
當 GitHub Pages 成爲了程序員首選的 博客/內容/文檔 服務器時,他/她也採用了靜態站點生成這一項技術。靜態站點生成有各類各樣的優勢:編程
而事實上,靜態站點生成所作的最主要的一件事是:將數據庫中的數據進行代碼化。採用諸如 Wordpress 這樣的 CMS 時,咱們是將數據存儲在數據庫中,以實現對於數據的 CRUD。一篇文章變爲數據庫二進制文件中的一個片斷。安全
隨後,靜態站點生成工具作了第二件事情即是將文本內容可視化出來,便於人們閱讀。這樣一來,咱們便實現了發佈-開發分離。服務器
將數據代碼化時,咱們面臨了一個很是大的挑戰:易於編寫、閱讀的標記語言(如 markdown)只設計了內容的形式,缺乏了內容相關的其它信息,諸如於建立時間、做者、修改時間等等。markdown
因而各個靜態站點生成器定製了本身的 markdown,添加了一些額外的信息,如 hexo 採用 :year-:month-:day-:title.md
的形式來管理文章的日期和標題等。這樣一來講,就不須要經過讀取這個文章的 Git 信息來構建出整個信息。
咱們所熟悉的 GitHub Flavored Markdown 也是如此,經過不明顯破壞內容格式的兼容模式來擴展 markdown 數據字段。
除此,咱們能夠定製基於 markdown 數據的圖表、思惟導圖等內容。
面向非技術人員設計是代碼文檔化的一大挑戰。做爲一個程序員,咱們以爲 markdown 語法再簡單不過了,可是對於非技術人員來講並不是如此。他/她須要:一個易於上手的可視化編程器。而要實現這樣一個目的,咱們須要在架構上作一些轉變,咱們能夠嘗試使用 『編輯-發佈-開發分離』 模式來解決這個問題。
即,咱們將過程拆爲了三步:
咱們依舊能夠選擇用源碼管理的方式來管理內容。只須要將數據庫接口,轉變爲 Git 服務器接口便可 —— 固然它們是稍有不一樣的。不過呢,把本地的 Git 轉換爲 Git remote 那就基本一致了。
如此一來,最後咱們的成本就落在改造出一個基於 Git 的 markdown 編輯器。
完美,我又一次在引子裏,把中心思想表達完了。
主要緣由有:文檔不代碼化,就沒有重構的可能性。
剩下的緣由有:
2020-02-30.docx
和 2020-02-31.docx
。應該還有更多。
回到正題上:
文檔代碼化,將文檔以類代碼的領域特定語言的方式編寫,並借鑑軟件開發的方式(如源碼管理、部署)進行管理。它能夠藉助於特定的工具進行編輯、預覽、查看,又或者是經過專屬的系統部署到服務器上。
它具有這麼一些特徵:
而一個高效的文檔代碼化系統,還具有這麼一些特徵:
而事實上,大部分的團隊並不須要上述的高級功能,並且它們都已經有了成熟的方案。
事實上,咱們在四個引子中標明瞭咱們所須要的要素:
設計一個標記語言及其擴展語法,而後實現它便可。
考慮到我和個人同事們最近實現了這麼一個系統,我仍是忍受一下手的痛楚,簡單說一下怎麼作這樣一個系統。咱們所考慮的主要因素是:
由於由 DSL 轉換成的圖表易於修改,而且能夠索引。因而乎,咱們:
咱們使用 Angular + GitHub,快速實現了一個 MVP:
隨後,咱們在這個基礎上進行了快速的迭代。
咱們使用了 markdown 的 code
做爲圖表的 DSL,擴展了這麼一些語法:
toolset。調用 Toolset 相關的組件
因此,對於使用者來講,只須要編寫下面的代碼:
質量成熟度評估模型
config: {"legend": ["當前", "將來"]}
就能夠生成對應的圖表:
又或者是用於製做技術雷達圖:
咱們還經過 config 來輸入 JSON,進行必定的懶惰化處理(不要累死本身)。
咱們在這個過程當中,遇到的最大的挑戰是,隨着咱們對 markdown 語法的不斷擴充,相關的代碼已經變成了一坨大泥球。因此,咱們不得不重寫了這部分代碼:
已經開源在 GitHub,併發布對應的 npm 包:@ledge-framework/render
。
咱們已經在 GitHub 上發佈了這個文檔化系統,你能夠參與到其中的使用和開發。
GitHub:https://github.com/phodal/ledge
項目首頁:https://devops.phodal.com/
而後,你就成爲了一個 Markdown 工程師,D3.js 設計師,Echart 配置管理員。