GNU 與 AI 的重新實作
原文由 Salvatore Sanfilippo 于 發布,訂閱此部落格
「忘記過去的人,注定要重蹈覆轍。」我從來就不太喜歡這句話,而現在 AI 在軟體專案重寫上所引發的種種,正好暴露了這種想法的侷限。許多人正在抗議用 AI 重寫既有專案是否公平。但這些人當中有相當一部分,早在九〇年代就已入行:他們見證了理查·斯托曼及其追隨者在八〇年代發起、延續到九〇年代後期的那場大業的尾聲——為 GNU 計畫重新實作 UNIX 的使用者空間。當年為 GNU 計畫的行動歡呼的同一群人,如今卻反對 AI 重寫(在我看來,當年的歡呼是對的——我自己也曾歡呼)。
斯托曼不僅是個程式設計天才,他也是那種具備跨領域宏觀視野的人,此外他對著作權的細微之處也十分精通。他要求其他程式設計師以特定的方式重新實作 UNIX 的使用者空間。一種能讓每個工具相較於原版都顯得獨特、可辨識的方式。或更快,或功能更豐富,或可寫成腳本;這些特質同時服務於兩個目標:讓 GNU Hurd 變得更好,同時也提供一層對抗訴訟的保護。如果有人主張 GNU 的實作不僅僅是複製概念與行為(這是合法的),而是抄襲了「受保護的表達」(也就是逐字照抄原始碼),那麼這些新增的功能與刻意朝特定設計方向推進的努力,就能提供一個法官也能理解的反駁論點。
他也要求大家永遠只重現行為本身,避免去看真正的實作,而是透過規格文件與工具在現實中實際運作的機制——靠手動執行來測試——來進行。即便如此,公平地說,很可能有不少參與 GNU 計畫的人其實接觸過或取得過 UNIX 的原始碼。
當林納斯重新實作 UNIX、撰寫 Linux 核心時,情況就有些更複雜,多了一層間接關係。他只是以使用者的身分接觸過 UNIX,但顯然並未取得 UNIX 的原始碼。另一方面,他卻大量接觸過 Minix 的原始碼(一套 UNIX 的實作,但採用微核心架構),以及描述該實作的書籍。然而,回過頭來,塔能鮑姆撰寫 Minix 時,本身就是在大量接觸 UNIX 原始碼之後才動手的。所以,SCO(在與 IBM 的訴訟期間)很難主張 Linux 包含了任何受保護的表達。然而,當林納斯以 Minix 為靈感時,他不僅非常熟悉那個本身就是在知曉 UNIX 程式碼的情況下實作出來的東西(Minix),更值得玩味的是,Minix 當時的授權是限制性的,直到 2000 年才成為開放原始碼。即便在這樣的情況下,塔能鮑姆抗議的仍是架構問題(在那場著名的論戰中),而非著作權侵害。因此,我們可以合理推斷,塔能鮑姆認為重寫是公平的,即使林納斯接觸過 Minix(而他自己在寫 Minix 時也遵循過類似的過程)。
著作權法真正的規定
要把這一切放到正確的脈絡中,讓我們拉近來看著作權真正的邊界:法律說你不能抄襲「受保護的表達」。以軟體來說,受保護的表達就是原封不動的程式碼,包含相同的結構、變數、函式、特定事情的確切處理機制,除非它們是眾所周知的演算法(標準的快速排序或二分搜尋就算寫得很相似也不算侵權)。問題在於程式的商業邏輯幾乎逐行完美對應到原始實作時。否則,這種複製就是合法的,也無須遵守原來的授權,只要相當清楚地能看出程式碼雖然在做類似的事,但並非剪下貼上、或機械式地翻譯成另一種語言、或只是做些表面修飾讓它看起來有點不一樣(注意:這正是法院會試圖揪出來的那種惡意手法)。我有種感覺,每個有能力的程式設計師讀到這篇文章,都完全知道什麼是*重新實作*、看起來會是什麼樣子。無可避免會有些相似之處,但程式碼明顯不是抄來的。如果法律框架是這樣,為什麼大家還在意無塵室實作?嗯,現實是:那只是在訴訟發生時的一種最佳化手段,讓你在法庭上更容易勝訴,但就算接觸過某個程式的原始碼,只要這種接觸僅被用來了解其概念與行為,就是沒問題的。此外,我們今天都很高興能擁有 Linux 和 GNU 使用者空間,以及許多循著類似路徑而來的其他開放原始碼專案。我認為規則無論在我們認同其結果時,還是不同意時,都應該一體適用。
AI 登場
所以,重新實作向來都是可行的。現在改變的是,它們變得極其快速又便宜。過去,你得聘請開發者,或是自己要夠熱情、夠投入才會去動手重做一套,因為有商業上的企圖,或是因為你想把它分享給全世界。
現在,你可以啟動一個寫程式的 agent,用兩種方式進行:把實作轉換成規格,然後在全新的對話中要求 agent 重新實作它,並可強加上特定的要求,例如:讓它更快,或讓實作變得極度易於追蹤與理解(這是個讓最終成果與原版相去甚遠的好技巧,畢竟很多程式碼看起來像是為了相反的目標而設計的),或更模組化,或解決原始實作中某個根本性的限制:所有這些提示,都會讓你更容易大幅偏離原始設計。以這種方式使用時,LLM 並不會產出它們過去見過的東西的複製品,但最後你還是可以用 agent 仔細檢查是否有任何侵權之處,若有,就用全新的程式碼替換掉。
另一種看似不那麼嚴謹,但在現實世界中可能非常有效的方法,是直接提供原始碼本身,要求 agent 以完全新穎的方式重新實作,並同時把原始碼既當作規格,又用來刻意讓實作盡可能遠離原始碼本身。最前沿的 LLM 非常有能力,它們甚至可以利用某樣東西來明確地避免抄襲它,並謹慎地嘗試不同的實作途徑。
如果你曾嘗試過上述做法,你就會知道「無壓縮複製」真的只是一種幻覺:agent 會以非常「有機」的方式撰寫軟體,會犯錯,會因為後來才變得明顯的限制而多次改變設計,從一個小東西開始、逐步加入功能,而且在這個本就混亂的過程中,我們經常用提示、暗示、期望大幅引導它們的工作。許多想法既具安慰性又是錯誤的:「無壓縮複製」就是其中之一。但即便如此,現在重寫的過程變得如此簡單,還是讓許多人感到不安。這裡有一個更根本的事實:軟體的本質已經改變;在不同授權下進行的重寫,只是這種本質被永遠改變的一個例子。與其去對抗自動化程式設計的每一個具體表現,我認為更好的做法是建立一個新的心智模型,並去適應它。
超越法律
我認為有組織的社會若能遵守法律就會繁榮,但我不會因為一條規則存在就盲目接受它,我會根據自己的倫理去質疑:正是這樣,個人、社會與法律本身才得以演進。我們必須自問:著作權法在倫理上是正確的嗎?AI 為既有流程帶來的加速,是否從根本上改變了流程本身?
讓軟體得以比大多數其他人類領域更快演進的原因之一,是這個領域較少被專利與各種保護所束縛(而這反過來,很可能是因為軟體周圍存在著一種分享文化)。如果著作權法更嚴格,我們很可能就不會有今天所擁有的一切。保護單一個人與公司的利益,是否比人類文化的整體演進更重要?我不這麼認為,更何況,著作權法是一個共同的競技場:規則對所有人都一樣。此外,說即使採取較寬鬆的做法,軟體至今仍是較容易賺錢的領域之一,一點也不誇張;看起來商業面並未因能夠重新實作而受到衝擊。很可能恰恰相反:想想有多少商業模式是因為開放原始碼軟體堆疊才得以實現(並不是說開放原始碼大多是抄襲,但它確實繼承了許多來自過去系統的概念)。我認為,即使有了 AI,那些根本的張力依然成立。重新實作變得便宜,但這是我們所有人新的競技場,而只是用自動化的方式把東西重做一遍,卻沒有在概念、工程、功能上放入任何新穎的東西,長遠來看價值將很有限。真正重要的會是你創造某樣東西的具體方式:它是否設計良好、有趣好用、有持續維護、有點新意、快速、有文件且實用?更重要的是,這一次力量失衡的方向是正確的:大企業向來有能力投入天文數字的金錢來複製系統,以一種讓使用者無法抗拒的方式提供它們(例如,多年免費,之後再轉換商業模式),並把自己塑造成那些並非真正由它們發明的概念的領導者。現在,小團體的個人也能對大公司的軟體系統做同樣的事:既然合成勞動力對許多人來說更便宜,他們現在就能在概念上競爭。
站在巨人的肩膀上
還有另一個根本的觀念,是我們都需要內化的。軟體是以一種漸進、連續的過程被創造與演進的,每一項新創新都是建立在前人發明之上。我們都很快就建構出某樣東西並認為我們「擁有」它,如果只談到我們親手寫下的那段確切程式碼,這是正確的。但我們是在已經完成的工作與概念之上繼續搭建,而鑑於當今資訊科技的發展,正是奠基於「概念與行為不受著作權保護」這個基本典範,我們需要接受重新實作是一個公平的過程。如果它們不包含任何新意,也許算是偷懶的努力?有可能,但:它們是公平的,沒有人侵犯任何東西。然而,如果我們想成為生態系中良好的公民,在複製某項成果時,就應該試著同時演進它、發明一些新東西:例如為更低的記憶體用量而特化實作,或讓它在特定情境下更有用,或更少錯誤:也就是斯托曼的方式。
以 AI 來說,我們幾乎是集體犯了一個錯誤:孤立地去思考一項科技對軟體與人類究竟是好是壞。AI 能在開放原始碼領域釋放出許多好處。許多充滿熱情的人寫開放原始碼,是因為他們討厭正職工作,想做出自己喜愛的東西,或是因為他們想成為比經濟利益更宏大的事物的一部分。許多開放原始碼軟體要不是在閒暇時間寫成的,就是在人力配置極度受限的情況下完成的,或更糟的,是在出資開發的公司所施加的限制條件下完成的。既然程式碼正一天比一天不如概念重要,開放原始碼可以被 AI 大幅加速。在對的人手上(AI 寫程式並非人人適合,就像好的程式設計與設計並非人人都能做好),週末撥出的四小時將帶來十倍的成果。例如,Linux 的裝置驅動程式可以透過自動反組譯某些專有二進位 blob 來實作。或者,原本只是勉強維持的函式庫,也能轉變成能在更合理的時間內好好維護的專案。
在 AI 出現之前,我們已經見證了軟體的商品化:品質下降、只在乎賺錢、對極簡與資源節約毫不在意:只剩下一堆大多殘破臃腫的東西。硬體效能越強,臃腫就越多,關心就越少。情況本來就已經非常糟糕。AI 會讓它變得更糟,並非顯而易見、也非必然,而重新實作其他軟體系統的能力,正是那幅可能為我們的領域重新帶來一些熱情與理性的更大圖景的一部分。
隨機一篇部落格
留言
登入後參與討論