Wiki 的極限

本文是當初開發 Lowiki 協定時(用在 LoNote 中)的想法記錄,主要涉及了 Wiki 系統的弱點。

因為擺在自己的筆記倉庫中也沒啥用,所以略做修改後拿出來貼一貼,權當分享。

必須說明的是,本文中的「Wiki」指的是 Wiki 引擎,而非維基百科,切勿誤會。


從我最早有「電子筆記」這個概念開始,在我的心中,電子筆記一直都是和另一個名叫「Wiki」的概念相連結的。如果您讀過我的電子筆記介紹文章,多半會注意到,我所嘗試的筆記軟體中,幾乎有半數其名字中都有「Wiki」這個詞。

所謂的 Wiki,維基百科長篇大論說得很籠統,不過大體說來,可以歸納為兩個概念:

  1. 「透過名字,連繫到系統中的其他頁面」
  2. 「如果頁面不存在,允許輕易建立頁面與連結」

我對這種概念一直很著迷。

這也難怪。就看看維基百科吧,那是世界上所有人類的共用筆記,包含了數不清也看不完的各式內容,可以被人從任意地點、以任意方式進入檢索、讀取、重寫與創作。

我的個人筆記,顯然會是這等系統的縮影,我當然也會憧憬這樣子的一套系統能被我所用。

在一段相當漫長的日子中,我開始選用各種 Wiki 系統來建立筆記,從 Mediawiki 到 Tiddlywiki,從 Zimwiki 到 Vimwiki……然而隨著我大量嘗試使用 Wiki 系統,享受它們的好處之餘,卻也漸漸地意識到,Wiki 系統中其實存在著某些讓人十分頭疼的問題。

而這一切,都圍繞著命名的問題。

命名的問題

Wiki 對於頁面的組織方式很寬鬆,不會要求樹狀或層次性結構,但它對頁面的「名字」,卻要求得很嚴格。因為它正是使用「名字」作為不同頁面的識別字--

使用者對系統說:「我要連到一個名叫『魔法』的頁面。」系統就會連到指定的那頁。

邏輯很直觀,就是這麼回事。

然而這個邏輯,在實際使用上是有問題的。

首先,連到「魔法」頁面的指令,並不會連到名為「魔戒魔法體系」的頁面,當然也不會連到「黑魔法」或「魔法老師」的頁面。另一方面,您的系統中也不能有兩個名叫「魔法」的頁面,不然系統怎麼知道您要連到哪一頁?對嗎?

同一個名字,在同一套 Wiki 系統中只能出現一次,這是 Wiki 中的鐵則。

長名、更名與死鏈

但在我們日常使用中,很多時候確實會不知不覺中建立起「名稱相同的頁面」。比方說作家寫小說,有五個故事專案,每個專案都有「人物介紹」……好吧,作者顯然不能只打「人物介紹」幾個字作為名稱,得打「XXX 故事的人物介紹」才行。

然而系統總是由小而大的。

當您第一次建立「人物介紹」頁面或「盆栽照顧」頁面時,您未必能夠考慮到日後你會把它細分為十幾種不同的細項,所以接下來,您多半會開始考慮「更名」的問題,偏偏 Wiki 系統對更名很不友善。

重新回憶一下,沒錯吧:「它用名字來建立連結」,所以,很自然地,一旦您變更了某個頁面的名字,原本指定要連到該名字的那些連結,當然就會全部失效了。

雖然許多 Wiki 系統允許使用者透過「重定向」這種技巧來進行「假更名」,好避免更名後產生死鏈,但若使用這種方法來處理更名問題的話,先前被錯誤佔用的名稱在更名後依然不能被釋放出來,名實不符的情況依然無從解決;二來,也無法使用舊名稱來建立新的頁面--因為舊名稱依然處在「被佔用」的狀態。

(重定向還有很多可說的話題,請允許我稍候再續。)

不管怎麼說,仔細想想我們就能注意到,以 Wiki 的運作本質來說,他的頁面名稱一經建立,就不能--也不應該被修改。如果勉強修改了,原本連向它的那些連結,全部都會變為無效。

這很讓人傷腦筋。

如果您用 Wiki 系統記筆記……更名後大量修改死連結這種沒營養的事,幾乎肯定會發生,而且一次又一次。

如果不更名,那怎麼辦?明明應該改名為「鬱金香盆栽養殖」的頁面,就一直掛著「盆栽養殖」這樣的名字嗎?雖然也不是不行,但這顯然也有問題……

重名、死鏈、更名這些問題,在 Wiki 系統中組成了一個矛盾的迴環。無論選擇什麼策略,使用者總是要做出犧牲:要嘛忍耐使用名不符實的頁面名稱、要嘛花費大量精神與時間修正死連結、要嘛為了避免重名與更名,打從一開始就使用超長超詳盡的名稱……

不管怎樣都很痛苦。

重定向

回到剛剛那個「XXX 故事的人物介紹」的例子。讓我進一步說明重定向這件事。

現在先忘記更名,假設我們一開始就已經正確地使用了一個精準的名稱,就是「XXX 故事的人物介紹」這樣。

如您所見,這名字很長很累贅,而且您還不能打錯任何一個字,比方說那個「的」就不能漏掉。而如您所想,這很容易打錯。

當僅僅只是想進入頁面時,因為有搜索功能輔助,所以輸入名字有小錯也沒問題,不過當使用者想要在其他頁面中建立連向這裡的新連結時,使用者就不能打錯任何一個字。這當然,因為「它用名字來建立連結」

大型的 Wiki 系統(比方說維基百科)有時會用「重定向」來解決這個問題。所謂的「重定向」,簡單來說就是告訴電腦:

「『XXX 故事的人物介紹』和『XXX 故事人物介紹』,這兩個名字含意是相同的唷!就算漏掉中間的『的』也沒有問題!」

重定向很不錯,能夠緩解同義字問題,然而這卻是個手工活,電腦幾乎幫不上忙。如果您哪天又覺得「XXX 人物介紹」和「XXX 故事的人物介紹」也是相同意思,您又得再設定一次。

假設某個頁面有五種同義字模式,您就必須設定五次……

--還是算了吧,我們乾脆說打字小心一點好了。


概念說明到此結束,對 Lowiki 設計沒興趣的人無需往下讀。

最初的發想:LoNote 不是 Wiki

因為我知道 Wiki 系統有這些讓人頭疼的問題,所以從一開始(0.1 時期),就沒打算將 LoNote 設計為一種 Wiki 系統。如您所見,LoNote 的筆記組織方式是最傳統的樹狀結構。

事實上,因為無法確定能否避開那些惱人的問題,我在 Lowiki 之前甚至沒有讓 LoNote 實作任何「從頁面到頁面」的交叉參照方式。LoNote 的頁面在很長時間中,彼此是完全獨立的:每頁只考慮自己,而不考慮其他頁面記錄什麼資料,發生什麼事情。

然而隨著使用情境逐漸拓展,我在用 LoNote 翻查筆記時,偶爾也會看到一個詞,想要依據這個詞直接調閱進一步資料的情境,這時我就會懷念起 Wiki 系統的好來。雖然說 LoNote 的搜尋功能非常快速強大,但是那始終比不上滑鼠一點來的直覺。

在這種狀況下,我開始考慮設計一個專用於 LoNote 內部的 Wiki 連結方式,那就是之後的 Lowiki。

被捨棄的設計

因為 Wiki 系統具有某些侷限,因此我也不打算完全實作所有的 Wiki 特徵,稱呼 Lowiki 為 Wiki 的一種,其實稍微有些勉強。

我在最初構思 Lowiki 時其實是這樣考慮的:

【具有弱點的最初版本】
先用隨便什麼方式創建 Lowiki 連結,格式像是:「lowiki://魔法」。主要的處理工作都是在點擊時進行。總之,當點擊一個 Lowiki 連結時,就會在整本筆記中尋找名字對應的頁面:

  1. 如果只對應到一個名字就立刻換頁過去
  2. 反之如果對應到多個名字(重名),就建立一個臨時選單,取每個筆記內容中的前 50 字作為參考,讓使用者選擇具體是要跳到哪一頁。

這樣的構思,是想用「點擊時讓使用者選擇實際跳轉對象」的方法,來解決重名問題。

我認為重名在筆記中是理所當然的事情,就像「人物介紹」這種條目名稱,往往會有許多個同時存在一樣,重名不該被嚴格禁止。

比起我後來的作法,這其實更合乎傳統 Wiki 的邏輯:連結本身儲存的是筆記的「名字」,在連結被點擊後,就去比對系統中的筆記名稱。

然而,雖然這個版本的 Lowiki 有考慮重名的狀況(面對重名的筆記,能夠透過選單選擇實際連結的目標),但由於它還是使用筆記的名字作為索引,於是「更名困難」的問題依然無法解決。這也是我最終放棄這個設計的原因。

自動創造頁面與組織結構的矛盾

另一個被我拋棄的 Wiki 特徵是,「自動創造頁面」

前面有稍微提到,除了「名稱獨特性」以外,Wiki 系統的另一個特徵是「點連結之後,如果目標頁面不存在,就創造它並開始編輯」

這是個很方便的設計,也沒有什麼明顯的缺點,然而它只適用在無結構的系統裡面--他不能和 LoNote 混用。

想想吧,LoNote 的筆記是依據樹狀結構被組織的。假設使用者點了一個不存在的頁面連結,自動新建立了一個頁面,那麼那個新的頁面,將會被安排在(樹狀結構的)哪裡呢?

當然我也可以設計一個無結構的區域,專門存放這種新建立的頁面,或出在建立頁面的時候跳出對話框讓使用者選擇放置位置,但不管採用哪種策略,這功能的方便性也就消失無蹤了。

「在有結構的系統中,自動創造頁面功能是難以合理被實作的。 」

最後實作

整理了以上內容,最後被我拿來實作 Lowiki 連結的,反而是頁面的 uuid 識別字。

所謂的 uuid,指的是一個「每個筆記不相同,而且也不會改變的識別碼」。因為這個值不會被使用者直接觀察到,唯一的用途就是識別筆記對象,所以也不像筆記名稱一樣有事後修改的必要--而既然不會被修改,以此為基礎的連結,自然也就不會有「更名後造成死鏈」的問題。

使用這種技術實作後,LoNote 依然可以任意更動筆記名稱,也可任意搬動頁面在樹狀結構中的位置,還可以允許多個筆記使用相同而重複的名字--只要當初連向的頁面依舊存在沒被刪除,Lowiki 鏈結就會永遠有效,而且永遠正確地指向原本設定的那一個。

Lowiki 不使用「頁面名稱」作為連結對象,也沒有「點不存在的頁面名稱自動產生新頁面」的特性,嚴格說來已經不算 Wiki 了。我最後還是這樣叫,主要是放在它「容易連結」上面。

建立 Lowiki 連結時非常方便,使用者不需要輸入任何文法,甚至也不需要輸入完整的連結目標名稱。只要選中想建立連結的關鍵字,比方說「魔法」,然後呼叫建立連結的功能(如 Ctrl + L)。系統就會自動比對候選目標,讓使用者決定具體要連到哪一頁去。

我對當前的 Lowiki 基本滿意,但它還是有著固有的缺點,那就是它是一種自訂標準,因此它不會被其他系統所支援。如果是標準控,或許就不會想去使用他。

相關連結

  • Wiki(維基百科介紹)
  • UUID(維基百科介紹)
  • LoNote:某款筆記軟體,本文後半段的主角。
  • KeepNote:這款軟體的 Wiki 連結底層,似乎也是用同樣邏輯做的。供參考。