2009年11月17日 星期二

我在 TechEd 2009 演讲的资源 (Silverlight & Ajax)

这是TechEd第二天下午的Silverlight课程资源。关于百度Hi的Silverlight实现方面的任何问题,都欢迎与我讨论。



这是TechEd第三天下午ASP.NET 4课程资源。与ASP.NET AJAX 4.0相关的问题可以在此讨论。

User Friendly 2009

这个周末有幸去上海参加了UPA China组织的用户体验行业大会User Friendly 2009。参会人员大多数都是设计师,会议内容也是他们熟悉的内容,但对于像我这样少数的参会工程师来说,这样的会议确实让人大开眼界。

在整场会议当中,我觉得让我印象最深刻的就是Jared M. Spool的Keynote了,我觉得其中一些观点是非常有价值的。至于其它的Workshop,也都能学到一些实实在在的东西,不过就没有Keynote那么震撼了。下面就分享一些我印象最深刻的内容:

从ROI到ROX

Jared M. Spool的Keynote标题为The Dawning of the Age of Experience(体验时代的来临)。这跟我们传统所说的产品设计有什么不同?那就是我们需要把视觉从产品放大到体验上来。在这里,我想借用MIX 09上Bill Buxton的Keynote中的几页幻灯片来解释一下:

Day One Keynote hosted by Ember

Bill Buxton有一辆这个型号的自行车,而且这也正是Roland Green获得公路赛冠军所用的自行车型号。画面上给你传达的是这辆自行车相关的信息,但又如何?这世界上还有千万款不同的自行车,为什么要在乎这特定的一辆?这不是人们想要购买的东西。

Day One Keynote hosted by Ember

这张幻灯片是同一辆自行车的不同摆放方式,就像是Pixar动画短片里面的那个独轮车一样。这赋予了它一定的个性,这个思路是对的,但这仍然不是你想要购买的东西。

Day One Keynote hosted by Ember

这才是体验设计师应该关注的事情——你骑着车从山上沿着小径冲下来,一直冲到溪谷里,伴随着你的尖叫水花四溅。这是一辆什么型号的自行车?从画面上看不出来。这是一辆什么牌子的自行车?也说不清楚。这从根本上就和自行没有关系,真正有关系的是你尖叫着冲进小溪里的那种刺激的体验。

过往我们谈论的是投资回报(ROI),现在我们谈论的是体验回报(ROX)。我们想要向用户推销我们的产品,但实际上他们想要从我们这里购买体验,因此我们必须改变思维方式,考虑向用户提供什么样的体验。

举个例子,用户在你的网站上购买机票,他想要买的其实不是机票这样一个商品,而是一趟舒适的商务旅行。因此,过往只卖机票的网站开始加上酒店服务。在你输入往返日期后,不仅仅搜索往返机票,还搜索目的地的酒店信息。只有我们向用户提供符合他们预期的体验时,我们才能够获取到高回报。

Chicken Sexer的故事

什么是Chicken Sexer?就是一些判断小鸡性别的专业人员,他们盯着眼前一群两星期大的小鸡,就能指出每一只是公的还是母的,精确率最高可达97%!你让他们说说经验,他们也可以归纳出一些来,例如根据毛色、屁股来判断小鸡性别,但这些规则对于外行人来说一点意义都没有,你实在无法看着一只小鸡然后利用这些规则判断出它的性别。

那么Chicken Sexer是如何练成的呢?新人必须跟着一位大师一起工作,新人负责指出小鸡性别,说错了大师就狠狠地打一下新人的手臂。在接受训练之前,任何正常人都有 50%的正确率;在开始接受训练之后,新人的正确率会先下跌到40%——因为他想得太多了。三个月后,正确率会慢慢恢复到50%,一年之后,你的正确率能够提高到60%;再过两三年,你的正确率能够提高到80%。如果你真的把这当作你毕生的事业来做,正确率可以提升到95%。

Jared M. Spool对这个故事的总结是,有些事情是可以学习而无法自省(introspection)的。在这里,“自省”是指对自身心智或情感变化的观察和检验。设计工作也属于可以学习无法自省——你可以通过学习让自己的设计能力获得提升,但你无法归纳出你在学习过程中发生了哪些变化,以便让其他人直接通过同样的变化以获得同样的结果。

我对这类技能的学习方法看法是,你必须在大师级人物的指导下学习,你才能成为大师。这不是任何人能够通过理论知识的学习或者基础技能的训练就能习得的,这些只能让你胜任需要这些技能的工作,但不能让你成为大师。在你成为大师后,你也无法将你的技能归纳为一组理论,你只能通过亲自训练让更多人习得跟你一样的技能。

企业内推广的两个关键

在Tencent CDC的统一体验的设计Workshop上,我了解到了在企业内推广统一体验的两个关键:老板和项目。

首先,需要老板重视这件事情。例如在Tencent内部,马化腾相当于“首席体验官”的角色,他重视这个事情,对于做得不好的他会站出来指责,别人自然愿意接受你要推广的,因为没有谁想被老板指责。其次,需要通过有价值的项目来证实你推广的东西。如果你的东西你应用于QQ,对其它Tencent产品来说自然就有说服力了。

上述就是User Friendly 2009对我最有启发的几点。如果你对此类会议的信息有兴趣,欢迎订阅我的博客:

2009年11月16日 星期一

Tech·Ed 2009

今年是我第一次以讲师身份参加TechEd,碰巧TechEd所在的周末我们要搬家到百度大厦,所以我星期四早上搞掂打包工作后就赶到了会场。凭着《讲师指南》进入会场后,我直奔讲师休息室领取证件和衣服,然后再跑到MVP站台领取印章,接着等待第一天下午的Keynote开始。

尽管我没有参加Windows 7 Launch而跑去参加SD2C了,但我仍然觉得第一天Keynote的一半是Windows 7 Launch的重播。至于Keynote的另外一半,则是与Windows 7并列于New Efficiency系列的Windows Server 2008 R2以及Exchange Server 2010。我认为比较有趣的是Exchange Server 2010的演示,这个演示通过丢失笔记本电脑的场景来说明虚拟桌面的强大——换一台电脑,同一个桌面;这个演示还通过丢失手机的场景来说明远程擦除手机数据的特性。没错,这些功能都很好,但我个人的观点是——如果你经常丢失手机和电脑,Exchange Server 2010的价值才会被凸显出来。最后,我觉得Exchange Server 2010最有价值的功能就是内置的VoIP了,这相当于内置了一个Google Voice,搭配Outlook 2010的邮件视图,你就可以在自己的企业内享受全套的Gmail + Google Voice体验了。

Keynote之后的是面向Microsoft员工和讲师的Welcome Dinner,也是难得的交流时间——白天大家都忙于会务、讲课、停课,晚上才有时间停下来聊聊技术。当看到有人说自己讲了十年TechEd之后,就如同看到Rick Strahl博客上的的“MVP since 2007”一样震撼——原来有人一直在做这样的事情,并且坚持了10年之久。有兴趣有动力去做好一件事情不难,难就难在坚持做10年。

第二天上午我抽空去郭晓颖的Session上听了一下她是怎么讲Silverlight的,顺便在她的Q&A环节为自己的Session卖了一下广告。其余时间,我都在忙于调整我自己的pptx,直到下午我的Session开始为止。在Session结束后,我又花了一些时间解答大家的问题,以及帮大家盖MVP的章,然后才赶往Jeff的Session听他讲MVC。

第二天晚上是MVP Dinner,很高兴又能跟一群MVP朋友聚会了。为什么MVP Dinner有价值?这并不在于MVP为Microsoft创造了多少价值,而在于MVP擅长通过沟通来创造价值,因此能够跟一群MVP沟通一定能为你带来价值。因此,MVP Global Summit、MVP Open Day、MVP Dinner等等每年固定的聚会我都尽量不缺席。

最后一天,除了在王洪超的Session上讲讲我熟悉的ASP.NET AJAX 4.0,我就没什么别的工作了,因此我有时间就在会场周围走走,看看有谁要盖章的。有一次我走在三层展区,看到一位美女迎面走来,她看着我想要说什么但又没说,我就猜她想要找我盖章,但又不确定我是不是宣传单张上的那个人。于是我直接走过去问她,“你是要找我盖章吗?”她说是,然后还呼唤她的同伴过来盖章。我不知道如果我不主动问她的话事情会怎么样,但机会有时候就是这个样子,如果你看到了又不主动问,你就有可能错过,而问一下又不会有什么不好的。对我来说,不为她盖章并没什么损失;对她来说,或者就要多花一些时间去找另外一位MVP了。

2009年10月25日 星期日

SD2C 2009 (Part 2 - Session & Forum)

SD2C的第一天晚上,我在「开放平台」和「PPT制作秘诀」两者之间犹豫,最后选择了去听蔡学镛的「尼古丁+咖啡因...不瞌睡的PPT制作秘诀」,原因是我觉得如果蔡学镛能教别人写不瞌睡PPT,那么他自己的PPT至少也应该是不瞌睡的。事后证明我的选择是没错的——别人告诉我「开放平台」论坛成了平台和开发人员互相责骂对方的战场。

蔡学镛把制作PPT比喻为制作生鱼片,要经过选材、处理、装饰这三步。在选材方面,一个PPT讲的内容最好是相当于一章书的内容,时间不能超过90分钟,而讲述的事情不能超过7件。接下来的处理,要注意做好破题,引起受众的兴趣,并且每一小节的结束时都要有总结。一页PPT所表达的意思,有可能相当于一个词、一句话、一段话,我们应该多用表达一句话的PPT页面。最后的装饰会需要用到不少图片,通过使用正确的关键字联想策略,往往都能搜索到你想要的图片。

SD2C的第二天,我原计划要听听周爱民的「实践者思想」和蔡学镛的「DSL设计与实践」的,结果上午听完Gary Bennett的「iPhone SDK简介」之后就被吸引住了,下午的时间都放在iPhone相关课程上了。这说明了,课程的首要条件还是要能把人吸引住,不会让人想要睡觉,也不会让人想要换个课室看看。在满足这个前提条件后,才有资格来讨论内容的知识性如何。我在听了几节iPhone开发的课程后,又开始对iPhone开发充满兴趣了。

晚上的「程序员软技能」论坛是我最期待的,因为这个话题可以讲得非常有震撼性。讲得好的话,这可以让很多程序员发现自身的unknown unknown(不知道自己不知道的事情)来,把这变为known unknown(知道自己不知道的事情)之后,只要努力了就能获得改善。结果主持人刘江自己戴上了嘉宾的帽子就开始不停地说,搞到台下有人举手说「在刚才的30分钟里面您已经讲了20分钟喇」。同时,估计因为刘江是做图书的,所以花了不少时间在读书的话题上,此外再提到了一些企业文化和沟通技能之类的东西,顺便还鄙视了一轮内地的高等教育连幼儿教育都不如(来自台湾清华的蔡学镛很无辜地无法参与到这个话题中来)。可能是我原本对这个话题的期望太高,所以我对这个论坛挺失望的。将来有空我会专门写文章讨论一下程序员常见的unknown unknown。

最后一天的SD2C我没有参加,因为已经没什么让我想要听的了,所以我选择了去参加Windows 7 Community Launch。有微软社区的人说SD2C是「傻蛋2.0大会」,选择了Visual Studio 2010 Beta 2 Launch、Windows 7 Launch、Windows 7 Community Launch这三天来举行,分明就是跟微软过不去。说实在的,我也觉得今年的SD2C日期选择失策了,明知道Windows 7对Microsoft有多么重要,也明知道发布日期是哪一天,还偏要选择一个冲突的日期。希望明年的SD2C能够选择一个更好的时间吧,相信会务今年已经通过举手投票搞清楚大家的喜好了——最好是在星期二三四开会,因为星期一和星期五工作压力小,同时星期六日是用来休息的。

2009年10月23日 星期五

SD2C 2009 (Part 1 - Keynote & Meal)

一年一度的SD2C又来了,今年的时间由去年的两天半扩充到三天,第一天只设主会场,全部都是keynote。

跟去年的情况类似的是,keynote环节基本上就是赞助商专场,每个赞助商都来从技术的角度说一下自己当前最重视的市场。例如说Microsoft开始重视Team Foundation Server的市场占有率了,于是就在Visual Studio 2010的keynote上介绍TFS的特性,所占比例比VS2010自身还要多。当然,keynote里面也有一些是有启发性的,例如IBM讲的大型企业中的敏捷实践,这就属于我认为比较好的keynote。

由于今年的话题集中在云和移动上面,所以keynote大多与这两个领域相关。能够上去讲keynote的人,当然是要有一定水平的,不能讲一些很肤浅的内容,但如果因此就把keynote弄得很高深或者很抽象又弄巧成拙了。高深的内容固然能够表现出演讲者很有水平,问题是这样一个面向上千受众的活动,有多少人能够对如此多个keynote的话题都有深入了解呢?就算你对其中一个话题很有了解,觉得讲得如此有高度很对你胃口,但你也总有n个其它不了解的话题吧,那些话题你听起来也会觉得是云里雾里的。

在我看来,优秀的keynote应该是这样子的——它能够阐述一个很新颖的观点,或者提供一种全新的视觉,使得无论你原本对这个话题了解多少,你都会被震撼到——这个事情我有所了解,但为什么我之前就没有尝试过从这个角度来思考呢?这其实也就是Punch Party的优势,无论受众具备怎么样的背景,都能感受到全新观点带来的冲击力。如果能够打到这样的效果,我并不在意一个keynote是否顺便在推销某个企业或者产品。

接下来要说说吃饭的问题,但在此之前让我先说说我对MVP Program的一些观点,这纯粹是个人观点,也不一定符合事实。我觉得,就拿MVP Summit这样一个全球峰会来说,每年要接待来自全球各地的几千人,为他们提供四天的食宿,平均分摊到每个与会者身上的费用肯定是不少的。如果MVP Summit的作用仅仅在于让大家聊聊技术,我想Microsoft作为一家商业公司是不会愿意花这笔钱的,就算Microsoft想要这样做,股东们也不会同意。因此,MVP Program必然是能够产生价值的,并且分摊下来每位MVP为Microsoft创造的价值应该大于Microsoft为他所作的花费。这些价值可能包括,MVP为用户解答问题,为客户带来技术培训,也就相当于节省了Microsoft的服务成本和市场费用。同时,MVP也会积极反馈关于产品的各种问题,这也属于创造价值的部分。

回到SD2C的事情上来,CSDN其实对热心贡献的用户非常好,例如说提供SD2C赠票。但是CSDN从来都对此事保持非常低调的姿态,生怕激怒那些付钱买票的人,同时也怕更多人去找他们要赠票。我的疑问是,为什么这些对热心用户的正面激励不能好像MVP Program那样光明正大的做呢?如果一位热心用户为CSDN创造的价值能够大于SD2C门票的成本价,那送他一张赠票肯定还是赚了的。

为什么我要说这件事?因为今年的赠票不包括背包和晚餐。不包括背包我觉得可以理解,金融危机嘛,能够让我免费来参加SD2C我已经非常满足了,没有背包也没所谓。但是不包括晚餐就非常不人性化了——这不是逼拿赠票的人不参加晚上的活动提前离场吗?况且,班车还要等晚上活动结束后才有,傍晚离开还是挺不方便的。于是我就在会场的做啥大屏幕发起讨论,问问没晚餐票的人准备如何吃晚餐——我的本意只是想组织落单的赠票使用者一起吃饭,反正拿赠票的大多是CSDN活跃用户,大家也都是认识的。同时我考虑到CSDN不希望公开有赠票这件事,我一开始也刻意回避了这个话题,后来有人公开讨论了我也就跟着讨论了。

结果是什么呢?CSDN会务组单独给我一张晚餐票,并告诉我原因是蒋涛看到做啥大屏幕的内容了。这就让我感觉到很奇怪了,两天的晚餐票值多少钱呢?值得把事情搞到这样子吗?CSDN自己是做媒体的,应该十分清楚媒体的影响力。赠票邀请来的人,都是技术社区上最活跃的人,他们的博客都是具有相当影响力的媒体,给这些人留下这样一个负面印象,CSDN损失的是多少价值呢?这是否已经超过了两张晚餐票的价钱呢?我相信以蒋涛在CSDN这么多年来做媒体的经验,应该在这件事被搬上大屏幕讨论之前就把帐算清楚了吧。

最后一点,也就是这样做是否厚道。如果CSDN以媒体身份受邀参加这样一场大会,本来是希望借此机会向自己的读者传递更多更好的技术资讯的,然而却受到大会主办方不公平的对待,搞到连饭都没得吃,你们会喜欢被这样对待吗?如果你们自己也不喜欢被这样对待,那就在如此待人之前先考虑清楚。

2009年10月16日 星期五

国际长途比国内市话便宜

众所周知,在国外买国际长途电话卡打到中国,比国内市话还要便宜。这说明了国内话费之高完全是垄断造成的,其实根本就不值这样的价格,因此我们能够打国际长途就打国际长途吧,尽量别再为国内垄断行业支付额外的话费了。

在国内要通过国际长途拨打国内电话,通过VoIP就行了,Skype和Google Voice都可以,它们的价格都很便宜。就拿移动话费来说,非漫游非长途要¥0.29,漫游或/且长途要¥0.39,但是Skype只要$0.021(每次接通需要$0.039连接费),而Google Voice只要$0.02(无需连接费)。

如何使用Skype拨打国内电话呢?你可以用信用卡通过PayPal购买Skype credit,然后就可以用任何Skype客户端拨打国内号码了。对我来说最方便的是,iPhone上面有Skype客户端,只要在有Wi-Fi的地方我都可以用它来打电话。当然,Skype通话质量会受带宽影响,如果你所在的区域信号不好或者带宽有限,通话质量就会下降。

在没有Wi-Fi的时候怎么办呢?通过Google Voice的回拨服务可以解决问题,当然前提是要通过网络(GPRS/EDGE或3G)访问Google Voice。Google Voice拨号可以拨通对方的国内电话,但回拨只能拨美国电话,怎么办呢?我们可以通过购买Skype Online Number解决这个问题。这时候Google Voice和Skype会同时拨通双方电话,然后建立双方通话,话费也就是$0.041而已,还是比移动话费稍微便宜一点。

可能很多人会怀疑,花那么多美元来拨打国际长途,真的比国内话费要便宜吗?这就要看你的具体使用方式和套餐组合方式喇。我曾经因为每天漫游加长途贡献了不少人民币给中国移动,换成Skype后至少省了一半的钱,所以从此我就决定改为贡献美元给Skype好了。如果你并不介意花$10购买Skype credit试试,可以实际使用一段时间后对比一下烧钱速度后再决定。

2009年9月17日 星期四

你的网站「被兼容」了吗?

一般情况下,我们只会讨论我们的网站如何主动兼容某某浏览器,被动地等待浏览器来兼容我们的网站是不切实际的幻想——哪个浏览器会那么伟大,原意主动为一个不兼容的网站而作出改变呢?IE8就是这样一个伟大的浏览器,Microsoft就是一家这样伟大的企业。

故事是这样的,我们有一小段JavaScript依赖于userAgent属性,同样是用IE8进行浏览,在测试环境上userAgent显示为MSIE 7.0,而在生产环境上userAgent显示为MSIE 8.0。为什么会这样呢?打开Developer Toolbar后,发现原来是Browser Mode这个开关在搞鬼——当Browser Mode是Internet Explorer 8的时候,userAgent就是MSIE 8.0;当Browser Mode是Internet Explorer 8 Compatibility View(兼容性视图)或Internet Explorer 7的时候,userAgent就是MSIE 7.0了。

接下来的问题是,我们并没有刻意去拨动这个开关啊,两个相同的页面怎么在不同的环境中默认显示为不同的Browser Mode呢?我的猜想是,这是由于域名不同而引起的——Microsoft自己维护着一个Compatibility View List,当访问该List中的站点时,IE8会自动启用Compatibility View,也就是将Browser Mode切换到Internet Explorer 8 Compatibility View。接着我在地址栏输入以下地址,检查了一下我本地最近更新的List:

res://iecompat.dll/iecompatdata.xml

事实表明,我们测试用的baidu.com域名确实在上述List中,但部署到baidu.jp后也就脱离了该List。这就很好地解释了我们遇到问题,同时也提醒我们域名已经成为了IE8测试中不可避免的一个紧耦合因素。在过去,我们可以简单地认为,部署在不同URL的相同页面在同一款浏览器中显示出来总是一样的。但现在我们必须修正这句话了,仅当不同URL都基于同一个域名时上述命题仍然成立。

通过这个案例,希望能让大家了解到在开发与测试过程中保持域名一致的重要性。如果你开发的页面要部署到example.com,你最好在develop.example.com上开发,在test.example.com上测试,然后再部署。如果你需要在本机进行开发测试,也要通过改hosts模拟一个localhost.example.com来进行测试与调试,以确保代码在最终部署后能执行在相同的环境下。

2009年8月23日 星期日

Twitter Suspension

我的Twitter帐号,也就是@CatChen,经历了一次长达半个月的suspension。

Twitter Suspension

8月5日早上醒来,发现我的Tweetie不能再更新,打开Web看看,发现如下提示:

This account is currently suspended and is being investigated due to strange activity. If we have suspended your account mistakenly, please let us know. See Suspended Accounts for more information.


这时候我觉得很无辜,竟然被误判为发垃圾信息的用户了。当然,这可能和最近Twitter系统不稳定有关,因为有些人的following被清空了,自然会导致另外一些人的followers数量暴跌,由此触发垃圾用户判别标准也是有可能的。无论如何,我只能按照它给出的Suspended Account帮助链接寻求帮助了。

打开帮助页后,发现了一条令人极度无奈的信息——“帐号有可能要被封禁至少30天以备研究之用”。你Twitter要研究和改进反垃圾信息策略可以啊,但你不应该为了自己的研究就封禁我的帐号30天吧!不过我还是先提交请求好了,反正现在也没什么更好的解决方案了。

第一次在Web上提交请求,系统发了一封自动回复给我,我大概看了一下,就存档了。结果请求第二天就关闭了,问题没有得到解决。第二次提交请求,质询为什么请求关闭了但封禁没结束,系统再发了一封同样的自动回复给我,我仔细阅读后才发现,信的末端说明要回复此信解释为什么我觉得这个封禁是错误的。回信后,系统指派了人负责跟踪这个问题,但一直没有任何进展。

后来我在Twitter上看到有人说,要联系suspended@twitter.com,我就再发信去质询进度,这相当于创建了第三个请求。系统继续发回自动回复,我又继续回信解释,接着问题第二天就解决了。虽然我并不能确定,是不是联系suspended@twitter.com确实帮助我快速解决了这个问题,但我建议不幸被封禁的人都应该试一试这个方法,然后告诉我这是不是一个有效的方法。

最后,这次事件引起了我的一个想法——Twitter如此错误封禁我的帐号半个月,和GFW随意封禁一些无关紧要的网站随后又解封,有什么本质上的区别吗?对我造成的影响其实是没有区别的,这两者都只会提高我日常生活的成本。

一直以来,我们依赖于网络从不同的网站获取信息,而GFW有能力随时终止网络服务的能力,所以GFW让人觉得讨厌。最近,Twitter也成为了我们获取信息必不可缺的一个途径,它自身同样具备随时终止服务的能力,因此Twitter并不可爱。与Twitter类似的其它核心服务也如此,如果你的Gmail帐号有一天被封禁了,你使用的所有Google服务随之而终止,Google无论如何都坚持它封禁你的帐号是没有违反服务条款的,这时候Google本质上和GFW还有任何区别吗?