科普一下GPL和開源軟體

最近關於「自主」的話題很熱,我個人對現在的主流論調不以為然,但也不想糾正他們,策略性的東西,說多錯多,如果你非要問我,我寧願說你該幹嘛幹嘛去,不關你的事,你自己虛心實腹,「智者」才不敢為。

但我想科普一下關於開源的基礎知識,作為真想干點正事的人的參考。

我們先來理解一下到底什麼是GPL開源協議。

GPL是一種版權授權聲明。我們平時看電影,裡面往往會有一個聲明:「版權所有,侵權必究,XXXX有限公司」。什麼是版權呢?它是用來保護知識產權的。比如你寫了一本小說,每本賣100塊錢,這其中,可能有紙的成本,有印刷的成本,有渠道的成本,但那個不值100塊錢,真正值的,是你的「創作」,因為你的勞動,讀者應該給你付錢。

什麼是侵犯版權呢?有個人,買了你一本書,然後拿著這個內容,重新印了1000本,每本50塊錢賣出去,他只付出了紙和渠道的成本,就借你的知識產權獲得利益。這就是侵犯版權。侵犯版權,違反法律,也違反道德,你利用了別人的勞動成果獲得收益,擠佔了人家的收益。

版權是自動擁有的,你寫了一篇日記,作了一首歌曲,演繹了一段(即使是其他人作曲的)鋼琴曲,寫了一段程序,你就自動擁有這個「作品(work)」的版權。大部分國家的版權法(所有加入WTO的國家都必須有類似的版權法),保護期限是100年,如果你的作品經過了修改,新的作品會延長保護期。所以你經常看到軟體代碼的版權聲明中,都這樣寫:

Copyright 2000-2018 by XXX Ltd. All Rights Reserved

這就是說,這個作品第一次創作是2000年,2018年經過了修改,版權屬於XXX公司,保留所有權利(比如署名權,收益權,不被修改的權利等)。如果你要使用這個作品,你需要取的版權擁有者的認可,否則你就侵犯了這個公司的權利。

這樣,這個作品在應用到特定國家的法律的時候,都可以從這個聲明上來進行計算。國內不少程序員能寫出Copyright 2000-2050這樣的聲明,這屬於完全不知道版權聲明是什麼的。

專利也是一種知識產權,但它和版權是不同的,專利是一種方法(或者用特定方法設計的裝置和改進),或者說是一組方法的特徵。比如我的程序使用了特定的演算法獲得一組數據的特徵,從而優化了cache的預期效果,這就可以申請為一種「專利」。專利是一組特徵,而版權是一個「實現」;專利需要申請,版權不需要;專利申請後需要每年付錢來維持,版權也不需要;專利如果被人證明,在你提出前,已經有人公開類似的方法了,就會失效,版權沒有這個問題;專利的保護年限很短(很多國家只有20年左右),版權則長得多;等等。

對此,讀者可以先Keep in mind,我們後面談GPL的具體問題的時候會涉及到。

GPL又稱為Copyleft,這是一種英語的調侃,因為Copyright的那個right,有多個含義。用作copyright的時候,right是權利的意思,但它同時還是「右邊」的意思。所以叫它Copyleft,表示這是和Copyright是走另一邊的。

但Copyleft確確切切是一種Copyright!

如果有人寫了一個代碼,他自動就擁有這個代碼的Copyright了,但他說,我希望更多人來使用它,你們不用跟我協商了,直接用就好了。這不表示他放棄了這個作品的版權,這只是說,他做了授權,授權你使用這個作品而已。有時我們看到,一個作品可以是雙授權的,比如一方面是GPL的,同時又是商業授權的,這一點問題沒有。因為作品的創作人擁有對自己作品做任何授權的權利。

GPL授權對被授權者是有要求的,它重點強調:

第一,和大部分開源軟體一樣,這個作品提供給你AS IT IS,作者不為任何物理損失負責。這個是開源授權的一個優勢。作者可以少負責很多東西。所以,其實如果你給別人提供一個作品,而且不想負責任,簡單使用一個開源授權協議,可以保護你自己的。對公司來說,這背後還有很多遊戲可以玩,但那個屬於商業機密,我就不在這裡說了。

第二,如果你,基於這個作品衍生了新的作品,那麼這個新的「作品」,必須符合GPL協議,否則你就失去原作品的授權。

第三,符合GPL協議的作品,在提供給它的使用者的時候,必須同時提供該作品的GPL部分的源代碼。不能對該源源代碼的使用作出限定。

這第二點是最難解釋的,也是現在大量誤解的原因。

首先,這個授權沒有說明新的作品是否免費,你願意賣多少錢其實都是可以的。但根據第三條,無論你多少錢賣出去,你的用戶應該拿到這個產品的源代碼。至於用戶是否非要這個源代碼,其實這個是兩者之間可以協商的,其他人管不著。所以你現在看到的GPL侵權例子大部分都在消費者市場,因為消費者市場的用戶無數,你沒有辦法協商,而且你不能在銷售條款中要求消費者接受不找你要源代碼,否則你就侵犯了被你衍生的原作品的版權。一旦你侵犯了原作品的版權,原版權擁有者就可以用「侵犯版權」來告你,這在西方國家,下場就是罰款和禁售,這個對商業公司來說,常常是致命的。

我還看過案例,即使不是原版權擁有者也可以用「侵犯版權」來告倒侵權者。這相當於「我在路上看到別人偷東西,雖然不是偷我,我也可以告他」。但不是每個國家都支持這種方式。

所以,GPL主張的是「讓產品的使用者真正擁有對產品的控制權」,而不是主張「共產主義,代碼屬於所有人」。GPL並不要求免費,也不要求別人代碼開源,他只是要求你保證:你把產品傳遞給用戶了,用戶應該真正擁有這個產品,也就是說,他必須有能力修改它,所以你必須提供源代碼給這個用戶,這還不僅僅要求代碼,你還應該保證這個代碼的GPL部分可以被修改後重建,所以,你還需要提供Makefile,可獲取的編譯器等輔助設施,否則都可以視為侵權的。

更重要的是,這個用戶基於GPL拿到一個代碼後,如何處置這個代碼,提供者無權干涉。

這個在細節上也會引起很多問題,比如硬體只能運行簽過名的二進位,那麼為了滿足這個要求,就會要求提供簽名的密鑰,但一個商業公司,怎麼可以給你提供它簽名的密鑰呢?這個是對用戶的不負責任,GPLv3的很多問題,都是從這裡來的。

接著我們來討論一下什麼是「共同作品」。GPL的說法是:如果你的代碼和GPL的代碼構成「共同作品」,那麼你的代碼也必須是GPL的。但什麼叫共同作品呢?這就看個人看法了……

從廣義的「作品」的角度來說,兩個東西關聯很多,我們就認為它們構成「共同作品」,但多少關聯叫「很多」關聯呢?這個說不清楚的,這完全看法庭怎麼判。有人簡單說,如果兩個程序在同一個地址空間內,就構成共同作品了。

但如果我把Linux運行在nommu模式,豈不是所有代碼必須是GPL版權的?(實際上一個Linux發行版裡面有很多軟體都不是GPL的)。還有,如果我用一個開源的庫,我把它放在一個獨立的MMU空間里,然後每次調用的時候都切換一下頁表,這難道就應該認為這不是「共同作品」?這其實不符合我們一般對「一個獨立著作」的認識的。所以,法庭並不使用簡單的「是否同一個地址空間」這樣的邏輯來判斷「共同作品」的。但確實,如果程序在兩個進程中,我們一般認為他們是兩個作品。但如果你惡意地靠地址空間把兩個程序隔開,實現所謂的「GPL隔離」,那麼法庭很可能不會接受你的「兩個作品」的辯護的。

有些公司,還曾經用過這樣一個手段:他們把一個不開源的代碼用二進位提供,提供給用戶,在用戶的系統上把這個二進位和一些其他簡單的源代碼一同編譯,建立和Linux內核的「關聯」,讓用戶自己插入到Linux內核中。這樣,理論上,他們並沒有建立和Linux內核的關聯,所以沒有義務向用戶提供源代碼,而用戶建立了這個關聯,所以用戶的代碼應該是GPL的,但因為用戶沒有向第三方提供這個「產品」,所以用戶沒有向任何人開源的義務。

這種小聰明用過很多年,現在怎麼樣了我不知道,但它帶來多少問題我是知道的:),無論如何吧,從這個例子,我們可以更深入了解GPL的版權保護是如何實現的。

其實,很多商業公司也是身不由己的。比如你做了一個解決方案,當初不流行開源的時候,他們沒有考慮更多的問題,很多軟體是來自第三方的,他們取得了第三方的版權授權,加入到自己的產品中。但現在你給他說要開源,原來的授權怎麼辦?就算有心去要那家公司的授權,人家在不在都不一定啊。

還有一個問題就是專利了。我版權給你可以,但專利怎麼說?專利給你嗎?這專利也不一定是我的呀,是我的一個兄弟公司的怎麼辦?所以,GPLv2是不討論這個問題的,用戶自己看著辦。v3想討論這個問題,所以也有很多的分歧,現在都沒有吵清楚。從用戶的角度來說——我要不要擔心我用了你的代碼,以為占點什麼便宜,結果等我做大了,你跑來找我要「專利費」?

這背後也有很多的技巧。

所以,我常常說,不要用情懷來說話,做事你才能體會細節。站隊,激情,什麼屁用沒有,只是當「智者」的棋子。

最後,我們來談談開源軟體的盈利模式,以便讀者更容易理解這裡面的細節。

比如你做一個Linux發行版,賣給某個客戶,你每個實例可以賣1萬塊錢,但你必須同時提供所有GPL軟體的源代碼。這樣,用戶確實是可以這樣的:買你一個版本,然後重新編譯100份,用於自己的內部網路,這樣,用戶用了100分拷貝,只給了一份的錢,而且用戶還可以接著把這個產品重新賣出去,收5000塊錢。這一點問題沒有,因為GPL協議說了,你無權阻止用戶如何使用這個源代碼。

但是,我可能每個星期都會出補丁,你能夠一次次這樣升級嗎?而且你只買了了一個拷貝,你內部拷貝的其他版本出了問題,我可是不負責的。你願意這樣做嗎?——實際上很多人是不願意的,比如大部分的銀行,礦山等企業。這樣Linux發行版提供的就不是「版權授權」了,而是「Subscription」,我賣你的重點不是那個軟體,而是基於這個軟體為你提供的服務(這就叫「軟體即服務」)。這種模式現在這個階段養活幾家大發行版,卻無法在數據中心市場實現開拓,因為這些市場都是買一個版本(甚至不買,某些開發者已經幹這種事情了),然後自己維護的主。但其實這個到最後也是個博弈的關係,如果發行版發展不下去了,原來他們負責的那些特性,就沒有發展了,這時這個鍋會重新燒到雲運營商頭上。所以國外的運營商對這些發行版提供商還是客客氣氣的,就國內某些運營商反而傲慢得莫名其妙。等真得打到白熱化的時候,你們就知道問題出在哪裡了。

其實,真正領頭的Linux發行版提供商對此是表現得很大度的,他們明確說你可以這樣做,但有一點,你不能使用人家的商標,人家的代碼是授權給你的,你要用這個代碼人家不會攔你,但你不能使用人家的商標(這又是一個知識產權問題了),不能聲稱:我這個其實就是XXXX了。這樣你就侵犯別人的商標權了。

這是一種模式,其實還有另一種模式,我們知道有些商業發行版是完全免費的,不對客戶服務收錢,這種發行版的盈利模式是從硬體提供商哪裡收錢:我擁有一大堆的客戶,他們的業務建立在我的發行版上,所以你要我的版本支持你的硬體嗎?給錢啊。這又是一種思路,比如某「標準AI計算平台」,就是這樣取得競爭優勢的。

好了,我們建立了一個基本的模型脈絡,讓讀者大概理解開源是什麼樣的,被什麼樣的法律和現實力量左右著。我們現在可以進入主題,來討論什麼是開源,和為什麼要開源了。

最近很多人談「自主」,但他們常常把「自主」當作一個名了,似乎「我做的」才是「自主」,使用「開源軟體」,不叫「自主」。這和我以前談《道德經》中常舉的「失敗的架構師」例子如出一轍:某個系統應該使用方案A,工程師t提出來了,架構師會很不爽:這個名怎麼讓你佔了?我要千方百計證明「A」是不好的,寧願用一個更差一點的「B」方案來解決這個問題。

這明顯是「求名」,對不對?

還有「求禮」的:t,你這麼厲害,我看來需要退位了,你上,我冰清玉潔,不能把你的名給遮蓋了,閃耀吧,t君!

他媽的還是求名,換個形式而已。

如果你理解開源協議,你就應該明白,一旦一個作品被授權出來了,本來人家就給你授權了,你要求名不用它?然後把這些事情重新做一遍?這是求名求到根子上了,怎麼說你好?你遲早變成污泥拿來填池塘。

所以,你用不用一個開源作品,不是因為它是不是開源的,不是因為它是不是簽著你的名字,不是因為它是不是簽著中國人的名字,而是它是否符合你的要求!

好了,這裡涉及我要討論的核心了:國內大部分公司,都不具備主線維護能力。開源最早的時候,也許是因為一些個人的情懷和期望。但到今天,它早就不是了,開源是保證構架演進的關鍵手段。

你們可以看看我這裡寫的一個設計討論:

in nek:Progress and confusion of the IOMMU name space?

zhuanlan.zhihu.com圖標

這是我們要給我們的加速器做一個統一的軟體引擎,我已經寫好這個代碼很久了,也在實際的產品中使用了,但我仍需要這樣公開表達出來,因為在我寫我的引擎的時候,其他公司也在做他們的加速引擎,做IOMMU構架定義的公司在修改iommu框架,做GPU的公司在加mdev,做網卡的公司在用這個東西取代DPDK的全用戶態驅動。我確實可以保證我自己的應用場景,但當我的場景向下展開的時候,他們面對的困難,我同樣需要面對。我提早和他們對齊,我做錯的可能性就低得多。因為我個人面對的世界太小了。

實際情形是,我寫完,拿出來討論,就馬上收到反饋——有人面對的場景不是這樣的。他們會利用我的「設計」,但同時他們有他們的考量,我的設計會在這一次次的沖刷中逐漸逼近那個可以生存下去的「道」,這裡沒有任何道理,只是你有你的要求,我有我的要求,我們形成一個更貼近現實的合作模式而已。

在你看到我這個文檔的時候,那個文檔更新過5個版本了,幾乎每個版本都是完全重寫的。

這就叫架構引導。它的目的就是讓每個增加的代碼都是夯實的,不會向下增加代碼的時候,很多邏輯之間就互相衝突了。

當你進行架構引導的時候,你需要考量的是未來怎麼活下去,而不是眼前怎麼實現功能。很多人想不明白為什麼國內做不出操作系統,我看過很多人的策略,他們不可能成功的。因為我們大部分開發組織還處於「求名」的階段。構架是沒有立即的收益的,是沒有名的,它是走一條沒有立即收益的道路,期望可以「活下去」,「活的更久」。

我們很多組織,使用Linux,使用OpenStack,覺得自己也是「做開源的」,「懂開源的」,「為開源做貢獻的」,但他們沒有真正懂過開源,所以他們糾纏於「我有情懷,我有責任」,或者「這些人就知道情懷,不知道公司運營」,看來針鋒相對,各有觀點,其實統統失道。根本就沒有搞清楚開源的目的是什麼。

我們不少人醉心於拿到一個開源的版本,然後針對自己的場景進行優化,覺得「我做得比開源好,他們根本就不懂」,卻不知道自己其實是在消耗構架——是因為有開源在前面穩住了一個架構,才有你現在消耗的機會。你把這個作為你牛逼的原因?——現在你是否明白為什麼你總是使用別人的架子?

所以,很多人擔心比如Android的代碼不能用了怎麼辦。這根本就不是這麼個問題,開源的代碼沒有什麼特別,開給你了,你隨時就可以拿來用。關鍵在於,你如果要開始獨立為這個架子的發展負責了,以你這種求禮的心態,你是不是可以穩得住這個架子?

所以,不要老想著要怎麼努力獲得競爭優勢了,你求「競爭優勢」這個名,你就不會有競爭優勢,做好你本來應該做的。如果你真要做長遠投資,找些不那麼求名的人來運作……

而國內不少發行版,把代碼唔得死死的,以為是「核心競爭力」,其實門都沒有入,這種關起門來自High還差不多,拿去競爭?——市場不相信眼淚。

其實這個和開源沒有什麼關係,只是「架構版本」,現在的最優實踐,是開源版本。但不表示你開源了,你就能撐得住這個架構,也不表示你不開源,你就能撐得住這個架構。但開源,是我們最容易理解這個「架構版本」是怎麼回事的一個實例。


推薦閱讀:

HttpRunner 通過 skip 機制實現對測試用例的分組執行控制
優質的 Vue 開源項目 - 收藏集 - 掘金
作為技術開發,我們真的要自己造輪子嗎?開源的目的是為了什麼?
neofetch常用的配置文件
怎樣參與到全世界優秀的開源項目中?

TAG:開源 | 開源項目 |