低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

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

2012 年 2 月 09 日

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 )关注我们,并与我们的编辑和其他读者朋友交流。

2012 年 2 月 09 日 06:383543
用户头像

发布了 479 篇内容, 共 127.1 次阅读, 收获喜欢 30 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营第五周作业 一致性哈希

sunnywhy

第五周总结

秦宝齐

课程作业

第五周总结

Acker飏

极客大学架构师训练营

架构师训练营第五周作业

王铭铭

【架构师训练营】第五周总结

Mr.hou

极客大学架构师训练营

Intellij IDEA必备插件,提高效率的“七种武器”

码农神说

IDEA Java 面试 idea插件

架构师训练第五周一致性Hash

邵帅

架构师训练营第 5 周作业——一致性Hash算法

在野

极客大学架构师训练营

MQ 核心概念

陈皮

ES5、ES6中继承的几种写法

Manito

Java

【架构师训练营】第五周作业

Mr.hou

极客大学架构师训练营

架构师训练营第五周总结

王铭铭

分布式技术总结

LEAF

可变对象和不可变对象

Leetao

Python Python基础知识

漫画:Integer 竟然有 6 种比较方式?

王磊

Java 编程 漫画 java编程 漫画编程

B站Up主自制秃头生成器,一键get张东升同款发型,网友:秃的太过真实

程序员生活志

程序员 B站 隐秘的角落 张东升 秃头生成器

UC Token即将强势登陆

Geek_116789

负载均衡(Load Balance)

陈皮

架构师训练第五周

邵帅

缓存、一致性哈希和负载均衡总结(训练营第五课)

看山是山

缓存 极客大学架构师训练营 一致性hash

一致性哈希实现

娄江国

极客大学架构师训练营

架构师训练营第五周总结

sunnywhy

小师妹学JVM之:JVM中的Safepoints

程序那些事

Java JVM 小师妹 性能调优 GC

华为厦门DevCloud创新中心正式揭牌,“上云用数赋智”新助力

Geek_116789

面试官:为什么 HashMap 的加载因子是0.75?

哪吒来踢毽子

hashmap

互联网中的缓存

陈皮

计算机操作系统基础(十五)---使用fork系统调用创建进程

书旅

php laravel 操作系统 进程 线程’

Tomcat 架构原理解析到架构设计借鉴

码哥字节

Tomccat 「Java 25周年」

IOTA架构实战:大数据即时多维查询引擎构建【视频】

易观大数据

架构模式 大数据任务调度 查询引擎 数据算法

分布式缓存 - 第五周总结

孙志平

Week 05 学习总结

卧石漾溪

极客大学架构师训练营

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

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