草稿
這篇文章是草稿。
在我移除這則通知之前,請勿分享或連結到這個網址
我的書的版權頁
2014 年 3 月 14 日
到目前為止,我已經寫了相當多的書,而我時常會被問到我用什麼工具來寫作。多年來,我已經開發出一個相當靈巧的工具鏈,至少對我而言是如此,因此以下是我對所有工具如何結合在一起的看法。
在我開始寫作時,我使用文字處理或出版工具。我試用過一段時間的 Microsoft Word,但不太喜歡它。我早期的書(分析模式、精簡 UML、規劃極限程式設計和重構)都是使用 Framemaker 撰寫的,這是一個適用於大型文件的精密工具。如果你喜歡 WISIWIG 編輯環境,它相當不錯(儘管我從 2000 年左右就沒有再使用過它了)。
在撰寫《企業應用程式架構模式》時,我在寫作上做了一個重大的轉變,轉向基於文字的系統。我的意思是將書中的原始檔案保存在開放的文字格式中。這對我來說非常有效。畢竟我是一個怪咖,而且我很容易就能寫出處理基於文字檔案的工具。我也可以將書保存在標準版本控制系統中,這在獨自工作時很有用,而且對於其他人的協作工作至關重要。
這種機制對許多人來說有其缺點。我沒有 WISIWIG 了,而是使用文字編輯器撰寫文字,並執行指令碼來產生可讀的輸出。這對我來說很好用,但你可以想像非怪咖會覺得它相當原始。
對於像我這樣的技術作者來說,這個方案有一個特別的優點,就是處理軟體程式碼。在我使用文字之前,我必須撰寫程式、讓它們運作並進行測試,然後將它們複製/貼上到 Framemaker 中。最後一個步驟就是問題所在,我經常需要變更程式,然後必須更新書中的程式碼。使用手動複製/貼上時,很容易發生錯誤。
現在使用我目前的方案,所有程式碼都會在建置過程中自動匯入書中。因此,如果我更新程式碼,這本書就會自動更新。我再也不會使用手動複製/貼上了。
我全文字方法的唯一例外是圖表。我使用過各種圖表繪製工具,而這些大多是所見即所得風格的工具。這並非理想,但我尚未找到一種能與直接文字編輯搭配得更好的解決方案。
原始文字格式
我方法的重點在於使用開放文字格式。在我的情況中,我使用自訂 XML 字彙。它大多類似於 HTML,但加入了一些對我的書籍有意義的額外標籤。我一直都是語意標記的愛好者,也就是根據文字的意義標記文字,而非其輸出格式。例如,我時不時會在定義一個詞彙時將其加粗,就像我在上面所做的那樣。我喜歡這樣做,因為如果讀者正在尋找某個術語的定義,他們可以透過掃描頁面快速找到它。
然而,當我對其進行標記時,我不會使用像 <b>
或 <bold>
這樣的標籤,而是使用語意標籤 <term>
。然後我在轉換程式碼中決定將術語轉換為粗體文字。
我比較喜歡這樣做,因為它迫使我專注於語意,而非格式。它也在轉換過程中為我提供了其他有用的功能。當我轉換術語時,我不僅可以將它們加粗,還可以插入標記以建立輸出索引。
我認識的許多人喜歡文字文件,但討厭 XML。有些人覺得 XML 難以輸入,或者標籤會妨礙閱讀。這裡一個受歡迎的替代選擇是標記語言,它故意容易在純文字中閱讀和撰寫。我比較喜歡 XML,因為它為我提供了更多標記彈性,我可以引入任何我喜歡的標籤,包括專門針對這本書的專門標籤,並將它們順利地融入流程中。
我遇到的另一個來源格式是使用 Docbook XML 字彙。Docbook 是一種標準的 XML 字彙,用於文件,尤其是長篇文件。它有一些有用的優點,但我發現它的標籤相當冗長且具有侵入性。此外,採用 Docbook 會阻止我使用自己的語意標籤。
另一個具有悠久傳統的文字選擇是 LaTeX,但我從未嘗試過。
轉換目標
為了將我的原始文件轉換為輸出,我使用一個轉換工具鏈,我將在稍後討論。該工具鏈的立即目標是 Docbook。雖然我不喜歡 Docbook 作為原始文件格式,但它作為轉換目標確實很好。一旦你將文字轉換為 Docbook,那麼就會有一系列 OSS 工具可以將該 Docbook 轉換為許多格式:HTML、PDF、ePub 等。我可以輕鬆地將這些工具整合到我的整體工具鏈中,因此透過一個命令,我可以產生這些格式的任何組合。
在早期處理這本書時,我通常使用 HTML 輸出。如果我想與審閱者分享這本書,我可以根據他們的意願產生 PDF 或 ePub。我的出版商(Pearson)會取得 Docbook 檔案,並將它們輸入他們的出版流程中。
轉換工具鏈
產生 Docbook 的工具鏈是我自己用 Ruby 編寫的一系列腳本。它們會採用一系列組成書籍文字的 XML 檔,以及書目和即時程式碼目錄等事物的參考檔,並產生 Docbook 輸出。
它們被建構為轉換規則,因此當轉換器看到「術語」標籤時,它知道要輸出適當的 Docbook 元素(以及索引資訊)。如果我新增新的標籤,我只需要為它們新增新的處理方法,就可以快速讓它們顯示在輸出中。這個工具鏈和我用於我網站的工具鏈非常類似,主要差異在於網站工具鏈輸出 HTML 而不是 Docbook
編輯
這種方法的好處是我可以使用任何文字編輯器來撰寫。我最喜歡的文字編輯器是 Emacs,而 Emacs 有非常棒的模式(NXML 模式)可以用來編輯 XML 檔,這特別有幫助。我見過許多 XML 編輯器都是針對 XML 作為階層資料結構的序列化,這不適合用於標記文字。NXML 模式非常適合文字標記,因此它對我來說很好用。在其他功能中,它可以設定 RNC 架構檔,讓編輯器有架構感知能力。
程式碼匯入
自動程式碼匯入是我工具鏈中非常重要的部分。我可以處理常規程式碼,並依我喜歡的任何方式組織。我只需要放置標記,並將其封裝在註解中,以指出程式碼中我可能想要拉入書籍中作為程式碼片段的區域。然後我有一個 XML 元素,用於命名檔案和片段以及標籤。當我執行工具鏈時,程式碼會從即時檔案拉出到 Docbook 輸出中。
圖形
圖形表示一個區域,我不會在文字編輯器中進行編輯。目前我沉迷於使用 OmniGraffle 來製作圖表(僅限 Mac)。OmniGraffle 會匯出我需要用於書籍製作的各種格式(png、eps 等)。我的腳本工具鏈使用 Apple 的腳本功能來自動重新匯出檔案,因此當我變更圖表時,我不必記得要匯出。
版本控制
像任何程式設計師一樣,我非常重視版本控制。當我開始使用 P of EAA 時,我們使用 CVS,從那時起,我使用過 SVN、Mercurial 和 git。當與他人協作時,版本控制系統特別有幫助,因為我們可以使用與程式碼相同的方法來保持我們的寫作同步。
當書籍進入製作階段時,我已與我的出版商 Pearson 安排使用文件編輯器、索引編制人員和其他製作人員,他們都習慣於處理儲存庫中的原始來源檔案。
重大修訂
2014 年 3 月 14 日