Eric Nelson谈VS 2010和.NET 4.0

个人简介 Eric Nelson在英国微软工作了12年了,在此之前他是一位Unix开发人员,使用C和其它第4代语言。目前他隶属于微软Partner Group,负责与ISV的合作。他的Blog是http://blogs.msdn.com/ericnel。

QCon全球企业开发大会(QCon Enterprise Software Development Conference)是由C4Media媒体集团InfoQ网站主办的全球顶级技术盛会,每年在伦敦和旧金山、北京、东京召开。

   

1. 我是Ryan Slobojan,这位是微软的Eric Nelson。你好Eric,能谈谈.NET 4.0和Visual Studio 2010有哪些新功能么?

在.NET 4.0中,有两个方面我比较关注。一个是Parallel和相关的扩展,另一个则是Entity Framework以及它将拥有的特性。(.NET 4.0)是一次较大的发布,这对我们来说是个考验。我们在UK的团队只有3个人,我们需要研究(.NET 4.0中的)技术,考虑如何与这些技术的早期使用者合作,我们有太多的事要干了。但是每个团队还是尽可能在.NET 4.0中多发布一些东西。

我们在语言方面做了很多工作,以便可以更容易的用VB.NET和C#做同样的工作。我们在dynamic方面也做了很多,让这些(静态)语言能够更好的与动态语言和COM组件进行交互。除此之外还有其它语言方面的好东西,我们加入了另一种语言,也就是F#。这样我们就有VB.NET、C#和F#三种语言了。

在语言之外,我们还在工作流方面下了功夫,我们正在开发新的版本,它将使我们处理工作流的方式和使用的工具得到改进。我们也在SharePoint方面做了工作,如果你是一个SharePoint的开发人员,你可能正在留意开发工具,期望着Visual Studio 2010会有重大的改进,这其中最容易被发现的(改进)是开发体验。我们正在用WPF重写Visual Studio 2010的编辑器。我们必须非常小心,确保我们是在添加非常重要的东西,因为编辑器是否能够在很长的一段时间里保持稳定对我们来说是非常重要的,然后我们会慢慢习惯使用它然后说“我们就这样做,扔掉旧的编辑器,换一个新的”。

我正在使用一些内部的构建版本,目前版本中的编辑器非常难用-当然这只是内部版本-但是我可以看到它最终会解决什么问题。通过使用WPF,微软和他的合作伙伴可以为Visual Studio构建插件,使编辑器有完全不一样的视觉效果。如果你需要我可以举个例子:比如用图案来表示类。如果你所有的类都遵循某种命名规范,以动物名开头作为类名,并且你希望在编辑器中能够将类显示为动物(的图案),你可以做到,这是旧编辑器无法实现的。

当然这是很怪异的需求。但是显然我们希望人们做一些更简单有趣而且有用的东西。想象一下,如果你正在处理XML schema或者注释,我们可以通过使用WPF来渲染设计器,以一种完全不同的视觉形式来表现。这真的是一个很重要的发布版本,包含非常多的东西。就像我前面说的,Parallel和Entity Framework是我目前最关注的部分,接下来的是Workflow。WF是.NET 3.0的重要部分,我们在.NET 3.5中又做了一些(改进),在.NET 3.5 SP1中只做了很少(的改进)。而在.NET 4.0中,我们从早期的使用者获得了很多反馈。他们说“我们很喜欢现在的方式,但是对于我们来说大规模的使用还有一些问题。你们能否再看一下你们是如何实现(WF)的?” 这就是我们团队已经完成的事情之一。

他们对初期的结果非常满意,目前在内部使用(WF)很有趣,因为各个团队处在不同的开发阶段。有些部分很成熟,甚至明天就可以发布,但是有些部分还需要进一步探索才知道什么是最好的方式——太多的事了。

   

2. 你刚才提到了VB,我记得我听说过VB与C#和Java这样有大括号的语言不在一个级别上。你觉得呢?

我有很深的带分号语言(以分号结束一行的语言)的背景,我有C语言背景。再往前我曾经用过很多编程语言,只要是项目需要的都用。我曾经也用了C#很长时间,后来在去年七月我决定换到VB.NET,那时我已经离开开发工作很久了,我想我没赶上C#2.0和3.0,为什么不回来开始用VB.NET呢?

这对我来说这很有趣,我开始发现很多用VB.NET做的项目,与其它人在一起,看看我们身在何处。在UK有很多VB.NET开发人员。在微软,我们主要讨论C#,我们几乎100%的时间都在讨论C#。如果我们举办一个活动、会议或者写博客,我们都用C#。但是VB.NET的用户数至少是C#的一半,在某些行业甚至是一半一半,我们有大量的VB.NET开发人员。其中的原因是你可以用VB.NET创建与C#同样功能的应用程序。

不过尽管这两种语言都跑在CLR上,但却是由不同的团队开发的,而且在微软内部还存在着激烈的竞争。这些团队用不同的方式做不同的事。难点在于,当C#团队先于VB团队引入了一些特性时,如果你选择一个使用这些特性的框架或者示例,VB.NET的开发人员就会抱怨,我们就要想一些解决的办法了。

在C#里有很多事VB.NET也可以做,但是需要用不同的方法,例如lambda、匿名方法。

在VB.NET 9也就是VB 2008中,我们没有办法那样做。在.NET 4.0中我们做了改变,在十月的PDC上我们谈到了称之为语言互进化的东西,通过它这两种语言能够在同一时刻做同样的事。

在VB.NET中有很多东西比用C#实现得更好,比如COM互操作和动态类型。由于VB.NET(在这些方面)比C#好很多,因此C#团队正在从 VB.NET团队引入这些东西,同时VB.NET团队也在从C#团队引入C#的东西。当我们可以仅仅通过更改语法就可以将程序改成另一种语言来运行时,这两种语言就几乎等价了。不过我们还没法马上就实现它,这也是一件好事。VB团队正在做其它的一些事,但是互进化是我们目前的工作目标。

   

3. 你还提到了F#会成为.NET 4.0的一部分,它也会是互进化的一部分么?它也会有同样的特性集么?

F#对我来说有点特别,我看过演示,也看到过开发人员使用,但是我自己从来没在项目中尝试使用过。F#是一种与VB.NET和C#完全不同的语言。当函数式编程开始在UK的金融行业流行的时候,我注意到这一点。互进化很大程度上只是针对VB.NET和C#来说的。F#是个新事物,我不知道在创建应用方面有什么不同。它能创建(和VB.NET与C#)相同类型的应用程序么?我认为可以,但这不是我关注的地方。

   

4. 在.NET 4.0以后的版本中有哪些特性是你所期望的?你认为这些特性应该集中在哪些方面?

有很多,首先我觉得产品团队要把(特性)列表上的都做出来。如果你和产品团队的任何人谈论他们在.NET 4.0会发布什么,会发现他们已经有了一个长长的列表,上面都是无法在.NET 4.0发布的东西。如果你和任何Entity Framework团队的人谈论他们在ORM或者SQL Server方面的工作,他们会说“我们正在给.NET 4.0添加50个伟大的特性,但是我们的列表上还有150个呢”。

他们有很多想要实现的东西需要完成。同样的情况也发生在Parallel团队——他们正精力集中在第一个发布版本上——他们已经有了一个不错的列表,列出了他们想要添加的功能。每个团队都确定“这就是我希望添加的东西”。以个人角度来说,我希望看到的是Parallel和语言的集成。

他们实现的方式很有意思。当你往某些东西比如框架中添加新技术时,你可以将它作为库,可以将它作为语言的扩展来使用库,也可以将它作为语言的扩展来自动生成一些的代码。如果你使用的是类似于LINQ的东西,那就是语言扩展。这意味着当C#团队实现了语言扩展后,VB.NET团队也必须实现这个扩展,如果你用的是另外一种语言,那么就没有这个扩展了。

LINQ只在VB.NET和C#中能工作的很好。至于Parallel,他们决定使之成为一个库,我喜欢这个决定,因为这样一来所有.NET语言都能使用 Parallel。如果你想要发挥多核的能力,只要使用.NET 4.0的Parallel就行了,你可以在任何.NET语言中使用。不过使用一个库怎么都会觉得不够顺畅。我希望在.NET 4.0之后的版本中,这个库能够成为语言的一部分。

.NET 4.0包含了VB 10.0和C# 4.0,让我们再来看看VB 11.0和C#5.0,看看Parallel作为语言的扩展。实际上VB团队已经开始讨论一个叫做并发Basic的东西,这是一个研究项目,他们将这个项目放到了Channel9上,并且说“看看我们现在在做什么:我们在研究语言的扩展,这不会包含在.NET 4.0中,可能永远也不会发布,但是先看一看,给我们一些反馈”。他们扩展语言的方式看起来真的很不错。我不想再考虑什么库了,我希望新东西,我希望有语言扩展。

   

5. 你刚刚提到了在.NET 4.0中将要到来的Parallel Library,可以更详细的谈一谈么?

在过去的12个月里,我对Parallel以及它的组成部分越来越感兴趣。当我想到Parallel,我想到的是“我希望在同一时间同时运行2部分代码,因为我有不止一个核(的CPU)”。如果你有一个这屋子里的那种笔记本,你可能就已经有了双核。如果我明年买笔记本,可能会是4核的,而且可能还有超线程。这样我就有8个虚拟核。然后你就会想“作为一个开发人员,如何让我的应用程序利用多核技术”。

这里有些事需要考虑:“操作系统能够使用8个核么?Windows能么?” -当然!Windows已经能运行在64核上了,所以Windows没问题。“.NET Framework运行时可以么?” -可以,它的架构支持多核。“.NET Framework的服务器端库可以么?” - 可以,因为它是服务器端技术,架构上已经支持多核了。

但是.NET Framework其余的绝大部分都被设计为只支持单核,里面的注释都类似于“只工作在单核上,只支持单线程,如果你同时用它做两件事,就会出问题”。我认识的大多数开发人员都不写任何并发的程序,坦白地说,原因就是每年我们都有更快的计算机来运行单线程程序,5年前写的代码,今天可以运行的很快。

看看AMD和Intel正在做什么吧,他们下一代CPU的频率会和现在一样。事实上他们还考虑让CPU运行的慢一些,这样就能在一个CPU上多放几个核了。作为开发人员,我们需要更多的考虑多线程和多核,那真的很难。不管你是用VB.NET还是C#,或者是其它的编程语言,多线程是非常难的。

我们在.NET 4.0中做了一些工作,以便让多线程编程变得更容易。现在,如果你为多核写程序,你会在线程级思考,你会想如何让你的程序在多线程环境下运行。这样做的问题在于,同时思考如何分解你的应用程序和如何调度处理器上的线程并不是一件容易的事。我们需要将如何分解程序与线程数目的联系断开。

我们可能正在写一个程序,然后想“我觉得有1000件事可能同时发生,但是我只有4个核(的CPU)”。事实上,如果这些事都是与CPU绑定的,我只希望有4个线程。我有1000件事,我只有4个线程,这太难了。尝试在4核CPU上跑1000个线程不是个好主意。每个线程会占用1MB的内存,线程切换也需要资源,这不好。因此我们引入了Task(任务)这个新事物。.NET4.0引入了Task Parallel Library,其中包含了一种新的类型Task,你可以创建Task的实例,最后CLR的线程池会在线程上运行这些实例,你可以创建5千个任务,如果你想也可以创建1万个或者2万个。

最终,CLR线程池会执行正确的操作,让这些任务运行在线程中。对开发人员来说,任务比线程更强大。我们可以用父任务和子任务来定义任务之间的关系,我们可以从父任务向子任务传递错误信息或者反之,我们可以用返回值传递——太多的事是线程无法实现的。

在这之上,我们添加了Parallel.ForAll、Parallel.ForEach和Parallel.Invoke这样的方法,从名字上很容易理解他们的用途,这也是你所希望的。如果你有28个方法,你希望它们并行执行,使用Parallel.Invoke来调用这些方法,它们就会并行执行。

在内部,我们加入了一些并发数据结构,因为很多集合类(collection)和字典类(dictionary)以及列表类(list)都不是线程安全的,因此我们需要某种方式来让多个线程可以同时访问。当一个线程遍历列表的时候,另一个线程在第一个线程遍历到之前,改变了列表的值,这意味着什么?这就是我们正在做的数据结构。

我们有很多托管方面的工作,我今天已经提到了Task Parallel Library。如果你是一个C++本地代码开发人员,还有另一个针对C++的版本。我再多说一点,如果你已经有了这个并行库,你就有了 Parallel.ForAll和Parallel.ForEach,你也有了并发数据结构,我们还有一些C#和C++团队加入到Framework中的基本消息类型。

   

6. 你刚刚还提到了Parallel也有LINQ,有办法把他们合在一起么?

可以,开发团队已经在Task Paralle Library中做了很多工作,比如用任务代替线程,他们还在实现Parallel LINQ,这很令人震撼。在用LINQ to Objects——而不是LINQ to SQL,这是数据库服务器的任务——的时候,只要在代码上做出一点改动,就可以让你的代码并行的运行在多核处理器上,非常的简单。

你可以先构造一个查询如from O in objects...where...select然后在代码上加上一点修饰,你就得到了完全不同的代码,那就是Parallel LINQ。一般来说这样做对LINQ to Objects并不会有副作用。但是你要小心。默认情况下,返回结果的顺序可能会与非并行执行不同,但是你也可以强制他们有相同的顺序。如果你用LINQ 来访问目录结构,如果你用了单线程,你可能会得到一个确定的排序结果,如果你用了Parallel LINQ,结果可能就会有不同的顺序。你也可以强制排序,你可以说“我要Parallel LINQ,但是保持排序好么?”。我们还没全部实现,但是已经有进步了。

   

7. 你刚刚谈到了将要到来的F#,以及VB.NET和C#,你还提了一下C++,是不是有点跑题?

问的好,我有淡忘C++的倾向,这很不好,有非常多我合作过的公司仍然有大量的C++开发工作在进行。C++仍然保持强势。公平的说,我们有点忽视在 C++上的投入了,但是我们开始在Visual Studio 2008上做出改变,C++团队开始更多的谈论“我们要加入所有这些功能,我们要加入所有这些特性”。它们已经为Visual Studio 2010和.NET 4.0列了一个长长的列表。例如我们前面提到的Parallel,他们能比托管开发人员做的更多。

相比C#和VB.NET,Parallel对于C++开发人员有更多的功能。C++仍然是一个非常流行的语言,尤其在金融行业,那里有很多C++开发工作。如果我们调查一下UK,C++开发人员所占的比例相对较低——大概10%至15%——但是仍然是一个庞大的群体。我们在Visual Studio 2010中添加的功能会给你深刻的印象,这是相当大的投入。

   

8. 云计算到底是什么?

我接触这方面的工作已经3、4年了,主要是与ISV一起工作。伴随着SaS(Software as Service)、Salesforce、NetSuite的出现,人们开始谈论在云中按需运行程序。就是从那时起,我开始关注这些事情,比如我的计算器程序,我想让它运行在互联网上的某个地方,确切地说是在其它某个人的机器上,并将计算结果存储在那里。

虽然云对商业的影响很复杂,但是对我来说,它只是一个简单的东西:在其它其个人的机器上进行计算和存储。观察各公司如何处理这个潜在变化是很有趣的。如果你是一个传统的ISV,那么现在就要面临一些使用云技术的竞争对手,它们会在几分钟内将产品发布到用户手里。试试我们的云吧,切换到上面,现在就可以。

有一种传统的观念,你需要2周的时间来发布产品。但是从纯技术的角度,我希望能有一种方式让我可以在别人的机器上运行代码并存储结果。某种程度上,这比使用自己的服务器和数据中心更有吸引力。3、4年前,我们花了很多时间来写一些指导文档,来帮助那些使用Windows进行开发的公司理解,如何才能够从云中获利,但是在2年前,我们做了重大的改变,开始构建云计算服务。

我尝试的第一个云技术是SQL Server Data Services(SSDS),那是在2008年的3月,它可以将数据存储在云中。这是微软为开发人员开发的服务,相比微软其它已有的云服务——如 XBox Live、Live Meeting——我更愿意使用SSDS。这就是我的第一次,后来在同年10月,我们在PDC上宣布了Azure服务平台。

   

9. 能更多谈谈Azure么?

Azure服务平台很庞大,我认为我们在10月份(PDC)做的不错,我们探讨了不同的技术,这些技术来自于不同的产品组。我们尽量消除大家的疑惑,但是不可避免仍有一些存在,现在我希望能够消除这些疑惑。Azure服务平台实际上是一个标志,它让我们能够在一个地方,将真正对开发人员有用的服务集成在一起。我们会绘制一个Azure服务平台的边界,在里面你可以单独使用某些服务,也可以将它们结合到一起使用。

如果你看一下Azure服务平台的示意图,你会发现一个叫Windows Azure的东西,它和Azure服务平台不是一回事。我们喜欢将云称为Azure操作系统,因为它是构建在Windows Server技术上的,而且也的确使用了Windows Server。作为一个开发人员,如果我想在基于Windows Azure的云中运行某些代码,它就会施展魔法让程序具有高度可用性、高度可扩展性、保存我的数据并可以让我用多种方式访问数据。

它会为我做所有的事,帮我记录日志、提供跟踪信息、让我控制验证和授权。这些都是与操作系统打交道的事,它让我无须考虑我的程序实际上是运行在多个 Windows Server节点上的,它包装了Windows Server。Windows Azure让我能够在云中构建ASP.NET程序,不管是传统的web forms还是MVC。

我可以简单的将已经构建好的ASP.NET程序放在里面,它就可以工作的很好。数据存储方面也很有意思,如果我构建一个传统的程序,我需要使用SQL Server、Oracle或者DB2,我需要和关系数据库打交道,我需要用ADO.NET来实现。当我说“我想要它运行在Windows Azure中”时,我会使用Windows Azure Storage。它不是关系型的,甚至完全不同。它是RESTful的,所以我会进入HTTP和get/post/put/delete的世界。

我需要做一些大的改变来让程序的数据访问代码可以访问关系型数据,然后重写它来支持Windows Azure Storage。这不是无法解决的问题,有很多成功的例子显示,可以将已有的使用关系数据库的ASP.NET程序移植到非关系型数据存储中,但是仍然有很多工作要做。你的程序越复杂,越需要关系型数据存储。

Windows Azure是我们的操作系统,并且有它自己的存储方式,但是后来我们又有了SQL Data Services。一开始它叫SQL Server Data Services,后来在10月份我们给它改了名,以显示它支持关系型数据存储。我们用了1年左右的时间发布了CTP版本,并得到了非常多的反馈。很多人喜欢自己做所有的东西,他们会说“我喜欢这样,我知道它是如何扩展的,我知道它是半关系型的,但只要能让我添加一些特性就足够了”。

但是,如果你是一个公司或者有一个依赖于关系数据库的应用时,你看到SQL Data Services时会说“我希望它能在关系数据上做的更多,我希望它能够做关系数据库管理系统能做的事”。就在上周,我们发布了修改后的SQL Data Services,现在它是云中的一个完全关系型数据引擎。我们会在SQL Data Services中使用Transact SQL,就是SQL Server中的Transact SQL,你可以使用存储过程、触发器、视图,但是有些功能不能使用。虽然你不能做所有在SQL Server上能做的事,但是可以做大部分。

这意味着,作为一个开发人员,我可以使用Windows Azure来作为我执行代码的地方,ASP.NET、VB.NET、C#等等。对于存储,我可以使用Windows Azure Storage和SQL Data Services,具体使用哪一个取决于我要做什么。除了这些还有很多其它的服务,比如.NET Services、Live Services,我们还可以使用Dynamics和SharePoint相关的服务。对于我和我们已经完成的工作来说,这就是“在云中计算,在云中存储”,这就是Windows Azure和SQL Data Services。

   

10. Azure和市场上其它云服务相比有什么不同,例如Amazon?

我们走了完全不同的路线。Amazon非常成功,很多公司和个人可以使用它做一些仅靠自己难以实现的事,你需要有很多钱才能做到同样的事。但我们用了完全不同的方式。Amazon S3是最强大的存储方案,但也只是用一个Key和一点元数据来标示存储的对象。 “我只是想要存储些东西,我有一个key可以让我将他们取回来,并且还有一点点元数据来描述”,这与关系(数据库)差的还很远。

虽然我们的存储方案——Windows Azure Storage——也是基于这种方式的。但是Windows Azure Storage内建支持队列、大对象和表。在Windows Azure Storage中你可以说“我想要一个表,表里有一些列,我想将数据存在里面”,然后你就可以在里面做查询。我们不用SQL语法,但是你可以用它来查询。如果你要存储大对象,你可以存储非常大的对象。如果你想存储50GB的对象,你可以直接存到里面,也可以存成多个块,但是最终你会有50GB。我们还有队列,我们可以很容易将东西放进去,然后在另一端将它作为列表做些工作,这也是Windows Azure的一部分。

即使是在基础层面,它也比Amazon S3提供了更多的功能。SQL Data Services提供了完全的关系模型。有些人会说Amazon SimpleDB也支持一些关系模型。但是它有很多限制,存储的只能是字符串,当你想要将存储的数据取回来时,它会返回250个块,而且只有250个。我们没有这些限制,Windows Azure Storage有数据类型,虽然没有你希望的那么多,但是SQL Data Services确实有很多类型。

我们支持任何SQL Server拥有的类型,除了自定义类型,也就是CLR类型。所以我们没有CLR集成。在数据存储层,我们有很多东西可以让开发人员使用起来更简单,“我想创建非常复杂的程序,而且有非常多的数据”。在计算部分,如果我想在云中构造一个计算器,Amazon有一个简单有效的模型,“我们提供给你一个虚拟机”然后“这就是你的虚拟机,在虚拟机上你可以跑一般的程序,做什么都行。”

但这只是一个或一些虚拟机。我们在Windows Server上还做了大量的抽象。Azure团队开发了Hyper-V,因为他们知道你想要用虚拟化技术做什么,从开发人员的角度使用它不会让你感觉是在部署一个虚拟机。我可以构建程序然后说“这就是我的web程序”,我会创建一个web项目,写些代码,做XML配置然后说“可以帮我运行25个实例么?”,Azure就会分配一些虚拟机来做这件事。

但是从开发人员的角度来看,这就像是部署在一个平台上,而不是管理25个虚拟机或者是用某些工具。这就像是云中运行着一个操作系统,为我们简化了很多工作。我们已经知道了人们想要做什么,并且在实现上有了很多经验,我们只是试图让这一切尽量简单,能够帮助开发人员将程序尽快运行起来。

另一方面,这与在自己的计算机上写一个ASP.NET程序是不同的方式。我们可以说大多数是相同的,但不是完全相同。你无法写那些依赖文件系统的东西,如果你需要保存数据,应该用Azure storage或者是SQL Data Services,我们一直在写一个指导文档来说明这些。

你可能感兴趣的:(Eric Nelson谈VS 2010和.NET 4.0)