博客 / 詳情

返回

技術文檔還在全靠 Markdown?它可能真的在拖你後腿

Markdown 這玩意兒,誰不用?
寫 README、記筆記、寫博客,全靠它,簡單、直觀、上手快。很多團隊甚至把“全站 Markdown”當成技術文檔基礎設施的一部分。

但一旦文檔規模上來,涉及多終端發佈、結構化檢索、AI Agent 消費、跨系統複用這些需求時,Markdown 的短板會被放大得非常難看——它更像是“最低公分母”,而不是可靠的“文檔真相源(source of truth)”。

這篇就來聊聊:

  • 為什麼説 Markdown = 內容世界裏的“隱式類型系統”
  • 什麼時候它會把你拖進坑裏
  • 幾個更適合嚴肅技術文檔的備選方案

一、Markdown 最大的問題:它幾乎不描述“是什麼”

Markdown 的優點大家都知道:

  • 純文本、可讀性好
  • 寫起來快,開發者友好
  • 在 GitHub、靜態站、編輯器裏到處都能用

但它有一個致命缺點:幾乎不帶“語義”

對機器來説,一段 Markdown 大概長這樣:

  • #:大概是個標題
  • - / *:大概是個列表
  • 但它不知道:

  • 這個標題是“概念解釋”還是“操作步驟標題”
  • 這個列表裏的每一項是“步驟(step)”、還是“注意事項(note)”、還是“純羅列”
  • 這段代碼是“命令行指令”、“配置片段”還是“完整示例”

    對人類眼睛來説都差不多;
    對搜索引擎、IDE 插件、AI Agent 來説,差別就很大了。

    更現實一點的場景:

  • 你想把一份內容同時導出為:HTML / PDF / ePub / man page
  • 你想讓 LLM 根據文檔自動生成“操作步驟”、“API 參數説明”、“環境要求”

    如果文檔只有 Markdown 這點結構信息,機器只能靠猜,沒有任何“結構保證”

    image


    二、把 Markdown 想象成“隱式類型系統”

    可以借用一下程序語言的比喻:

  • JavaScript、Python 這類是“隱式類型”

    • 寫起來靈活
    • 但編譯器給不了多少保證
  • TypeScript、Rust 則是“顯式類型、強約束”

    • 寫的時候麻煩一點
    • 但能在編譯期抓出一堆問題,整體工程更穩

    Markdown 就是文檔世界裏的 “隱式類型”

  • 怎麼寫都行,沒有 schema,沒有校驗
  • 同一層級的標題,在 A 文檔裏表示“概念解釋”,在 B 文檔裏表示“操作手冊”
  • 機器完全不知道它們“語義上是不是同一類東西”

    而且還不止一種 Markdown,常見幾種:

  • CommonMark:https://commonmark.org
  • GitHub Flavored Markdown:https://github.github.com/gfm
  • MyST:https://mystmd.org
  • MultiMarkdown:https://fletcherpenney.net/multimarkdown

    你以為自己在寫“Markdown”,
    實際上是在寫“某個實現的 Markdown 方言”,
    換個渲染器就可能各種小問題:

  • 有的支持腳註,有的直接無視
  • 有的對軟換行有特別規則
  • 代碼塊語法也可能不兼容

    結果就是:非常適合寫一篇文章,極不適合作為長期演進的大型文檔體系基礎。


    三、MDX:大家都在 Markdown 上“偷偷造輪子”

    當團隊發現 Markdown 表達力不夠的時候,常見的補救手段是:MDX。

    比如這樣的寫法:

    # Install

<Command>npm install my-library</Command>


`<Command>` 根本不是 Markdown,它是個 React 組件:

* 在這個網站上,渲染成統一風格的“命令塊”
* 對編輯者來説,這樣比 \`\`\`bash 看的更語義化

問題是:

* 這套東西 **只在這一家站點裏有意義**
* 你想把這段文檔同步到別的系統上,對方也得實現一模一樣的 `<Command>` 組件
* 即使對方也支持,渲染細節也未必一致

換句話説,大家本能地覺得“只靠 Markdown 不夠用”,
於是開始在上面“造私有的語義層”,
結果是:**結構變強了,但可移植性直接歸零**。

---

## 四、為什麼要認真對待“語義標記(semantic markup)”

語義標記關心的是:**內容是什麼**,而不僅僅是“長什麼樣”。

比如同樣是一行內容,對機器來説這幾種差別很大:

* `<li>`:普通列表項
* `<step>`:操作步驟
* `<note>`:提示或備註
* `<warning>`:高危提示

這對幾個方面都很關鍵。

### 1. 內容複用 & 多渠道發佈

如果源文檔帶語義:

* 可以按需轉換為 HTML / PDF / ePub / man page / Markdown 等
* 在轉換過程中,可以根據類型定製展示:
  
  * `<command>` → 統一風格的命令行塊
  * `<step>` → 自動編號、摺疊
  * `<warning>` → 高亮紅框

如果源頭只有 Markdown:

* 解析出來最多隻有“標題 + 列表 + 段落 + 代碼塊”
* 想在後處理中重新識別“哪些是步驟、哪些是概念”
  
  * 只能靠語義模型 / 正則去猜
  * 準確率和可維護性都很糟糕

一句話:**結構信息只能從源頭寫入,很難在下游魔法補回去。**

### 2. 機器消費:LLM / Agent / IDE 集成

對 AI 而言:

* `<step>` = 100% 確定的“操作步驟”
* 列表裏的 `- xxx` = “可能是步驟、也可能是吐槽”

前者可以直接用來生成交互式嚮導、腳本、校驗器;
後者只能當普通文本讀。

早年的 XML Web Service 之所以流行,很大程度上也是這個理由:
**結構 + schema 可以給機器足夠多的“確定性信息”**。
今天 JSON 一樣要配合 JSON Schema 來用,道理相同。

---

## 五、幾種比 Markdown 更“長遠”的文檔格式

接下來看看幾種常在技術文檔體系裏出現的選手:表達力和結構都比 Markdown 強很多。

### 1. reStructuredText:Python 社區的老牌選手

reStructuredText(reST)是 Python / Sphinx 生態的標記語言,
語法是純文本,但支持豐富的“指令(directive)”和“角色(role)”。

示例:

Installation

.. code-block:: bash

npm install my-library

.. note::
This library requires Node.JS ≥ 22.

See also :ref:usage-guide.


這裏可以看到:

* `.. code-block:: bash`:明確是代碼塊,語言是 bash
* `.. note::`:語義上的“註釋/説明”
* `:ref:`:顯式的交叉引用

reST 還有 figure、sidebar、citation 等一堆結構化元素,
都可以在渲染時被“定製化對待”。

---

### 2. AsciiDoc:更易讀的人類友好型語義標記

AsciiDoc 也是純文本語法,但設計時就考慮到了“結構 + 參數化 + 多渠道輸出”。

示例:

= Installation
:revnumber: 1.2
:platform: linux
:prev_section: introduction
:next_section: create-project

[source,bash]

npm install my-library

NOTE: This library requires Node.JS ≥ 22.

See <<usage,Usage Guide>> for examples.


裏面有幾個關鍵點:

* 頂部的 `:revnumber:`、`:platform:` 等是文檔屬性
  
  * 方便做版本、平台過濾、條件內容
* `[source,bash]` + `----` 明確説明“這是 bash 源碼塊”
* `NOTE:` 是標準的“提示”語義
* `<<usage,Usage Guide>>` 是交叉引用

藉助 Asciidoctor 工具鏈:

* 可以從 AsciiDoc 輸出 HTML / PDF / ePub / DocBook 等
* 也可以把現有 Markdown 遷移過來(有成熟的遷移文檔和工具)

遷移指南可看:
[https://docs.asciidoctor.org/asciidoctor/latest/migrate/markdown](https://docs.asciidoctor.org/asciidoctor/latest/migrate/markdown)

---

### 3. DocBook:偏“工業級出版”的 XML 模型

DocBook 是專門為技術出版設計的 XML 模型。

示例:

<article id="install-library">
<title>Installation</title>
<command>npm install my-library</command>
<note>This library requires Node.JS >= 22</note>
<xref linkend="usage-chapter">Usage Guide</xref>
</article>


每個標籤都有清晰語義:

* `<command>`:命令
* `<note>`:註釋/説明
* `<xref>`:交叉引用

DocBook 還內置了大量領域標籤:

* 函數名、變量名、應用名、菜單、快捷鍵、UI 元素等
* 支持索引項、術語表,方便自動生成索引和術語解釋

藉助已有的 XSLT 樣式:
[https://docbook.org/tools](https://docbook.org/tools)

可以穩定輸出 HTML / PDF / man page,甚至再導出為 Markdown。

代價當然是:**XML 比 Markdown 囉嗦得多**。

---

### 4. DITA:企業級結構化內容的終點站

DITA(Darwin Information Typing Architecture)是企業裏常見的結構化內容標準,基於 XML,主打:

* 主題化寫作(topic-based)
* 內容重用(conref、條件過濾)
* 多產品、多版本、多渠道發佈

示例:

<task id="install">
<title>Installation</title>
<steps>

<step><cmd>npm install my-library</cmd></step>

</steps>
<prolog>

<note>This library requires Node.js >= 22</note>

</prolog>
</task>


語義非常明確:

* `<task>`:一個任務
* `<steps>` / `<step>`:任務步驟
* `<cmd>`:執行命令

再配合過濾和重用,可以在**一份內容源**基礎上,輸出:

* 不同產品線的定製版本
* 不同平台(Linux / Windows)的變體
* 不同渠道(Web / PDF / 幫助文檔)的呈現

---

## 六、別急着嫌 XML:你可能已經在“間接付出成本”了

很多開發者看到 XML 就本能牴觸:

> “又長又難寫、工具又少,團隊肯定不買賬。”

但如果你團隊已經在:

* 用 MDX 自己造組件語義
* 用各種插件給 Markdown 打補丁
* 寫一堆腳本在構建時“猜結構”、“改 AST”

那説明你已經在為“語義 + 結構”付費用了,只是:

* 付的是**隱形複雜度**
* 得到的是**非標準、不可移植的私有解決方案**

相比之下,選一個成熟標準(reST / AsciiDoc / DocBook / DITA):

* 工具鏈、最佳實踐、生態都比較成熟
* 學習成本是一次性的
* 長期來看更容易維護、擴展、遷移

---

## 七、怎麼選?給不同規模的項目一個簡單建議

可以按“文檔複雜度”來劃分:

1. **小體量 / 短生命週期文檔**
   
   * 例如 README、內部一次性説明、Demo 説明
   * → 用 Markdown 就好,簡單高效
2. **中等規模的開發者文檔站點**
   
   * 需要結構化、交叉引用、少量複用
   * → 優先考慮 reStructuredText 或 AsciiDoc
     
     * 編輯體驗接近 Markdown
     * 結構比 Markdown 強多了
3. **大型、長期演進的文檔體系**
   
   * 多產品、多版本、多渠道發佈
   * 有專職技術文檔團隊
   * → 考慮 DocBook / DITA 這類 XML 方案

無論選哪個,有一個共識比較重要:

> **源頭儘量用“信息最豐富”的格式,往下可以裁剪成 Markdown,但別反過來。**

Markdown 非常適合作為“開發者友好的輸出格式”,
但不一定適合作為你整個文檔體系的“唯一真相源”。

---

## 八、稍微動手試試會更有感覺

如果想從“停留在 Markdown”往前挪一點,可以這樣練手:

* 先找一小段現有 Markdown 文檔
  
  * 按照 AsciiDoc 的規則手工重寫一遍
  * 再用 Asciidoctor 渲染成 HTML / PDF 看看效果和表達力差異
  * 遷移指南:
    [https://docs.asciidoctor.org/asciidoctor/latest/migrate/markdown](https://docs.asciidoctor.org/asciidoctor/latest/migrate/markdown)
* 然後試着把 AsciiDoc 導出為 DocBook:
  [https://docs.asciidoctor.org/asciidoctor/latest/docbook-backend](https://docs.asciidoctor.org/asciidoctor/latest/docbook-backend)

當你真實感受到:

* “同一份源文檔”可以就這麼往多個渠道、多個格式輸出
* AI / Agent 可以準確識別“步驟 / 命令 / 注意 / 概念”

你就很難再把 Markdown 當作“萬用解決方案”了。它依然好用,只是該讓位的地方,得學會讓位。

---

**喜歡就獎勵一個“👍”和“在看”唄~**

![image](https://files.mdnice.com/user/44095/f9363b7e-9738-44f3-9ac6-8ee2cddf995d.png)

專屬付費版全家桶
----------------

如果你只是激活JetBrains全家桶IDE,那這個應該是目前最經濟、最實惠的方法了!

`專屬付費版全家桶`除了支持IDE的正常激活外,還支持`常用的付費插件和付費主題`!

![全家桶+付費插件授權](https://files.mdnice.com/user/44095/bcbdd158-4b22-4ec6-827a-8a8e0381062b.png)

100%保障激活,100%穩定使用,100%售後兜底!

### 為什麼説專屬付費版全家桶最經濟、最實惠?

因為`專屬付費版全家桶`支持常用`付費插件和付費主題`。而任意一款或兩款付費插件或付費主題,其激活費用就遠高於我提供的`專屬付費版全家桶`。

比如,最方便的彩虹括號符`Rainbow Brackets,124/年。`

![Rainbow Brackets](https://files.mdnice.com/user/44095/c93301eb-2317-4009-bfdb-c0ac6682804a.png)

再如,MyBatis最佳輔助框架`MyBatisCodeHelperPro`的官方版本`MyBatisCodeHelperPro (Marketplace Edition),157/年。`

![MyBatisCodeHelperPro](https://files.mdnice.com/user/44095/9b91272f-dc35-4d31-8233-0d84fa91871b.png)

還有最牛的`Fast Request`,集API調試工具 + API管理工具 + API搜索工具一體!`157/年`。

![Fast Request](https://files.mdnice.com/user/44095/d7778d66-605b-41ba-b942-0011cf7b4443.png)

`` `專屬付費版全家桶` ``包含上述這些付費插件,但不限於上述這些付費插件!

需要的小夥伴,可以掃碼二維碼,回覆付費,瞭解優惠詳情~
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.