探討.NET Core的未來
本文要點
與傳統的.NET Framework相比,.NET Core平臺具有顯著的效能優勢。
.NET Core在Microsoft平臺之外也廣為採用,並受益於強大的社群參與。
.NET Core在設計上採用以伺服器為中心,而非聚焦於Windows。.NET Core開發受益於這種設計。
.NET Core現已成為一種適用於新應用開發的穩定平臺。
隨著.NET Core 2.0的釋出,這個最初發佈於2016年的平臺終於有了最新的主版本,該平臺具有通用性、模組化、跨平臺和開放原始碼的特性。.Net Core涵蓋了當前.NET Framework版本中可用的很多API。其初衷是為下一代ASP.NET解決方案提供支援,但現在卻已成為其它許多應用場景的基礎,例如物聯網、雲端計算和下一代移動解決方案。在本系列文章中,我們將探討.NET Core的一些優勢,以及它如何給傳統.NET開發者以及所有需要為市場提供強大、高效能和經濟解決方案的技術人員帶來好處。
在本文中,五位資深開發人員對.NET Core平臺開展做了一次探討,內容涉及.NET Core的應用情況,以及其未來的發展方向。通過本文,讀者可一窺平臺的優缺點,並確定自己是否可在未來做開發時從中受益。
討論小組成員
Jeff Ammons
Jeremy Miller
David Pine
Mark Rendle
Spencer Schneidenbach
InfoQ:先請大家做個簡要的自我介紹,以及目前使用.NET Core的情況。
Jeff:我早在.NET Core還被稱為ASP.NET vNext時就開始跟進。雖然我在2012年幾乎遠離了Microsoft開發,但是vNext讓我重拾舊業!我從2014年開始著手宣講Core,因為在我看來,它為伺服器端/Web專案提供了一個更好的基礎。
Jeremy:我牽頭了多個.NET社群的OSS專案,其中部分專案的目標就是混用整個.NET Framework和NETStandard。
David:我自2015年下半年以來就一直在使用.NET Core做開發。此後在2016年1月,我開始做PoC(概念驗證,Proof-of-Concept)應用。從那時起,我們整個團隊一直在積極使用.NET Core做開發。我們藉助ASP.NET Core構建企業Web應用。在當時,它還被稱作ASP.NET 5,依賴於.xproj檔案格式和project.json。我認為自己是一名.NET Core的早期採用者,非常高興看到.NET Core的發展。同樣,我對開發者社群心存感激,正是社群幫助該Microsoft產品定型發展,並使其發展超出人們的預期。我相信NET Core只會變得更好。
Mark:我從開始就是一位.NET使用者,並自第一次預覽版釋出以來就在持續使用.NET Core,當時它被稱為Project K。我一直為團隊和組織提供培訓課程和諮詢,其中包括.NET Core本身,以及其開放的新生態系統,諸如Linux、Docker、Kubernetes等。我目前正在開發關於使用ASP.NET Core構建雲原生應用的一系列線上課程。
Spencer:我曾在一些新建的專案中使用了.NET Core,這些專案主要是將ASP.NET Core用做React-Redux應用的後端。我還召集了數次ASP.NET Core的研討會,其中一次是聚焦於Angular,還有一次是聚焦於ASP.NET Core本身。它們均可由.NET Core提供支援!
InfoQ:你們喜歡.NET Core的哪些強大之處?
Jeff:每次我在做關於Core的演講中,該問題都會被問及。例如,“作為一名Windows開發人員,我為什麼要關心跨平臺問題?”。答案就在於效能上的考慮。最初,.NET是在單臺Windows計算機上針對單使用者做的優化。與針對多臺伺服器上的大量使用者做了優化的技術(例如Node等)相比,.NET如果僅綁定於Windows並面向單一使用者,那麼其將難以在多使用者伺服器環境中建立超高效能的應用。Core使得Microsoft得以將開發基礎重置為以伺服器為中心的模式。
Jeremy:我個人最喜歡之處在於它是跨平臺的。我能夠將.NET Core的大部分開發工作移植到其它作業系統上。雖然簡化csproj檔案格式正的確是朝正確方向邁出的一大步,但我仍希望.Net Core能夠保持更簡潔的project.json格式。dotnet cli工具是我編寫的書中的一個亮點。相比以往而言,它極大地簡化了OSS工具指令碼的構建,最終以簡潔的命令列工具啟動和管理專案檔案。改進的Nuget工具結合了更好的csproj檔案格式,這極大地降低了我們在上一代經常會碰到的Nuget和Visual Studio.Net的合併衝突問題,無需訴諸於Paket這類大多數開發人員不太瞭解的工具。
David:很明顯,.NET Core的開源、跨平臺和卓越效能會受到大多數開發人員的喜愛。 但我的喜歡之處在於.NET Core依然是.NET。如果你曾經在.NET中做過開發,尤其是使用過C#,那麼你就會接觸到那些優秀的工具、令人歎為觀止的社群,以及世界上最強大的程式語言之一。我相信.NET Core對Microsoft而言是邁向正確方向的一步,這對於所有的框架開發人員來說尤為重要。開放原始碼和跨平臺應該成為標準。開發人員可以對C#語言或者是.NET Core中的一項功能做出貢獻,併產生影響,這是Microsoft所取得的一項令人難以置信的成就。賦予開發人員閱讀原始碼、設計實現和運作內部架構的能力是非常有必要的。為此,我向Microsoft脫帽(“紅帽子”,Red Hat)致敬。
Mark:.NET Core的強大之處主要在於跨平臺支援。事實上,你可以開發一個執行在Windows或Linux上的獨立應用,或者使用macOS開發可在x86和ARM CPU上執行的應用,這一點令人驚歎。最重要的是,由於採用了正確的開源發展方式,我們已經看到了由社群給出的一些驚人貢獻。這使得其效能得到了改善,尤其是在網路方面,並且還有更多的改進即將推出。我們可以在繼續使用C#以及一些熟悉的框架和庫的情況下,獲得所有這些現代優點,這是非常美妙的事情。
Spencer:跨平臺絕對是.NET Core的最大賣點和最大優勢。我先前曾提出過這一觀點,即.NET Core旨在吸引下一代的開發人員,而非那些目前使用.NET Framework的開發人員。但是,隨著.NET Core中添加了越來越多的功能(例如System.Drawing和System.DirectoryServices等,不勝列舉),我想我們會看到更多的.NET開發人員和商店轉移到.NET Core。
InfoQ:目前.NET Core中是否還存在一些缺點,這些缺點是你們希望在未來能得到改進的?
Jeff:一些重要遺漏將會隨時間的推移而得到新增。在過去一年中,改善就非常顯著。去年秋天之前,Core的巨大弱點在於.NET、ASP.NET和Visual Studio團隊之間的脫節問題。但是在秋季釋出之後,團隊的脫節問題得到了解決,這才使我可以向其他人推薦使用Core做開發。另一個很好的例子是project.json轉換為*.csproj的徹底失敗。但是該過程的變化過晚,因此對於早期建立生產專案的人而言,這無疑是一種懲罰。我們需要Core能達到一個穩定的高度,才可以認真地考慮著手採納的問題。
Jeremy:在我看來,如果開發人員需要直接編輯csproj檔案,那麼目前的檔案格式仍然過於繁瑣。為消除一些MSBuild內部關注的問題,同時將檔案格式推向使用者友好的方向,Core在工具和檔案格式方面還存在著一定的改進餘地。我非常希望看到能推出AssemblyLoadContext概念,並以此作為曾經的AppDomain模型的一個輕量級繼任者。
David:當前,.NET Core的一個主要弱點就是隨之而生的一些誤解。無數的開發人員仍然在問,“.NET Core、.NET Standard和.NET Framework有什麼區別?”。類似問題還包括,開發人員應該選擇哪一個,以及為什麼。選擇並非總是那麼簡單或清楚。例如,實際上可能存在以.NET Framework為目標的.NET Core應用。這樣的應用的確可能會令人困惑,因為我們知道.NET Framework和.NET Core都是.NET Standard的執行時實現。.NET Core的術語被過載,存在.NET Core應用、.NET Core CLI、.NET Core SDK和.NET Core執行時。我相信,在使所有這些術語更易於理解和使用的方面上還有很大的提升空間。
Mark:Core在效能方面還有一些工作要做。例如,在TechEmpower“純文字”基準測試中,ASP.NET Core的Web伺服器Kestrel表現極佳;但在涉及資料庫查詢等的高階測試中,Kestrel則表現不佳。在效能方面上,大部分從完全(full-fat).NET Framework遷移過來的程式碼都可以得到很大的改進。好訊息是,現在人們正在深入研究程式碼,並挖掘這些效能問題。
Spencer: Core缺乏一些與.NET Framework相匹配的功能。這意味著當前的.NET開發人員在嘗試.NET Core時,必須要決定.NET Framework的某些核心功能是否值得棄用。如果你正在使用System.Drawing、System.DirectoryServices,或是某些僅針對.NET Framework的框架,那麼你就不會那麼好運了。ASP.NET Core已經是一個非常成熟的產品,從ASP.NET MVC/Web API轉向非常簡單,但並非所有的事情都是如此。例如,Entity Framework 6到EF Core的轉換就並非易事。
InfoQ:如果現在你要為組織啟動一個新專案,你會選擇.NET Core而非.NET Framework嗎?原因是什麼?
Jeff: 是的,我就是這樣做的!伺服器端效能是我做出選擇的一個主要原因。另一個主要原因是MVC和WebAPI控制器的整合。對我而言,具有兩個獨立的程式碼庫是毫無意義的。第三個原因是標籤助手(Tag Helpers)。我希望我的HTML看上去儘可能更像是HTML。我一向不喜歡
@Html.ActionLink(“Which param is this”, “Or this”, “Wait What Is This One Again”, new { @class = "OhComeOnYouMustBeKidding"})
這樣的風格。新增CSS類絕對是一個最好的做法。我非常喜歡這樣的風格:
<a asp-controller=”book” asp-action=”edit” class=”MyCSS”>Edit</a>
Jeremy:當然是的,並且我們已經這樣做了。主要原因在於.NET Core對於更多的主機和開發選項而言是跨平臺的。
David:我會選擇.NET Core而非.NET Framework。對我來說,這個選擇非常簡單,因為我沒有開發任何新的WinForms、WPF、WCF或ASP.NET WebForms應用。我很高興使用Microsoft提供的最新的、最偉大的技術。到目前為止,我唯一期望的就是能看到即將推出的SignalR。在我看來,進步是直截了當的,這是朝著正確方向邁出的一步。我唯一關心的問題是關於.NET Core的可用性。只有一個選項是有點令人沮喪。事實上,我寧願Microsoft只是宣告我們現在需要全部使用.NET Core,並且可以具有以.NET Framework為目標的TFM(目標框架名字物件,Target Framework Moniker)。
Mark:對於一個新的專案,我絕對會預設使用.NET Core。最顯著的原因在於.NET Core應用效能的提高和佔用空間的減少,這意味著無論是對於雲還是私有資料中心,可真正做到在基礎架構上的成本節省。我主要從事Web和後端服務開發,能夠使用Docker和Kubernetes等容器編排工具跨平臺開發和部署應用,這是一項真正的優勢。對於具有WPF、UWP或Xamarin移動元件的混合專案,使用.NET Standard可讓開發人員在整個.NET或Xamarin專案與.NET Core Web或服務專案之間共享軟體包。
Spencer:我的組織在.NET Framework上運作得很好,所以現在可能不會考慮.NET Core。但是我們希望在某個時候重新開發我們的平臺。我們屆時將會認真地考慮.NET Core。不必被鎖定到基於Windows的託管,這是一件非常好的事情,但當前對我們並不是一個大問題!
InfoQ: 你們認為.NET Core的發展是否會超越Microsoft之外,還是會繼續侷限在現有的.NET開發者社群中?
Jeff:我希望如此。這是Microsoft首次有機會必須面對新一代的Web開發人員,這些開發人員認定必須使用Mac做開發。我在課堂上以VS Code入手講授Core。儘管我越來越喜歡Code,但毫無疑問,完整的Visual Studio具有更高的生產率。目前為止在深入學習了ASP乃至Core之後,大多數從Mac或Linux入手的學員都會轉向使用Windows。我們希望能改進非Windows、非Visual Studio開發人員的體驗。
Jeremy:如果在TechEmpower趨勢圖上,基於ASP.Net Core的架構能保持攀升勢頭,情況或許會是如此。.Net Core必須要克服數十年來存在的一些關於Microsoft開發技術和文化的陳舊觀念。
David:我認為.NET Core的發展已經超出Microsoft之外。從統計數字上看,.NET Core程式碼庫事實上每天都會接受來自於非Microsoft僱員處的Pull請求。此外,.NET基金會有1700多家公司為.NET生態系統做出貢獻,具有550多個以.NET為核心的原始碼庫!認真想來,這非常不同尋常。如果Microsoft不公開原始碼,那麼這些都是不可能的做到的。.NET開發人員社群與以往一樣的強大。
Mark:我很希望看到.NET Core的發展壯大,吸引更多來自於其它生態系統的開發人員。它已具有大量的社群支援,似乎主要來於已有的.NET社群,儘管我們可以看到某些行業對此展示出越來越濃厚的興趣。三星就是一個很好的例子。該企業已經在其Tizen作業系統中採用了.NET Core。我們很高興看到Amazon和Google也已加強了對雲平臺的支援,包括提供很好的SDK支援。感覺Core專案像是一個開始,即更開放的Microsoft開始更積極地參與其它的社群。我希望該專案能繼續發展,使得這些社群繼續與Microsoft合作。
Spencer: 很難說。我認為信任是Microsoft在開源領域中存在的最大問題,但是他們已經取得了巨大的進步。Visual Studio Code就是一個例子,它對開源軟體的各個方面都已產生了重大的影響。我認為時間會證明一切。
InfoQ:你們認為.NET Core在未來兩年中將會如何發展?
Jeff: 我期望Core的發展軌跡能遵循我們所見的MVC發展的同一軌跡。起初,MVC由於與Web Forms存在一些迥異之處,因此並未受到Microsoft開發人員的喜愛。之後,在開發人員勉為其難地嘗試之後,他們的態度發生了轉變,進而開始喜歡使用它。現在,開發人員對Core的感受也是一樣的。其中的一個巨大的差異之處在於,開發人員的MVC和WebAPI上技能可以得到更多的轉換,大大地超過了可轉換為MVC的Web Forms技能。
Jeremy:如果在以Netstandard 2.0為目標的專案中使用舊的.Net庫是切實可行的,我認為更多的開發團隊最終會跳到.Net Core。目前出於專案依賴性尚未針對Netstandard的顧慮,這些團隊可能會猶豫不決。
David: 我並不認為.NET Core真的有什麼特別之處。隨著它越來越受歡迎,它將會得到日益廣泛地採用。.NET Core的工具將變得更高效、無缺陷並且更為實用,進而提高開發人員的工作效率。我相信,.NET Core將成為.NET生態系統內新開發工作的一個行業標準。在ASP.NET Core中引入更好的SPA(單頁面應用,Single Page Application)例項並非我的關注點。儘管據我所知,現在已有一些JavaScriptServices程式碼庫,可以幫助開發人員構建Angular或React之類的專案,但我還是希望Microsoft能夠涉足客戶端框架。Microsoft已經給出了TypeScript,因此已在朝著正確的方向推進!
Mark:現在大企業客戶開始認真考慮是否可對新專案使用.NET Core,這是我們當前所處的採納曲線階段。這種趨勢將持續下去,並有望推動更廣泛的生態系統向前發展。如果看一下.NET Core、ASP.NET Core、C#等一些專案的路線圖,它們已經推出了一些非常令人驚奇的進展。其中的CoreRT是我最喜歡的一個專案,它為.NET提供了AoT編譯,支援開發人員構建不帶執行時依賴項的獨立可執行檔案。這些專案也增加了對WebAssembly的支援,支援開發人員編寫並編譯C#程式碼,在瀏覽器中執行復雜的處理。我非常期待看到未來的發展!
Spencer:增加一些與.NET Framework相對應的特性,可能將有助於推動.NET Standard的發展。
InfoQ:大家最後再談談看法?
Jeff:相比於推出新特性而言,長期穩定性將成為考慮採用Core時更看重的因素。Core正在接近於此。我是“長期支援版到當前版”模式(LTS vs Current Model)的堅定支持者,這種模式正被Node、Ubuntu等使用。從一個組織的角度考慮,我需要了解是否可以押注一種技術,該技術在必須要做出重大改變之前,至少會保持3到5年的穩定期。同時,我也需要知道該技術的創新也是在穩步推進的。
Jeremy:至少在Netstandard 2之前,.NET Core的殺手級問題就是,其在從.NET OSS生態系統分離出來時,如何避免出現像臭名昭著的Python 3發行版那樣的問題。要實現完整的框架和.NET Core的多目標並非易事,這可能會成為OSS開發時的一個阻礙。
David:我一直驚訝於對.NET Core或ASP.NET Core聞所未聞的.NET開發人員數量。我相信Core是新Microsoft的一部分,作為開發人員肯定是要對此亦步亦趨的。在我的全部程式設計生涯中,這的確將成為一個我會講述給孫輩們的創新經歷,“令人記憶猶新的是,當年Microsoft同時推出了開放原始碼和跨平臺。他們將其稱為.NET Core,孩子們,請不要介意這個名字”。的確,這是一個激動人心的時刻!
Mark:正如大家從我的談話中可以看出,我是.NET Core的一位忠實粉絲。如果你正啟動一個新的ASP.NET專案,你應該使用Core。它與.NET非常相似,所以你能很快就開始執行。它也是穩定的,並正得到一些開源的生態系統的支援。它只會變得更好。
討論小組成員簡介
Jeff Ammons 是Code Career Academy的首席講師,在亞特蘭大周邊區域講授Microsoft Stack和Node.js網頁開發。Jeff具有Microsoft MVP和Pluralsight author認證,經常在使用者組、一些聚會和會議上發表演講。他曾就職於多家不同規模的公司,任開發人員達25年以上,職位從開發人員到首席軟體架構師。
Jeremy Miller 是德克薩斯州奧斯丁市的一位開發人員和軟體架構師,也是多個OSS工具的作者。他的個人部落格是jeremydmiller.com。
David Pine 是位於威斯康星州的Centare公司的一位技術佈道師,也是一名Microsoft MVP。David喜歡在技術社群分享知識,並在一些區域性會議、使用者組和技術會議上做演講。David熱衷於通過寫作來分享自己的想法,並積極維護著個人部落格。
Mark Rendle 是一位具有近30年行業經驗的軟體開發人員。他是一名自由顧問、培訓師和開發人員,定期在世界各地的.NET Core、構建現代應用和服務相關的會議上演講。可在Twitter上關注Mark。
pencer Schneidenbach 是一位居住在密蘇里州聖路易斯市的軟體架構師、API/整合專家,也是一名Microsoft MVP。Spencer具有個人部落格。
原文地址:http://www.infoq.com/cn/articles/future-of-net-core
.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com