专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,他所创办的Wintellect公司与微软有密切的合作关系,他本人也为微软的.NET框架贡献良多。

2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

InfoQ:从一开始,Windows开发基础知识就一直是您的书的重点。在您看来,哪些最重要、最根本的知识是每个开发人员都应该掌握的?

Jeffrey Richter:我想,了解你的应用构建于其上的系统,这很重要,也令人兴奋。内存管理很重 要,线程也比较重要,还有错误和异常处理,这些都是软件开发人员每天都要用的东西。如何构建组件,并把这些组件组合在一起,让它们互相之间互相操作,这些 我想都是应该掌握的很重要的理念。当.NET刚刚出现的时候,我就是去了解.NET里面这些相关的概念。

InfoQ:您与微软的关系很密切,您是不是曾为微软工作过?

Jeffrey Richter:我得说我不是微软的雇员。不过微软的技术我是用了很多年了,大概从1980年开始,到现在有32年了吧。我在过去的20年一直在给微软提供咨询服务。

Windows 8是微软的“重中之重”

InfoQ:您如何评论微软在Window 8上的投入?

Jeffrey Richter:过去这几年,显而易见的是:人们喜欢移动计算设备。比如Apple的 iPhone、iPad,配置了Android操作系统的手机等等,人们喜欢这些东西。微软在这些技术领域是落后了,然而至关重要的一点是:微软在 Windows 8上投入巨资,为人们提供微软技术相关的移动计算设备,让人们利用自己已有的微软信息资产。我个人对于Windows 8兴奋异常,我认为微软真的在上面做了很多很不错的东西。从纯技术层面讲,其中的技术是很有竞争力的。但我也认为还有很多东西需要到位,比如好的硬件厂 商、合理硬件的价格,还有基于其上构建的应用等等。还有很长的路要走。不过我认为微软现在有一个很好的开始。

不能说是整个公司的资源,但这对于微软来说,确实是重中之重。如果Windows 8不能成功,在面对竞争对手时如果败下阵来,那我想微软一定会深受其害。

InfoQ:那么这对于开发人员来说意味着什么呢?

Jeffrey Richter:对于开发人员,这等于多了一种移动计算设备的出色选择,而且是运行微软操作系 统的。对于已经在C#、Visual Basic等微软相关技术上投入很多的开发人员,他们知道Windows的运行机制,可以把自己已经有的知识应用起来。Windows 8还支持HTML和JavaScript,掌握这些技术的人也可以利用Windows 8来开发应用。

与硬件直接通信是WinRT的主要特性

InfoQ:那么说到在Windows 8和WinRT下的编程,最大的优势、或者说最重要的特性有哪些?

Jeffrey Richter:WinRT学习和使用起来都很简单。它主要的特性,是允许应用直接与底层硬件 通信,这不是操作系统做的事情。操作系统是要抽象硬件设备,并把这些抽象提供给应用开发人员。Windows 8和WinRT能够与很多种硬件通信,包括多种显示器、鼠标、重力感应计、陀螺仪、键盘等等,当然还有触碰设备,这是它们主要针对的对象。应用开发人员可 以使用WinRT API,与多种不同品牌的硬件通信,这些硬件不久之后就将面市。它们还能让人们利用已有的、在Windows上的很多投资,其中已经内建了文件系统支持、 网络支持。WinRT的API的确简化了这些方面的操作,让人们可以用多种语言编程,不像iOS,只能使用Objective-C,Android也主要 针对Java开发人员。JavaScript开发人员、C/C++开发人员、.NET开发人员都可以使用WinRT。它的编程范式对这些语言的开发人员来 说都很简单。

InfoQ:知道如何开发.NET应用的开发人员们是不是也能在WinRT下开发?

Jeffrey Richter:当然,开发语言是完全一样的。C#和Visual Basic没有变化,.NET的核心部分也是一样的,对象啊、字符串啊、异常处理啊,这些都一样。但是在Metro应用中,一大部分.NET的框架库不能 用了。我要说明的是:Windows 8同时支持Metro应用和以往的应用。微软主推的是Metro应用,也就是在移动设备上的触碰优先应用。如果开发人员选择这条路线,他们可以利用自己已 有的很多知识,有些库不能用了,但是可以使用WinRT中的库。

InfoQ:有人说WinRT的性能要相对好一些, 那么如何使用WinRT开发高性能应用?

Jeffrey Richter:我不确定性能是否是Window8和WinRT的主要目标。客户端应用和触碰 应用针对的是消费者,计算设备只要比使用它的人的速度快就好了。我们关心性能的场景,是针对可扩展的服务器端应用。我想说,Metro应用在 Windows 8下用起来感觉是快了一些,因为Window 8会中止没有在后台运行的应用,相关的线程也就不再运行了,所有的计算资源都提供给了前台运行的应用。用户会觉得应用的响应很快,微软用的词汇是“快速而 且流畅”,当你触碰和滚动屏幕的时候反应快速,随着你的手指的运动滚动屏幕,没有延迟感。

InfoQ:与iPhone对比呢?

Jeffrey Richter:与iPhone对比一下的话,iPhone在这方面当然做的也不错,微软试图与其竞争。很难说哪个更好或是更快,因为这取决于运行的硬件。Apple完全控制硬件,微软选择与其他硬件厂商合作,自己不做硬件,所以会有很多种硬件。

InfoQ:有些移动开发人员说,要想得到很好的动画性能表现,就必须要从底层代码写起,而不是使用现有的程序库,那么在Windows 8下面是不是也是这样?

Jeffrey Richter:要说高性能的Metro应用,主要应该是游戏了。要是开发游戏,微软鼓励大家 使用C和C++作为开发语言,并使用DirectX支持图像硬件处理,要说到库,互联网上有一些库,就是用C++开发的。可以直接把这些库拿过来,集成到 自己的应用里,使用其中的物理引擎之类的东西来控制比如飞到空中的球、掉在地上的盒子等等。

InfoQ:那么在Windows 8和WinRT中使用这些库不会有兼容性问题吗?

Jeffrey Richter:对于现有的这些库是支持的。

创业公司现在就可以开始学习Window 8

InfoQ:对于创业公司来说,开发人员何时应该拥抱Window 8呢?

Jeffrey Richter:我想现在就可以开始学了,我也一直在学。大家现在可以开发一些应用,然后放到 应用商店里面去。Window 8当然也需要一些时间才能起来,现在的目标是在2月中旬交付Beta版本,正式版可能要在今年年底才能交付。那时可能就有可用的硬件了,消费者到时候就可 以买到预装了Window 8的设备,企业和公司的用户可能还要一到两年。因此要看你想开发哪些类型的应用。对于创业公司,如果是游戏公司,我觉得现在就是好时机,因为现在市场还很 小,没有多少竞争对手,技术也比较成熟、稳定,这么做应该会不错的体验。

InfoQ:那么对于已经使用过去的.NET平台开发了产品的公司呢?

Jeffrey Richter:对他们来说就是个挑战了。他们也可以不管这些,让应用直接在Window 8上运行,因为Windows 8对更早版本的Windows应用保证100%的向后兼容性。如果出于商业原因,要将应用移植到Metro上,这也是他们的决策。如果认为其他人希望拿着 移动设备而不是笔记本电脑走来走去,投资开发Metro版本的产品也是值得的。不过我觉得这种类型的现在切入就有点早了。

InfoQ:那么Windows 8和Kinect会有什么联系吗?人们都非常喜欢Kinect。

Jeffrey Richter:Kinect的Windows版本在接下来的一两个月就会交付了。Windows 8当然支持,同时还有SDK,大家现在就可以下载Beta版本,使用Kinect作为输入设备,Window 8会提供完全支持。

异步处理线程对服务器端开发非常重要

InfoQ:您曾经提过,异步处理在服务器端开发中非常重要,能否解释一下原因?

Jeffrey Richter:从我的经验看来,很多开发人员没有认识到:线程是非常宝贵的资源,一个线程一 般要占用1M内存,通常还要更多。创建和销毁线程也会占用很多CPU资源,当线程要运行时,Windows还要在它们之间联系,交换处理线程也会影响性 能。很多人在创建服务器端应用时,每当来一个客户端的请求,他们就会创建一个线程,并用这个线程来处理请求。当这个线程进行某些操作时,比如访问数据库这 样的常见场景,或者是跟其他网站对话这样的常见场景,这个线程和它占用的所有资源就被阻塞了,除非数据库服务器或是网站服务器有回应,它什么都做不了。如 果这段时间内,有更多客户端请求进入,系统就会不断创建越来越多的线程,结果就是一个服务拥有很多个线程,占用了很多内存,但是CPU使用率非常低,因为 处于阻塞的线程们在等待其他服务器或数据库的回复。因此你的服务很难扩展。如果再进入足够多客户端请求,最终会出现异常,导致服务崩溃,再重启,就无法回 复之前那些请求了。

这就是异步处理之所以重要的原因。

其背后的机制是:客户向服务器发出请求,一个线程开始处理某些东西,当它与另外的数据库或web服务器对话时,我们让这个线程变成异步的,它就不需 要等待另外服务器的回复,线程可以回到线程池,或者处理更多客户端请求。这就是说,现在服务器上的线程少多了,服务器可以同时处理几十万个请求,而只使用 少数一些线程。服务器也不会塞满线程,然后因为内存不足导致崩溃。因此,异步编程至关重要。

然而,在过去,开发人员做异步编程非常困难,因为编程模型不适合,你必须要写很多回调函数,或者不能使用局部变量做参数,等等限制让异步编程充满挑 战。不过,我跟微软一起工作,知道有个新的特性将会在下个版本的.NET中交付,使用对用户更加友好的编程模型,让异步编程会简单许多。

InfoQ:是“async”关键字么?

Jeffrey Richter:没错。async在C# 5.0和下个版本的Visual Basic中有,这也借助了我在过去5年中使用的技术,是我的Power Threading程序库的一部分,被称为AsyncEnumerator。世界上很多人和公司都用过它,也取得了很多成功。现在,微软把它加入到了.NET框架中,我也帮助做了集成。

InfoQ:您能否推荐一些好的异步编程框架?

Jeffrey Richter:我的Power Threading程序库就很棒啊,而且是免费的!:-) 我的AsyncEnumerator,还有跟它一起使用的SyncGate, 二者一起完成线程异步处理,不会阻塞任何线程。99%的时候,我会用这两个库。SyncGate是一个读写锁,但是不会阻塞任何线程。有了这两个,再加 上.NET 4.0中做并行计算的Tasks,这就是我每天用的东西。我用Tasks完成并行计算,AsyncEnumerator做异步操作,用SyncGate做 线程同步,来协调访问某些资源。从服务器端应用的架构要求来说,这三者已经足够大部分人完成很多事情了。

不要“过度架构”,不要重新发明安全机制

InfoQ:您能否就Windows编程在性能提供一些原则和建议?

Jeffrey Richter:我想可扩展性也很重要,现在我做很多服务器端开发,有时候可扩展性要比性能更 重要。服务器能否处理100个客户端的请求?1000个客户端呢?10万个客户端呢?一般来说,要想让某个服务可扩展,你得让它的性能表现稍微差一点,只 能是稍微差一点,性能也非常重要。再次强调,异步编程对于改善可扩展性很重要。

至于其他与性能相关的原则,我总是尽量写尽可能少、尽可能简单的代码,我总是试着不去“过度架构”我的系统。我为其他公司做咨询的过程中,很多时 候,我去看他们的代码,总是会发现他们存在“过度架构”的现象。很多时候,他们会想:我们猜想这块儿会很慢,得加入缓存系统,但是他们没有认识到:缓存会 占用很多内存。在Windows操作系统中,在内存量和速度上有很紧密的关系。很多人都知道:如果我的系统运行速度慢了,给服务器加更多内存就好了。但是 他们没有想到的是:如果系统占用的内存更少,运行的速度会提高,这也是很重要的。因此我看到很多人使用缓存,往内存里面放很多东西,他们这么做是想让系统 更快,实际上反而更慢了,因为用的内存更多了。但是他们付出的这些额外的努力,构建缓存,测试缓存,修复缓存代码中的bug,总的来说,反而让系统的质量 更差了。所以,不要“过度架构”你的系统。

因此,关于性能,还是要让代码尽可能简单,让代码工作起来再说。如果性能不好,就用一个profiler,去看看性能的热点出现在哪里,找到原因,再去解决问题。

如果有些地方对性能要求真得很高,不妨先写原生代码,然后跟其他C#代码放在一起,

InfoQ:那您能不能就安全性方面给些建议?

Jeffrey Richter:对于内存的安全,使用托管语言编程,比如.NET、Java,这对于防止内存崩溃、堆栈溢出之类的问题非常有帮助,可以事先排除很多现在的安全隐患。原生代码很容易破坏内存,带来安全方面的bug。

除此之外,我建议不要自己再设计一套安全机制,这一向是很糟糕的事情。使用业界已经使用了很长时间,而且经过检验的安全机制,比如证书、共享密钥, 也许可以用私有密钥,类似的算法,已有的哈希算法等等,这些都是好实践。已经有很多好的书籍和文章记录这些安全实践了,还有很多很好的框架,如果是我,一 定会把现有的这些安全实践整合到我的程序里面。

通过写书,我让世界变得更美好

InfoQ:大概7、8年前,我也曾是一名.NET开发人员,我那时读过您的《.NET框架程序设计》,这本书对我帮助很大。现 在,您又带来这两本新的著作,我想很多中国的Windows开发人员也会从中获益良多。我想知道:驱动您写出这么多深入而又经典的书籍的,是什么样的力 量?

Jeffrey Richter:我热爱技术,我自己也喜欢学习这些东西,而且我也喜欢与其他人分享我的发现。 这能帮助大家提升工作效率,改善生活质量。我认为,软件让我们的生活质量大为提升,做很多事情变得更容易,我带着我的笔记本电脑到处走,我使用智能手机, 用其中的GPS导航,搜索东西,这些确实提升了我的生活质量。 通过帮助其他人学习这些东西,他们能构建更多应用,也让我的生活质量提高了,还有其他人的生活也是。这让我觉得很受鼓舞,非常受鼓舞,我觉得我能帮助其他 人,并以此让世界变得更美好。

绝对不是为了钱,写书不能给我带来多少收入。我在中国遇到很多人,大家对我非常热情,他们总是在感谢我写的书,总愿意跟我合影,给他们签名,我在这 里总是觉得很受欢迎。在这里感觉真得很棒。能够感受到我给他们带来的影响,我所做的事情影响了他们的生活,这让我感动得说不出话来。


给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

This entry was posted in Best Practices. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s