译者 | 朱先忠
策划 | 伊桑
Node.js可能是业界最流行的后端技术。Twitter、LinkedIn、Uber等知名国际企业都选择使用Node.js作为他们的主要服务器端技术,或者将其与其他语言相结合。Node.js拥有很多相关的优势,比如它有一个巨大的社区,还有一个伟大的生态系统,特别是在前端和后端都能够使用相同的开发语言等等。
由于C#和.NET是我的主要编程语言;所以,我想通过本文的探讨来试图弄清楚是否我在使用的是一种被低估的技术,以及它的市场趋势是否看好。其实,ASP.NET(.NET服务器框架)本身就很流行。自从.NET运行时成为开源和跨平台平台以来,它一直在改进,并越来越受欢迎,但目前看来,Node.js的地位依旧领先。
那么,为什么我依旧建议初创公司最好考虑选择.NET而不是Node呢?以下是我的7个理由。
1、.NET具有更好的性能
性能问题是Node.js技术的最大软肋。我倒不是说Node.js的速度慢得令人难以忍受;但是,当你开发的系统需要后端支持计算功能或者具备高吞吐量的请求时,那么Node.js并不是一个好的选择方案。主要原因在于:它的运行时是单线程的,这对于当下允许并行执行许多操作的多核处理器来说,绝对是一个巨大的浪费。techpower最近的基准测试
结果显示:Node.js远远落后于ASP.NET Core。
诚然,.NET也并不是最快的技术。如果仅仅强调“速度最快”的话,答案很可能要归属于极简主义的Rust语言或C++实现。但在主流Web框架中(不包括Just或may_minihttp这类小众项目),.NET算是最快的框架之一。主要理由主要存在于三个方面的性能测试优势:单查询基准测试、多查询基准测试和Cookie基准测试。
2、Node.js需要混合和相匹配的语言来实现性能补偿
当深入了解选择Node.js的公司的技术堆栈时,你会发现,他们的微服务架构技术方案中几乎总是存在其他语言和运行时(如Go、Rust、Java和Python)的组合使用。Node.js和JavaScript非常适合只向数据库、队列或其他服务发送查询的高级REST服务器。然而,当您需要进行一些计算工作时,比如运行算法或使用文件系统时,这样的技术选型并不好。
相反,C#和.NET运行时速度快,功能多。在大多数使用场景中,您不需要使用像Rust或C++这样的本地语言来获得额外的性能优势。这意味着,您可以节省向项目的技术堆栈添加额外语言的开销。因此,实际开发中,最好还是努力避免使用另一种新的语言,因为这样的话你将需要更多的专家和更多的基础设施,从而导致开发团队变得不那么“多才多艺”。
3、C#是一种令人惊叹的语言
很难说哪种语言更好,因为每个人都有自己的偏好和偏见。但是,我认为C#是目前业界最强大、最高效、最流行的语言之一,理由如下:
它是一种高级的C风格面向对象语言。对于大多数开发人员来说,它将是熟悉的,并且富有成效的。
尽管它是一种高级语言,但在性能优化需要时,它允许对敏感代码进行低级控制。如果您愿意,您可以使用指针和直接访问内存访问。
它具有丰富的函数语言功能,如LINQ和扩展方法。
它是类型安全的,比TypeScript要安全得多;但在需要时,它还具有JavaScript等动态功能。
它有大量的技术文档和庞大的社区支持;尽管没有JavaScript开发领域那么大,但仍然非常大。
业界成功使用C#开发项目的几个案例是Bing搜索引擎、StackOverflow和Unity(最流行的游戏引擎),它们都允许您使用C#作为编程语言。
4、最好用的工具
我认为C#提供了世界上最好用的工具,包括最好的IDE、最好的调试经验和最好的评测器等等。
JavaScript或TypeScript并不具备C#的强类型特性;因此,高级代码导航和重构是不可能的。在许多情况下,知道谁实现了你的接口或谁引用了你的类的函数是不可行的。经常的情形是,Node.js必须依赖于基本的文本搜索;而在C#集成开发环境中,您可以通过快捷键导航到相应的用法和实现源码。强大的重构功能也是如此,比如实现接口、添加参数以及提取函数或类。如果您已经使用Visual Studio或Rider很长时间了,那么您可能会在迁移到Visual Studio代码时体验到真正的生产力损失。
就调试问题而言,Chrome开发工具调试器或VSCode调试器与Visual Studio的经验并不相近。但是,在调试Node.js程序时,我就成为一个相当普通的用户。
5、更容易的内置开发循环
在Node.js中,您可以使用Babel、Webpack、ESLint等工具以任何方式构建开发环境管道。您可以使用不同的JavaScript版本,将所有内容打包到单个文件或多个切片中,缩小它们,等等。这是一个可高度定制的过程。管道的每个部分都有许多不同的工具。例如,Webpack可以被Rollup或Parcel替换,ESLint可以被更改为prettier工具,等等。存在数百万种不同的方法来构建JavaScript项目,每个公司似乎都有自己独特的设置,而且需要大量开发和维护的设置。尽管我不得不承认,如今存在很多现代方法,比如Vite,可以让一个丰富的开发环境快速启动并运行。
.NET中的情况正好相反。在构建设置中没有太多技术选择,因为您将始终使用微软公司的MSBuild、.NET SDK和Visual Studio。当然,您可以进行一些定制,但这与JavaScript项目完全不同。要做的唯一“选择”是使用哪个.NET版本,哪个版本总是最新的,以及要构建的项目类型:ASP.NET Web API或ASP.NET MVC,这应该是一个明显的选择,具体则取决于您希望如何开发前端。
因此,可以考虑Node.js的灵活性,这是它的一种优势,也是合理的。但是,你也可以将其视为一种负担。在.NET开发中,除了在非常大的项目或特殊的情况下,开发环境需要做的事情并不多。Visual Studio和MSBuild可以正常工作,它们可以处理大型企业应用程序和服务器,而不会出现太多问题。
6、稳定的生态系统
正如刚才提到的,Node.js和JavaScript有一个非常丰富的生态系统,这包括开发工具、库、文档等。不管是好是坏,这个生态系统大多是开源的,由社区开发。在许多情况下,公司所依赖的库是由一个小团队甚至一个人开发的。如果这个人决定停止项目工作,公司就损失大了。当然,其他人可以接手这项工作,或者你可以自己动手,添加你需要的任何缺失的部分;但是,这对于一家快速创建第一个产品的初创公司来说是一个很大的麻烦。当然,这并不是小型开源项目的唯一问题。当他们引入错误或安全漏洞时会发生什么?如果他们的爱好项目对你的创业公司造成了损害,维护人员并不完全负责,是吗?
我并不是说大公司的产品中没有错误。据我所知,他们的产品中可能会有更多。但你可以投诉,开罚单,甚至起诉微软。你可以肯定,一个项目将在很长一段时间内继续得到支持,如果它停止得到支持,你会提前几年收到通知。就稳定性和可靠性而言,我打赌Microsoft.NET运行时及其所有工具都比大多数Node.js开源库测试得更好!这可能会降低产品版本发布的速度,但却会带来更稳定的产品。
话虽如此,仍存在许多维护良好的开源库,它们有许多贡献者,并得到了大公司的大力支持。
7、合规性、隐私和安全性
这一论点主要基于常识,而不是基于我的经验或专业知识。如果我做了一些错误的假设,请让我提前道歉。
在开始创业时,您可能认为法规遵从性问题并不重要或特别有趣。我想创始人会专注于制作产品、招聘、筹集资金和选择公司的标志。但是,这仅是产品最重要的方面之一。在某些行业,如医疗保健、军事和政府部门,至关重要的是,你的应用程序必须是安全的,能够保护个人信息,并符合HIPAA和ISO 27001等标准。
再让我们回到对技术的选择话题:
如果您选择了Node.js或者是ASP.NET,那么合规性/隐私性/安全性是否重要?
在这两种技术上运行的应用程序是否符合标准,是否安全,是否受隐私保护?
但当你选择Node.js时,还可以选择使用开源库和生态系统。某些开源库存在安全或隐私漏洞的可能性更大。而且,这些项目很有可能不遵守微软为自己制定的疯狂标准。即使你正在采取最好的措施来保护你的应用程序,例如进行渗透测试等等,你也无法与微软的声誉竞争。如果一个G端客户知道你全部都在使用微软的技术堆栈,他们就更有可能信任你的应用。
8、小结
至此,我希望我至少说服了你认可我上述提出的部分观点。不过,很多论据都是带有主观性的,比如谁有更好的工具,或者哪种编程语言更好。其实,我会第一个承认Node.js比ASP.NET更好一些。对此你有什么看法呢?欢迎在文后留下你的评论。
原文链接:https://shimo.im/docs/pmkxQn7ejPuZ1EAN/read
译者介绍
朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。