qiming's profile陆其明 - 逐日PhotosBlogListsMore Tools Help

Blog


    12/21/2008

    《代码之道》勘误表

    由于《代码之道》一书整个出版过程比较仓促,在我把译稿交给出版社、出版社编辑同志完成修改之后,出版社并没有把修改后的译稿发回给我复查。结果是,书中出现了一些悖离原文的翻译,可能会给读者带来费解或误导。(毋庸置疑,我对全书精神的把握肯定要比编辑同志好一点。)这不完全是编辑同志的错,更多是出版流程上的问题。本着严谨、务实的态度,出此勘误表。参见http://blog.csdn.net/happydeer/archive/2008/12/21/3574823.aspx

     

    12/11/2008

    访谈录:中国的软件业需要悟道

    1.      记者:目前,随着中国IT业的发展,国外IT企业对中国IT业也越来越重视,能否简单介绍一下目前中国外包情况?

    陆其明近几年,中国IT业的发展确实比较快,特别是软件行业。你可以看到,全国各地都在建软件园,各级政府对软件企业也都有政策倾斜。软件企业的发展如同雨后春笋一般。遗憾的是,国内众多的软件企业中,很少能制造出有自主知识产权、并且拥有广大用户群的软件来。为什么呢?原因可能有很多,但我觉得最关键的是“土壤”问题——国人对知识产权的尊重意识不够。很多人都没有花钱买软件的习惯;企业做出来的软件没人买,那何以为继呢?于是,很多软件企业做起了含金量不高的定制项目,做起了软件外包。看一下前不久刚刚统计出来的数据吧:中国软件外包2008年第3季度的规模已经达到45.3亿人民币。看起来,中国的软件企业活得还不错。也很有意思,您的问题里没有提软件,而直接提到了“外包”;看来在中国,软件就等同于外包了J 中国的软件有了规模,但我认为中国离软件强国还有很远的距离。

     

    2.      记者:您目前在哪家公司就职,在公司中扮演怎样的角色?

    陆其明我目前在速尼软件(上海)有限公司工作,担任Qflix部门的工程经理一职。速尼是一家美资企业,专业从事多媒体内容的制作、管理、娱乐等软件的开发,在欧美享有良好的声誉。好莱坞的很多DVD都是通过我们公司的高端软件制作完成的!而公司的使命,更是要把好莱坞的娱乐体验带进千家万户寻常百姓的家中。再说说我所在的Qflix部门吧,这是一个新成立的部门,主要从事按需生产DVD的产品研发。听说过“长尾理论”吗?我们的产品能使这个理论在DVD消费领域变成现实。市场前景很不错哦,很有革命性!我本人主要负责中国这边的研发工作,以及相关的项目管理、沟通和协调。

     

    3.      记者:在一个项目中常常会遇到怎样的问题?

    陆其明建一栋房子是一个项目,造一架飞机也是一个项目,但我们这里只说软件项目。软件项目中可能会碰到的问题实在太多了:需求不清,需求经常改变,设计不合理,人员不够,人浮于事,计划太紧,代码太乱,毫无流程或者流程混杂,沟通不畅,软件Bug太多……任何问题处理不当,结果都可能是:不能在规定的时间内交付给客户符合他们的需求、达到他们的质量要求的产品或服务。那就是项目失败!

     

    4.      记者:如何提高一个项目的开发效率?

    陆其明一个项目能否成功受到很多方面因素的影响。而且各个项目有各个项目的特点,不存在统一的、放之四海皆准的、能确保项目高效成功的方法。但总体来说,人才是第一位的。我们国内不缺高素质的软件人才。再则软件流程也很重要,国内软件企业在这方面很薄弱,不过即使是国外的企业也不见得个个都很强。再则就是沟通,因为沟通永远都是个问题。再则……人才、流程、沟通,不分先后顺序,个个都很重要,个个都大有可为之处,做好了都能提高项目的开发效率。但是,迄今为止,没有哪个方法能够彻底解决软件开发过程中的所有问题,哪怕你采用最近几年很流行的敏捷软件开发过程。软件行业里有句名言,叫做“软件开发没有银弹”。因此,我认为,在项目实践中不必刻意去套用一种“完美”方法,而在项目过程中建立起一个持续反馈、自我改进的机制才是最有价值的。

     

    5.      记者:作为一个项目管理者,您是如何建立一支高效的软件团队?

    陆其明这是每个管理者都关心的问题。毕竟,谁不想拥有一支骁勇善战、能够百战百胜、建功立业的团队呢?!当然,为了建立一支高效的团队,有很多技巧可以应用。但我觉得更重要的,还是要提高我们管理者自身的素质。那就是如何让自己成为一名优秀的管理者?难吗?其实一点都不难,你只需要做好下面两件事:(1)确保你的团队能够正常开展工作;(2)把你的团队成员真正地当人看,而不是只把他们看成是资源。(呵呵,这些我也是从《代码之道》一书中学到的J

     

    6.      记者:我知道您最近翻译了一本软件职场方面的专著,书名叫做《代码之道》,在市场上这方面的图书并不是很多,能谈谈您对这本书的感受吗?主要针对读者人群有哪些?

    陆其明是的,我前段时间翻译了一本叫《代码之道》的书。虽然书名里有“代码”,但书的正文中没有出现任何一行代码。这本书阐述的是“道”,软件之道!我还要说的是,我太喜欢这本书了;不是因为我是这本书的译者,而真正是因为这本书的内容本身。这本书太贴近现实了,非常有启发意义——如果你把书中的“微软”换成你所在公司的名字,把“Windows”、“Office”换成你所在公司的产品名字,你会发现,整本书好像就是在说你们公司的自己事一样。说的是事,讲的是理,悟出的则是道。太精彩了!

    《代码之道》适合所有软件从业人员阅读。这本书,管理人员读起来会更有味道;但被管的人读一读此书,同样能够受益匪浅。我写过四本书,翻译还是第一次。不管我的翻译功力多么稚嫩,也顾不上“王婆卖瓜”之嫌,我真心向大家推荐《代码之道》。

     

    7.      记者:这本书给你感受最深是哪个部分,为什么?

    陆其明说起感受最深的部分,我想应该是那些关于“管理”的篇章吧。这包括了第1章的“项目管理”和第9章的“人员管理”。原因可能是因为这些话题比较贴近于我现实的工作。我是做技术出身的,管理对我来说存在着天然的障碍。为什么这么说呢?因为技术注重的是细节,而管理注重的是大局。技术出身的管理者一不小心就会陷入过于关注细节的泥潭,也就很难真正地把管理工作做好。因此,管理对我来说是个挑战,是一个需要我不断提高的领域,也是我目前的兴趣所在。通过阅读《代码之道》,我对如何克服管理上的障碍信心更强了。当然,我并不是在贬低这本书的其他部分。每个读者的知识框架是不一样的,各人有各人的实际情况。如果你对软件过程改进比较感兴趣,那第2章会比较符合你的胃口;如果你对效率很看重,那第3章定会让你大受启发……总之,大家见仁见智,各取所需吧!

     

    8.      记者:最后一个问题,目前又是一轮企业招聘的时节了,希望您能谈谈应届毕业生在职场上应该注意什么,或者说给他们提一些建议吧?

    陆其明时下受金融危机的影响,很多企业都在削减开支。一大批企业倒掉了,或者开始裁员,同时也停止了招聘。因此,我认为眼下的就业形势不容乐观,2009年可能还会更加严峻。至于应届毕业生就业问题,可能还要更难一点。因为大部分应届毕业生都是白纸一张,他们最缺乏实战经验,而这跟企业的用人条件是背离的。遗憾的是,很多应届毕业生还自我感觉良好,做起事来却是眼高手低。结果呢?他们对企业创造不了什么价值,难怪一些企业订下潜规则:“绝对不招应届毕业生……”但谁不是从应届毕业生过来的呢?作为过来人,我能给出的建议是:要认清当前的形势,认清自我的情况,始终保持一种谦虚、学习、积极向上的心态,“大处着眼,小处着手”,兢兢业业把事情做好。没错,应届毕业生年轻、思路开阔,但企业支付给员工薪水不是因为员工的能力,而是因为员工给企业创造了价值,也就是为企业做出了贡献。能力和贡献之间并不是直接的等号关系!要经常问问自己,你对企业的价值何在呢?如果说个人能力是进入企业的敲门砖,你在工作中也能保持良好的心态,那在一个企业工作达到一定级别之后,你会发现,个人的智力和行动的速度对职业生涯的进一步发展起到的作用已经不再明显。这时候,你的沟通技能以及自我管理能力就显得非常地重要。当然,这些都是后话了……

    11/14/2008

    温昱书评:读《代码之道》

    索然无味、毫无观点的书永远引不起人们的阅读兴趣。放心,《代码之道》绝对不是!

     

    形式上,本书中的每一篇文章都通过讲故事等方式提出问题,然后分析问题根源,最后给出改善建议。其中,问题的提出往往极具戏剧效果(作者也坦承“为了达到效果,我又一次夸大了问题”),这样一来,凸显了问题的巨大负面影响,且使阅读过程变得有趣。于是,当捧书在手时,产生欲罢不能的感觉,也就并不奇怪了。

     

    ¨        不必说“我认识一些架构师,他们的生活都是失控的”、“回到现实世界来吧,到别的经理手下干活也未必解决问题”这些亦庄亦谐的话点到了人的痛处——现实就是这样的!

     

    ¨        也不必说“你总是在伤害你爱的人”、“了解并接受你所选择的生活方式”这些富有哲理的话让人顿生错觉——本书的上架建议真的是“软件工程”?

     

    ¨        单是“管理层不切实际”、“如今,大家都在跨部门合作上空口说白话”这些你想说又不敢说的话就足以“抓”住你——此书我得好好读读!

     

    定位上,本书不仅是实用建议录,也是深入思考集。书的字里行间,透着作者的良苦用心:不仅“推”给你体现其多年经验精华的实用建议、医“病”良方,更要“拉”你就一线开发中的关键问题进行深入思考、对比分析。这是十分值得赞赏的。即使在我并不认同作者阐述的某个观点之时,我对作者“引发思考”良苦用心的赞赏也未减一分。

     

    内容上,都是和一线的“软件工程师和工程经理”息息相关的话题。首先,是软件开发流程。第1章,谈了项目管理方面的经验。第2章,核心观点是“敏捷,但应理性”。第3章的真正含义不是“停止写规范书”,而是“为了提高协作效率,建议采用非正式文档”。第4章,阐述开发者和测试等其他角色之间的关系。第5章谈质量,质量=业务上有价值+工程上无Bug。第6章讲前期设计。……是的,过程管理、项目管理、沟通管理、角色设置、质量管理、前期设计,这些正是软件开发流程关心的。

     

    除此之外,本书有30%的内容覆盖一线开发者和经理成长的话题。例如,我很喜欢第9章。作者为经理们提供了实用建议:如何识才、如何面试、如何帮助平庸员工、如何避免团队“内斗”……。很中肯的良方。

     

    有趣的是,这本书的很大一部分我是在外出讲课的火车上读的,而读此书的感觉恰似坐在晃动的火车上——它不容你的大脑懈怠,因为让你“为之一振”的观点会以极高的频率不断“跳”出来,冲击力十足。

     

    ¨        “有没有一种方法在大产品和小团队之间的缺口上架起一座桥梁呢?答案是肯定的,有!那就是架构。架构最重要的一点,就是它能把难以处理的大问题分解成便于管理的小问题。”非常到位的总结。我在架构培训中也常讲:架构要设计到什么程度呢?第一要支持并行的详细设计,第二可根据团队和项目情况灵活调整,第三业务层和通用机制应更深入设计。

     

    ¨        “工程的本质就是要真实地知道,而不是靠猜测。”言简意赅,却切中肯綮。

     

    ¨        别的公司,团队里有交互设计师、文档专员、过程经理等角色,你的公司要怎么做的?“如果那是一款很熟悉的产品,目标也很明确,那么你可能不需要很多的专员。如果那是一款不常见的产品,目标也很模糊(至少对于工程师来说是这样),那么你需要较多的专员。”这就是《代码之道》给出的回答。

     

    ¨        ……

     

     

    经验,对软件从业者的重要性,怎么强调都不过分。而在本书中,作者无私地分享了他过去在软件行业6个不同的公司、28年的职业生涯中提炼出来的经验。相信大家都能从中找到自己需要的。

     

    7/27/2008

    《I. M. Wright's "Hard Code"》翻译完工

    这里好久没有更新了……前段时间在忙着翻译一本MS Press的书——《I. M. Wright's "Hard Code"》——从4月8号开始,历时整整3个月;每天晚上都是12点以后才能睡觉;几乎每个双休日都得扑在翻译上……一个字,“累”!期间,因为体虚,我的耳朵一次又一次地发炎;但我得坚持住,因为出版社给我的交稿期限是7月20号,时间很紧!也可想而知,我少有时间去照料我那刚满周岁的儿子。哎,好就好在,那段日子终于结束了——上上周我就把书稿交给了出版社。这是我第一次做翻译,也许也是最后一次吧,因为翻译需要花费的精力实在太大了!但不管怎么说,这本书的中文本估计再过3个月就能上市吧,还是有点期待 Smile
     
    *内容提高*
     
    本书总共有49个栏目,以一位微软内部人士的视角,揭示了关于软件编码、软件测试和项目管理的残酷现实。作者文笔犀利,见解独到,对软件行业内的很多常见问题提出了解决方案,并提供了最佳实践。通过阅读本书,你将了解到:怎样提高软件的质量和价值;怎样切合实际地管理项目的时间表、风险和规范书;怎样为常见的低效率开发瘦身;怎样应用过程改进方法,避免固执盲从;怎样驱动一个成功的、令你自己满意的职业生涯;以及怎样发展并管理一个欣欣向荣的团队。
     
    本书提出的观点,是作者对过去在软件行业6个不同的公司、28年的工作经验的一次总结。本书不仅是微软内部员工的必读之书,它也同样适合于软件行业内其他所有的工程师和管理者阅读。
    11/27/2006

    温昱评《脚本驱动...》

    读罢陆其明的新作《脚本驱动的应用软件:开发方法与实践》一书,感觉非常不错!在我看来,此书至少有三个特点颇值得称道...
    6/5/2006

    [开源]脚本驱动的看图软件

    本文摘自《脚本驱动的应用软件开发方法与实践》,作者:陆其明
     
    第6章 脚本驱动的看图软件

    6.1 脚本驱动的意义

    在软件的交互性不断提高的今天,仅仅提供菜单或工具条的界面已经不能满足用户的需要了;软件的可定制特性已经成为当今软件的一项基本特征,对于一些通用软件尤为如此。那么,本书引入的脚本驱动的软件开发方法又有什么意义呢?
    使用脚本驱动的软件开发方法,程序员可以彻底摆脱UI艺术设计。大家知道,UI对于一款软件来说是非常重要的!要把UI做好也是很不容易的!软件的UI应该是帮助用户更好地使用该软件提供的功能或服务的,因此好的UI应该是漂亮的、整体风格一致的、符合用户的使用习惯的。很多程序员说,我的审美能力太差了,设计专业的UI恐怕已经超出了我的能力范围。现在不怕了!其实,UI完全可以交给艺术设计师来做(这也正是他们的特长)。程序员与UI设计师之间有着不同的分工,并且最终通过脚本来进行整合;大家各施其职,各尽其才,何乐而不为呢?
    除了程序员与UI设计师之间的分工之外,程序员内部还可以这么分:专门开发商业逻辑的程序员和专门开发脚本程序的程序员。他们使用不同的程序设计语言,他们对各自使用的语言都非常精通,他们都在为同一款软件提供不同的支持——脚本程序可以用来定义UI元素、实现UI逻辑,可以很灵活地跟用户实现交互;这使得其他更多的程序员能够集中精力于商业逻辑的设计和开发。这样的分工是合理的,是富有生产力的。不同专长的程序员专注于他们各自擅长的领域,个人兴趣与公司业务有效地结合起来,更利于个人的成功。而这种个人成功,带来的同样是公司业务的成功。
    脚本驱动的软件开发方法细化了软件开发过程中的分工,因此非常适合于基于团队的大型软件开发。让分工责权清晰,让合作的渠道畅通无阻,软件开发的整体效率就有了保障。面对不断变化的软件需求,我们可以做得更加从容。
    脚本驱动的软件最大的特点还在于它在可定制性和交互性方面的出色表现。因为针对一个特定的商业领域,我们可能已经开发了非常多、非常细的功能(或组件)。然而,这么多功能并不是统统放在一个软件中、一股脑儿地推给所有用户的。这并不是一种成功的方式!因为用户有不同的分类,不同的用户往往有着不同的需求。我们必须根据不同的用户需求为软件组合不同的功能集,表现出一种专业的个性化服务,以获得较高的用户满意度反馈。通过特定的脚本规范,以及脚本程序的交互控制能力,这种软件的定制其实很容易就能做到。
    脚本驱动的软件到底还有多少好处呢?还是请读者在本书提供的不同版本的看图软件之间进行细细的比较吧!认真体会从ImageViewer_Basic到ImageViewer_Skinned、ImageViewer_Customized乃至ImageViewer_ScriptDriven的演变过程,相信读者定会有所感悟。
     
    6.2 脚本驱动的实现

    脚本驱动的看图软件源代码请到如下网址下载:
    http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1559
    5/31/2006

    使用Active Scripting技术进行JavaScript解析的典型应用

    本文摘自《脚本驱动的应用软件开发方法与实践》

    Active Scripting是微软公司提供的一种脚本解析技术,是ActiveX技术的一个重要组成部分。它支持解析两种脚本语言:VBScript和JScript,并且已经在很多专业软件中得到了广泛的应用,其中就包括微软公司自己的Windows操作系统、以及Office系列办公软件。有了Active Scripting技术,我们也可以让自己开发的应用程序来支持脚本解析,使应用程序的部分功能为特定的脚本语言所控制、与脚本程序实现互动,以此大幅度地提升我们的软件产品在用户可定制性、可交互性方面的表现。
    接下去,本书将重点介绍Active Scripting的基本结构和实现原理,并以一个实例程序来演示Active Scripting的应用方法。通过这部分内容的学习,读者将基本掌握在自己开发的应用程序中支持脚本解析的技能。

    ...................


    5.2.3 实例程序:CurveSee
     
    假设你去一家公司应聘,被要求做这样一道题目:对于用户输入的任意一个平面函数f(x),请绘制出其函数曲线。很有挑战性哦!
    这里的技术难点是如何来计算表达式的值。因为用户输入的表达式是任意的一串字符,如果要计算这个表达式的值,一般的做法是:对表达式进行扫描,去括号,按照运算符的优先级生成二叉树,然后遍历该树生成逆波兰表达式,再然后通过栈的方法进行运算。如果在表达式中再包含有函数的话,那就更麻烦了……
    那么有没有简单一点的解决方案呢?答案是肯定的。我们可以使用脚本解析技术!因为JavaScript(或VBScript)引擎能够计算表达式的值,更重要的是,它们能够直接接受字符串形式的表达式。假设现在有个表达式为:f(x) = sin(x),我们只需在某个取值范围内、按照一定的步幅递增x的值,然后让脚本引擎去分别计算sin(x)的值,并将计算的结果赋给变量y,之后将每次x的值和对应的y值(以及当前循环计数器的i值)一起传回给应用程序;应用程序根据这么一对一对的x、y值,就能很方便地画出表达式的函数曲线了。这个过程可以用下面的这段脚本伪码来表示:

    // 假设x的取值范围为[xMin, xMax],在这个范围内要计算maxCount个采样点
    var x = xMin;  // x的初始取值
    var xStride = (xMax – xMin) / maxCount;  // 计算x的步幅
    var y;
    for (var i = 0; i < maxCount; i++)
    {
        // 在脚本中计算表达式的值
        y = sin(x);

        // 将计算结果传回应用程序
        Result(i, x, y);

        // 指向x的下一个采样点
        x += xStride;


    接下去,我们就通过CurveSee这个例子,来介绍利用Active Scripting技术解答这个题目的完整实现。
    (请到http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1555下载源代码)
    5/25/2006

    《脚本驱动的应用软件开发方法与实践》之预览

    A Practical Guide to Script-Driven Software Development
     
    • 倡导一种先进的软件开发之部署模式
    • 推介一门专业的JavaScript解析技术

    第1阶段   原始的软件开发
            以前常常听人这么说,某某软件的作者是谁、谁谁发布了一款多么强大的某某软件。那个时候,一款软件从需求分析到功能定义、架构设计、编码实现、乃至测试,都是由(或者说主要是由)一个人来完成的。这个人是高手,是全才,是个大能人,是众多程序员崇拜的偶像。那个时代的软件产品,也往往附带着强烈的个人英雄主义色彩。为了方便阐述和对比,本书将这个阶段的软件开发称作为原始的软件开发。
            时至今日,一些个人软件仍然在延续着这个美丽的传说。本书接下去的部分,将以开发一个简单的看图软件为例,力图重现这种个人软件的开发过程。不为附庸风雅,但求管中窥豹、略见一斑。
    ................................................................

    第2阶段  分工协作的软件开发
            常常听到有人这么感叹:“现在的软件真是越做越大啊!”一个软件产品的设计、开发、维护,涉及到的技术难度以及工作量之巨大已经远非个人能力所能及。这种软件产品,没有一个规范化运营的公司来支撑是不行了!软件开发的个人英雄主义悄然淡出了历史舞台,取而代之的是:分工协作、团队精神。
            仍然以看图软件为例,后续的章节我们将进一步介绍开发支持皮肤的看图软件、以及用户可定制的看图软件的方法。与原始的软件开发相比,这里集中体现出来的是一种UI艺术设计的分离、以及UI设计与程序设计分工协作的特点。这种分工协作,使得软件开发更富有效率,使得最终的软件产品更加专业化。由于基于皮肤的看图软件和可定制的看图软件都牵涉到了XML技术,下面我们就先从XML的应用说起。
    ................................................................

    第3阶段  脚本驱动的软件开发
            高度分工是现代社会的一个显著特征。分工造成了领域的细化。在每个细分的领域中,人们更容易学以致用、学有所成,长期积累下来的经验可以帮助他们把所属领域内的事情做得更快、更好。各个领域之间同时又是相互协作的,并且有机地整合在一起,共同构成了一个和谐的、高效率运作的社会。
            软件产品的开发无疑也是一种社会活动。高效率的软件开发过程当然也要建立在高度分工与协作的基础之上。从基于皮肤的看图软件的开发过程,我们已经看到了程序员与UI艺术设计师之间的分工和协作。如果再发展到本书后续章节将要介绍的脚本驱动的看图软件,我们会看到另外一种角色——JavaScript程序员——的加入。于是,VC程序员、JavaScript程序员、UI艺术设计师之间的联系将变得更为密切(当然,根据不同的专长以及在产品开发过程中承担的不同任务,开发人员之间一般会有更细的分工)。虽然引入这种脚本驱动的软件开发的初衷,是对用户可定制的软件模式的一种增强,但它也恰恰顺应了软件开发追求不断细化分工的一种发展趋势。
            由于本书介绍的脚本主要是指JavaScript,下面我们就先从JavaScript的解析说起。
    ................................................................

    《脚本驱动的应用软件开发方法与实践》之目录

    第1阶段     原始的软件开发
    第1章 开发一个看图软件
      1.1 需求分析
      1.2 概要设计
      1.3 编码实现
        1.3.1 图像处理功能
          1.3.1.1 图像文件解码
          1.3.1.2 图像反色
          1.3.1.3 图像灰度化
          1.3.1.4 叠加Logo
          1.3.1.5 叠加系统时间
          1.3.1.6 显示到指定窗口   
          1.3.1.7 另存为图像文件
        1.3.2 UI设计与实现
          1.3.2.1 UI元素布局
          1.3.2.2 UI逻辑处理
        1.3.3 实例程序:ImageViewer_Basic
    第2阶段     分工协作的软件开发
    第2章 XML的应用
      2.1 XML简史
      2.2 XML基本概念
        2.2.1 文档结构
        2.2.2 文档类型定义
        2.2.3 元素和属性
        2.2.4解析器
      2.3 XML解析
        2.3.1 网页中读取XML文件
        2.3.2 用C++编码实现解析
         2.3.2.1 CXmlWrapper类
         2.3.2.2 遍历每个节点
         2.3.2.3 查找某个节点
         2.3.2.4 实例程序:XMLParser
    第3章 基于XML的看图软件
      3.1 UI艺术设计师的工作
        3.1.1 UI的整体设计
        3.1.2 UI元素的分离和定位
        3.1.3 生成一个XML文件
      3.2 程序员的工作
        3.2.1 UI元素设计
        3.2.2 查询XML文件
        3.2.3 支持皮肤的UI类
      3.3 实例程序:ImageViewer_Skinned
    第4章 可定制的看图软件
      4.1 UI由XML文件驱动
      4.2 实例程序:ImageViewer_Customized

    第3阶段     脚本驱动的软件开发
    第5章 JavaScript解析
      5.1 JavaScript简介
        5.1.1 词法结构
        5.1.2 数据类型
        5.1.3 变量和常量
        5.1.4 运算符
        5.1.5 程序流程控制
        5.1.6 对象
        5.1.7 数组
        5.1.8 函数
      5.2 Active Scripting技术
        5.2.1 基本原理
        5.2.2 COM自动化
       5.2.2.1 IDL和类型库
       5.2.2.2 IDispatch接口
       5.2.2.3 IDispatchEx接口
       5.2.2.4 自动化对象实现
        5.2.3 实例程序:CurveSee
       5.2.3.1 设计受控对象
         5.2.3.2 设计宿主程序
         5.2.3.3 执行脚本
       5.2.3.4 演示说明
      5.3 JavaScript解析要点
        5.3.1 名字项与全局对象
        5.3.2 属性和方法
        5.3.3 创建对象并传递给脚本
        5.3.4 接受脚本中的对象
        5.3.5 数组的解析
        5.3.6 异常处理
        5.3.7 传递一个null参数
        5.3.8 自动类型转换
        5.3.9 回调脚本函数
        5.3.10 访问脚本的属性和方法
        5.3.11 多线程问题及其解决方案
        5.3.12 支持定时器
        5.3.13 支持动态属性
        5.3.14 脚本的单步调试
    第6章 脚本驱动的看图软件
      6.1 脚本驱动的意义
      6.2 脚本驱动的实现
        6.2.1 制定脚本接口标准
        6.2.2 面向接口的实现
        6.2.3 事件和事件处理
        6.2.4 脚本驱动起来!
      6.3 实例程序:ImageViewer_ScriptDriven
     

    《脚本驱动的应用软件开发方法与实践》之内容提要

            本书纵观了软件开发在不同发展阶段的特点,揭示了当今在很多大型应用软件设计、开发过程中采用的一种部署模式,引出了一种称之为“脚本驱动的应用软件”的开发方法。结合以实例,本书还介绍了XML解析、JavaScript解析等多种实用编程技术。
            本书广泛适合于计算机应用软件系统的设计人员以及开发人员,对于指导XML技术入门也有一定的帮助,在JavaScript解析技术方面更是一部不可多得的实务指南。
    4/10/2006

    关于《DirectShow开发指南》源代码下载的声明

    由于原书所指的下载地址已经失效,请需要源代码的读者到下面的网址下载:
    http://www.czvc.com/down.asp?id=141
     
    另外,我在126.com建立了一个公开的信箱,你也可以去那里的收件箱下载,方法是:
    1. 登陆www.126.com
    2. 使用以下用户名/密码登陆信箱:
    用户名:luqiming_books
    密码:12345678
    3. 在收件箱中找到相关的mail。
    3/29/2006

    [ZT]《DirectShow开发指南》所附源代码DsBkSource\Chapter05\SimplePlayer中截图问题的解决及疑问

    今天在CSDN看到一个不错的帖子,转过来!发帖者:xw_ma ()
     
    陆老师,您的书写得真的很不错,让本人在DirectShow方面有了很大的进步,在此先表示感谢。
    但最近我发现《DirectShow开发指南》所带源代码DsBkSource\Chapter05\SimplePlayer的这个工程的抓图功能似乎有点问题,同时本人还有一些问题想向您请教。
    在bool CDXGraph::SnapshotBitmap(const char * outFile)这个函数里有这样几句:
    if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
       {
        BITMAPFILEHEADER hdr;
        LPBITMAPINFOHEADER lpbi;
        lpbi = (LPBITMAPINFOHEADER)buffer;
        int nColors = 1 << lpbi->biBitCount;
        if (nColors > 256)
         nColors = 0;
        hdr.bfType  = ((WORD) ('M' << 8) | 'B'); //always is "BM"
        hdr.bfSize  = bitmapSize + sizeof( hdr );
        hdr.bfReserved1  = 0;
        hdr.bfReserved2  = 0;
        hdr.bfOffBits  = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
          nColors * sizeof(RGBQUAD));
        CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
        bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
        bitmapFile.Write(buffer, bitmapSize);
        bitmapFile.Close();
        pass = true;
       }
    我运行后生成了一张bmp格式的截图,却奇怪地发现该图可以在ACDSee 32 V2.4和Windows自带画图中正常显示,拖曳到IE中也可正常显示,但是到了其它软件如Windows图片和传真查看器和Photoshop中却无法显示,前者说“绘图失败”,后者说“磁盘错误”。我检查后发现mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)获得的图全都是32位的bmp,如果是32位的话,上面代码中变量nColors用1<<32赋值之后应该等于0(因为VC里int型只有32位,溢出),但调试时我却惊奇地发现nColors等于1!后来才发现是VC编译实现的问题,如下面代码所示:
     int a = 32;
     int b = 1 << 32;
     int c = 1 << a;
    执行后,b等于0,但c却等于1!查看反汇编代码后才发现,对于b=1<<32编译器将其判为溢出,直接将b赋值为0,而对于c = 1 << a这种情况,编译器使用的却是循环左移位,这样1<<32就变成1,依此类推,1<<33就变成2,1<<34就变成4,……。而32位bmp正常情况下是没有调色板的,因此代码中的hdr.bfOffBits多加了nColors * sizeof(RGBQUAD)共4个字节,如果其它程序根据hdr.bfOffBits来计算图像数据区或者验证文件大小的话就会出错(在ACDSee 32 V2.4和Windows自带画图以及IE中可能没有验证hdr.bfOffBits因而可以正常显示)。
    知道原因后改正起来就很方便了,只需把
    if (nColors > 256) nColors = 0;
    改为
    if (nColors > 256 || 32 == lpbi->biBitCount) nColors = 0;
    即可。
    我的问题是:
    1.IBasicVideo::GetCurrentImage抓图时可不可以抓成24位图?难道只能抓成32位图吗?
    2.如果仍用原来的思路,而把nColors扩展为__int64型变量应该就OK了,但我试了,不行,if (nColors > 256)此时依然为假,nColors的结果依然为1,是不是C++的“>”操作符没有重载64位数的比较?您觉得应当怎样做?
    谢谢!
     
    /////////////////////////////////////回复///////////////////////////////////////
    cx0928(阳光)
    此处应改为:
    if( lpbi->biBitCount <=8)//<=8位,有调色板
            nColors = 1 << lpbi->biBitCount;
    问题1:抓图时存成多少位的图,与GetCurrentImage函数本身没有关系,此函数只是将图像封装成位图结构,这与视频格式有关,如RGB8、RGB565、RGB16、RGB24、RGB32
    问题2:你的代码不正确,改为我所的代码即可。
    非常感谢xw_ma同学。我很赞赏你的分析问题/解决问题的整个工作过程,你的这种态度是现在很多同学所缺乏的。再次向你致敬!
    1. IBasicVideo::GetCurrentImage是由video renderer来实现的,而video renderer跟显示器的设置是直接相关的,也就是说,显示器设置32位,那么GetCurrentImage抓到的bmp是RGB32,如果显示器设置成24位,那么GetCurrentImage抓到的bmp是RGB24。。。我好像做过这样的试验,但不确信了,你可以自己再试一下。
    2. 还是改一下原书的逻辑吧,推荐cx0928(阳光)方法。

    1/14/2006

    构思下一本新作

    今天是星期六,早上醒来,却不想起床;懒懒地躺在床上,开始想一件事情:我是不是该构思我的下一本新作了?!不能老是工作工作,工作之外还应该有些自己的追求。虽然我已经出版了3本书,但3本都是纯技术的,而且领域针对性很强,属于特定的“点”上面的工作。我能不能做一些“面”上面的工作,使更多的读者能够与我一起分享我的所思、所得呢?我想我能!这将是我第4本书带来的一次突破!我在努力,我在期待...
    6/13/2005

    昨天拿到了《Windows Media编程导向》的样书

    非常高兴看到自己的新书,不过已经没有出版第一本书时候的那种期待和兴奋了。

    先说说封面吧,我觉得非常漂亮!这个封面是QQ同志在临出版前一个晚上改出来的,很不容易哦。以前的封面设计早送出版社了,但他们一直没有提出异议;直到要排版印刷了,出版社才反馈过来说封面设计欠妥,马上要改。幸亏我有个能干的老婆:)再来看这本书在内容上的编排,我觉得也比前两本书要好,感觉很精简、较为“成熟”。

    Anyway,这本书好不好,最终还要读者说了算!

     

    5/30/2005

    《Windows Media编程导向》样书终于出来了

    上周五(5/18/2005),《Windows Media编程导向》的样书终于出来了!据出版社的编辑说,效果还可以。只是,这本书的出版拖的时间太长了。从2月份把稿子递交给出版社算起,到现在已经3个多月了。按照我前两本书的出版速度,这本书这时候应该是可以跟读者见面了......

    3/8/2005

    《Windows Media编程导向》——内容提要

    这是一本介绍Microsoft公司Windows Media编程技术的专著。全书结构合理,内容由浅入深,循序渐进地探讨了使用Windows Media Format SDK进行编程的方方面面,包括Windows Media在流媒体应用领域中的解决方案,先进的ASF文件格式,Windows Media编解码器以及Windows Media文件的生成、读取、编辑、流化、数字版权管理等等。

    本书对于一线的程序开发人员具有重要的指导意义,对于流媒体应用方案设计人员、对流媒体技术感兴趣的编程爱好者也具有一定的参考价值。

    《Windows Media编程导向》——前言

    这是一本专门写给程序员的书;更确切地说,是一位在多媒体编程与应用领域默默工作、跌打滚爬多年的程序员,写给更多的需要类似经验的、但又不想如此痛苦的程序员的书。冀望能以我个人的程序实践,指引你的程序之路,共铸属于我们自己的程序人生!

    本书介绍的是Microsoft公司的流媒体技术。所谓流媒体,它的主要特点就是边下载边观看,以流的形式进行数字媒体的传送,从而使人们可在线欣赏到连续不断的多媒体节目。随着近年来网络宽带化的发展趋势,流媒体技术作为多媒体与网络领域的交叉学科,得到了迅速的发展。人们已经不再满足于信息高速公路中仅有文本、图像或声音这类简单的信息,而越来越希望更直观的、更丰富的新一代信息表现形式,那就是流媒体。目前,流媒体的典型应用有:视频点播、视频会议、远程教育、数字图书馆等等。

    当前市场上主流的流媒体技术有三种,分别是RealNetworks公司的RealMedia、Apple公司的QuickTime和Microsoft公司的Windows Media。RealNetworks公司早在20世纪90年代中期首先推出了流媒体技术,它的RealMedia技术性能出色,在市场上处于主动地位,并且拥有最多的用户数量,但架设一套RealMedia流媒体应用系统需要较高的费用;Apple公司的QuickTime是一个非常老牌的媒体技术,是数字媒体领域事实上的工业标准,它依托自己的Mac操作系统的便利,也拥有不少的、相对稳定的用户;Microsoft公司起步最晚,但却是后起之秀,它的Windows Media技术不是最好的,但依托自己的Windows操作系统在PC上的垄断地位,很快便取得了一定的市场份额,并有持续增长的趋势。另外,在Windows平台上架设一套Windows Media流媒体应用系统的费用相当的低廉。互联网的发展已经证明,市场并不永远属于先来的开拓者的。随着Microsoft公司在Windows Media上的继续投入,我们有理由相信,Windows Media会在不久的将来成为最好的流媒体技术。因此,对于那些有意于或者已经致力于多媒体应用开发的程序员来说,学习Windows Media编程技术是很重要的,也是很有必要的。

    本书在编写过程中,把易学性和实用性作为两个基本原则,力求给读者带去一种愉快而高效的美好体验。全书共分三大部分:第一部分,Windows Media概论,第1章~第6章,首先从总体上介绍流媒体技术的前景及其面临的挑战,进而介绍Microsoft公司的Windows Media技术给出的解决方案,以及Windows Media SDK系统,希望读者通过这部分的学习能够对Windows Media技术有个初步的了解;第二部分,Windows Media应用编程,第7章~第10章,从编程的角度介绍使用Windows Media Format SDK的方方面面,包括Windows Media文件的生成、读取、编辑、流化等等,希望读者通过这部分的学习能够掌握Windows Media各项常用的编程技术;第三部分,Windows Media高级话题,第11章~第12章,介绍Window Media的数字版权管理,Windows Media与DirectShow的交叉应用等内容。

    本书对于一线的程序开发人员具有重要的指导意义。在开始学习本书之前,读者最好已经掌握了面向对象的编程思想和方法,具备比较扎实的VC编程基础,以及对COM组件模型的基本理解和应用能力;有DirectShow开发经验的则更佳。本书对于流媒体系统方案设计人员也具有一定的参考价值。

    由于本书是一本技术专著,在我为它编写程序实例时不免遇到一些麻烦。所幸的是,在我最困难的时候得到了Microsoft MVP项目的大力支持,他们是Neil Leslie、Sean O’Driscoll、Cally Ko,还有我们中国的MVP Lead张文雅,以及后来的技术支持工程师龚睿。感谢所有这些朋友!荣膺MVP让我受益良多,也使我更有信心能为读者奉上一部精品。此外,本书在编写过程中还参考了《流媒体和视频服务器》(钟玉琢等编著,清华大学出版社,2003年)一书。世纪音频网站负责人苏信东也提供了友好的帮助。

    最后,我还要感谢一些人......由于Windows Media技术仍然处于一个不断完善和发展的阶段,限于本人的学识水平,书中的不足或错误之处在所难免,恳请读者不吝给予批评指正。

     

    注:本书的配套光盘提供Windows Media Format 9/9.5 SDK安装程序,以及书中各章节涉及的所有实例源代码。这些实例的开发环境如下:Windows XP操作系统,VC 6.0或Visual Studio 2003 .NET,Windows Media Format 9.0 SDK(部分实例需要9.5以上版本),DirectX 9.0 SDK(开发DirectShow Filter项目时需要)等。

     

                                                                           陆其明

    2005年4月于上海

    1/17/2005

    《Windows Media编程导向》——目录

    第一部分 Windows Media概论

    第1章 流媒体来了
    1.1 什么是流媒体
    1.2 流媒体技术
    1.3 Windows Media

    第2章 理解SDK系统
    2.1 SDK系统概述
    2.2 SDK基本概念
    2.2.1 输入、输出、流
    2.2.2 格式与媒体类型
    2.2.3 Sample数据包
    2.2.4 时间戳
    2.2.5 比特率
    2.2.6 内容缓冲
    2.2.7 网络协议
    2.2.8 媒体内容发布
    2.3 SDK编程梗概
    2.3.1 开发环境配置
    2.3.2 实用的宏定义
    2.3.3 COM库的初始化
    2.3.4 COM接口扩展方案
    2.3.5 回调接口的实现
    2.3.6 异步函数调用的同步
    2.3.7 接口函数的两遍调用
    2.3.8 宽字符与ANSI字符
    2.3.9 奇妙的do-while循环

    第3章 ASF文件格式
    3.1 ASF文件结构
    3.1.1 头对象
    3.1.2 数据对象
    3.1.3 索引对象
    3.2 ASF系统特性
    3.2.1 流编号
    3.2.2 流类型
    3.2.3 流互斥
    3.2.4 流优先级
    3.2.5 带宽共享
    3.2.6 数据单元扩展
    3.2.7 SMPTE时间码
    3.2.8 标记
    3.2.9 元数据
    3.3 ASF与Windows Media

    第4章 Windows Media编解码器
    4.1 编解码器概述
    4.1.1 编解码器枚举
    4.1.2 实例程序:ListWMCodecs
    4.2 编解码基本概念
    4.2.1 CBR编码
    4.2.2 VBR编码
    4.2.3 两遍编码
    4.2.4 视频复杂度
    4.2.5 设备兼容模板
    4.2.6 实例程序:ListCodecProps
    4.3 Windows Media编码软件
    4.3.1 文件格式转换
    4.3.2 实况流编码
    4.3.3 屏幕捕捉
    4.3.4 网络流化

    第5章 Profile描述
    5.1 Profile概述
    5.1.1 实例程序:ListProps
    5.1.2 小工具:ShowProfile
    5.2 系统Profile
    5.2.1 系统Profile枚举
    5.2.2 系统Profile本地化
    5.2.3 实例程序:ListSysProfiles
    5.3 Profile管理
    5.3.1 获取ASF文件的Profile
    5.3.2 使用系统Profile
    5.3.3 保存Profile到文件
    5.3.4 从文件装载Profile
    5.3.5 创建全新的Profile

    第6章 元数据
    6.1 元数据概述
    6.2 获取元数据
    6.2.1 实例程序:ListMetadata
    6.3 ID3支持
    6.3.1 实例程序:ListID3


    第二部分 Windows Media应用编程

    第7章 Windows Media文件的读取
    7.1 异步读取
    7.1.1 读取过程概述
    7.1.2 识别输出编号
    7.1.3 选择输出格式
    7.1.4 随机定位
    7.1.5 读取器性能统计
    7.1.6 Sample内存优化
    7.1.7 实例程序:WmvPlayer
    7.1.8 实例程序:WmaPlayer
    7.2 同步读取
    7.2.1 实例程序:WmSyncRead
    7.3 文件复制
    7.3.1 实例程序:WmCopy

    第8章 Windows Media文件的生成
    8.1 生成Windows Media文件
    8.1.1 创建Profile
    8.1.2 确定编码模式
    8.1.3 识别输入编号
    8.1.4 设置输入格式
    8.1.5 即时编码预览
    8.1.6 生成器性能统计
    8.1.7 自定义接收器
    8.1.8 实例程序:FilterASFWriter
    8.2 两遍编码
    8.3 水印叠加
    8.3.1 DMO简介
    8.3.2 水印组件开发
    8.3.3 水印组件枚举
    8.3.4 应用演示
    8.4 图片视频流
    8.4.1 实例程序:WmImages
    8.5 屏幕录制
    8.5.1 屏幕采集方法
    8.5.2 实例程序:WmScreen
    8.6 使用第三方编码器
    8.6.1 实例程序:FilterASFMuxer
    8.6.2 典型应用:DivX流保存为ASF

    第9章 Windows Media文件的编辑
    9.1 元数据编辑
    9.1.1 获取属性
    9.1.2 修改属性
    9.1.3 增加属性
    9.1.4 删除属性
    9.1.5 实例程序:WmEditor
    9.2 复杂属性
    9.2.1 获取歌词
    9.2.2 编辑歌词
    9.2.3 实例程序:WmLyrics
    9.3 使用标记
    9.4 文件索引

    第10章 Windows Media的网络应用
    10.1 流媒体发布模型
    10.1.1 广播发布
    10.1.2 点播发布
    10.2 网络流化
    10.2.1 本机广播
    10.2.2 推发布
    10.2.3 实例程序:WmStreaming
    10.3 客户端播放
    10.3.1 流式播放
    10.3.2 下载播放
    10.3.3 另存为本地文件
    10.4 视频会议广播系统
    10.4.1 系统方案设计
    10.4.2 流化组件开发
    10.4.3 系统演示


    第三部分 Windows Media高级话题

    第11章 数字版权管理
    11.1 初识DRM
    11.2 支持DRM
    11.2.1 获取许可证
    11.2.2 实例程序:DRMPlayer
     
    第12章 Windows Media与DirectShow
    12.1 为什么要DirectShow
    12.2 QASF Filters
    12.2.1 WM ASF Reader
    12.2.2 WM ASF Writer
    12.3 精确到帧的定位


    附录A: Windows Media Format SDK常用GUID对照表
    附录B: Windows Media Format SDK的主要对象与接口
    附录C: Windows Media Format SDK的主要功能函数