专访Jeffrey Richter:Windows 8是微软的重中之重
fmms 13年前
<p> Jeffrey Richter 以其多本 Windows 核心技术的经典著作而闻名,同时,他深入掌握微软的 .NET 等一系列核心技术,他所创办的 <a href="/misc/goto?guid=4958328966086775642">Wintellect</a> 公司与微软有密切的合作关系,他本人也为微软的 .NET 框架贡献良多。</p> <p> 2012年 1 月,Jeffrey Richter 在北京接受了 InfoQ 中文站的专访,谈到 Windows 8 和 WinRT 编程,并就异步编程、Windows 编程中的可扩展性、性能和安全性方面给出自己的建议。</p> <p> <strong>InfoQ:从一开始,Windows 开发基础知识就一直是您的书的重点。在您看来,哪些最重要、最根本的知识是每个开发人员都应该掌握的?</strong></p> <p> <strong>Jeffrey Richter:</strong>我想,了解你的应用构建于其上的系统,这很重要,也令人兴奋。内存管理很重要,线程也比较重要,还有错误和异常处理,这些都是软件开发人员每天都要用的东西。如何构建组件,并把这些组件组合在一起,让它们互相之间互相操作,这些我想都是应该掌握的很重要的理念。当 .NET 刚刚出现的时候,我就是去了解 .NET 里面这些相关的概念。</p> <p> <strong>InfoQ:您与微软的关系很密切,您是不是曾为微软工作过?</strong></p> <p> <strong>Jeffrey Richter:</strong>我得说我不是微软的雇员。不过微软的技术我是用了很多年了,大概从 1980 年开始,到现在有 32 年了吧。我在过去的 20 年一直在给微软提供咨询服务。</p> <p> <strong>Windows 8 是微软的“重中之重”</strong></p> <p> <strong>InfoQ:您如何评论微软在 Window 8 上的投入?</strong></p> <p> <strong>Jeffrey Richter:</strong>过去这几年,显而易见的是:人们喜欢移动计算设备。比如 Apple 的 iPhone、iPad,配置了 Android 操作系统的手机等等,人们喜欢这些东西。微软在这些技术领域是落后了,然而至关重要的一点是:微软在 Windows 8 上投入巨资,为人们提供微软技术相关的移动计算设备,让人们利用自己已有的微软信息资产。我个人对于 Windows 8 兴奋异常,我认为微软真的在上面做了很多很不错的东西。从纯技术层面讲,其中的技术是很有竞争力的。但我也认为还有很多东西需要到位,比如好的硬件厂商、合理硬件的价格,还有基于其上构建的应用等等。还有很长的路要走。不过我认为微软现在有一个很好的开始。</p> <p> 不能说是整个公司的资源,但这对于微软来说,确实是重中之重。如果 Windows 8 不能成功,在面对竞争对手时如果败下阵来,那我想微软一定会深受其害。</p> <p> <strong>InfoQ:那么这对于开发人员来说意味着什么呢?</strong></p> <p> <strong>Jeffrey Richter:</strong>对于开发人员,这等于多了一种移动计算设备的出色选择,而且是运行微软操作系统的。对于已经在C#、Visual Basic 等微软相关技术上投入很多的开发人员,他们知道 Windows 的运行机制,可以把自己已经有的知识应用起来。Windows 8 还支持 HTML 和 JavaScript,掌握这些技术的人也可以利用 Windows 8 来开发应用。</p> <p> <strong>与硬件直接通信是 WinRT 的主要特性</strong></p> <p> <strong>InfoQ:那么说到在 Windows 8 和 WinRT 下的编程,最大的优势、或者说最重要的特性有哪些?</strong></p> <p> <strong>Jeffrey Richter:</strong>WinRT 学习和使用起来都很简单。它主要的特性,是允许应用直接与底层硬件通信,这不是操作系统做的事情。操作系统是要抽象硬件设备,并把这些抽象提供给应用开发人员。Windows 8 和 WinRT 能够与很多种硬件通信,包括多种显示器、鼠标、重力感应计、陀螺仪、键盘等等,当然还有触碰设备,这是它们主要针对的对象。应用开发人员可以使用 WinRT API,与多种不同品牌的硬件通信,这些硬件不久之后就将面市。它们还能让人们利用已有的、在 Windows 上的很多投资,其中已经内建了文件系统支持、网络支持。WinRT 的 API 的确简化了这些方面的操作,让人们可以用多种语言编程,不像 iOS,只能使用 Objective-C,Android 也主要针对 Java 开发人员。JavaScript 开发人员、C/C++开发人员、.NET 开发人员都可以使用 WinRT。它的编程范式对这些语言的开发人员来说都很简单。</p> <p> <strong>InfoQ:知道如何开发 .NET 应用的开发人员们是不是也能在 WinRT 下开发?</strong></p> <p> <strong>Jeffrey Richter:</strong>当然,开发语言是完全一样的。C#和 Visual Basic 没有变化,.NET 的核心部分也是一样的,对象啊、字符串啊、异常处理啊,这些都一样。但是在 Metro 应用中,一大部分 .NET 的框架库不能用了。我要说明的是:Windows 8 同时支持 Metro 应用和以往的应用。微软主推的是 Metro 应用,也就是在移动设备上的触碰优先应用。如果开发人员选择这条路线,他们可以利用自己已有的很多知识,有些库不能用了,但是可以使用 WinRT 中的库。</p> <p> <strong>InfoQ:有人说 WinRT 的性能要相对好一些, 那么如何使用 WinRT 开发高性能应用?</strong></p> <p> <strong>Jeffrey Richter:</strong>我不确定性能是否是 Window8 和 WinRT 的主要目标。客户端应用和触碰应用针对的是消费者,计算设备只要比使用它的人的速度快就好了。我们关心性能的场景,是针对可扩展的服务器端应用。我想说,Metro 应用在 Windows 8 下用起来感觉是快了一些,因为 Window 8 会中止没有在后台运行的应用,相关的线程也就不再运行了,所有的计算资源都提供给了前台运行的应用。用户会觉得应用的响应很快,微软用的词汇是“快速而且流畅”,当你触碰和滚动屏幕的时候反应快速,随着你的手指的运动滚动屏幕,没有延迟感。</p> <p> <strong>InfoQ:与 iPhone 对比呢?</strong></p> <p> <strong>Jeffrey Richter:</strong>与 iPhone 对比一下的话,iPhone 在这方面当然做的也不错,微软试图与其竞争。很难说哪个更好或是更快,因为这取决于运行的硬件。Apple 完全控制硬件,微软选择与其他硬件厂商合作,自己不做硬件,所以会有很多种硬件。</p> <p> <strong>InfoQ:有些移动开发人员说,要想得到很好的动画性能表现,就必须要从底层代码写起,而不是使用现有的程序库,那么在 Windows 8 下面是不是也是这样?</strong></p> <p> <strong>Jeffrey Richter:</strong>要说高性能的 Metro 应用,主要应该是游戏了。要是开发游戏,微软鼓励大家使用C和 C++ 作为开发语言,并使用 DirectX 支持图像硬件处理,要说到库,互联网上有一些库,就是用 C++ 开发的。可以直接把这些库拿过来,集成到自己的应用里,使用其中的物理引擎之类的东西来控制比如飞到空中的球、掉在地上的盒子等等。</p> <p> <strong>InfoQ:那么在 Windows 8 和 WinRT 中使用这些库不会有兼容性问题吗?</strong></p> <p> <strong>Jeffrey Richter:</strong>对于现有的这些库是支持的。</p> <p> <strong>创业公司现在就可以开始学习 Window 8</strong></p> <p> <strong>InfoQ:对于创业公司来说,开发人员何时应该拥抱 Window 8 呢?</strong></p> <p> <strong>Jeffrey Richter:</strong>我想现在就可以开始学了,我也一直在学。大家现在可以开发一些应用,然后放到应用商店里面去。Window 8 当然也需要一些时间才能起来,现在的目标是在 2 月中旬交付 Beta 版本,正式版可能要在今年年底才能交付。那时可能就有可用的硬件了,消费者到时候就可以买到预装了 Window 8 的设备,企业和公司的用户可能还要一到两年。因此要看你想开发哪些类型的应用。对于创业公司,如果是游戏公司,我觉得现在就是好时机,因为现在市场还很小,没有多少竞争对手,技术也比较成熟、稳定,这么做应该会不错的体验。</p> <p> <strong>InfoQ:那么对于已经使用过去的 .NET 平台开发了产品的公司呢?</strong></p> <p> <strong>Jeffrey Richter:</strong>对他们来说就是个挑战了。他们也可以不管这些,让应用直接在 Window 8 上运行,因为 Windows 8 对更早版本的 Windows 应用保证 100% 的向后兼容性。如果出于商业原因,要将应用移植到 Metro 上,这也是他们的决策。如果认为其他人希望拿着移动设备而不是笔记本电脑走来走去,投资开发 Metro 版本的产品也是值得的。不过我觉得这种类型的现在切入就有点早了。</p> <p> <strong>InfoQ:那么 Windows 8 和 Kinect 会有什么联系吗?人们都非常喜欢 Kinect。</strong></p> <p> <strong>Jeffrey Richter:</strong>Kinect 的 Windows 版本在接下来的一两个月就会交付了。Windows 8 当然支持,同时还有 SDK,大家现在就可以下载 Beta 版本,使用 Kinect 作为输入设备,Window 8 会提供完全支持。</p> <p> <strong>异步处理线程对服务器端开发非常重要</strong></p> <p> <strong>InfoQ:您曾经提过,异步处理在服务器端开发中非常重要,能否解释一下原因?</strong></p> <p> <strong>Jeffrey Richter:</strong>从我的经验看来,很多开发人员没有认识到:线程是非常宝贵的资源,一个线程一般要占用 1M 内存,通常还要更多。创建和销毁线程也会占用很多 CPU 资源,当线程要运行时,Windows 还要在它们之间联系,交换处理线程也会影响性能。很多人在创建服务器端应用时,每当来一个客户端的请求,他们就会创建一个线程,并用这个线程来处理请求。当这个线程进行某些操作时,比如访问数据库这样的常见场景,或者是跟其他网站对话这样的常见场景,这个线程和它占用的所有资源就被阻塞了,除非数据库服务器或是网站服务器有回应,它什么都做不了。如果这段时间内,有更多客户端请求进入,系统就会不断创建越来越多的线程,结果就是一个服务拥有很多个线程,占用了很多内存,但是 CPU 使用率非常低,因为处于阻塞的线程们在等待其他服务器或数据库的回复。因此你的服务很难扩展。如果再进入足够多客户端请求,最终会出现异常,导致服务崩溃,再重启,就无法回复之前那些请求了。</p> <p> 这就是异步处理之所以重要的原因。</p> <p> 其背后的机制是:客户向服务器发出请求,一个线程开始处理某些东西,当它与另外的数据库或 web 服务器对话时,我们让这个线程变成异步的,它就不需要等待另外服务器的回复,线程可以回到线程池,或者处理更多客户端请求。这就是说,现在服务器上的线程少多了,服务器可以同时处理几十万个请求,而只使用少数一些线程。服务器也不会塞满线程,然后因为内存不足导致崩溃。因此,异步编程至关重要。</p> <p> 然而,在过去,开发人员做异步编程非常困难,因为编程模型不适合,你必须要写很多回调函数,或者不能使用局部变量做参数,等等限制让异步编程充满挑战。不过,我跟微软一起工作,知道有个新的特性将会在下个版本的 .NET 中交付,使用对用户更加友好的编程模型,让异步编程会简单许多。</p> <p> <strong>InfoQ:是“async”关键字么?</strong></p> <p> <strong>Jeffrey Richter:</strong>没错。async 在C# 5.0 和下个版本的 Visual Basic 中有,这也借助了我在过去 5 年中使用的技术,是我的 <a href="http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDMQFjAA&url=http%3A%2F%2Fwintellect.com%2Fpowerthreading.aspx&ei=f44zT4yhMIuPigKkltzPCg&usg=AFQjCNGsf8dY6FBoUtczXhqkwfGtJG6K9w">Power Threading</a> 程序库的一部分,被称为 AsyncEnumerator。世界上很多人和公司都用过它,也取得了很多成功。现在,微软把它加入到了 .NET 框架中,我也帮助做了集成。</p> <p> <strong>InfoQ:您能否推荐一些好的异步编程框架?</strong></p> <p> <strong>Jeffrey Richter:</strong>我的 Power Threading 程序库就很棒啊,而且是免费的!:-) 我的 AsyncEnumerator,还有跟它一起使用的 <a href="/misc/goto?guid=4958328967689166295">SyncGate</a>,二者一起完成线程异步处理,不会阻塞任何线程。99% 的时候,我会用这两个库。SyncGate 是一个读写锁,但是不会阻塞任何线程。有了这两个,再加上 .NET 4.0 中做并行计算的 Tasks,这就是我每天用的东西。我用 Tasks 完成并行计算,AsyncEnumerator 做异步操作,用 SyncGate 做线程同步,来协调访问某些资源。从服务器端应用的架构要求来说,这三者已经足够大部分人完成很多事情了。</p> <p> 不要“过度架构”,不要重新发明安全机制</p> <p> <strong>InfoQ:您能否就 Windows 编程在性能方面提供一些原则和建议?</strong></p> <p> <strong>Jeffrey Richter:</strong>我想可扩展性也很重要,现在我做很多服务器端开发,有时候可扩展性要比性能更重要。服务器能否处理 100 个客户端的请求?1000个客户端呢?10万个客户端呢?一般来说,要想让某个服务可扩展,你得让它的性能表现稍微差一点,只能是稍微差一点,性能也非常重要。再次强调,异步编程对于改善可扩展性很重要。</p> <p> 至于其他与性能相关的原则,我总是尽量写尽可能少、尽可能简单的代码,我总是试着不去“过度架构”我的系统。我为其他公司做咨询的过程中,很多时候,我去看他们的代码,总是会发现他们存在“过度架构”的现象。很多时候,他们会想:我们猜想这块儿会很慢,得加入缓存系统,但是他们没有认识到:缓存会占用很多内存。在 Windows 操作系统中,在内存量和速度上有很紧密的关系。很多人都知道:如果我的系统运行速度慢了,给服务器加更多内存就好了。但是他们没有想到的是:如果系统占用的内存更少,运行的速度会提高,这也是很重要的。因此我看到很多人使用缓存,往内存里面放很多东西,他们这么做是想让系统更快,实际上反而更慢了,因为用的内存更多了。但是他们付出的这些额外的努力,构建缓存,测试缓存,修复缓存代码中的 bug,总的来说,反而让系统的质量更差了。所以,不要“过度架构”你的系统。</p> <p> 因此,关于性能,还是要让代码尽可能简单,让代码工作起来再说。如果性能不好,就用一个 profiler,去看看性能的热点出现在哪里,找到原因,再去解决问题。</p> <p> 如果有些地方对性能要求真得很高,不妨先写原生代码,然后跟其他 C# 代码放在一起,</p> <p> <strong>InfoQ:那您能不能就安全性方面给些建议?</strong></p> <p> <strong>Jeffrey Richter:</strong>对于内存的安全,使用托管语言编程,比如 .NET、Java,这对于防止内存崩溃、堆栈溢出之类的问题非常有帮助,可以事先排除很多现在的安全隐患。原生代码很容易破坏内存,带来安全方面的 bug。</p> <p> 除此之外,我建议不要自己再设计一套安全机制,这一向是很糟糕的事情。使用业界已经使用了很长时间,而且经过检验的安全机制,比如证书、共享密钥,也许可以用私有密钥,类似的算法,已有的哈希算法等等,这些都是好实践。已经有很多好的书籍和文章记录这些安全实践了,还有很多很好的框架,如果是我,一定会把现有的这些安全实践整合到我的程序里面。</p> <p> <strong>通过写书,我让世界变得更美好</strong></p> <p> <strong>InfoQ:大概7、8年前,我也曾是一名 .NET 开发人员,我那时读过您的《.NET 框架程序设计》,这本书对我帮助很大。现在,您又带来这两本新的著作,我想很多中国的 Windows 开发人员也会从中获益良多。我想知道:驱动您写出这么多深入而又经典的书籍的,是什么样的力量?</strong></p> <p> <strong>Jeffrey Richter:</strong>我热爱技术,我自己也喜欢学习这些东西,而且我也喜欢与其他人分享我的发现。这能帮助大家提升工作效率,改善生活质量。我认为,软件让我们的生活质量大为提升,做很多事情变得更容易,我带着我的笔记本电脑到处走,我使用智能手机,用其中的 GPS 导航,搜索东西,这些确实提升了我的生活质量。 通过帮助其他人学习这些东西,他们能构建更多应用,也让我的生活质量提高了,还有其他人的生活也是。这让我觉得很受鼓舞,非常受鼓舞,我觉得我能帮助其他人,并以此让世界变得更美好。</p> <p> 绝对不是为了钱,写书不能给我带来多少收入。我在中国遇到很多人,大家对我非常热情,他们总是在感谢我写的书,总愿意跟我合影,给他们签名,我在这里总是觉得很受欢迎。在这里感觉真得很棒。能够感受到我给他们带来的影响,我所做的事情影响了他们的生活,这让我感动得说不出话来。</p> <div id="come_from"> 来自: <a id="link_source2" href="/misc/goto?guid=4958328964905365900" target="_blank">InfoQ</a> </div>