什么是.NET
有一次小飞去面试,面试官上来就问了一个宏观的问题:“你觉得什么是.NET”?小飞的脑子嗡嗡的,支吾了半天,才吐了一些碎片化的词语:“跨平台、开源、微软…”
虽然作为一个.NET人,但是小飞更喜欢编码细节,对理论这一类不是很感兴趣,比如.NET历史枷锁、什么是.NET等。一个源于技术更新发展太快,另外一个原因是小飞觉得技术以实用为主,聊这些虚头巴脑的理论没有什么用。
考官点评了:“你对.NET缺乏基本的了解,作为.NET技术的运用者,对问题缺少刨根问底的思考,我们要招聘的是面向未来,有系统性思维的人。”
面试让小飞很受挫,于是他去找小黑,一个.NET方面的老司机。
“小黑,你在.NET这方面比较资深,到底什么是.NET呢?”
小黑知道小飞比较好学:“小飞,你先不用难过,这次面试反过来也是对自己知识的查缺补漏。”小黑一边安慰,一边回答道:“你可以这么思考,假如你是微软的产品经理,你会如何规划.NET呢?”
小飞摇摇头:“我只是一个菜鸟,初出江湖,哪里有这个高度。”
小黑道:“嗯,没关系,就是一个思考角度罢了。你可以这么思考,微软就像一个主厨,做了一桌满汉全席,上面有八大菜系:有网页,移动,桌面,微服务,游戏,机器学习,云原生,物联网。”
“微软不但提供桌子这个平台,而且上面的每道菜系怎么做,用什么材料做,如何打样都提供了周到的说明。更贴心的是,微软对开源社区说:我的满汉全席大家随便吃,随便拿,不要钱,因为我采用的是最宽松的MIT协议。”
小飞:“我知道以前很多人对微软帝国有很多偏见,都说微软不开源。”
小黑:“这次微软是真的放下架子,彻底拥抱开源了。”
小飞对大厨的比喻很深刻,不禁念叨:“.NET、满汉全席,八大菜系,各具特色,不要钱。”
小黑看到小飞碎碎念,就帮他做了一个概括:“是的,.NET是一个可构建各种应用(八大菜系)的跨平台的开源的开发平台。”
小黑继续展开解释道:“构建各种应用,说明.NET具有多面手的能力,好比班上的三好生,虽然在某个科目上无法做到最优秀,但是每一门功课几乎都没有短板。也就是说学好了.NET一种技术平台就可以应对各种商业场景的开发,这对中小团队是非常友好的。”
小飞不解的问:“为什么说对小团队非常友好?”
小黑:“你想,如果你用Java做Web开发,后续做桌面开发怎么办?Java在桌面端开发是没有优势的,如果你用Dart开发移动端,后续想做物联网开发怎么办?这对中小企业是很不友好的,因为他们不可能像大企业那样,为了极致的选型,可以养一批不同技术栈的人员。”
小飞琢磨了一下,好像是这么回事。
.NET发展和规划
小飞对.NET的发展不是很感兴趣,但是从事.NET技术开发又撇不开它,所以索性就去请教了前辈小黑。
小黑给了他一张版本演化图:
“你看到什么规律了没?”
小黑认真的回复到:“从以下.NET Core发展历史,我们可以看到它的发展的进度非常快,微软会每隔一年发布一个版本,有时候还不止一个,注意看,版本号为奇数的是普通版本,版本号为偶数的为长期支持版本(LTS),我们要关注LTS版本,一般长期支持时间为三年,所以我们选型版本的时候尽量以LTS版本为准”。
“原来如此,还是有一点讲究在里面啊。”
在小飞感叹的时候,小黑继续叨叨:“在未来.NET只有一个平台,就是现在.NET Core演化过去的.NET,而不会有.NET Framework的版本,.NET Core会在.NET 5.0这个版本上对新旧版本进行统一,所以未来从.NET 5.0到7.0都会叫.NET而不是叫.NET Core,而且统一名称后,微软会定义在每年的11月份进行新版本发布。”
“不知道你留意没有,这里为什么没有4.0的版本?”小黑故意停顿了一下。
“是啊,我刚才没有注意看,确实版本号有断档。”小飞挠了挠头。
“原因是当前.NET Framework为4.8版本,所以二者如果要融合的话,就不能起一个版本冲突的4.X的名字。”
“明白,非常感谢!”,小飞对.NET的历史和未来有了更加深刻的理解。
ASP.NET Core的特点
聊了.NET的前世今生,小飞若有所获,但是对ASP.NET这个家伙,有点迷惑,到底什么是ASP.NET呢?
小飞故意查了一下ASP的全称,ASP(Activity Server Page活动服务器网页),回想之前看到的ML.NET和Azure.NET,小飞若有所思:ASP.NET应该就是用来开发Web应用的子框架了。
就在小飞得意之时,小黑突然微弱地问了一句:“你知道ASP.NET和ASP.NET Core有什么区别吗?”
“卡壳中……”
小黑像个布道师一样继续说道:“别看他们二者很像,其实骨子里是两套完全不同的设计框架。除了性能提高之外,关键是新架构采用了组件化的设计理念。”
“组件化是个好东西,而且也听得多了,但是这里的组件化具体是什么意思,为什么要组件化呢?”小飞发现自己对ASP.NET Core的认知还很肤浅,小黑的话给了他很多触发,也产生了更多的疑问。
小黑解释道:“组件化借鉴的是乐高思想,它的核心是复用。比如,我们可以用有限的乐高组件拼装出各种栩栩如生的玩具。同样,我们可以复用ASP.NET的组件,比如依赖注入、配置框架、选项框架、日志框架、HTTP中间件等,像流水线一样拼装出各种我们想要的Web应用,这里有个高大上的名称叫控制反转,扯得有点远,我们后面再聊。”
“嗯,你的比喻非常形象,乐高确实有很强的复用性。而且,我看每个小孩几乎都会玩,而且可以无限扩展。”
“是的,组件化还有易扩展的特点,不知道你发现了没有,小孩玩乐高是越玩越得心应手,一旦你对ASP.NET的各个组件熟悉之后,我相信你也可以快速生产各种应用了。”
小飞在心中默默的念叨:ASP.NET Core、乐高、易复用、易扩展。
小黑又进一步问道:“好的框架,除了以上,还应该具备哪些特点吗?”
小飞脑子又嗡嗡起来:“这可是架构师要考虑的,我无论如何也想不出来啊。我只知道以前很多人选择Java都说因为Java跨平台。现在很多钟情Go,因为容器化、易部署。”
“对了,你说出了两个很重要的关键词,跨平台、易部署,这个.NET也考虑到了。”
小黑很兴奋,声音有点大。
“虽然微软的开源来得有点晚,很多人对他的过往独裁有成见,但这次开源确实也是很给力,C#也已经摆脱Windows系统的限制,不但支持Mac OS和Linux,而且对容器化(Docker),微服务、容器编排(Kubernetes)等技术的支持非常友好,这很好地顺应了云原生的未来趋势。”
很多新概念在小飞的脑袋开始延伸开来……
“为什么微服务和容器化关系这么密切,我经常听别人把这两者放在一起?”
小黑:“你可以这么思考,一旦服务的数量扩大为成百上千后会怎么样?”
小飞:“这么多的服务,部署和运维会让人抓狂吧?”
小黑:“对的,易部署和易运维也是ASP.NET Core的重要特点。”
一个新框架的诞生想不到背后有这么多的设计理念,小飞继续在心中念叨一遍:ASP.NET Core、乐高、易复用、易扩展、跨平台、易部署、易运维。
“小飞,别忘了,新架构如果性能不够优异,其他的指标再好也没人用的。”
“是哦,我经常听老的.NET程序员聊过旧版ASP.NET首次加载很慢,不知道这次全新改版性能怎样?”
“微软在设计早期就将性能列为其重要的目标之一,根据性能测试网站Tech Empower的最新数据(Round18 2019-07-09),ASP.NET Core在云服务器规格下(Azure D3v2 instances)的Plaintext响应测试可达215 941次/秒,JSON序列化响应测试可达52 623次/秒,表现非常亮眼。”
小飞对测试数据没有什么感觉,但是感觉好像很快的样子,小飞在脑子里对这些特点画了一幅脑图:
“小飞,你这幅脑图应该再加一个圈,里面填上…的省略号,他可不仅仅只有这些能力,很多内容我也没用过呢。”
“还能有什么能力,我感觉上面这些已经很高大上了啊?”
“我把其他的能力也列在下面,你可以看看。”
编后语:
作者的腾讯课堂《.NET Core入门和实战》系列课程持续更新中,感谢您的捧场。