【編者按】從閉源走向開源,.NET 背後都發生了哪些有趣的故事。本文采訪了 6 位微軟 .NET 團隊成員,分享他們在 GitHub 以及建立 .NET 開源項目的經歷。作者 | Richard Lander
2021-08-04 03:46:44
【編者按】從閉源走向開源,.NET 背後都發生了哪些有趣的故事。本文采訪了 6 位微軟 .NET 團隊成員,分享他們在 GitHub 以及建立 .NET 開源項目的經歷。
當第一次考慮在 GitHub 上共享 .NET Core 時,我們覺得開源是一個富有吸引力且令人興奮的想法。同時,我們很多人都不太瞭解 GitHub,只知道這是一個很大的平臺,至於如何利用這個平臺,我們都有很多疑問。「如果第一天就有人在我們的運行時上建立分叉,該怎麼辦?是不是說我們的項目就完了?」我們知道應該虛心學習開發人員建立的模式,並瞭解他們對我們的期望。話雖如此,我們還是建立了項目和組織,而且項目的發展速度超出了我們的預期。截止到目前,我們已經度過了數個春秋,而且已經擁有了多個版本,而其他的都已成為歷史。這是一段有趣的旅程,我們將與各方工作人員一起分享。
此次,我們將通過談話的形式,與以下幾位 .NET 工程師一起分享他們嘗試 GitHub 以及建立 .NET 開源項目的經歷。
Claire Novotny:.NET 基金會執行董事, .NET 團隊的 PM
Dan Moseley:.NET 庫團隊的項目經理
Immo Landswerth:.NET 團隊的項目經理
Kevin Pilch:ASP.NET Core、Entity Framework 和 Winforms 的工程經理
Matt Mitchell:.NET 工程師
Stephen Toub:.NET 工程師
Immo:現代開發技術棧需要跨平臺。在作業系統和架構不斷變化的大環境中,開源是最具可持續性的、構建一個擁有廣泛支援的技術棧的方式。我們可以通過開源與消費者實時互動,而這從很多方面改變了我們計劃、構建和迭代 .NET 的方式。最後,人們都希望開發技術棧這類的基礎技術能夠在開源許可下開放。
Claire:開源之後,任何人都可以檢視和偵錯用於構建應用程式的運行時,甚至為之做貢獻。以前有些問題對他們來說很重要,但不會被優先考慮,而如今他們可以自行解決這些難題了。開源之後, .NET 項目已不再由微軟一家提供。
Kevin:我認為開源對 .NET很重要,原因如下:
開源語言和運行時的實現很常見,所以如果不開源的話,倒顯得我們格格不入。
.NET 涉及的範圍很廣,儘管我們盡了最大的努力來編寫文件,但還不如讓人們來親眼看一看這些實現,甚至動手偵錯。
我們可以通過開源,與個人和其他公司展開合作,這種合作比在閉源系統上進行的一次性協議更直接。
Stephen:原因有很多,但最讓我心動的是任何人都可以找到對他們很重要的東西,並加以改進。在 .NET Core 出現之前,任何改進請求都要與其他請求一起經過整理和分類後,才會到達合適的微軟工作人員手中,然後再安排開發人員處理改進要求,可能需要經過幾年的時間才能釋出出來。如今,如果有人發現希望修復的問題,他們只需提出 PR,然後經過審查、迭代、合併,通過每晚的構建,第二天就可以上線了。這是一個完全不同的世界。
Dan:開源是實現跨平臺的最佳方式,尤其在面向 Linux 時,開源是最自然的做法。
Matt:我認為,微軟必須通過某種方式表現對開源軟體社群的投入,這一點很重要。我們採用了開源軟體的開發方式,並將開源作為產品的一部分發布出去。如今,開源軟體是整個軟體生態系統的重要組成部分。微軟的參與和回饋也非常重要。
Dan:由於有更多的人關注我們的工作,因此可以幫助我們在產品釋出之前確保產品的正確性。此外,社群的規模意味著其中有許多來自各個領域的專家,其規模遠遠超過了我們的工程團隊,這也可以幫助我們更好地完成工作。
Immo:只有 StephenToub 長期休假就沒問題。
Matt:我們幾乎全部轉移到了GitHub 上。安全補丁的確會先在程式碼庫中構建,但等到程式碼釋出的時候就會合併到開源庫中。除此之外,我們的開發、討論和議題跟蹤幾乎都在 GitHub 上。
Stephen:如今程式碼炸彈已經很罕見了。有時,有一些額外的已有元件會被移動到 dotnet/* 程式碼庫中,但是這種情況很少見。我能想到的過去一年中出現此類情況是一個名叫 System.Speech 的庫。
Kevin:實際上,我認為我有最大的一個程式碼炸彈,因為向 roslyn 項目提交程式碼的第一個人是我(當初我們還沒有使用機器人來完成此類工作)。如今我們的大部分工作都是直接在 GitHub 上進行的,而且你可以看到這個過程是逐步建立的。但也有可能我們決定釋出一些新項目的程式碼,或者在我們決定是否開源之前先在原型上進行試驗。
Dan:我們十分關心公開我們的工作,除了作為一種承諾之外,還能讓更多人關注我們的工作。所以一般來說,開發重大的非公開項目有違於微軟的慣例。
Kevin:在 .NET Core1.0 開發期間,我一直在研究 Roslyn,但讓我們非常高興的一件事是,當 Anders 宣佈編譯器釋出到了 CodePlex 上之後,我們與運維人員一起觀看伺服器上的負載增加狀況。幸運的是,負載一直保持不變,但如果我沒記錯的話,那是他們迄今為止看到過的最高的負載。
Immo:我們創建了一個 .NET 專用賬號(dotnet bot),而且這個賬號還成了第一批程式碼的提交者。我們之所以這樣做,是為了表明所有這些提交都是已有的程式碼,而不是由某個人編寫的。可以想象,第一批提交包含大量的程式碼。時至今日,dotnet bot 收到了大量工作邀請函,因為有人透過 GitHub 的統計資料挖掘到了 dotnet bot。
Stephen:多年前,我在從倫敦起飛的飛機上編寫了一個數獨應用,用於生成遊戲和玩遊戲。這個應用成為了我嘗試新平臺的媒介,最初是在 Windows Forms 上編寫的。後來,我把它移植到了 WPF。後來在研究平行計算時,我利用這個應用來演示平行計算。等到 Windows 8 釋出以後,我將其移植到了 WinRT。後來,我們釋出了平板裝置,我又一次將其移植了上去。而等到我們在 Linux 上啟動 .NET Core 後,這個應用是除了「Hello, world」之外,在 .NET Core 上運行的第一批 Linux 應用之一(移植後的版本提供了文字介面)。
Matt:早先時候,我們的公共 CI 系統採用了 Jenkins。我們不知道應該使用哪種工具。我們採用了一箇舊版的 Jenkins 單體版本,而且它的設計並不適合處理我們的規模(數以萬計的作業,需要大量的編排)。好在一切還算順利,但是很難管理穩定的安裝版本。最終,我們不得不創建了一個又一個越來越大的虛擬機器,而且佔據的記憶體也越來越大(數百 GB),但我們仍然需要有人時刻監視,一旦系統崩潰,就按下重啟鍵。
Dan:社群的參與度和專業知識總是讓我感到驚喜。此次開源在很大程度上是一種合作伙伴關係,令人欣慰的是,如此之多的開發人員對 .NET 充滿熱情,他們貢獻的功能和變更如此重要,可以讓 .NET 變得越來越好。
Immo:多年來我們一直在談論開源。我非常驚訝的是我們的心態轉變速度之快:前一天我們還在擔心,結果沒過幾天就完全變了:「為什麼還沒完成」。整個團隊的文化都發生了變化。從使用 TF VC 的內部 TFS 轉變到使用 Git 的 GitHub,並公開開發工作,我們幾乎只用了幾周的時間。我很震驚,也很自豪能夠成為一支適應速度如此之快、幾乎沒有任何猶豫的團隊的一員。
Kevin:雖然在微軟從事了七年的開源技術工作,.NET 開源的一切在我眼裡都很正常,但我仍然對這份工作感到興奮。如果回到 2002年,我很難想象這樣的事情。
Matt:這個項目的發展速度總是讓我感到驚訝,而且如今似乎還在不斷加速。以前,我總是能夠清楚地記住當前正在進行的一系列工作,各個程式碼庫的狀況以及它們之間的關係。然而在過去的一年裡,我經常會恍惚:「等等,我們現在就要做嗎?」但話說回來,可能只是因為我上了年紀。
Dan:自從 .NET 開源以來,內部團隊已經聯絡了我們很多次,希望我們能夠幫助和指導開源他們的項目。而他們又會成為微軟其他團隊的榜樣。令我驚訝的是,人們對我們公開自己的工作非常感興趣,他們希望能夠從我們身上汲取經驗。
Immo:我沒有預料到的一件事是,在與合作伙伴團隊的內部互動中,開源竟然起到了如此大的作用。回想起來,這也不是很意外。微軟是一家大公司,擁有各種各樣的工程系統、釋出週期和業務目標。我們希望團隊之外的人員也能夠接觸我們的程式碼庫,包括微軟的不同團隊,而在開源的幫助下,這個問題非常容易解決。
Immo:.NET 以高效著稱,尤其是與 C# 結合使用。在開源之前,我聽很多人說,有些人堅持認為「微軟非常邪惡」,雖然 C# 非常棒,但他們仍然拒絕使用 C#,因為它是閉源的,並且只支援 Windows。開源之後,很多人終於有機會在項目中使用了 C#了,即便他們的工作根本不涉及 Windows。
Kevin:我認為這在一定程度上表明 .NET 已深入客戶的日常工作。他們每天都會用到. NET,因此能夠讓工程師和客戶直接接觸我們的項目是非常有價值的。團隊中還有很多人在思考如何與社群展開合作,以及如何讓我們的開源軟體更具包容性,更容易接納別人。在這個問題上,我們都要感謝 Dan 付出的努力。
Matt:多年以來,.NET 的「核心」已得到鞏固。如今,我們有機會進一步擴展,並嘗試新事物和創新。與早些年相比,我們的工程系統越來越好,而我們的發展速度也越來越快。
Stephen:C# 是一門非常容易上手且發展成熟的語言,.NET 的庫非常健壯且龐大,運行時堅如磐石。你可以編寫非常高效且可擴展的應用和服務,而且編寫這種程式碼的效率非常高
Claire:在我看來,C#、.NET 和 Visual Studio 一直都是值得信賴的平臺。我可以快速投入工作,快速地編寫程式碼,然後開始偵錯,而無需考慮類路徑等複雜的配置,或手動指定垃圾收集器的設定。
Dan:.NET 開發人員的群體非常龐大,而且由於大多數 .NET 平臺是用 C# 編寫的,因此向這個項目做貢獻相對比較容易,而且很容易出成果。通過開源,我們與所有開發人員建立了聯絡,而不僅僅是 Windows 開發人員,無論你使用何種平臺,都可以考慮 .NET。
Immo:根據我與 .NET 開源社群其他成員的交談,感覺我們做了許多正確的事情。特別是在剛開始的時候,我們告訴所有人,我們可能會犯錯,我們非常期待誠懇的反饋。我認為,這件事奠定了社群參與的基調。儘管如此,我們也明白,取得開源的成功並不是目標,而是過程。還有許多東西值得我們從其他社群學習。
Dan:從 GitHub 社群的調查問卷中我們瞭解到,大多數情況下人們都很高興。不同的程式碼庫的結果也不一樣,也有許多我們需要改進的地方,我們應當更積極、更加透明地響應,降低貢獻程式碼的難度。我們可以學習一些成功的開源項目。我們已取得了進步,但前面還有很長的路要走。
Matt:我認為核心開發人員對 .NET 開源項目基本滿意。至少,我沒有看到任何開源的反對意見。從 .NET 組織的文化來看,這種情況非常自然,也是我們的目標。現在的反對意見主要集中在如何提高各個部分的工作效率。怎樣才能更好地管理議題?PR 的測試標準是什麼?
Kevin:我認為我們一直在嘗試改進。總會有人因為他們的問題沒有得到解決而不滿,但目前來看,在我們的程式碼庫中進行構建、偵錯並運行測試並非易事。有時候,就問題能否解決、何時解決,我們並沒有管理好人們的期望。因此,我認為我們做得還不錯,但依然有可以改進的地方。
Dan:舉一些我們讓 .NET 變得更加包容的例子:我們在Github上公開了 .NET 6 的計劃,並在Github 上管理該計劃;我們還積極利用 dotnet/designs 程式碼庫,這樣社群就可以幫忙分享和改進我們的設計和計劃。
Dan:由於程式碼庫一直都非常活躍,我們不得不放棄事必躬親的想法,也不能逼迫自己在業餘時間隨時做出響應。相反,對於喜歡靈活工作的人,這種情況反而很好,例如,無論何時都會有人執行程式碼審查。
Kevin:對於我來說,關注一切會讓人感覺不堪重負。我管理的幾個程式碼庫每個月都有幾百甚至幾千個議題,更不用說 PR 和評論了。就算是全職工作,給予一切方面應有的關注,時間也遠遠不夠。我看到有人通過延長自己的工作時間來解決這個問題,但最終還是會面臨精力耗盡的局面。
Stephen:我的時間根本不夠,無法完成所有的工作。例如,我很希望能審查 dotnet/runtime 中的大部分PR,但量太大,最後我只能優先處理一部分。
Matt:挑戰之一就是避免讓自己成為救火隊員。由於 .NET 的發展速度非常快,光是回覆 PR 審查請求、幫助受阻的開發人員或修改基礎設施的錯誤,就佔據了我所有的時間。困難就在於專心解決根本問題,並從戰略層面上思考怎樣解決一類問題,而不是一整天都為個人服務。
Dan:團隊中有許多人非常善於保持工作的邊界。我們認為這樣完全沒問題,甚至可以說這是最理想的做法。
提交者人數是固定的,但潛在的貢獻者是無限的。因此,我們不可能關注所有的議題和 PR 審查。我們會盡可能關注一切,但同時也會嘗試找出一個正確的模型來管理這項工作。我們希望社群能幫我們解決這個問題。
Claire:由於項目是全球性的,貢獻者也來自五湖四海,因此新的議題永無止境。工作之外的時間裡,我會想盡各種「請勿打擾」的方法,來保持工作和生活的平衡。
Clarie:我們一直在努力確保團隊與社群的友好交流,讓每個人都能參與進來。
Dan:有很多例子。我們主導了「社群分類」行動,好幾個程式碼庫都由社群成員負責給議題新增標籤,或者關閉重複的議題。在程式碼方面,有時我們會讓社群貢獻者參加我們的每日會議。去年我們在網路效能問題上也嘗試過同樣的實踐,而且非常成功。只要有可能,只要社群成員願意實現某個功能,我們非常願意放手。例如,Web 套接字壓縮和 PriorityQueue 就是這樣實現的。
Kevin:Dan 等人的調查已經持續了一段時間,我們在嘗試從調查中汲取經驗。如上所述,我們在努力給議題的狀態設定更為清晰的期望,方便大家訪問程式碼庫,降低構建的難度,確保社群PR得到更快的審查,等等。
Immo:以前,我們曾嘗試過「程式碼開放」,就是將程式碼扔給開源社群,而我們躲在門後繼續製造程式碼炸彈。從 .NET Core1.0 開始,我們的工作全部轉移到了 GitHub 上。這樣人們就可以看到團隊的程式碼審查,也能看到問題的跟蹤。我們中的許多人都加入了社交網路,更積極地宣傳 .NET 和我們的 GitHub 項目。我們還在 YouTube 上直播了設計討論會議。現在我們有好幾個網站可以與社群分享更多資訊,比如issuesof.net、apisof.net、apireview.net和 themesof.net 等。
Matt:在基礎設施方面,我們的理念一直是為微軟之外的 .NET 貢獻者提供與微軟開發人員相同的工具和流程,以及同樣的 PR 檢查工具,並公開檢查結果,同樣的程式設計工具,等等。
Dan:補充一句,這樣做也為團隊中不在辦公室辦公的成員提供了方便,他們不需要VPN就能工作。
Stephen:這個想法太悲觀了,我為什麼要跳槽?但是,沒錯,開源非常重要。
Dan:縱觀整個職業生涯,我一直在從事閉源項目,直到遇到 .NET。如今的我無法想象在一個非開源或註定會開源的項目上工作。開源的工作更有意思,我們能獲得更多的能量,接觸到更多的觀點,而且還可以認識更多人。而且開源非常高效。
Claire:能夠參加開源項目,併為開源做出貢獻,對我來說非常重要。能夠與社群互動、獲取新想法的反饋,並公開迭代過程,這一點至關重要。
Immo:作為項目經理,我非常重視與客戶實時互動的能力,包括讓他們直接接觸工程團隊的工作成果。我很難接受失去這一切。即便將來離開微軟也沒有關係,因為所有的工作都公開了。
Kevin:我從事開源項目已經七年多了,我從大學開始就想從事開源項目。我很難想象自己加入一個非開源團隊。
Matt:我認為,對我來說開源並不是一個硬性要求。但是某些開源的「思維方式」很重要。例如透明度、多樣性、完整性、社群、公共標準和辯論,還有開源工具,這些對我來說都很重要。
Claire:毋庸置疑。在開源之前,.NET 僅限於 Windows。如今 .NET 開源了,可以在更多地方運行了。
Immo:我相信答案是肯定的,但我認為跨平臺支援(包括裝置)給 .NET Core 帶來了很多變化。很難說這些成功的主要因素是什麼,但我認為開源軟體是我們成功構建 .NET 的關鍵。
Dan:在開源的幫助下,我們更容易地實現了跨平臺,因為我們可以與 Linux 的社群合作。而支援 Linux(以及 Mac)讓我們成為了 Linux 開發人員的備選之一。當然,也有一些開發人員單純因為喜歡開源技術棧。此外,開源還讓人們更容易信賴 .NET,因為每個人都可以閱讀原始碼。
Matt:我覺得應該會。我認為,我們很難將 .NET的採用率與開源直接聯絡起來,但我認為在某些方面開源增加了項目的可見性,而且還讓.NET 在原本不可能的地方(例如紅帽)得到了應用。
Kevin:肯定有一些客戶不太願意。在我看來,這個問題主要在於支援。雖然大多數人都知道,微軟釋出的產品都提供支援,比如 gRPC-dotnet,雖然絕大多數程式碼是微軟編寫的,但是實際上該項目由 CNCF 負責,也由他們負責釋出。那麼,我們提供支援嗎?(答案是這個問題剛剛得到了解決,我們提供支援)。但是我們推薦或貢獻了程式碼的第三方庫也經常出現這個問題。
Dan:以前許多 .NET 客戶構建應用都會使用微軟提供的庫(以前都是閉原始碼),再結合自己編寫的程式碼,他們不太習慣依賴微軟之外的庫,而這些庫通常是開源的。我們希望讓他們明白,他們也可以信任來自 .NET 團隊之外的庫,而開源更容易讓他們信任這些庫。
Matt:至少在內部,經常有人不太瞭解開源項目的開發方式,開源項目之間的關係以及開源項目如何才能滿足需求(服務、新功能等)。有時,他們有點不太習慣 .NET 之類的微軟傳統項目中包含微軟以外的開發人員編寫的程式碼。但我認為這主要是因為.NET 的發展歷史,而不是他們真的不喜歡開源。
Immo:我覺得打從第一天起,我們對此就非常透明。微軟整個公司都在向雲遷移。許多微軟的客戶都在使用 .NET,我們認為 .NET 與雲端計算的結合至關重要。而且我們相信開源是 .NET 向雲轉變的最佳方式。
Dan:為了回答這個問題,我們可以看一看近年來發生的事情。微軟維護的開源項目數量持續增長,包括幾個頂流的 Github 程式碼庫。這些都是最有力的證據。
Claire:人們經常將 .NET 項目與 .NET 基金會混為一談。該項目的智慧財產權歸 .NET 基金會所有,但 .NET 基金會沒有項目控制權。.NET 項目的控制權在微軟手中。作為 .NET 基金會的執行董事和 .NET 團隊的項目經理,我同時擔任兩項職務,我清楚什麼場合下應該承擔起哪項職務。我認為,剛開始的時候 .NET 項目和 .NET 基金會之間的界限很模糊,在過去的幾年裡,我們一直在努力更清晰地區分二者。
在 GitHub 上公開辦公,徹底改變了團隊和產品。雖然我們從事 .NET 的開發已經很多年了,但項目和產品本身仍在不斷增長。這是一個振奮人心且令人滿意的結果。很明顯,開源是開發應用程式平臺的最佳方式,而且也更有趣。感謝所有為該項目做出貢獻的人。
感謝Stephen、Matt、Kevin、Immo、Dan 和 Claire 與我們分享 .NET 開源項目的情況,以及參與其中的感受。
原文連結: https://devblogs.microsoft.com/dotnet/conversation-about-the-net-open-source-project/
聲明:本文由CSDN翻譯,轉載請註明來源。
☞華為訴爭「鴻蒙HongMeng」商標再被駁回;比爾蓋茨夫婦正式離婚;iOS 15「查詢」新功能,關機也能用|極客頭條
☞Snowflake如日中天是否代表Hadoop已死?大資料體系到底是什麼?
☞蘋果「重心」轉移,終端退位?
相關文章
【編者按】從閉源走向開源,.NET 背後都發生了哪些有趣的故事。本文采訪了 6 位微軟 .NET 團隊成員,分享他們在 GitHub 以及建立 .NET 開源項目的經歷。作者 | Richard Lander
2021-08-04 03:46:44
7月29日晚上,華為召開旗艦新品釋出會,大家期待已久的P50系列,終於是正式釋出了。關於P50系列的資訊,機哥已經在前幾天《華為P50正式釋出》一文中,已經向機友們詳細介紹過。但是說
2021-08-04 03:13:14
熱門手碼科技資訊早知道,快來關注作者。 編輯|孫鳳新稽核|文崢使用者與手機的互動方式大多都是通過螢幕完成的,近幾年手機廠商越來越重視手機螢幕的開發,不僅顯示效果越來越好,屏
2021-08-04 03:13:05
擺在中國手機廠商面前的,是越來越嚴峻的競爭格局。8月2日,谷歌正式官宣,將會在今年秋季釋出新的旗艦手機Pixel 6和Pixel 6 Pro,而這兩款手機最大的看點,就是會採用谷歌自研晶片Go
2021-08-04 03:12:59
作者 | Coder的技術之路來源 | Coder的技術之路為了更好的體驗和更優的效能,其實RPC悄悄的做了很多工作,本篇就帶大家來看下RPC的一些高階特性和其背後的原因。(還是以開源的du
2021-08-04 03:12:50
數字孿生技術如今在工業環境中很受歡迎,因此瞭解數字孿生概念是如何定義以及如何部署至關重要。物聯網裝置和數字孿生的概念物聯網裝置是一種通過網際網路將資料從一個地方傳
2021-08-04 03:12:39