GNU 軟體開發如何在經濟上維持下去?
如果這個問題超出主題,我深表歉意,但它同時是一個經濟和程式問題。如果它應該去另一個 SE 社區,請指出我。
從理論上講,GNU 軟體完全是由志願者在空閒時間開發的,或者由自願資助程序員開發 GNU 軟體的公司(通過使用他們活動的另一部門的收入)開發。
我了解它如何完美地適用於小型項目,可以由一個人在幾個下雨的周末完成(例如數獨遊戲),因為畢竟電腦程式是一種非常有趣和有益的愛好,我看到人們在空閒時間開發中小型程序並將其分享給全世界,我對此毫無疑問。
問題在於,由於以下原因,這對於大型程序的擴展性極差:
- 儘管程式很有趣,但隨著必須實現的項目變得越來越大,實現所需功能所需的時間會增長得非常快。一個更大規模的程序需要大量的時間來開發,例如,一個人可能很容易花費 15 年的空閒時間和休假時間來編寫一個作業系統,而當他的軟體發佈時,它會完全過時.
- 由於其他人以與您不同的方式編寫程序,因此閱讀和理解他人的程式碼需要花費大量時間,在大多數情況下與從頭開始編寫自己的程式碼一樣多。正如 GNU 哲學所鼓勵的那樣,修改他人的程式碼並嘗試改進它幾乎與使用您想要添加的功能開發您自己的上述程序的複製一樣耗時。
- 一旦 2 人或更多人必須合作開發一個更大的程序,這就會產生許多在單一開發人員項目中永遠不會出現的決策問題。結果是,例如,如果一組 2 位程序員合作完成一個單人需要 10 年才能完成的項目,他們不會在 5 年內完成,但可能在 8 年內完成。
- 如果為同一個項目合作的人只在網際網路上見面,項目中的一個成員很容易突然消失(或者是因為他失去了興趣,或者因為他身體上不能再上網了),從而使合作變得平淡無奇。更難
因此,雖然我完全理解如何使用 GNU 思維方式開發簡單的程序,但我絕對不知道如何在這種模型上實現諸如 GNU/Linux 或 gcc 之類的巨大程序。gcc 大約有 700 萬行程式碼。我知道程式碼行沒有多大意義,因為在項目的後期階段,效率更高的程序員才是真正刪除程式碼行(簡化和/或優化項目)的程序員,但這讓我們無法理解一個項目 gcc 是。
所以理論上任何人都可以在空閒時間自由修改gcc,但實際上呢?它是由非常專業的人開發的,作為一種工作,而不是一種愛好。任何將編譯器作為愛好的人最終都會放棄,因為成本/收益不值得:
- 開發大型程序是一個長期的大型項目,他們寧願利用空閒時間進行其他短期內更有價值或更有趣的活動
- 如果他們無論如何要開發一個大型程序,他們寧願為一家願意為他們付費的公司做這件事,而不是免費做
從長遠來看,為了讓人們對開發 GNU/Linux、gcc 或 Open Office 等程序感興趣,這應該是有益的。所以我的問題是:為什麼有人為大型 GNU 項目做貢獻,如果他們沒有得到薪水呢?
首先我想說我不是程序員,我從來沒有為任何開源項目做過貢獻。但是,我對開源的興趣由來已久,並且我相信我了解開源的一般概念以及它是如何工作的。
首先,我想說開源並不意味著你不能在軟體上賺錢。這只是意味著程式碼必須是公開的。Red Hat 和 Canonical 等公司不是通過銷售軟體賺錢,而是通過銷售他們的專業知識。如果我不想讓我的公司執行 Linux 伺服器,我可以免費獲得該軟體。但我需要有人來安裝、設置並提供支持。這就是來自紅帽的專家進入並賺錢的地方。對於公司來說,這是有道理的,因為聘請他們自己的專家可能會更昂貴。這也激勵了這些公司貢獻程式碼。他們希望他們的產品是好的,所以人們會使用它並通過他們的服務。
但是,讓我們談談您關於可擴展性的觀點。
- 開源最酷的一點是你不必從頭開始開發所有東西。像 Ubuntu 這樣的作業系統不是由一個人建構的。相反,很多人為系統的不同部分做出了貢獻(實際上,我認為很難找到一個擁有所有技能的人來製作有效的作業系統)。例如,Ubuntu 人不開發 Linux 核心。他們只使用其他人開發的一種。所以沒有開源的東西可能是不可能的,現在是可能的,因為你可以建立在其他人的工作之上。
- 閱讀和理解其他人的程式碼並不比編寫自己的程式碼更耗時。至少在很多情況下不會。除此之外,您不必了解您使用的所有程式碼。如果我想為 Linux 編寫一個程序,我不必詳細了解該程序中的所有部分是如何工作的。我只需要知道他們在做什麼。然後我可以把這些部分和其他部分放在一起來創建我的程序。或者,我可以採用現有程序並根據需要對其進行修改。
- 像 git 和 github 這樣的工具使協作變得異常容易。您只需獲取程式碼並進行修改。然後,您將它們送出給項目負責人。如果好的話,就會被採納。
- 人們總是在項目中進進出出。但是,如果該項目很受歡迎,那麼將有足夠的工作量。
以下是開源工作的一些原因。
- 我認為開源軟體變得如此出色的主要原因是大量從事該項目的人,確保了我很難在一小群開發人員中存檔的專業水平。雖然看起來很奇怪,但這一事實似乎超過了開源中可能出現的所有負面問題。
- 在商業節目中,該項目與公司一起死亡。假設您使用了一家公司的一些軟體,然後該公司就關閉了。然後你搞砸了,因為你不會收到更新和錯誤修復,你需要通過新軟體來跟上。使用開源,您可以找到另一家公司來支持您的軟體或自己開發它。
如果你仍然感興趣,我建議你閱讀大教堂和集市
開源軟體開發有多種原因,但人們普遍誤解它主要由業餘愛好者或專業人士完成,但作為一個副項目。我一般來說是針對開源回答這個問題,而不是特別針對 GNU 許可的軟體。但我的回答是包容性的。
假設我是一名軟體開發人員(我是),並且我正在從事一個複雜的軟體項目(我是)。良好的架構將問題分解為獨立的部分,隨著開發的進行,開發人員通常會認識到他們需要的部分是許多問題共有的部分。以下是一些典型的前進道路:
- 他們自己開發這件作品,它成為公司的財產。或者他們從另一家公司購買閉源解決方案。
- 他們找到了一個解決這個問題的開源項目,它非常適合併且許可證也合適。他們只是將其合併到他們的項目中,這可能需要也可能不需要開源,具體取決於許可證及其使用方式。他們不回饋項目。
- 他們找到了一個幾乎可以解決這個問題但有缺陷或不足的開源項目。他們對此進行了改進,並且可能會將這些改進貢獻回基礎項目。
- 他們沒有找到足夠喜歡的東西,所以他們開始了自己的項目並決定將其開源。
2-4 的優點是更多的人最終為項目的設計和程式碼做出貢獻,並且它進入了一種生態系統,在這個生態系統中,強大的想法可以生存(如果你願意的話,可以通過繁殖)而弱的想法則不能。錯誤修復和功能添加成為社區的努力。在場景 #2 和 3 中,採用該項目的開發人員受益於完善的工程原理和成熟的程式碼。3和4是相關的。在場景#4 中,當其他人採用和改程序式碼並回饋時,開發人員會受益(#3)。回饋項目是有利的,這樣您的改進就會隨著其他修復和改進而得到鞏固,您將繼續從中受益。根據我的經驗,所有這些情況都很常見。
在我目前的軟體項目中,我是大約 12 名開發人員之一,並且在一個系統上工作了大約兩年。我們已經合併了大約 5,000 個開源項目!我們只產生了幾個新的 FOSS 項目,並且貢獻了大約六個。在這種情況下,我們並不是特別好的公民(其他公司要好得多),但這向您展示了這一切是如何運作的。即使在小型項目中,來自開源的貢獻也很容易達到數十或數百個。如果我們不使用任何開源軟體,開發成本將膨脹 100-10,000 倍。
可伸縮性的發生是由於設計的模組化以及通過這種適者生存的過程,程式碼可以被重構、分叉等等。可生存性通常比專有替代品更好,因為即使不再維護程式碼,它仍然存在,其他發現其中價值的人可以維護他們自己的分支。公司來來去去,員工被雇用和離職的速度更快。如果您添加了一個您沒有原始碼或只有一個小型內部團隊需要維護的軟體依賴項,那麼您將面臨巨大的風險。Linux 核心、gcc、Android 等大型項目通常有大量公司積極參與。
編寫好的和正確的程式碼比閱讀它更容易(在大多數情況下),這是不正確的。即使您進行修改,您也不必閱讀您正在使用的所有軟體。您必須深入研究其中的各個部分並閱讀很多內容,但不是全部。我可以在這裡說更多關於單元測試的內容,但為簡潔起見將省略。
大多數開源軟體不是由人們在空閒時間開發的。這種做法非常有益,以至於它在沒有優化市場的情況下也能發揮作用。我個人懷疑某種以市場為導向的方法會大有幫助,但我不知道這種方法會是什麼樣子。人們認為存在一個以聲譽為貨幣的市場,但我認為這不是一個準確的模型。工作中的一種貨幣是採用新軟體所需的時間。您希望找到並使用活躍、簡單、具有良好文件等的東西。因此,就像購物者一樣,您正在尋找投入最少時間的最優質產品。