是否要选择 .NET,这是个问题

cdop 7年前

我很困惑.

多年来,我一直是一名 .NET / Microsoft 技术栈下面的开发者(从这儿往后我会简单点叫它 .NET , 而我的意思则是 Windows / ASP / .NET / IIS / SQL Server 等等这些东西. 一个产品家族或者一些产品) ,并不是因为任何“宗教信仰”般的原因, 也不是因为我已经像其他一些人那样受到企业思维的影响,或者业务范围的限制d – 而仅仅只是因为机缘巧合,我开始使用 Visual Basic 2 进行了开发, 而后一发不可收拾的使用之后的版本,之前则变成了历史与回忆.

为 .NET 祈祷

常年来我总是读到一些“很酷”的家伙使用着 Unix / Linux / Ruby / Python,以及一些你能叫得出名字的东西 ; 比方说他们能使用VM快速的解决一个问题; 比方说开源软件社区如此之庞大,充满了热衷奉献的人们; 比方说他们的工具或者框架是多么的稳定和快速.

不知何故我从未去涉足这些领域. 我的意思是,我并没有去质疑这些事实,而我总只是看看而已,某种程度上我仍然我行我素, .NET 技术栈是强大、丰富而稳定的,他拥有精湛的工具 (主要是 Visual Studio),并且还有非常友好的文档.

特别是近年来,Microsoft以及第三方的库、工具和框架的爆炸式发展,让.NET更加的棒. 许多的这些工具“灵感”都源自Linux – 尽管他们的创建者都很少承认这个事实. 一些东西的命名——在顺序和重要性方面完全都是随机的: ASP.NET MVC, Chocolatey, NuGet, Entity Framework, Nancy, Web API, PowerShell, Windows Server Core… 当然还有许多其它“更小”的工具,丰富了整个生态系统,像: NUnit, Resharper, Web Essentials, GitHub for Windows, Dapper, Lucene.Net, Autofac, Cmder,以及成百上千的其它项目. 更别提许多其它源起 .NET 的项目,或者是他们自身的发展版本: Octopus Deploy, Hangfire, Xamarin, SignalR. 我总是感觉在 .NET的世界中我没有丢掉任何东西 – 工具都有,稳定性也有;年轻人喷它只是为了耍酷,或者至少他们是这样想的. 在整个这段时间里我唯一认同的问题是使用 Windows/.NET 生态系统会花费许可费用, 而  *nix 是免费的. 但这一争论并没有明确一些东西,因为存在使用免费的东西就不会获得企业级的支持等等因素. (我知道这个争论源起子MS的市场营销策略, 是非常主观的,而我现在不回去深入纠结这一点.)

某种形式的觉醒

尽管如此,我已经看到的是一幅越来越令人担忧的图景. Microsoft的代码不是开放的,而当他们最终开始开源他们几年以前的一些项目是, 他们也不会 接受代码的提交请求. *nix中好的库和框架比Windows的要大很多。 Internet Explorer么? 甚至都没有让我开始去强调这一点. 我已经写好了属于我的这部分东西. 许多基准测试都声称IIS表现要比nginx差. Shell么? 必须告知大家真相: PowerShell 是一个很大的进步,但从使用的稳定性、易用性和速度方面来看他仍然落后于 sh/Bash. Windows 用户仍旧没有改变他们对于用键盘来操作shell的心态. 所有的指南/教程/Q&A 都是用界面截图的步骤来向你解释如何搞定一个IT的任务 – 打开这个程序,点点这里,从列表里面选择等等. – 而命令行方式的版本则常常就是一行你实际只要复制粘贴和重复使用的能起作用东西, 不会有版本之间丢失步骤,或者改变位置诸如此类 的问题.

一些.Net/Windows的老手开始向*nix迁移,并写下了博客。 这不是什么新鲜事。据我的印象,这个现象从近五年开始显著。人们提出了各种反对.Net/Windows的观点,并开始偏爱*unix。一开始,我仅仅认 为这是某些极客的观点:微软不够酷,Linux让我干活更快,Windows根本不安全,微软没有开源软件的优点。我听到有些人说它们迁移到了LMAP 栈,觉得他们自由了。但是我仍然不认同这种观点,就像我前面说到的,.Net的生态环境更健壮,还在不断的发展,并且有足够的支持。

慢慢地,我开始发现某些真相。就像当跟别人争吵时,你们都不会仔细听别人的意见。但是当你们静下心,放下自己的主观意见,公正地判断问题的对错,你就会理解别人的观点,发现别人的观点并不是那么站不住脚。

我实践过很多博客的观点。 他们中大部分都讨论.NET,我的技术来源于此。 但是当你简单过滤关于软件设计的博客时,出现的都是企业家精神、精益创业、编程马拉松的相关文章 – 这些都不是企业动态 – 他们很少谈到.NET。 他们不讨厌.NET,也不是整天嘲笑.NET。他们只是不关注.NET。 他们用Python/Node/Go/Meteor语言研究自己的东西(我没有提到RoR,因为最近它不太流行),他们使用精简版Linux虚拟机或者 Docker容器,他们把系统发布到Heroku或者Google AppEngine或者DigitalOcean上一个精简的Linux虚拟机,就这些。 这并不意味着他们的架构不够强壮,因为他们确实有数据库、框架、所有需要的工具,这些都是免费的,并且这些框架/工具很稳定,他们在生产环境中使用这些东 西。

如果你看下早期和成熟的创业公司 – 会发现他们的代码90%(呃,这个精确的数字是我捏造的,但实际数字与此相近)使用Linux技术架构。 在硅谷,很难找到优秀的的.NET工程师。现在,NodeJS(考虑成本,它运行在Linux上,尽管在Windows上它也运行得一样好)很流行 – 部分原因它是MEAN框架(由 MongoDBExpressJSAngularJS、NodeJS 组成的完整的WEB开发框架)的一部分。 我越来越多地听到.NET开发属于过时、传统的团队,而真正轻便、敏捷、MVP架构的系统使用MEAN框架(以前叫LAMP,开发PHP的一个框架)开发。

.NET革命

另一方面,微软总部雷德蒙德吹来变革之风,并且这阵风越来越强。 变革开始于微软开源.NET栈的一些技术,发展于微软成立开源组织如 Outercurve和 MS Open Tech。我们开始看到这些组织对一些著名的开源项目的重大贡献,最终微软开始接受代码提交 – 开始是并行技术,现在发展到.NET核心类库, 并介绍了下一代.NET vNext。 微软不再否认Linux的存在。 他们不仅仅接受Linux的存在(我确信在一些重要内部政策的要求下,他们的市场部被迫改变销售模式),他们甚至在微软Azure云平台上提供官方的 Linux虚拟机,截至我写这篇文章,Azure云平台20%的虚拟机使用Linux系统。 不久的将来Docker也将支持Windows系统。

下一代.NET vNext的宣布使微软一飞冲天。微软反复修改.NET代码来对抗Linux系统和Mac系统 - 不再是用于写hello world但不能用于产品的Mono工程。最终,.NET工程不再绑定.csproj文件 - 根据物理路径中的内容,工程可以进行转化并且完全是可移植的,包括工程运行时使用的.NET框架版本。所有这些快速消除了.NET栈技术和框架之间的鸿 沟,这一点我之前提到过。

作为一名.NET爱好者,.NET现在看起来比过去好多了。几年前,作为一名.NET协作开发的程序员,我感到惭愧,最近我再也没有这种感觉了。几个月前,我在Reversim 博客(希伯来文)中详细地描述了这一点。

再次困惑.

一直没想明白, 到底是 Microsoft 做的太少, 还是起步太晚. 虽然, 在明白它那种传统又独特的方式做出来的产品已经失去市场之后,  Microsoft 一直努力的跟上市场的步伐. 但是 Microsoft 的霸气已然不复存在. 也许它在桌面领域(包括个人桌面系统和商务桌面系统)依然独占鳌头, 但是, 很久以前它在浏览器领域已经失去优势.  服务器领域(1, 2), 和开发栈(development stacks)领域也没有太多的优势可言. 重点是, Microsoft 还能不能跟上潮流, 阻止开发人员继续往 Linux 那边流失, 甚至扭转整个局面呢?

另外一个问题是, Linux 和 and Mac OS 版的 .NET 能否 100% 实现 Windows 版的功能. 暂且不提 Microsoft 是不是真心给非 Windows 系统提供完全兼容的 .NET. 我认为技术上能不能实现才是个大问题.  

虽说我是个资深的 .NET 程序猿, 按理说因该支持 .NET. 但是究竟选择哪一种技术,  关键要看它适不适合手头的的项目. 就拿我的下一个 web gig 来说, 除非其他开发框架有明显优势, 如: NodeJS+Express, Meteor, Go, Python+Django (当然, 这些框架在客户端或服务端的某些方面有自己的优势) – 否则, 我真的想不出有什么理由不用 .NET. 我指的是服务端 – 网站应用. 至于客户端, 那是另外一回事.

如何? 觉得 .NET 有前途吗? 还是心意已决, 打死不碰 .NET? 现在, 钱(Monetary) 和 IP 不再是问题, *nix 的程序猿会考虑用 .NET 吗?