巴别塔上的雇工


再次戏说Bug
3月 29, 2009, 1:48 上午
Filed under: 工作心情

The only good bug is dead bug” —— Starship Troopers,the movie

s1909822[1]几年前我写过一篇《戏说Bug》,最近主要的工作就是fix bug,所以想再次戏说一下。

软件开发很复杂,软件开发的艺术就是控制复杂性的艺术,复杂的系统就容易出现种种原因导致的和预期不一致的行为,这就是bug,需要fix。大的软件系统更加复杂,所以bug更多,trace和fix bug成了软件工程师的家常便饭。

临近release,需要把bug控制在一定范围内,我们就要疯狂地屠杀bug。因为我刚加入这个team,我先了解了一下每个developer平均每周能够杀死多少个bug,然后努力去超越这个平均值,这样努力了几周,发现自己杀bug的效率还不错,基上每天两个。

转头一想,美国的反恐专家们是不是也曾这么想,我每天消灭多少多少个恐怖分子,保持这样的速度,打多少多少年的反恐战争,恐怖分子也就全被消灭了。事实上是,打了这么多年的反恐战争,恐怖分子越打越多。会不会我们也会越fix bug反而bug越多呢?

首先我们在杀死bug的时候要注意,别引入新的bug,如果这样就得不偿失了。在反恐战争中,为了杀死一个恐怖分子造成对平民设施的破坏,激起更大的仇恨,所以更多的人变成了恐怖分子,这就错了。

不过随着测试人员和用户的持续测试和使用,肯定还有以前未发现的bug被发现,没有办法,只能将他们列入屠杀名单。反恐战争中,突然又冒出某某组织对你构成巨大威胁,你也没办法,只好将其列入恐怖组织名单。

虽然我们都知道“唯一的好bug就是死bug”,但是我们都清楚,我们不可能在release之前fix所有bug,不然这个产品可能永远也不会release,所以在bug triage中,对于不是很严重的bug,就处理为won’t fix或者postpone,也就是说我们对这些bug忍了。在美国的反恐战争中,triage做的不好,本来恐怖分子就很多了,还非要把伊朗国民卫队列为恐怖组织,以下子多了几十万bug,哦,是多了几十万恐怖分子,这不是找麻烦吗?

面对蜂拥而上的bug,不得不让bug slayer们想,为什么造成了这种现状呢?是不是这个系统本身出现了问题?我们如果重新建一个勇敢新世界,是不是就不会有这么多bug了?我的观点是——绝不要重头写一个大型软件

软件开发很复杂,软件开发的艺术就是控制复杂性的艺术,复杂的东西就会有漏洞。大型软件之所以一现在还能工作,就是因为先前的工程师处理了很多这样的漏洞,如果重头再来,即使不用处理这些漏洞,也肯定会遇到其它同样量级的漏洞,所以,不要重头写。现有的架构不合理,可以re-architect,现有的code不合理,可以re-factor,但是不要完全推倒重来。

Microsoft曾经想重写Word的code,经历了惨痛的失败之后,重新拾回老的code base,才把Word从悬崖底下捞起来得以Ship;Netscape曾计划重写code,死掉了。假如这个世界在核冬天之后诞生新的人类社会,完全重头再来,只要那个世界有不平等和侵略,谁敢保准会不会有新的恐怖分子。



输入法体验
3月 26, 2009, 1:28 下午
Filed under: 技术体会
公司组织了一次输入法体验活动,这种活动我当然积极参加。和众多其他参与者一样,我被安排分别用四种拼音输入法敲一篇汉字,然后对每个输入法进行评价,相关人员会对过程进行记录和分析用以提高微软输入法的用户体验。

我花了四十多分钟敲了四遍,感觉还是微软的“新新体验”输入法最好(虽然官方说还是“新体验”,但是这个名字在Office 2007发布的时候就用了,新版本应该算是“新新体验”了)。拼音输入法对用户拼音输入的判断准确率只是一方面,在别的方面也要下些功夫才能带来最好的用户体验。比如,如果拼音判断准确,那么用户就会不是一个词一个词地输入,而是一口气把一句话的拼音都打完,如果我输入“我最近喜欢看电视剧”,能够直接不停顿地敲“wozuijinxihuankandianshiju”,写完一句之后,我会输入标点符号,搜狗输入法的缺省行为是认为逗号之前的东西就是英文,所以进入文档的就是“wozuijinxihuankandianshiju,”,这很让我抓狂;而微软新新体验输入法的行为是,用户输入逗号表示用户对目前显示的文字满意,所以进入文档的就是“我最近喜欢看电视剧,”。这只是一个UI设计上的小功夫,但是带来的体验就很不一样。

积极参加公司产品的测试活动没错,今天参与者都收到了意外的礼物,一个微软无线鼠标3000微笑



BT: Behavior Targeting
3月 24, 2009, 1:54 下午
Filed under: 技术体会
前一整子Google宣布AdSense将具备BT功能,这个BT不是用来下载的Bit Torrent,也不是用来通讯的Blue Tooth,而是Behavior Targeting。在线广告领域,具有BT功能是很了不得的,价钱会比没有BT的高得多。

在线广告网最要紧的,就是把合适的广告内容在合适的时间展示给合适的人,要做到这一点,就得知己知彼——知道广告的内容,还知道嵌入广告的网页内容,只是知己;了解了用户的行为才是知彼。在没有BT的情况下,AdSense这样的服务只了解广告和包含广告的网页,但是不了解用户,所以只是知己,不知彼。有了BT,AdSense根据跟踪用户在Internet上的行为,可以探测每个用户的喜好倾向,比如某个用户总是搜索汽车相关的关键字,也浏览了很多汽车相关资讯,那么AdSense就将此用户定位为“汽车爱好者”这一类,当向这个用户展示广告的时候,就会选择“汽车”相关广告。

上面只是简单的介绍了一下BT,实际上BT是一个很复杂很高深的学问。但是,搞BT归根到底就是要跟踪用户行为,问题是——你希望自己的行为被跟踪吗?

《三体2》中,刘慈欣展示了未来世界BT达到极致,或者说达到极端的恐怖景象,广告系统能够定位每个人的所在位置,了解每个人的生活情况,然后随时随地将广告劈头盖脸地砸来。这样几乎毫无隐私的状况,诞生了这样的计算机病毒,可以利用这样的广告系统定位某个人,然后通过干扰自动化设备将其杀死。

当然,BT的倡导者们,对于BT涉及到的隐私(Privacy)问题也有说法——如果用户暴露他们的行为能够给他们带来更好的体验,比如他们看到的广告都是他们真的感兴趣的广告,那么他们会愿意使用BT的。要明白,说这话的都是卖家,卖家当然会说自己的东西好。

对BT应该是什么态度,每个人都可以有自己的看法,是否愿意让别人跟踪自己的行为,是每个人自己的选择。需要注意的是,当你下载安装一个浏览器Toolbar的时候,当你对某个超长的EULA(End User License Agreement)选择I Agree的时候,甚至当你仅仅只是使用某个搜索引擎的时候,你都可能已经选择让别人跟踪自己的行为了。



忙得没时间聆听了?
3月 23, 2009, 2:12 下午
Filed under: 工作心情
下午公司有个Career Talk——Becoming Successful Engineer in Microsoft,让人诧异的是来者寥寥,我听说好多团队最近ZBB,所以忙得没空来。

我一直认为,工作再忙,也可以不着急马上去做,计算要求今天要完成,也可以晚上加点班做嘛,毕竟这样得Career Talk的机会过去就过去了,应该珍惜。

做Career Talk的往往都是公司的前辈高人,我这个人容易听进去话,有的人觉得这样的Talk都是些官话套话,但是我总能学到一些东西。其实改变我们行为的往往就是别人的一两句话,这样的话,最容易通过和经验丰富的人交流得到。



I’m Your Brother, Not Cloaking Clown
3月 22, 2009, 5:47 上午
Filed under: 技术体会

看最近这个Blog的访问统计,发现不少访问的“引用地址”是http://search.live.com/results.aspx?q=windows

image

在Live Search上搜索windows关键字能够看到我的博客文章?但是我看相关文章和“Windows”并没有什么关系啊,跑到http://search.live.com/results.aspx?q=windows上去看一眼,的确没有什么关系。

这个现象原来是Live Search的搜索引擎在做Anti-Cloaking测试,也就是防止有的不良网站为了骗取搜索引擎(Search Engine)的high ranking,这些网站对于Crawler返回一个结果,对于普通的浏览器访问返回另外一个结果,这种作为行话叫Cloaking,也就是以为披个马甲就以为Crawler不认识它们了。

搜索引擎对付这样不良网站的办法就是让Crawler时不时伪装成一个Human去访问一下各网站,看看返回内容是否一致,如果发现它们在Cloaking,就给于重罚。Crawler伪装成Human的方法,一般也就是使用一个实际浏览器的UserAgent,比如伪装成Vista上的IE7用户就用Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0),做得更逼真一点还给个Referer说是那个网页把我引到这里来的,这也就是Live Search现在的做法。

这样的Anti-Cloaking做法也没什么不对,但是也太好被Anti-Anti-Cloaking了,不良网站只要费点心发现Referer中的模式,也就能再次骗过Crawler。

而且,所有spaces.live.com域名之下的网页内容都在Microsoft的控制之下,不可能搞Cloaking,Live Spaces得和Live Search说:我是你的兄弟啊,你怎么还总不信任我呢?55555



IE8: 饭得一口一口吃,仗得一场一场打
3月 21, 2009, 2:20 上午
Filed under: 工作心情

IE8发布了,虽然性能比IE7快了一倍,但是较竞争对手还颇有差距。这都是预料之中的,饭得一口一口吃,仗得一场一场打,既然对手也不是纸糊的,就没办法一战就能收复所有失地,每个Release都只能重点解决一部分问题。

自IE6之后的偃旗息鼓,到IE7卷土重来,再到IE8的再接再厉,性能问题没有得到很好的解决,因为重点放在标准兼容性和安全性上,当然还增加了一些我觉得并不是Killer的功能。在未来的发布中,我想IE将会重点在性能提高上下功夫。如果把IE7作为一个新起点,那么IE8算2.0版本,要知道微软产品从来都是3.0版本之后才开始发飚的。



Liskov
3月 17, 2009, 12:55 下午
Filed under: 技术体会

今年的图林奖得主是Barbara Liskov,这个名字看着眼熟,不错,著名的Liskov Substitution Principle(LSP)就是她提出来的。

LSP指导Object Oriented Design的一条重要原则,指的是,如果一个类型S能够成为另外一个类型T的子类(Subclass),那么要求在使用T实例的所有场合,S类型的实例都可以替换T的实例工作。这条原则看起来很合理,也很简单,但是这有点颠覆普通的思维,我们看这个例子:如果我们有一个正方形类Square,还有一个长方形类Rectangle,我们是否可以让Square继承Rectange?

按照数学上的说法,“正方形是一种特殊的长方形”,所以让正方形继承长方形似乎天经地义,不过正方形的特殊之处就是长宽总是一样的,所以我们这么写code:

public class Rectange
{
    public virtual int Width
    {
        get { return _width; }
        set { _width = value; }
    }
 
    public virtual int Height
    {
        get { return _height; }
        set { _height = value; }
    }
 
    protected int _width;
    protected int _height;
 
    public int Area
    {
        get { return _width * _height; }
    }
}
 
public class Square: Rectange
{
    public override int Width
    {
        set { _width = _height = value; }
    }
 
    public override int Height
    {
        set { _width = _height = value; }
    }
}

Square类不需要重写Area属性,只需要重写Width和Height的setter就好了,一切似乎都很好,但是让Square继承Rectangel违反了LSP,假如有这样一个函数:

public static void Adjust(Rectange rect)
{
    rect.Width = 3;
    rect.Height = 2;
 
    var someImportantVariable = rect.Area;
    Debug.Assert(someImportantVariable == 6);
    
}

从这个函数的角度来看,它只知道给一个长方形,将其宽设为3,长设为2,这个函数自然认为现在这个长方形的面积是6。但是,如果传递进去的参数是一个正方形Square类,那么得到的结果是4,这就会产生不可预料的结果。

所以,根据LSP,Square不能是Rectangle的子类。



Windows Live: 可选择不安装SilverLight
3月 14, 2009, 11:15 上午
Filed under: 技术体会

响应公司号召,我把笔记本也安装了Windows 7,所以又要重新安装一系列软件。在安装Windows Live Suite的时候,发现用户可以选择不安装SilverLight。因为最近我重装过不少次机器,所以我清楚地记得,之前的安装过程中是不让用户选择不安装SilverLight的。

image

我觉得这么一改也挺好,毕竟目前这个Suite中没有一个产品是依赖SilverLight的,还强制要求安装SilverLight显得很不地道。

作为Web Developer我也希望SilverLight早日普及,最好像Flash一样占据几乎所有浏览器,这样我们Web Developer就可以从Javascript的痛苦开发中解脱了。但是,SilverLight要做到这一点,不能靠这样绑架安装的方式推广,强扭的瓜不甜,如果没有真正的优势,这样的强制安装除了骗取一些安装统计数据之外没有用处,所以我说,这样一个改动改得好。



无暇阅读
3月 14, 2009, 4:42 上午
Filed under: 工作心情
工作变得超忙,阅读的时间被挤压得很少,不得不做一些动作。

Outlook中的邮件变得相当多,但是很多都是不用阅读的,只不过自己在某些DL(Distribution List)里面所以收到了。还好Outlook/Exchange有Rules and Filters的功能,可以定制规则把不用关心的Emails直接转移到一些目录下去,这样Inbox才显得干净些。

阅读时间减少了,在Google Reader上订阅的RSS Feeds就显得多了,一天大约100篇新文章,已经看不过来了,只好在以前的基础上继续裁减。这次的准则是,在看新的未阅读文章时,如果觉得这篇文章没有价值,就看看这个Feed以往的文章列表,如果我不曾将任何一篇标为Star,说明长期以来这个Blog也没有什么我真正想看的内容,那继续订阅似乎也没有什么什么价值,Unsubscribe它!



如果世界上只有一种……
3月 11, 2009, 2:32 下午
Filed under: 工作心情

做Web Application的前台,可能比起做任何其他工作对“多样化”带来的麻烦更有感触。

如果世界上只有一种语言那该多好,可惜不是这样,不得不考虑各语言各地区的差异。同一个意思,中国大陆叫“注销”,中国台湾叫“登出”,英文叫“Log Off”……如果只是翻译问题也就罢了,因为不同语言的长度不一样,导致一种layout在使用某些语言时正常,在另外一种语言情况下就会一团糟。更有甚者,地球上某些语言是从右往左写的,这个Blog的URI地址被显示为com.live.spaces.morganchengmo://http

如果世界上只有一种操作系统多好,为了测试Web在不同操作系统下显示,我既要操作Mac又要操作PC Windows ,虽然都是UI界面,但是两者的差异也相当显著。也许是因为被Windows毒害太深了,我不喜欢Mac微笑

如果世界上只有一种网络浏览器多好,浏览器之间的不一致是臭名昭著的,这点不用多说。

如果世界上只有一种键盘布局多好,键盘的大部分都比教一致,但是有的键盘就是特立独行,比如把数字键“6”弄得右手够不着,或者像Lenovo Thinkpad一样把Fn键放在本来应该放左Ctrl键的位置,如果你时不时需要切换使用两个键盘,这样的不一致就不方便了。

虽然有样那样的不方便,但是“多样性”(Diversity)一直也是我们提倡的,因为“多样性”让人总有个选择的机会,也就让事物有了进化的机会。

有的东西虽然也存在多样性,但每个人是没得选择的,那就是你的母语和你的祖国,你可以学会很多别的语言,你也可以改变国籍,但是母语和祖国就是烙印,永远也抹不去。