开源软件和开源社区的反思
蔡維德 李 磊
北京航空航天大學
引言
當前,許多新型技術憑借開源方式推廣。開源 軟件的發展由來已久,目前已有數以萬計的開源社 區和模型。由于開源軟件存在局限性,近來學術界 開始對開源軟件和社區的發展進行反思,認為 :開 源軟件的使用比開發更重要 ;要重視發展開源軟件 工程技術 ;在大數據和云平臺的環境下,應該建立 新的軟件工程,包括軟件的需求、設計、測試、整合、 部署和監測。
開源軟件和開源社區的發展
一個流行的開源軟件擁有一群高效率的開發者和數量龐大的用戶群,在通常情況下,用戶無須 支付費用。這些“免費”的開源軟件往往由拿著高 薪的工程師完成。為什么這些工程師愿意無償從事 開發?以Linux為例,以前很多人雖然反感微軟的 Windows系統,但由于沒有其他操作系統,只能選 擇Windows。當Linux系統開源項目一出現,許多 軟件開發組織自愿加入進來。再如,OpenStack的 開發也是如此,許多公司愿意付薪水給員工,并將 其組成團隊進行開發,期望OpenStack能取代市場 的主導產品。如果市場上出現了能夠主宰市場的產 品,而其他公司卻沒有足夠的資源能在短時間內開 發出自己的產品與其競爭,這些公司就會結成聯盟 使用開源軟件開發來改變競爭態勢。安卓系統也存 在同樣的情形。該系統一直在利用開源軟件系統與
其競爭對手蘋果iOS系統對抗。 由于每個參與開發的組織都有自己的管理方 式、企業文化及軟件開發流程,因此他們只能以開 源的方式合作,通過社區交換代碼進行交流。這是 開源軟件和開源社區的驅動力。 比爾·蓋茨說過: “市場占有率是最重要的”[1]。 一旦占領市場,以后開發出來的軟件就不得不依靠 之前擁有市場主導地位的軟件,所以軟件公司以占 領市場為首要任務。由于人們可以免費或低價獲取 開源軟件,所以開源成為占領市場的利器。 從許多開源軟件的事例可以發現以下幾個事實:
1. 雖然大多數開源項目沒有成功,但是成功的 開源軟件占據了絕大多數市場份額,例如Hadoop、 Linux、Spark和OpenStack。
2. 成功的開源軟件大多是被“贊助”的(意指 多個公司結成聯盟進行軟件開發),而“獨立”的 開源項目則大多失敗。
3. 成功的開源項目也可能走向失敗,其原因有: 出現了新一代產品,開源軟件領導核心離開以及企 業改變了經營策略等。
4. 許多新的軟件技術也經常使用開源軟件來進 行推廣。例如作為當前金融學領域炙手可熱的區塊 鏈技術 [2]。 “開源社區”的核心是“開源”,社區是“果”, 而不是“因”。“贊助”往往是“因”,有了大量的贊助, 才有了大量的開發人員。此外,社區這個“果”并 不意味著其相應的軟件已經成為“產品”。軟件產 品和項目是不同的,一個軟件成為產品要花費大量的工程與測試。所以如果有人認為軟件放在開源社 區開發,就會有工程師免費參與,那是不切實際的。如果沒有贊助,相信大多數工程師都沒有興趣來開 發,愿意無償開發的工程師畢竟是少數。
斯蒂芬·瓦利斯(Stephen Wallis)在其著作中提 到了開源社區和顧客的不同 :社區是一群開發者, 對軟件有興趣,有大量的時間卻缺乏資金 ;顧客正 好相反,沒有時間但有錢。在一個社區里,開發者 也可能是顧客,但不是每一個開發者都是顧客,也 不是每一個顧客都是開發者。社區活動的要素包括 :社區辨識與認同 (identify community)、社區的 使命(mission)、平臺工具、參與機制(architecture of participation)、行為準則、知識產權和治理結構等。 開源社區需要顧客發現軟件和使用軟件,培訓 顧客使其了解軟件并產生購買欲望。開源社區與顧 客的關系如圖1所示。
成功的開源社區形成的模式通常經歷以下過程 :
1. 項目開始于一些開發者對問題的討論 ;
2. 開發者討論要發展的項目 ;
3. 把軟件放在開源社 區,讓其他的開發者共同參與 ;
4. 建立說明文檔及 FAQ1,讓眾人參與討論 ;
5. 建立一個非盈利的基金會。基金組織確認知識產權管理的制度,使投資人從上述生態系統中獲益。
開源軟件的開發和應用
開源軟件技術分為軟件“開發”及“應用和采 購(adoption and acquisition)”兩部分。人們往往談 論軟件開發多一些,但是,通過了解美國國防部對 開源軟件的方針就會發現,他們更重視“采購”和 “使用”[3]。早期美國卡內基梅隆大學軟件工程研 究所(SEI2)曾提出軟件能力成熟度模型(Capability Maturity Model, CMM)理論,其重點是“軟件的開 發遵循著一定的流程”,流程在一定程度上保障了軟 件的開發質量。這在過去是正確的,但后來美國國 防部的軟件開發項目幾乎全部采用了外包策略,這 才有了軟件采購技術的研究。采購技術是一種關于 設計軟件需求以及驗證外包商開發的軟件是否能夠 被采納的新興技術。 “采購”與“開發”技術有所關聯。“開發”是 源于“生產者”的觀點,目的是用最高效的方法研 發軟件; “采購”是源于“消費者”的觀點,目的是 用最低的費用來快速地得到和使用有質量的軟件。 例如,生產者(工程師)關注設計和制造軟件,消 費者(用戶)則更關注軟件的質量、維護以及使用。 采購技術是為了收集、批準和使用軟件。對于 那些有開發進度數據的軟件系統,采購者需要檢驗 開發進度中的數據,以判定開發者或者項目管理者 是否存在欺騙。如果已經偏離了規定的進度,或者 明顯落后于計劃,管理者就可以采取措施來改正或 取消項目。 如果沒有可利用的進度數據,則采購者需要檢 驗產品來判斷軟件質量。因此,采購者關注的是測 試和評價數據,根據需要獲取足夠的此類數據,來 確保系統符合質量標準、安全性和可靠性標準。這 項工作通常包含端對端測試和集成檢測 [4]。采購者 還需要確保所需的項目能夠集成到現有系統中。因此,采購技術包括計劃、承包、進度管理(包括規范、 控制、跟蹤和審計) 、測試和評價以及最終政策和 指向。 在開源軟件時代,采購的一個重要目標是創造 可信賴的軟件庫,庫中只存有通過嚴格測試和用戶 驗證的軟件。雖然國內外的開源社區非常多,也提 供了大量的開源軟件,但只有極少數的開源軟件能 通過嚴格的測試而放在可信賴的軟件庫中 [5]。美國 國防部開發Forge.mil社區就采取了這個策略。 表1比較了開源軟件的 “開發” 與 “應用和采購”。
應用社區的探索
Forge.mil社區
Forge.mil與軟件開發社區有許多不同,主要有 以下幾個特點 [6] : (1)需要用戶提前、持續地參與系 統開發 ; (2)軟件開發者必須經常發布不同版本的軟 件 ; (3)所提交的軟件必須可以持續升級 ; (4)開發 者必須使用一種可模塊化、開放的流程。社區包括 軟件庫、協作開發/測試的環境、軟件過程管理與 方法、軟件工具與資源這四個部分。 其軟件開發的方法是敏捷開發方式加上開源 軟件。要實現這個方法不僅需要社區有許多的開源軟件,還需要對這些開源軟件的使用提供大量的支 持,包括傳統的軟件開發工具、社交網絡以及大數 據。可以利用大數據方法搜集每個開源軟件的元數 據,并利用云計算上面的快速運算來幫助搜尋開源 軟件。開源軟件元數據是SEI所做的工作 [7],正是 得益于他們的軟件支持以及云計算平臺的聯合,才 有了持續集成 (continuous integration)、持續測試 (continuous testing)以及持續部署(continuous deployment)等技術。
其他軟件社區
其他具有代表性的開源軟件社區有Black Duck (黑鴨軟件)、Stackoverflow以及CSDN(中國程序 員大本營)。Black Duck是開源代碼審計和管理領域 的領導者,軟件包含Protex、Codecenter和Export 三個工具。Protex用于代碼掃描,可以幫助用戶發 現自己的源代碼中是否含有開源軟件代碼,如果有, 則幫助用戶判斷其是否有觸犯開源軟件知識產權法 律的風險。Codecenter是幫助用戶在軟件開發生命 周期中管理和有效使用開源代碼的工具。Export能 夠幫助用戶發現源代碼中是否含有加密算法等。
Stackoverflow是一個與程序相關的技術問答網 站。用戶可以在網站免費提交問題,瀏覽問題,檢索相關內容。
CSDN創立于1999年,目前是中國最大的信息 技術社區和服務平臺,為信息技術從業者提供服務。
開源軟件工程教育
開源軟件改變了軟件工程。當前由于人們已擁 有大量的開源軟件,并可以利用一些方法搜尋元數 據,再加上能夠獲得持續集成、持續測試、持續部 署等工具的支持,使得軟件開發模型開始發生根本 的改變。例如,軟件需求被改變。在傳統的需求中, 不論是瀑布模型或是敏捷模型,都需要先與顧客討 論需求細節。而在開源軟件的環境下,則是先查看 相關的開源軟件,再了解開源軟件的需求,這是因 為很多開源軟件已經包含80%的新軟件需求。在此情形下,可以把開源軟件的需求當作新軟件需求的初稿。同樣,設計軟件的時候,不是先設計軟件,而是先在開源社區里查看是否有可重用的設計。同理,開源軟件程序代碼以及測試方法也可以重用。
本文第一作者在美國從事軟件工程教育多年, 最近開始用開源軟件進行軟件工程方面的教學。起 初,對學生的要求是可以在開源軟件或傳統方法進 行軟件開發之間進行選擇,結果許多學生選擇了傳 統方法,而不愿意使用開源軟件,原因是害怕或者 不愿意花時間去學習開源軟件,而且教科書上也沒 有開源軟件的使用方法。所以在授課的第二年,筆 者強制要求學生必須使用開源軟件。由于項目較大, 開源軟件的利用使得開發時間較之前縮短了許多, 取得了不錯的效果。如果項目不采用開源軟件,則 幾乎不可能完成任務。作為額外的要求,學生還需 要做三個星期的測試。結果大部分學生既完成了代 碼,也完成了測試。他們的軟件還具有不同環境下 的可擴展性(scalability)。在互聯網以及大數據的環 境下,若軟件沒有可擴展性,則基本上不會有人使用。
在開源的環境下,通常會要求工程師必須在 很短的時間內開發大量的軟件,這在以前被認定 是錯誤的。舊的觀點認為軟件開發必須耗費大量 時間才能保證質量和數量。這是30年前軟件工程 之父布魯克斯(F. Brooks)在其著名的文章《沒有 銀彈》中提出的,其核心思想就是軟件開發非常 復雜,任何宣稱能夠快速發展新軟件的技術都是 荒謬的。這種觀念今天仍然正確。但開源軟件重 點不是在于“創造”新軟件,而是“重復利用” 已被開發過的軟件。因為有大量的開源軟件,所 以重復利用、集成大量的軟件比重新開發軟件效 率要高得多。表2是傳統與現代兩種軟件開發思 想的對比。
我們曾經在課堂上講過一個有啟發的軟件開發 實例 : Instagram軟件 [9],它是由3個人在兩年半 的時間內開發出來的,并創造了10億美元的市價。 軟件的92%使用了開源軟件,自行開發的部分只占 8%。他們的原則是: (1)“永遠不重新‘發明’設計 輪子”(do not re-invent the wheel)。即任何已經存在的東西,都不重新開發。如果碰到問題,就先在網 上搜尋看看有沒有解答;如果有就用,如果找不到, 就到社交網絡上詢問那里的大師,大師們通常都樂 意解答。(2)軟件要有可擴展性。他們列舉了軟件開 發過程中的許多重大改變都是為了滿足可擴展性的 要求。(3)注重軟件用戶的體驗。
“開源”的開源軟件工程教育
我們需要一個新的軟件開發環境來開展新的軟 件工程教育。這個開發環境是一個為教育學生而設 計的軟件搜尋工具,能夠搜索開源軟件,支持持續 集成,保證持續測試、持續部署。學生們可以在系 統中自由交談,討論設計和問題。只有通過嚴格測 試和檢驗的軟件才允許被放進來。
我們還需要一個新的開源軟件工程的教材。像 開源軟件一樣,公開的、共享的資源可以充分激勵 人參與,創造價值。因此,我們可以設計“開源”的開源軟件工程教材,任何人都可以參與教材的制 作。孔子曰“三人行必有我師”。在這個大數據、 云計算以及開源軟件的環境中,每一個人都可以當 老師。即使是軟件工程教師也并非對每個軟件都了 解,事實上對于某些軟件,學生可能了解得更多。 所以,那些懂得多的學生可以把知識分享給他人。 這種教育的原則是“人人為我師”。使用開源軟件 案例也要經過評審。由一組專家先把樣本做出來, 他們隨時監督、檢驗所提交的教材,以保證“開源” 教材的質量。因為開源軟件是在不斷進步、可擴展 的,所以軟件工程的材料必須能夠得到持續擴展且 隨時更新。
這種開源軟件的教育方式還可以與國外軟件公 司進行合作,一起開發。此外,中國有大量的軟件 工程師、學生以及開源軟件產品,如果中國師生共 同參與,“開源”的軟件工程教育還能在世界產生 重大的影響。
最近出現了許多新型的教育方式和新學說,例 如慕課(MOOC)、知識地圖(concept map or knowledge map)、在做項目中學習(邊做邊學)、群體學 習(crowd learning)和數字出版(digital publishing)[10]、 小規模在線課程(SPOC)等。這些都可以在開源的 軟件工程教育上使用。在軟件工程教學方面,老師 的課程并非最重要的,學生參與軟件開發才是核心, 學生需要做到以下幾點。
1. 在開源軟件項目上學習(邊做邊學):傳 統的軟件工程是在小項目上做練習學習,這種方式 在現在的環境下需要補充加強。學生們應該在大學 時代就接觸大型的、可擴展的及有質量的開源軟件, 并學習開發高手是如何設計軟件的。雖然不需要初 學的學生就能夠開發開源軟件,但是他們要學會如 何了解、尋找、使用、評估和測試開源軟件。由此 出發再學會開發開源軟件。
2. 在社區中學習(群體學習):在開源的社區 里需要學習如何做一個有所作為的參與者,如何和 其他人一同工作。而且在這個開源的環境中,還會 有許多外國人參加,要學會通過英語進行交流。有 問題不恥下問,向社區里的大師詢問。
3. 自主學習“開源”軟件材料(知識地圖、 慕課、小規模在線課程和維基百科):學生可以自 主選擇某些材料來學習。不過這些材料必須事先以 教學的方式組織起來,以便自學。學生們可以進行 在線討論,聽在線的講座,在博客上交流,學習和 編寫維基百科相關內容。
4. 自主發表學習材料(數字出版):學生在 自主學習后,可以把相關的資料包裝成一個學習模 塊,發表在開源軟件工程教育社區,以便讓其他老 師、學生學習。在這個社區中,允許一個題目上讓 多個團隊發表他們的學習材料,使用者也可以評論 和參與。
5. 在社區發表軟件(數字出版):在開源社區 里發表軟件是學生學習的一個重要的里程碑。學生 甚至可以創立一個新的開源軟件項目。學生不只是 學習軟件開發的方法,更重要的是學習開發有質量 的軟件(邊做邊學)。傳統的軟件工程教給學生各 種技術,例如需求分析、設計模板、編碼標準、測 試腳本以及文檔編寫。但是這些都聚焦在軟件工程 技術而不是在軟件本身。敏捷開發方式創始者的“敏 捷宣言”(Agile Manifesto)[11] 中講到“軟件才是有價 值的,而軟件開發過程、軟件需求、軟件設計都是 創造價值的工具或者過程”。
軟件工程教育的最終目的是讓學生能夠開發有 質量的軟件,而不只是讓他們明白軟件工程技術。 所以,對軟件工程學生的評估不能只看考試成績, 更應該注重學生是否能在社區中開發軟件,能否通 過嚴格的社區測試,以及用戶對他們所開發軟件能 否給予正面的反饋。
結論
大量的開源軟件造福了許多公司,也改變了軟 件工程的發展。雖然開源軟件的發展是市場的自我 選擇,但它也在一定程度上促成了開放、共享的軟 件工程,包括軟件開發、采購和應用。不僅如此, 它還改變了軟件工程教育。這些都必須通過公開的、 分享的且持續不斷的更新來實現。
總結
以上是生活随笔為你收集整理的开源软件和开源社区的反思的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内开源社区有哪些 ?|GitCode
- 下一篇: java返回 0 到 50 随机整数