克莱's profile克莱沃曼PhotosBlogListsMore Tools Help

Blog


    August 14

    我博客的变动

    经过了几天的试验,出于以下几个原因,我决定把博客搬家了。

    1. Blogger的功能比较强大,可是排版格式很不舒服,虽然可能可调,但是由于国内网友反映经常被block,需要翻墙才能访问,因此放弃之。
    2. 测试的文章写得差不多快没的写了,以后虽然会继续写,但会比较少,主要是需要比较长一段时间才能有一些心得体会。因此,文章的主题会跟测试没太大关系,主要会集中在互联网,尤其是云计算上。因为主题的扩展,所以我希望能够跟更多的网友分享我的观点与看法。
    3. Live Space不知道怎么回事,最近的文章在各大搜索引擎上都查不到,这就使得上边的第二点成为了不可能。而看我文章的朋友主要集中在测试领域,我这些新文章未必是他们想读的,因此放弃Live Space。
    4. 由于中国的特殊国情,我还是要不得已放弃把博客放在国外网站,因为读者基本上还是身在国内的。经过CSDN,百度,新浪博客的测试,发现新浪上发表的文章搜索引擎收录还是比较快的,而且使用起来也还算顺手,觉得可以用之。

    以下是新的博客地址以及一些其他的交流方式,有兴趣继续看我文章的朋友,或者想问我问题的朋友可以通过他们和我联系,谢谢。

    其次,相关的文章我会发布到以下网站。

    网友对Google Chrome OS的一些误区

    最近在网上发现一些网友对Chrome OS的提问及观点表现出对Chrome OS的理解有一定的误区。我想对几个常见的误区谈谈自己的看法。首先,Chrome OS虽然还未推出,而相关信息也是少的可怜,但它却是唯一一款能够说服我的Web OS。无论Chrome OS是否能够成功,我认为它的理念都是跨时代的,都是应该研究和学习的。Google的Web OS的概念首先通过Chrome Browser突破到了浏览器,用通过Chrome OS突破到了操作系统,成为真正意义的Web OS。相比较之下,一些WebOS及Facebook的理念就要狭隘很多了。这也解释了我一个很长时间的疑问“Google为什么不把它的服务向Facebook一样有一个很好的组织,而让微软嘲笑它的服务混乱无序”,因为Google对Web应用的组织放到了浏览器这个层面,以及扩展到了桌面。下面是对一些常见误区的个人解释。

    1. 比尔盖茨:Chrome OS 就是Linux,没什么新鲜的。

    Chrome OS 采用了Linux内核不假,从传统OS的角度来说它就是Linux也并不为过,但是这个说话是不完全的,尤其是隐瞒了一些OS革命性的变动。传统OS分为Kernal mode及User mode,而桌面应用则是通过OS的API开发的user mode程序。Chrome OS的变革在于,它在user mode上只有一个浏览器,而Chrome OS上运行的程序则完全是Web应用程序。换句话说,Chrome OS与传统OS的理念及架构已经截然不同了,采用的Kernel无论是什么,只是管理硬件用的,普通用户根本就不care,而开发人员构建软件方式和用户的软件体验上才是重点。

    2. Chrome OS是Cloud OS。

    张亚勤已经谈过很多遍“云+端”了,这个概念还是很实际的。我们能够非常清楚地看到,Chrome OS不会被应用于云上,而只是应用于端上,所以我们不能把它称为Cloud OS,而Web OS可能是目前最合适的称谓了,虽然Web OS的定义也并不明确。

    3. Chrome OS会颠覆Windows。

    Chrome OS面向的市场是上网本,本身就比较局限,因此不可能颠覆Windows。Google不可能傻到这个地步一心要颠覆Windows,比较实际的目标是占据上网本的一定市场份额,并且使微软继续在上网本上挣不到钱,另外随时保持向笔记本和台机进军的可能,给微软造成巨大的压力。微软在上网本上不赚钱对Windows业务影响很大,本想通过Windows 7的发布扭转局面,被Chrome OS彻底扰乱了。

    4. Chrome OS的兼容性会差,或者应用程序太少。

    Chrome OS上的应用是Web应用,只要是能在Chrome浏览器中运行的应当都能在Chrome OS上运行。由于采用的是标准的跨平台,跨浏览器的Web应用,基本不存在太多的兼容性问题,尤其是在Chrome浏览器越来越成熟的情况下。同样,web应用丰富多彩,也不存在应用程序少的问题。

    5. 离开网络,Chrome OS什么都干不了了。

    早在Chrome Browser发布之前,Google就已经有了离线的解决方案Google Gears了,并且集成在了Chrome Browser里。因此,断网之后你还是可以查看/撰写emails,documents等等。

    6. Chrome应该提供API。

    Chrome是全新理念的Web OS,不再支持桌面应用,因此也不会有传统API提供。

    7. Chrome应该可以运行Office。

    Chrome上的Office就是Google Docs。

    8. Chrome很安全,不会染病毒。

    无论设计的多么完美,是程序都是会有bug的,不存在绝对安全的系统或软件,更何况hack的技术也是在不断发展的。因此,对于这个广告语似的口号,大家就没必要信以为真了。

    August 07

    微软,Google云计算基础技术的比较

     

    我想现在几乎没有人没有听说过“云计算”这个术语了,但是能明白云计算是怎么回事的人可能就是少数了,而在云计算的理解上也是因人而异,可能非常不同。这也不算不正常,因为云计算只是个概念,是个方向,很多时候大家都只是看到,抓到,感受到那么一点点,好比盲人摸象。就算大公司的理解也是千差万别,更何况每一个人了。我今天想通过对比微软和Google的云计算的基础技术来阐述一下自己对云计算的理解。首先我想澄清一些概念:

    • 云计算:现在最泛泛的概念就是云计算了。由于计算是其中的重点,我们经常把云上的所有东西统称为云计算,这就很容易使人感到迷惑。我个人认为云计算有两种context,一个就是计算,发生在云上的计算。另外一个是我刚提到的泛泛的概念,比如把云存储也归于云计算了。所以大家看相关文章的时候,一旦看到云计算要搞清楚context,否则就容易迷糊。而且我发现很多文章的作者本身对这两个概念也很迷糊。我在跟很多人讨论云计算的时候,也正是这个原因使得讨论无法进行。我个人倾向于把云和云计算区分开,就像把计算机和CPU的概念区分开,虽然CPU是计算机的核心。当然,这不是由我来作主的。
    • Server和client:我发现在讨论云计算的时候,不但需要区分上边讲的两个context,还需要区分server端和client端。如果从计算的角度来说,那当然server端是重点了,毕竟计算在server上产生。可是如果从云的整体来说,server端和client端就都很重要。而如果从用户的角度来讲,那就应该是client端最重要了,因为计算的发生对用户来讲是透明的,而client端的交互最重要。很多时候在讨论云计算的时候,人们竟然把client端跟server端混着来讨论。比如我在写livemesh与云计算的文章的时候,很多人竟然把windows azure拿进来讨论。我最近还看到有些文章竟然拿Chrome OS和Winows Azure进行讨论。
    • 由于以上原因,为了减少混乱,我会把云计算按照计算的context来讲,而把泛泛的概念直接称为云。我在讨论技术的时候,会把他们分为client和server端分别进行比较的。
    • Cloud OS与Web OS。在云计算概念流行以前,人们更多的是谈论Web OS。现在人们谈论的更多的是云计算,因此Cloud OS和Web OS的概念就又混淆了。可能不少人认为是一个东西,可是从我个方面的得到的信息来看,我们基本上可以用client/server端来区分他们。Cloud OS是server端的,比如微软的windows azure就号称Cloud OS。而Web OS则是客户端的,比如市面上的各种号称Web OS的网站,比如Facebook,比如Google的Chrome Browser,Chrome OS等等。目前来讲,Web OS还没有明确的概念,所有产品基本都是试验性质的,但是Web OS在client端还是比较明确的。
    • 对于云来讲,不同的人关心的重点不同。网络服务提供商,开发人员关心的是server端的cloud OS,而用户关心的是client端的web os。因此,对于大多数人都作为普通用户来讲,就没有太大必要去注意server端的那些新技术,新术语了,也不要被他们的出现搞糊涂了。

    下面的表格列出了微软和Google公司云计算基础技术和产品,随后有我个人的讲解。

    Server/client Technique Google Microsoft
    Server Cloud OS App Engine Windows Azure
    Client Web OS Chrome OS Live Mesh
    Browser Chrome IE
    RIA Javascript+V8 Silverlight
    Offline Gears Live Mesh/Silverlight
    OOB Chrome shortcuts Live Mesh/Silverlight

     

    • Cloud OS:由于Google App Engine只支持Python和Java,而我不想学Python也不喜欢Java,所以没有任何体验。而Windows Azure则体现出了微软强大的实力。从下至上,除了hardware则清一色使用微软自己的产品。OS: Server2008, VM: Hyper-V, Host: IIS, Dev tools: Visual Studio。从Azure来看,微软在云上开发了一套开发平台,从而改变了网络服务提供商的经营和开发模式。他们不再需要买自己的服务器,而转为租用微软的虚拟机,开发则是通过微软提供的接口开发在IIS上的web服务。重点是他们不需要考虑sacalability,而是按计算的需要和使用情况向微软付钱,就好比我们现在买电一样。而云计算的提供商则相当于现在的电力公司一样,使得计算变成一种资源去交易。由于我不是搞这行的,所以,我更多的注意力放在了client端。
    • RIA:要想建立client端的Web OS,则需要依赖于rich internet application。这方面的技术主要有三种,Adobe的Flash,微软的Silverlight以及Google推崇的AJAX。以前用过一些Web OS都是建立在Flash上, 我就感觉很别扭。一是因为既然是OS还需要依赖Flash?二是因为点右键总是有个Adobe的影子,而且不能customize。其实也正是因为这个原因使得Google在很早就放弃使用Flash了,而进行了更灵活的Javascript的大力支持。微软的Silverlight则正像是Flash的翻版,到现在为止我基本上没看到过什么基于Silverlight的应用,好像主要是播放视频。而Google自己基于javascript的Gmail, reader, 以及最近公布的集大成的Ajax的顶尖作品Google Wave等,都让我在RIA这个方向上很支持Google。
    • Browser:前边说过Google大力推行Javascript,而运行速度慢是Javascript的一个致命的问题,使得在和Flash, Silverlight的竞争中处于劣势。基于这个原因,Google推出了自己的Browser Chrome,并且内嵌了V8的JS的引擎,使得javascript的运行效率大大提高,从而可以用javascript开发出更高级的界面。比如,我看过JS实现的一些SD,动画的demo,都还是比较出色。而Chrome又大力支持HTML5,其中重要的一点是支持了视频,从而使得Flash和Silverlight的竞争力进一步降低。而且,javascript的好处在于浏览器本身就支持,不用像Flash, Silverlight还需要单独安装。进一步说,Chrome对JS的优化直接推动了Firefox和IE对JS的优化,而JS的运行效率也成为了浏览器的最重要的指标之一,使得Javascript的前景更加的光明。
    • Web OS:现在已经比较明确的看出来了Google的Web OS就是即将公开源代码的Chrome OS,而对于普通用户来讲,Chrome OS和Chrome Browser基本就是一个东西。因为普通用户对那块Linux内核是透明的,也是不在乎的。所以,我们只要看Chrome Browser的发展,就应该能推断出Chrome OS大概的样子。Chrome OS最大的焦点在于替换掉Windows,而Chrome Browser将要增加的同步功能,使得Google的Web OS更加完善,而谣传了许久的GDrive如果能够稍后推出的话,则Google的Web OS将基本成形。微软目前并没有一个所谓的Web OS,而最像Web OS的产品则是Live Mesh。Live Mesh我以前已经谈论过了,就不再重复了,简单来讲我很失望。
    • Offline:云计算的一个重大问题就是离线怎么办?这也是很多人质疑云计算的一个主要原因。Google的解决方案是Google Gears, 它内嵌于Chrome里,也可以安装到其他浏览器上。Google Gears使得用户在离线的时候还可以访问,操作数据。微软的主要解决方案是Mesh, 通过同步各种设备。最新的Silverlight也加入了一定的离线支持。
    • OOB (Out of Browser): 在浏览器中运行的Web应用界面与传统桌面软件比起来总是死板,不够灵活的。因此,人们就产生了需求,想在浏览器之外运行web应用。Adobe的Air可以实现这个功能,而Google的解决方案是Chrome里的shortcuts。给Web应用建立了shortcuts之后,就可以按照人们习惯的方式启动这个应用,而界面也很传统软件非常接近了。微软的解决方案则是Mesh, 或者最新的Silverlight OOB功能。

    综上所述,我们可以清楚地看到,Google的云技术的client端的核心就是Chrome浏览器,所有相关的技术都嵌入到了浏览器中,甚至操作系统的内核也算嵌到了浏览器中,这也是为什么Google为它Browser和OS起了一个同样的名字。所以,我们可以说Google Chrome未来就是一个Web OS。而反观微软,则是把这些feature分散在了几个不同的产品中:Windows, IE, Silverlight, Live Mesh,并没有一个统一的解决方案。因此,在云计算的战略上,还是感觉Google比微软看的更高更远一些。

    August 04

    我谈谈微软园区(Microsoft Campus) (2)- Commons与巴萨

    近两年微软大兴土木建成了奢侈豪华的Commons mall,奢侈程度令人咂舌。这么说吧,在西雅图这片没见过能相提并论的地方。今天又听说巴萨要来微软参观,不过搞得很神秘,大家猜测可能是参观Commons,以及在Commons新建的球场踢球。在Commons等候了半个小时不见踪影,拍了一些照片,包括visitor center和company store。然后赶回main campus去寻找,终于发现在一个我从没进去过,也不知道能不能进去的,也从来没敢进去过的独一无二的builing外面发现了几辆大巴。和大家在长时间等待以后,遗憾的是由于他们行走太快,以及人太多,并没有照到那几个球星 (除了亨利的一个远景),而录像也按错了,只拍到了最后一部分。其中见到了伊布,亨利,没有见到梅西,可能他个子太矮了,不显眼。大家看照片吧。

     

    视频里有亨利:http://www.facebook.com/v/139495017781

    从WebQQ谈云计算

    我是一个非常讨厌QQ的人,但是由于国内的亲戚朋友大多都是用QQ,所以很多时候迫不得已还是要狠下心来安装一下QQ。有的时候急需要联系人,在单位就麻烦了,安装了QQ也用不了,因为被封掉了。两天前没事干依稀记得听到过有个WebQQ,所以就抱着尝试的心态去试了试,发现它很优秀,它正是我心目中的软件即服务的形态。因此,我也想从WebQQ来再一次谈谈云计算。

    一谈到云计算争论总是很多,而我发现很多时候跟别人谈论的时候并没有太多交集。这是因为云计算的概念目前阶段并不明确,云计算的发展也只是开始,远不够成熟。而我也只是从个人的一些体会去谈论,由于接触的产品有限,并没有一个全局观。但是,我想把云计算简单划分一下,就是server端和client端。现在技术的发展在两端的表现形式差别太大,因此就更加使人迷惑。在server端的概念更注重云计算,就是Google说的像买电一样买计算。这也是最赚钱的一部分,所以各大公司都在搞自己的云计算平台,比如微软的Windows Azure, Google的App Engine, 以及亚马逊的EC2。而client端,也就是普通用户亲身体验的则是软件即服务的形态。有些公司是准备用web应用代替桌面应用,比如Web2.0掀起的Ajax,这一点是Google的赌注所在 (Ajax, V8, Chrome, Chrome OS), Adobe的flash,而微软则是准备在桌面和web应用进行一个统一,比如WPF,Silverlight,Live Mesh。而我今天谈的WebQQ则是在client端的讨论。

    对于我个人来讲是厌倦了桌面软件,因此安装好操作系统以后则是能不装软件尽量不装软件。比如QQ软件,我是在极度无聊的时候才会安装消磨会儿时间而已。我是真的希望哪天能够只安装操作系统,然后开机,登陆,就能享用各式各样的软件了。而这在软件即服务的概念下变得可能了。我想谈谈几个WebQQ的优点,基本上这几个优点也是软件即服务的几个卖点。

    1. 没有广告。这个跟云计算优点没啥关系,而且肯定也是暂时的,我提出它来是因为现阶段确实是个使用WebQQ的一大理由。以后有广告了,用浏览器的广告屏蔽功能也能搞定吧?
    2. 没有安装。这个就不用多说了,对于极度厌恶安装软件的我来说,没有什么优点比这个来的更实际了。
    3. 没有更新。更新都在server端进行了,不用整天看到QQ update搞得UAC弹出来的烦人情景了。
    4. 没有病毒扫描。因为不用安装,也就不存在感染病毒的情况,也就不用看到QQ扫描我机器了。
    5. 不怕防火墙。由于走的是http/https协议,在单位也能随时用QQ了。

    以上几点,除了广告以外,也基本上是云计算给终端用户带来的好处了。由于我是用Google Chrome浏览器的,因此我用到了“create application shortcuts”,创建了一个快捷图标。这样的话,启动方式以及界面跟传统软件基本一致。(在Google Chrome的概念里,看得出来他们认为一个网页就可以看作一个application,而Chrome就可以认为是WebOS了,这也是为什么他们要推出Chrome OS,用web app+Chrome来替换desktop app+Windows了)

    August 03

    微软将要大转型

    在微软与Google的大战中,我提过微软占有优势地位,但Google占有方向的优势。也就是说各方面的实力都是微软要高Google一头,但是在两个公司的理念上,我推崇Google。Google讲的是云计算,软件即服务,而微软由于软件霸主的地位使得微软不能放弃传统软件而提出了Software+Service的口号。我其实并不赞成这个口号,以前也批判过一些,而微软在这个口号下也没做出什么优秀的产品出来。倒是Google在云计算上做的风生水起。

    最近微软的一些变化让人感到很惊喜,首先就是Steve Ballmer竟然零代价搞定了Yahoo,简直是让我对他刮目相看。然后就是战略的转变让我重新看到了希望。微软每一年度开始,CEO都会发表下一年度的公司策略,而software+service则是去年的重点。我统计了一下去年与今年的变化,列出了主要的区别如下,

      2008 2009
    Software 出现9次 出现3次
    Cloud 出现2次 出现6次
    Strategy Embrace software plus services Embrace the cloud across all of our businesses

     

    Software的出现频率下降了三分之二,而cloud的出现频率则增长了两倍。可见微软这两年正在经历Software->Software plus Services->Cloud的一个重大历史转变。希望2010年微软能够推出一些重量级的产品出来与Google更好地进行竞争。

    July 28

    买房子的considerations

    今年房子降了不少,因此开始做功课研究一下买房的问题。其实早在两年前就开始看房子了,那时候房子差不多在顶上,我基本没看single house,主要集中在了condo上,因为当时最差的condo基本也将近30万了。降价之后可不得了,以前看上的一个 remodeled condo 是35万,现在降到了23万,以前一个崭新的townhouse是60多万,现在只要40万了。而single house很多也降到了30多万了,因此自然就不会考虑condo和townhouse而只考虑single house。最近看了不少open house,稍微有了一点感觉,今天算做个小总结吧。我认为选房子需要考虑的几个主要问题:

    1. 学区:除非你没有孩子,而且以后不打算要孩子,或者你孩子已经大了,学区无疑是选房子的第一要素。通常来讲,学区好的地方一定是富人区,穷人住的地方学区一定差。而且,在好学区通常只有single house,没有condo和townhouse,或有少量townhouse,而condo群集的地方一定学区不好。所以,在好学区买房子就意味着多花钱。
    2. 新旧程度:本来我是不太在乎这一点,但是发现大家还是更倾向于买新房子。选房子很重要的一点就是等你卖的时候一定要好卖,因此买个新一些的房子就可以在自己不得以卖房子的时候更容易一些,当然也意味着要多花钱。但是新房子普遍yard较小,甚至几乎没有yard,而老房子的大yard还是非常享受的,尤其是对小孩来说。但是照顾花草的工作还是蛮累人的,我人比较懒,因此还是倾向于小院子。
    3. 离公司的距离:以前这个是我的第二考虑要素,因为单位离家近的确是特别方便。比如我现在离单位车程5-10分钟,因此可以回家吃午饭,或者随时可以单位家里来回串,而有些人的房子离单位比较远,加上traffic,每天上下班两个小时就很没意思了。
    4. Parks and shopping:房子周围有park对小孩非常重要。每天下午下班回家可以带小孩去park玩,而且很多park在湖边,可以去游泳。如果周围没有park,生活质量感觉会下降不少。shopping相对次要,因为一般每周一次大采购就可以了,路程远点也不太要紧,当然如果附近有很多shopping就更方便了,缺什么可以随时去买。

    综上所述,如果以上条件都满足的话,那房子就会好贵好贵了,根本买不起。如果不考虑学区的话,2-4点还是很容易就可以满足的。而由于为了孩子一定要上好学校,就只能选择一个学区好,比较新的房子,离公司远一些,没什么park和shopping的房子,或者学区好,旧房子,离公司近一些,park,shopping方便的。我倾向于第二种,但是由于现今经济不好,工作不稳定,随时可能遇到意外情况需要卖房,因此前一种房子也许更明智一些。所以很矛盾 :(

    微软终于做了个正确决定

    Windows 7 取消了对上网本只可运行三个应用程序的限制。我一个多月前就在Twitter质疑这个限制。

    image

    image

    Code Review, Debugging, Windows Internals, WDM小结 (一)

    学完Silverlight之后,最近两三个星期集中在了code review, debugging, 以及Windows Internals和WDM的学习上。现在是时候做个小结了。

    逛了一些关于debug,windows内核,驱动等的论坛,发现大家主要集中在了加密/解密,逆向,系统漏洞和反病毒等等专业领域,和我所学习他们的目的并不相同。所以,文章和我所关注的知识点也不很match。对于我来说,我学习他们的主要目的集中在了Debug和Security Test上。在学习的过程中有种知识零散的感觉,昨晚才把他们互相联系起来,因此也就有个立体的感觉(请看下图)。下面想简单地谈谈。

    首先,Debug是一项软件人员应该掌握的既基本,又高级的技能。它并不属于开发人员的专利,测试人员拥有这项技能也如虎添翼。说它基本是因为在你大学学习计算机语言的时候都会或多或少用到debug的技术,是编程中一项必用的技术。说它高级是因为很多疑难杂症都需要高超的debug能力才能去解决,debug的能力很大程度上体现了一个人的软件开发测试的水平。大家debug的目的各不相同,而对于测试人员来说就是在发现一个bug的时候能够通过debug找到root cause。在debug的学习与实践中,我认为以下知识非常重要:

    1. Debugging tools: 微软提供了一套tools,而我们最常用的就是windbg了。windbg使用起来还不算麻烦,学习起来也不难,但是各项命令实在是太多了,需要时间和经验去慢慢积累。
    2. Code review:或者你做专门的code review,或者你在debug的时候做code review。总之,你对代码不熟悉是很难进行debug的。因此,code review也是debug中非常重要的一个方面,你应该熟悉你所测试产品的代码。很多时候,你甚至不用去debug,想想代码流程,或者简单地review一下就能定位bug。而对于code review方面,你需要了解Win32 API (User mode code),以及WDM,WDF (driver)。
    3. Assembly: 如果你没有源代码的访问权利,你就需要逆向的能力了,这个就对汇编的要求很高了。但是,一般来说我们都是测试自己的产品,理所当然具有源代码的访问权利。但是,即使这样,我们仍然在某些时候需要汇编的知识去debug,比如有时windbg的命令不能正确显示结果,或者调试optimized code的时候。不过这些要求不会太高,一般来讲你学习几个小时的汇编就应该够用了。
    4. Windows internals:其实Windows internals是里边最难学的,但又是比较基础的东西。比如,windbg的很多命令的使用需要你了解内核的工作原理及数据结构。而你在调试driver的时候当然需要内核的很多知识。你如果把内核学通了,其他知识都不成什么问题了,所以对内核的掌握程度也直接决定了你的debug水平。这本书我从开始看断断续续的也快三年了,最近才有了立体的感觉,一想能知道这本书都说了些什么,虽然我不确定我到底看懂了多少,但是基本上在debug需要的时候我能够直接找到相应的章节去看,也应该可以短时间内看懂。由于先看了这本书,所以在看WDM的时候就感觉很简单了,虽然作者说话很罗嗦,但是不用太多的推敲都能很快理解。有种感觉,好象是精通了C/C++以后再去学习其他语言的时候的那种感觉。

    image

    May 28

    你是不是要找病(Bing) ?

    在Google和Yahoo中搜索Bing, 出现提示"你是不是要找病"。

    image

     

     

     

     

     

     

     

     

    image

    微软与Google的战争已败

    这是Kumo发布的时候我写的文章,现在Bing发布了,我已经无语了。微软真是病(bing)的不轻呀。

    昨天听到不少微软的内部人士说喜欢Live search,不喜欢Google, 我也赞同。这两年Live Search还是有了明显的进步,和Google的差距也越来越小,虽说市场份额没啥变化,可是搜索质量跟Google相差并不大,而界面感觉更胜一筹。一般来说,英文搜索Live Search基本还是够用了。很多次我发现Live Search搜不到,去了Google也照样搜不到。我一直对微软还是抱很大期望的,有的时候也批评一下Google,而有些人就问我是否真正使用过Google。前一段时间认真研究了一下Google的各项服务,结果发现微软基本不可能打败Google了。

    首先,微软对Google的战争应该是全方位的,search并不是全部,只能是重点。由于Google是靠Search起家,而直到现在的盈利也基本是靠Search,给人一种印象就是微软只要打败Search就打败Google了。我一直是这样认为,相信到现在微软的领导层也是这样认为,因此在Search上投入大量的资金与期望。可是我在使用了Google的各项服务之后,发现微软是全方位的落后,只是把Search作为突破口击败Google在现实上是很难行的通的。目前微软的IM虽然占有绝对的优势,但是由于IM是客户端,对于Search的份额几乎起不到任何的影响,并且IM本身也不赚钱,看看Skype都成了Ebay的鸡肋了,所以这个优势对微软和Google的战争没太大影响力。另一方面,Hotmail对比Gmail目前还具有一定的优势,可是Gmail发展迅速,Hotmail客户流失严重,很可能在短期就被超过。我就想不明白,微软Search肯花那么多钱,干嘛非得在Hotmail上放那么大一个烦人的广告呢?这能挣几个钱呢?本来用户跑的就厉害,现在开放了POP3,使得用户可以把Hotmail导入到Gmail中去,跑得会更厉害。反正我用了Gmail以后发觉确实比Hotmail好用多了。Skydrive虽说Google还没有推出Gdrive,因此是微软的一个特有产品,可是发展也太慢了,跟桌面的整合没有,跟其他服务的整合没有,并且还跟很多类似的产品共存,搞得用户晕头转向不知道该用哪个。难道非得Gdrive推出来以后微软才知道进步?其他的产品就完全是Google占有绝对优势了。Blog上blogger比Live Space要强多了,连微软自己的minimsft就在blogger上。Photo上,picasaweb比Live Photos也强多了,很多msn的用户都是通过它来共享照片,视频上Youtube绝对统治地位,微软的soapbox还有人记得吗?Google reader微软没有,iGoogle比live个性化主页也强很多吧?后者已经很久没有更新过了。Google的AdSense, Webmaster tools, Analytics 都非常好用,而微软则刚刚关闭了自己的Analytics。Google的blog search微软没有,Google Docs微软也只是有个浏览的功能,Google groups, Google calendar, 微软也是最近才开发好,已经太晚了。还不只这些,Google还有很多小服务微软没有,而且Google还在不断推出或购买各种创新的服务,比如最近announce的Google Voice,又引起来一片关注。想想看,大家一个个用着Gmail, Google Docs,Picasweb,Youtube,Blogger,Google reader等等,你微软Live search做的再好,我为什么要去用你呢?这也解释了我一直想不明白的问题,为什么Live Search越做越好可是份额却没有提高,即使白给用户钱。这就好比大家用着Windows上一些列的应用程序,Linux没法跟微软竞争一样,同样的道理,大家都在用着Google的服务,Live Search怎么跟Google竞争呢?

    其次,微软的Live战略处在了非常迷惘的状态。 最新的Messenger我就不想提来,总之一片反对之声,我也早习惯了逆来顺受了。Live的Wave3到底做了点什么东西呢?搞了半天无非就是模仿Facebook,可是连Facebook自己都要模仿Twitter。这下可好,Twitter牵着Facebook的鼻子走,而Facebook牵着微软的鼻子走。微软搞得都不是二手货了,而是三手货了。这次之后,我对微软的Live创新能力彻底地失望了,我相信微软的Live根本不可能满足我个人的需求。再说Live Search,经过了这两年的折腾也有点不知道该往哪里走了,搞来搞去就搞出个Kumo出来。我个人对这个改名非常的反感,虽然这也没有最后定。首先,本来就是换汤不换药,除了名字和界面改动之外,我没有觉得有什么太大不同。虽然加了一点新的东西,这些我现在也不想讨论,毕竟没有公开。其次,Kumo是什么?说是日文的蜘蛛和网的意思。我就不明白你搞个日文名干嘛?太让我莫名其妙。总之,我觉得Kumo没什么戏。

    再次,Live Search非常地保守。本来保守也不一定是坏事,但是要想击败Google,不具备大胆创新的精神怎么成呢?下面就是Live Search对最新的实时搜索技术的态度:

    类似于search.twitter.com“实时搜索”(Real Time Search)服务可能会开始流行起来,但是有一个产品不会部署该服务:微软即将发布的搜索引擎Kumo。微软搜索引擎部门主管Stefan Weitz称,Kumo团队正在考虑进行小部分调整,而类似于实时搜索功能不会出现在Kumo中,它还需要一个进化的过程。

    Stefan还称:“微软不想因为作太大的改变而吓跑用户,而搜索引擎的界面在12年里也没有太大改变。”那么Kumo还带来什么新的特性呢?微软计划使搜索结果更加人性化,简化搜索过程,专注于用户的“关键任务”比如旅行,地方化信息等。

    综上所述,我认为微软与Google的战争已败。(我个人很喜欢韩信,韩信在鸿门宴上就料定项羽没戏,我这次也大胆断言一下)

    May 24

    《Windows Internals》学习心得(2)- Windows Architecture

    Windows

    • kernel32.dll, advapi32.dll: to provide Windows APIs
    • ntdll.dll: to switch from user mode to kernel mode
    • ntoskrnl.exe and drivers: major part of Windows OS
    • hal.dll: hardware abstraction layer

    Ntoskrnl.exe and drivers

    • executive
    • kernel: KeXXX

    Executive

    • system services: NTXXX, ZWXXX
    • executive support routines: ExXXX
    • executive components and relevant services

    Executive components and relevant services

    • Object manager: ObXXX
    • Configuration manager: CmXXX
    • Process and thread manager: PsXXX
    • Memory manager: MmXXX
    • IO manager: IoXXX
    • P&P manager: PpXXX
    • Power manager: PoXXX
    • Cache manager: CcXXX
    • Security reference monitor: SeXXX

    Drivers

    • ntfs.sys
    • volmgr.sys
    • ndis.sys

    xikug谈黑盒,灰盒,白盒,逆向


    早就想写点什么,自己都不知道一天在瞎忙什么,一直到最近才开始动手。。。我想通过这个乱谈系列跟大家分享一些心得。我打算在这个系列文章中讲点方法与思路,当然,很多方法并不是我的原创,只是我用这些方法和思路解决了我的实际问题。由于本人水平有限,很多说法只是我个人的理解,然后用我自己的语言表达出来,可能并不专业,所以在这里不负责任的乱谈一下,欢迎大家拍砖。
    什么是代码逆向
    代码逆向即是在没有源代码的情况下,对目标程序的行为、数据流、及编译器生成的代码进行分析,通过分析我们可以了解、发现程序的功能、流程、规则、及技术实现细节等,通过分析我们能对其进行优化、功能增强、漏洞填补、甚至还原成源代码等。这个分析过程我们可以称作逆向分析或逆向工程,简称逆向。
    对我们个人而言或许我们能够从逆向分析的过程得到的最大好处就是学习到优秀程序的设计思想、及技术实现细节。
    当今,逆向分析技术在很多地方都得到了应用,典型应用包括恶意软件分析、漏洞挖掘、BUG定位、技术探秘等。
    有人可能会说逆向太无耻了,自己不会写就偷别人的代码。。。我就不相信说这话的人什么都会,我就不信他没有分析过别人的东西,学习过别人的东西,我只能说他是无知的。。。殊不知逆向是一个探索未知的方法,是一种学习态度,是代表不屈服于困难的精神。如果没有逆向当前的很多科学进步不了这么快,也可能不能取得进步,科学研究就是探索未知,把我们未知的东西进行分析研究变成已知,不光是软件领域有逆向工程的应用,其他领域如:基因重组、化工、制药、电子、建筑、航空、军事等领域也存在着他们各自的逆向工程应用,逆向工程帮助科研人员把未知的东西进行分解、研究、组合、改进等,甚至创造新的东西出来等,科学就是这样一点点进步的。
    通过逆向得到的好处是显而易见的,然而任何技术都是把双刃剑,逆向分析技术也不例外。可能被人用于学习、解决技术问题或做有益于软件安全的事,也可能被人用于搞破坏。
    逆向方法
    白盒分析
    白盒分析就是从代码级别上(可能是反汇编代码、反编译的伪代码或源代码),通过动态调试或静态反汇编分析和理解程序的功能、逻辑,找到程序的安全问题等。
    黑盒分析
    黑盒分析是指从程序的外部,通过观察程序运行时候的行为,规则等来猜测和断定程序可能的实现方法,是否有存在脆弱点等。
    灰盒分析
    灰盒分析通常需要借助一些专有工具(可能需要自己编写),如api监视工具,陷阱工具,内存比较工具,文件监视工具等对目标程序进行监控,看它发生了什么操作,调用了哪些api,产生了哪些结果,在系统哪些地方安插了HOOK或过滤等,以此来猜测和断定程序可能的实现细节。
    目前越来越多的程序加了VM或进行了代码扭曲,用白盒分析此类程序可能会花很大力气也找不到突破口,而黑盒和灰盒分析往往对这类程序可能有意想不到的效果。
    逆向手段
    动态调试
    通过调试器对目标程序进行追踪分析,能够清楚的了解到程序运行起来后内部的状态,运算结果等信息。
    静态反汇编/反编译分析
    使用反汇编器或反编译器把目标程序变为可读的汇编代码或伪代码,然后分析程序的结构,流程,逻辑等。
    如何学习
    逆向并不是想像中那么难,但也不是想像中的那么简单,真正困难的是如何有效的运行这些方法和手段来更快、更好的达到我们的目的,这需要累积大量的程序设计经验和逆向经验。
    通常我们进行逆向的时候希望达到的目的大致可分为以下几种:
    技术探秘/代码还原
    软件漏洞挖掘
    软件Bug定位
    软件行为/规则分析
    解除软件的使用限制
    进行辅助程序的开发
    我们要达到的目的不同,逆向时采用的方法和手段的“细腻”程度也不会相同,譬如我们对一个win32平台下的内核驱动进行“技术探秘/代码还原”的时候可能会把白盒、黑盒和灰盒所有的方法和手段都用上,每段汇编代码我们都必须看懂,代码实现了什么功能,跟另一段代码有什么关系,理解整个代码的架构和思想等;而我们在进行“软件行为/规则分析”的时候可能只需用上黑盒或灰盒分析法就够了,知道按下这个按钮后读写了哪些文件,哪些注册表项,调用了哪些api等等。分析过程中有时候我们只需静态反汇编看一下就可以了,有时候我们可能还需要动态调试一下,总之没有固定的套路,一切视情况而定。
    扎实的编程基础是学好逆向的关键,基础打好了学什么都快。程序的基础就是算法和数据结构,语言只是一个实现的工具,绝大多数语言都是相通的,我们只要掌握一门,以后如果需要学习其他语言的话上手就会很快了,基础知识我们重点需要掌握以下内容:
    1.至少一门高级程序设计语言,推荐C语言或Pascal
    2.x86汇编语言
    3.常用算法和数据结构
    软件一般都是在特定平台下运行的,如Windows平台,Linux平台,WinCE平台,Java平台,Symbian平台,Plam平台等等。。。针对特定平台下的软件逆向,需要掌握特定平台下程序设计的相关知识,包括其SDK,进程管理,内存管理,文件系统等。这些东西不必全部精通,但要有个大致的了解,常用Api要知道,有特定平台下的程序设计经验最佳,遇到问题知道在哪里能找到自己想要的资料就够了。逆向的过程本身就是一个学习的过程,因此我们可以在逆向的过程中补充自己相关的知识,这样学习的效果是最佳的。(由于本人所接触的面比较窄,接触得最多的就是x86 Windows平台下的原生程序逆向,因此本系列文章中的内容除非特别说明都是指x86的Windows平台下原生程序和代码)
    学习逆向的最好方式就是动手实践,在实践中有针对性的学习。通常来说我们逆向时所面临的东西对我们来说是未知的或者是可能知道但不确定的,如果是已知的就没必要再去逆向了。针对性的学习就是在自己逆向的时候缺什么知识就补什么知识,日积月累过后我们的收获是相当可观的,不光是经验值的增长,还有知识面的增长和知识深度的增长。
    编程的经验对于我们实践逆向时也很重要,例如进行“漏洞挖掘”的时候我们可能会以程序设计者的角色进行思考,程序在哪些地方需要进行防范,哪些地方可能会出现漏洞等等,如果我们有足够的经验的话,可以很快定位到相关的代码部分对其进行分析,看是否存在可能的漏洞。又如在进行“技术探秘/代码还原”的时候,由于现在的程序规模越来越大,我们不可能每条指令,每段代码都去看,都去逆向,假如一个1M的程序需要这样做的话,光时间成本上来说成本都是相当高的,因此我们需要快速定位关键代码段,而丰富的编程经验有助于我们做到这一点。拓宽自己的编程知识面、积累编程经验跟积累逆向经验同样重要。丰富的编程经验能让我们事半功倍。
    另外在进行代码还原时我们最好能用原始程序的实现语言进行还原,这是为了避免麻烦,因为现代的编程语言通常都有自己的Framework,提供各种各样的类库,他们功能各异,互不兼容,如一个VCL的程序我们硬要用MFC对其还原,VCL的某一非常复杂的机制或功能在MFC中可能没有,而自己如果在MFC中实现的话工作量是相当庞大的,这时的结果可能就会是事倍功半了。因此我建议在代码还原时最好使用原语言进行,原来是C的就用C,原来是Delphi的就用Delphi,原来是Python的就用Python。。。
    逆向工程时常具有“四两拔千斤”的功效,我也不太会表述,等你有足够的实践之后大概才能体会到,这个就只能意会不能言传了
    学习资源
    上面说了那么多,是时候介绍一些学习资源的时候了,这些资源都是比较基本的,可说是学习阶段必备的,希望在大家学习和实践的过程中能帮到大家。

    《Windows程序设计(第5版)》 – Windows平台下程序设计的经验教程。URL - http://www.china-pub.com/2382
    《Windows核心编程》 – 又是一本经验的书,可以帮助你把Windows下的编程技术提升一个层次。 URL - http://www.china-pub.com/131
    《深入解析Windows操作系统(第4版)》 – 这本书是关于Windows内部机理核心的权威之作。这本书对提高你的逆向水平也是大大有帮助的,当然,前提是在你看懂之后。 URL - http://www.china-pub.com/32775
    《加密与解密》 – 不错的入门书籍,快出第三版了,http://www.china-pub.com/12210
    网站
    www.rootkit.com – 很多关于系统安全,系统内核方面的资料和代码
    www.codeproject.com – 很多程序设计的代码和文章
    msdn.microsoft.com – 包含最新的微软平台下的开发资料
    论坛
    bbs.pediy.com - 看雪论坛,国内最大的加解密论坛,已经向软件安全转型,上面汇集了国内大批高手。
    www.unpack.cn - 一蓑烟雨,国内最专业的脱壳论坛,关注面也很广,除了脱壳外还有汉化、软件安全、木马病毒、编程、游戏、文学、音乐、艺术等,上面的高手也不少。
    bbs.driverdevelop.com - 驱网论坛,驱动开发的论坛,高手不少,但是发言的比较少,可以去逛逛。
    forum.sysinternals.com – Sysinternals,很多系统方面的资料,不少高手在上面发言。
    www.debugman.com - 第8个男人,在下创建的论坛,旨在为志趣相投的朋友提供一个交流平台,目前关注方向为程序设计、逆向、代码安全和系统底层等。
    工具
    这里列出的工具只是很少一部分,对工具的选用,我的观点是哪个随手就用哪个。
    OllyDbg – 调试器,ring3下的调试器,上手快,功能强大,有很多插件。
    SoftIce – 调试器,ring0级调试器,当然ring3程序也是可以调的,功能强大,但已经不更新了,不支持vista等较新的操作系统。
    WinDbg – 调试器,MS自家的调试器,就不多介绍了,两个字 - 推荐。
    IDA – 反汇编器,最强大的静态反汇编分析工具。
    LordPE – PE工具,可编辑PE文件等。
    PEiD – PE工具,可识别PE文件的格式信息,如用什么编译器编译的,是不是被什么壳处理过了等。
    FileMon – 文件监视工具,可监视系统或程序对哪些文件做了什么操作。
    RegMon – 注册表监视工具,可监视系统或程序对哪些注册表项做了什么操作。
    SSM – HIPS,这个工具有时候可以给逆向带来很多方便,如抓取某个文件,禁止访问某个注册表项,盒灰分析等。

    May 23

    微软的混混们

    大公司总是会有这样那样的问题。这其中一个问题就是时间长了积攒了一些混日子的人,由于通常大公司都很稳定,不裁员,所以很多大公司被人们称为了养老院,比如微软。本人见过以下几类混混。

    1. A在微软已经工作了10年,典型的特点是神龙见首不见尾,长期Office的门紧闭,使人不知人是否在内。经常遇到他老板在门口敲门等待10分钟左右,最后确定人确实不在的场面。
    2. B在微软已经工作了9年,典型的特点是任何工作到了他那里就石沉大海。当你问他进展情况的时候,他的回答总是“I’m working on it”。本来几天就能搞定的事情,你总是会发现在他那里几个月以后还是active的状态。
    3. C在微软已经工作了5年,典型的特点是不回email,不参加discussion。一直奇怪分给他的任务他到底做了什么,做得如何。由于对他没有信心,老板只能叮嘱其他人尽量也要去cover他那一块。结果一年之后,他跟大家一讨论,发现他做的东西非常少,别人做的非常多,他还就顺势把这块任务推给了别人。
    4. D在微软是个新兵,工作刚满两年。可是不知为何从刚参加工作开始就混。第一年正赶上和以上某君交接工作,正好应了中国一句老话“一个和尚有水喝,两个和尚没水喝”的道理。任何事情到了他们那里总没人去care,两人互相推给对方。光工作交接就用了一年的时候。第二年终于算是全部负责了,可从来都是maintain 现有的工作,从没想过如何优化,扩展。Test failures从来不会主动去triage,一定要老板push几次才行。Test spec上明明有的test case就是发现不了bug。
    5. E在微软是个contractor,更是一个老油条。contract的工作一般一年。一年之后工作交接,你发现他几乎什么都没有做。Test spec, test code, automation job 等等几乎全部都是copy别人的。自己加上的test case自己都不明白为什么要有这个case和怎么去test。典型的回答是“This was written by XXX, I don’t know”, “I never run this test”, “This has been covered by XXX” (but they haven’t, if you ask XXX"), “Let me check and get back to you”, “All tests on this spec are manual”。从他口中能得到的信息量几乎为零,因此别人只能推到重来。

    以上几人已经有人由于长期坚持不得不离开公司了,剩下的在team里的比例还是达到了1/3, 也就是33%。这也是我为什么说微软裁人太少的原因,可惜的是微软裁人大多并不是按照Performance进行的,混得人还是在混,很多Performance好的却被裁。唉,这个世界总是不公平的。

    高级测试人才应该掌握的六类知识

    经常遇到测试人员不知道学什么,或者学一个东西不知道有没有用。其实我也经常会遇到类似的问题,因此我自己也想把我学到的知识归归类。我想只要是这几类的知识,你学习都没什么错,总是会有用的。

    1. 产品知识:对于你所测试的产品,你一定要非常熟悉。小到你所测试的模块,大到整个产品的架构,内部实现,代码,等等。
    2. 测试知识:黑盒测试,白盒测试,手工测试,自动化测试,性能测试,安全测试等等。
    3. 开发知识:编程,数据结构,算法,调试等等。
    4. 专业知识:以上2,3是基本的知识,你还应该精通一些你从事的更专的技术知识。比如,如果你的产品是基于.net的,你应该精通.net, 或者类似的J2ee等。(例如这方面我应该掌握的Win32系统编程,Windows内核,WDM等等)
    5. 领域知识:你应该精通你所工作的领域的知识,比如手机领域,数据库领域等等。
    6. 行业知识:你要对计算机行业的整体状态,新技术,动态,发展趋势有一个明确认识。(比如我除了自己从事的领域还关注Web2.0,云计算等等)

    要记住,你首先是一个计算机人才,其次是一个软件人才,再次是一个测试人才,最后你才是一个SQAA, SQAE, STE, SDET等等。要想做一个高级测试人才,这一条线的知识都需要掌握。

    《Windows Internals》学习心得(1)

    以前做开发的时候用VC, MFC, 对于Win32和Driver是一点也不感兴趣。后来乱七八糟混了好几年,IT业大变,自己碰巧就做上了测试。测试又做了快5年了,大部分时间是自我摸索,到了现在这情况变成了一定要学习Windows internals了。
    这本书从开始看也两年多了,我很难说我看懂了多少,只是最近才开始有点立体的感觉,当然这跟工作上接触到一些相关内容还是有关系的,否则只是硬看应该是看不懂才对。我想目前由于不精通Windows internals对于我的测试工作有以下几个障碍:
    1. 跟开发人员的沟通存在Gap。
    2. 不能更好地去设计测试用例,因此不能抓到更深入,复杂的bug。
    3. 对于一些复杂点的问题很难去debug。
    4. 对于code review, code coverage, security test等等都受到了很大的限制。
    5. 职业发展也有了bottleneck。
    因此,我觉得在今后的几年应该在Windows internals上下下功夫,争取能够达到精通。今天我就想谈谈自己以前比较混乱的一些概念,windows internals, windows kernel, SDK, DDK, Win32, driver。
    • Windows internals应该是讲Windows OS实现的一些细节,它并不局限在kernel mode的模块和知识,还涉及到了user mode的一些系统进程。因此,我说学习windows internals就应该包括了所有Windows OS的知识。
    • Windows kernel,我主要是按照在kernel mode运行的模块来理解的,因为Kernel mode里还有个kernel,容易造成概念的混淆。
    • Win32 API就是windows提供的在user mode的应用程序编程接口,它的工具包叫做SDK。但是涉及到系统服务,也就是内核上的服务的时候,他们是通过ntdll.dll转到kernel mode去实现的。也就是说,实现的细节还是在kernel mode。
    • Kernel里提供了一套接口叫DDK,是给driver的开发人员使用的。如果你想在Kernel mode运行你的程序,你应该只能通过编写driver来实现,正常来说。
    由于windows internals的大部分知识都是在kernel里,因此我也想主要集中在kernel mode里的模块和知识。
    1. 对user mode开放的服务都有哪些,实现细节如何?
    2. DDK里的函数都有哪些,实现细节如何?
    3. Executive层的模块都有哪些,实现细节如何?比如,memory manager, IO manager, cache manager等等。
    4. Windows里的driver都有哪些,实现细节如何?比如我认为最重要核心的ntfs。
    学习资料:
    《Windows Internals》
    《Programming the Microsoft Windows driver model》

    最后,HAL不想学,也不知道有没有用,Hardware不想学,WDF暂时不想学。现在是新手,能想到的也就这么多了。

    Debugging Tools for Windows 学习使用心得

    其实我的主要工作一直是UI test, UI automation, manual test 等等。曾经跟领导提过想做些深入点的测试,领导则反问 “你Kernel debugging 怎样?”。这是一个非常有趣的问题,你因为不具备良好的kernel debugging的能力,所以不给你做深入的测试工作,而因为你没有做深入的测试使你也不可能具备kernel debugging的能力。很多时候事情就是如此矛盾的,而我也曾经说过,一切最终还得靠自己。
    前几天发现一个奇怪的bug,分给这里的一个seniro dev他也没太多的办法。我在一个高手的指导下自己debug and figure out了root cause。在和这个高手的交流中,也基本明确了一下步的学习目标。以前的我主要是靠自己摸索,我想多跟高手接触,交流还是非常非常有帮助的,当然机会也不是很多。那么我的下一步的目标就是“code review, debugging, windows internal and WDM”。Debugging可以说贯穿了其他的三个,因此我今天先谈谈我对debugging tools的感受。
    我们基本都是用微软提供的几个debuggers,ntsd, cdb, kd, windbg。ntsd和cbd是user mode debugger, kd是kernel mode debugger, 他们都是command line的,而windbg是UI的debugger, 可以调试both user and kernel mode。大多数情况,我都是用windbg,但是在一些特殊的情况下,我还是需要其他的tools。今天我主要是谈windbg,我想学习windbg大概分这么几个阶段:
    1. windbg的命令,共三种命令,普通命令,加'.'的命令和加'!'的命令。Debugging tools自带的那个教程学习一下就应该差不多了,以后就靠经验积累了。
    2. 如何开始debug, 这要根据你所debug的目标和要debug的问题来决定了。你应该决定是使用user debugger 还是 kernel debugger, 是 local debugging 还是 remote debugging, 是用windbg还是ntsd, 等等。通常都有几种方式去debug,你要能够准确选择一个最合适的。
    3. 怎样进行debug。对于一个需要debug的问题,你需要有你的策略。比如,在哪里设置断点,如何设置断点,等等技巧。
    4. 利用一些tools。有些情况下只有debugger还是很难debug,你需要使用其他的tools去辅助。比如,有的时候在问题显露的时候已经太晚了,你很难追踪问题发生时的情况。这里,你可以用一些tool使得在事情发生的时候跳到debugger上去。
    5. Code review非常重要。当你发现一个bug的时候,如果你代码熟悉,你可能直接就能想到问题出在哪里,或者你稍微读读代码就能发现问题所在,根本就不需要debugger。而在你debugging的时候,常常你也需要review相关的代码来理解这个问题。
    6. 汇编语言。当你在调试optimized code的时候,你常常不能通过dv, dt等命令正确地看参数,变量等等,或者变量根本就没得显示。这就需要你具备汇编语言的阅读能力,了解calling convention, 不同cpu的汇编,以及在disassembly模式去调试。
    7. Kernel debugging。如果你具备了以上的技能以后,user mode debugging应该不成什么问题了。但是对于调试kenrel mode还是需要一些附加的知识与技能。首先,kernel debugger的命令很多跟user mode的就不一样了,你需要学习。其次,你需要了解Windows internal的知识和数据结构,以及Windows driver model。这也是为什么我把Windows internal 和 WDM作为两个学习要点。
    最后引用高手的两句话,“debug一两年,你就没什么问题debug不了了”,“只要能repro,你总能找到办法去debug”。