|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
今天去面试,被问到C#中的new关键字,看了那么多的书对new关键字还是有一定认识,回来又把new复习了一遍,发现了许多以前还不知道的细节。.NET平台很棒。真的很棒。直到它不再那末棒。我为何不再用.NET?复杂来讲,它限定了我们选择的才能(对我来讲很主要),转移了我们的注重力,使得我们向内认知它的平安性,替换了匡助我们认知表面宽广天下的一切大概性。
[系好平安带:这个文章的长度几近成了一本书…]
长处
起首让我入手下手说说.NET做得对的很多事吧,只管这个中的年夜多半其实不来自.NET自己,但倒是由.NET社区而来。
C#
C#使人惊讶。我以为它是一个使人惊讶的编程言语。从壮大的C言语背景而来,我完全地喜好其语法,流和这门言语的所带来的感到。固然有我大概改动的事,但整体来讲它是一门踏实的言语。而且基于开辟职员利用的编程言语云云巨额的百分比和Windows操纵体系的优胜性,它是一门尽人皆知的言语。
ReSharper
我也很喜好Resharper。在JetBrains事情的开辟者们都是事业般的人。假如没有ReSharper和一些相干的工具,我大概其实不会云云喜好C#。
BDDandMSpec
我也很喜好简称为呆板规格(mspec)的BDD作风的框架。它是一个使人惊讶的测试框架,真正撑持在测试中利用准确的言语测试自己。在利用mspec之前,我的测试真是一团糟而且很碍我的事。
别的,当我们创立GoConvey—基于Golang的BDD测试框架的时分,Mspec关于我的构造来讲是一个伟大的灵感和鼓励。
多言语运转时
我以为多言语的CLR(大众言语运转时)的看法真得使得JVM的天下思索着。我不晓得任何非Java的JVM言语在CLR之前,但跟着“大众言语运转时”的到来,我的了解是这使得利用JVM的人们向行进而且终极制造了如Scala和Clojure如许巨大的JVM编程言语。假如我错了请改正我。再者,CLR使得Sun公司的人们坐上去并存眷它,由于Java有一点陈腐而且跟着Java8的到来,仅仅如今才在多个方面追逐着。合作是一件十分好的事。
NuGet
另外一个明显的例子是NuGet。这个包在Windows中作为一个全体出格是在Windows的开辟中,它的办理轶事是糟透的。NuGet办理了良多成绩,他们也经由过程从Python和Ruby借用了良多器材往做了良多准确的事。有改善的余地吗?固然。但比起其他一些选择在这儿或那儿的包晋级来讲,我还没有感应利用NuGet有这很多痛苦。
Mono
关于Mono的开辟者们,我不克不及不说太棒了。他们所制造的太惊异了。没有任何官方撑持和掉臂潜伏的悬在他们头上的功令成绩,他们向前促进并制造了一个竟然能替换官方运转时的完成。我已有一些运转在产物中使用程序,在Mono下运转了几近一年而没有任何成绩。它的产物筹办好了吗?这大概取决于你的使用程序(见下文“Mono”)。
CQRS和事务溯源
能够以为,关于.NET最功德之一是,它是CQRS的出生地并有相干的手艺:事务溯源。就算如许,CQRS+ES自己并没有甚么很新的器材。正如GregYoung将会告知你的,这是由一堆40年汗青质料为我们从头打包并改名的。关于年夜型代码库我有些十分严峻的成绩,当我5年前利用CQRS+ES的时分,它完整开释了我的域。CQRS+ES如今是定名形式的而且其发展是不言而喻的。这多是由于.NET已可以和其他的开辟平台交互共享的缘故原由。除这个以外,年夜多半的立异是从内部来的。
弱点
长处先放在一边,让我们看看甚么堕落了和我为何不再用.NET框架。关于我比来开辟平台的迁徙,最能鼓励我的事是我能够使用很多最好的部分而丢下欠好的部分(以下文所说)。
Windows
正如前文所述,劈面对基于收集的服务器软件时,Windows并非一个好的选手。在我看来,Windows的另外一个真实的年夜成绩是传统的Windows开辟者是一般仅仅善于于Windows,当他们分开安泰窝以后就会很快丢失,这关于Linux开辟者来讲却不是成绩。盘算远不止是Windows。开辟者仅仅能操纵单一的操纵体系的一个成绩是它不成制止得招致Windows的激增。换句话说,Windows生了Windows。没举措冲破这个轮回。
另外一方面,*NIX的开辟者一般熟习多操纵体系(Linux,Unix,OSX,Windows等等),一个操纵体系的外部事情道理,分歧的散布(基于Debian和基于Fedora),窗口办理器,桌面办理器,文件体系,保证理,编译,从头编译,从头打包,命令行“fu”等等。
我的一个芥蒂是文件体系。NTFS并非体系独一的文件体系,关于任何赐与的义务它几近都不是最好的选择。ZFS,BTRFS,ReiserFs,ext*等等,有一些很酷的特征。我也很喜好为了各类高速/通明的磁盘操纵,能从BASH创立回路设备大概创立RAM设备。这在Windows中不会产生—假如没有第三方软件的话。
在AWS云服务中,启动一个Windows呆板要花失落足足10多分钟。我约莫15-20秒就可以启动一个复杂的Linux呆板。当触及到云盘算范围,它可以敏捷扩大是很主要的,由于当扩大很主要时,10-15分钟就像是永久的。
VisualStudio
在我这另外一根刺,当属VisualStudio。我必要一个年夜年夜超越预期的IDE往做任何开辟,这个设法困扰着我。它只是如Windows一样复杂的资本猪。我有一个内核i73770K3.5GHZ的台式机,以16GB的内存和最年夜4512GB的固态硬盘往编译。它差未几刷爆了Windows体验指数,但Windows+VS仍旧很慢。(是的,ReSharper使得它更慢了,可是ReSharper对这来讲是值得的。)
如今我在MacBookPro上开辟,它比起我的壮大的台式机来讲只要更少的CPU马力,但运转分明更快,在一个短小的进修曲线以后,UX(用户体验)变得无穷优美了。现实上,我乃至不再用鼠标了—我的双手一向在键盘或触控板上,我能够用手势操纵我的电脑并让它回应—不像在Windows。
关于VS很酷的一个事是调试器。它的检察和利用,使人难以相信得便利。每隔一段工夫会在监督窗口呈报毛病的值,招致消费更多工夫往调试。同时,这也是很年夜的负面,由于CLR默许的,多线程的天下使得我一入手下手就必要一个调试器。没有调试器是一个摆脱的体验,由于它迫使你以另外一种体例编程。
VS一样也有创立“csproj”和“sln”文件的坏偏差。我恨这些。固然,C#必需晓得编译甚么和什么时候编译。我了解这点。在Golang中,援用在代码中利用了很主要的语句。假如它不是.NET顶用到的工程文件,我大概利用复杂的文本编纂器编码C#,而且对这门言语更流利。利用gitrebase操纵时,这些文件也有招致兼并抵触。
别让我入手下手说换行符的差别。我不克不及信任直到明天我们还在处置如许的事。假如VS办理计划文件以Linux行停止符停止,经由过程双击它其实不能载进该办理计划,由于VS办理计划文件剖析器读不出它来。
源代码办理
侥幸的是,我早就跳出了微软阵营的源代码办理(版本把持体系VSS)。我早在2000岁首,在VSS有数次丧失了我的提交以后,就利用了Subversion(译者注:Subversion是开源的版本把持体系)。以后git(译者注:git是开源的版本把持体系,内容办理体系等)呈现了,我又迷上了它。不幸的是,没有Windows的接口—对我来讲是典范的遭受。终极有人创立了一个接口,我就用了谁人而且没有转头。Git是一把十分厉害的刀,但当你准确使用它的时分,它是一个壮大而高效的工具。我已经在一个小工程顶用过TFS(译者注:TeamFoundationServer,事情流合作引擎),它是一个怪物—和一切来自Redmond(译者注:美国微软总部)的产物一样。它传染了我的项目文件而且净化了我的源代码目次。真可爱。不,仍是感谢你。给了我恣意一天用命令行git…大概多是SourceTree,假如你必要从GUI失掉一点关爱。
Mono
是的,这是第二次说起Mono。正如Mono自己云云冷艳一样。在.NET的天下,它仍旧二等国民。不管甚么时分我实验在Mono上运转任何主要的器材,我一般都在和毛病作奋斗。侥幸的是,对下载代码,查找成绩,发送哀求和在Linux上编译代码我没有感应不恬逸。可是这件事我都记不清做了几遍了。
是的,CLR是个伟大的怪物,而且对一个非官方的使用在分歧的操纵体系都有不异的举动,几乎是个相似于分隔红海的事业。但现实是,我不能不消费云云多的工夫来弥补毛病以使我的代码可以准确运转,其实是很难为其辩解。
Mono的特定地区也慢。大概它不是在慢在过载,但对我来讲Web服务器是关头地点。而且它十分慢,最初,慢到了最底下—即便是微乎其微的器材。我想好动静是它只能从这儿失掉更好的。我也应当说起Mono的开辟者大概忘了Linux,比起我大概晓得的还多,以是我不克不及太抉剔。
IIS
大概IIS在实验着为太多的使用程序做太多的事变。它从作为一个web服务器变成像J2EE使用程序容器一样的使用程序宿主。它也站在慢速这一边。我猜假如我必要更高的功能,我应当编写我本人的web服务器,但我真的很想只存眷我使用程序的代码。大概使用Windows事务服务器将是好的,但nginx(译者注:一个高功能的HTTP和反向代办署理服务器,也是一个IMAP/POP3/SMTP代办署理服务器)和其他服务器只是不喜好在Windows中临盆。
假造的以JVM为基本的完成,比方Netty(译者注:JBOSS供应的一个java开源框架),很简单处置每秒650K+/的哀求量。IIS在运转一个复杂的CLR使用程序“Hello,World!”,处置约莫每秒50K的哀求量时就会阻塞。(风趣的题外话,参考基准开辟者经由过程TCP套接字创立了一个复杂的C#的web服务器,它能处置约莫每秒120K的哀求量。)
局促的心思
前些年有个活动叫做ALT.NET。该活动是全体是关于寻觅我们本身以外的更宽广的开辟社区以作为一个全体,并会聚分歧的部分。风趣的是,那是StructureMap、Autofac、NuGet、ASP.NETMVC和很多别的工具的灵感来历。在传统的.NET的圈子里,这个活动遭到了良多的不屑和小看。我把这看做是,作为一个全体的社区广泛的局促心思和勤奋的一个极年夜的例证。(切实其实,它们中的一些大概会消散,进而以包含Redis,MongoBD另有别的的分歧的手艺而呈现。)
有这么多很棒的计划在那边。假定微软已必定是独一准确之路的设法是荒唐的。假如是如许的话,我们就都还在利用VisualStudio的计划工具往拖放按钮和链接元素到一个WebForm的界面上,我们会设定了该按钮而且依附ViewState以匡助我们与可骇的HTTP所带来的害怕离隔。我从我的一个部署的代码库中最初一个WebForm中挣脱的那一天,是个光彩的值得庆祝的日子。
谁又曾想过“收集把持”是个好主张?很明显我思索过由于我喝了Kool-Aid(译者注:卡夫公司出品的饮料,这里意指明知是必定的或有伤害的仍旧往做,有负面涵义)而且完整承受它。它狠咬了我。见过2MB的ViewState吗?
[注:当我写这篇文章的时分,本来的题目,“为何我不再用.NET”,意味着全部.NET生态体系。题目感到有点短因而我更新为“为何我不再用.NET框架”。我想.NET作为一个生态体系,包含了一切的工具,工程,平台,构造另有良多开辟者。这就是为何有些更普遍的.NET社区的元素在我的这篇文章中遭到反攻缘故原由。]
功能杀手
C,Java和C#中典范的多线程典范都激烈保举利用锁和互斥。关于锁来讲有个埋没的开支:它们慢得难以忍耐。利用Disruptor(JVM中的无锁的环形缓存[译者注:实践上就是具有一个序号指向下一个可用元素的数组]),你能够很简单得每秒处置20M以上的事务。在.NET中利用划定的“最好理论”等任何凌驾每秒十几回的传输,都被以为是面子又好的功能体现,在这一点下去说你仅仅必要更年夜/更好/更多的硬件设备。现实上,我见过第三方客户端库(Rabbit,Couch,Mongo等等)中锁语句遍及全部代码。即便在我的代码中没有任何的并发,默许的和首选的办法都用了锁。
无锁的、事务驱动的办法同意你年夜幅下降硬件和资金付出。年夜部分使用程序能够容易地运转在两台呆板上,第二台呆板仅仅在冗余和生效备援时是必需的,以防由于硬件相干的成绩招致第一台呆板不成用的时分起感化。
这个成绩的另外一个方面是挪用收集和磁盘子体系的传统体例:同步,堵塞代码。假如你必要多个并发的HTTP哀求,你必要更多的线程。年夜多半人不晓得的是,为保持线程多出的1-2MB和高低文切换线程的需求,使得CPU内核损耗一切的工夫平稳在高低文切换上而不是做真实的事情。以是如今我们失掉了在一个使用程序中数百或数千的线程,占用了RAM,并形成CPU故步自封。另有个更好的体例。
Netty/NIO(JVM),Erlang,Node,Gevent(Python)和Go都撑持利用事务驱动的子体系操纵(选择/epoll[译者注:Linux内核中的一种可扩大IO事务处置机制]/kqueue[译者注:FreeBSD的可扩大的事务关照接口])。这就意味着当守候数据包被tx/rx跨收集的时分,CPU能够自在地往做别的,主要的事情。由于JVM的成熟,Netty能够以为是做这项事情最快的,但我喜好Go用Goroutines操纵这个的体例—它复杂,文雅,很简单推理,没有像意年夜利面条一样的回调。
SQLServer
作为一位.NET开辟者,当你入手下手一个新的工程时,有一些事是你一般会往做的:
1,创立一个新的solution
2,将其部署到TeamFoundationServer(译者注:Microsoft使用程序性命周期办理(ALM)办理计划的中心合作平台)
3,IIS中创建响应的网站出口
4,创立一个新的SQLServer数据库
5,在solution中联系关系EntityFramework(一般是2010年以后创立的工程)
6,入手下手计划你的数据库和ActiveRecord实体
在年夜多半情形下这不是编写代码的准确体例。固然它大概在某些情形下无效,可是作为一个“默许的架构”它并非你想要的。为何在我们乃至还没了解成绩范畴之前已做了任何手艺上的选择?这几乎是本末颠倒了。
微软的生态体系勉励每一个人利用SQLServer。在VisualStudio中和SQLService举行交互大概利用SQLManagementStudio(和它的前身,SQL查询剖析器)是云云使人难以相信的简单。这类以数据库为中央的重点,是钦定的或独一准确的体例的一部分。它使你加倍沉沦微软。厂商锁定一直对厂商来讲是好的。
为何我们要云云开辟?为何我们不更多地思索使用程序的举动而不是它怎样存储的?如今我一切的项目都利用基于JSON的键/值存储。有了这类功效,我能够选择任何我想要的存储引擎,包含SQLServer,Oracle,PostgreSQL,MySQL,Cassandra,CouchDB,CouchBase,Dynamo,SimpleDB,S3,Riak,BerkeleyDB,Firebird,Hypertable,RavenDB,Redis,TokyoCabinet/Tyrant,AzureBlobs,文件体系中的明文JSON文件等等等等。俄然之间,我们可以入手下手依据其长处而不是仅仅对其熟习来选择存储引擎了。
题外话:在AWSRDS的云上运转过SQLServer吗?别这么做。固然它会事情,可是一些比方复制如许最复杂的事是不存在的。文章充溢着对SQLServer不克不及在AWSRDS上事情的援用。效率会有不少的变化。而实际上java是基于堆栈机器来设计,这和我们常见的基于寄存器的本地机器是差异比较大的。总体来说,这是一种虚拟机的设计思路。 |
|