探讨.NET Core 的未来

A Discussion Panel

阅读数:1422 2018 年 6 月 24 日

话题:.NET语言 & 开发

本文要点

  • 与传统的.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”系列文章的一部分。读者可以通过订阅RSS接收更新通知。

在本文中,五位资深开发人员对.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 AmmonsCode 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

Spencer Schneidenbach 是一位居住在密苏里州圣路易斯市的软件架构师、API/ 集成专家,也是一名 Microsoft MVP。Spencer 具有个人博客

查看英文原文: Discussions on the Future of .NET Core