巴别塔上的雇工


买公司是为了买什么
4月 25, 2009, 1:31 上午
Filed under: 八卦杂谈

IBM想收购Sun失手了,Oracle冒出来要收购Sun,似乎八九不离十。这些公司之间的大鱼吃小鱼,总得有个目的,收购一个公司总得为了什么好处而收购,不能为了收购而收购——也就是,买一个公司到底是为了买什么?

我看业界买公司无外乎这样几个目的:

买客户或者用户。客户(Customer)和用户(User)还是有点区别,客户是给钱的主,用户是产品或者服务的使用者,但是不一定给钱,就好比我们普通用户用Google搜索,但是不会给Google一分钱,但是因此带来的流量,可以让Google找广告商要钱,广告商事Customer,我们是User。假如Microsoft真的收购了Yahoo!,那么在线业务的客户和用户数量都会大增,我说的是假如啊:-)

买技术。微软一位Techincal Fellow就是这么看收购Yahoo!的目的,更直白一点,是为了买技术开发人员(Developer),技术不断在改变,拥有深厚技术积累的人才是重要的。收购一个小公司,完全出于买技术的动机还可以理解,但是收购Yahoo!这样大的公司,只有这一个目的就不合适了,毕竟Yahoo!既有客户用户,又有技术积累,但是现在只能退而取其次,收购不了公司,那就直接收买他们的人。

买商标。Oracle收购Sun的目的不全如此,但是至少一部分成果就是拥有了Java TM,IBM一定很郁闷,是不是感觉.NET和Java对自己差别不是很大了:-)

保护性收购。有时候买公司其实不是真的想要,而是自己不买可能就被别人买了,自己吃了也不消化,但是又不想别人吃,还是硬撑着咽下了,比如Google当年收购blogger.com,还有Microsoft收购Facebook 5%的股份,把Facebook的估值抬到天价,让别人吃不下。

买了就是为了丢弃。这种现象也存在,买下一个公司就是为了让其不得发展,或是看中了该公司的其他资源。Google最近在北欧买了一家造纸厂,不知为何,我想Google不会进军造纸领域吧,也就就是看中人家的地皮,就和国内的开发商一样。



Windows 7 + Web 2.0
4月 24, 2009, 3:14 下午
Filed under: 工作心情
Windows 7发布在即,内部推出了一个具有Web 2.0性质的网络应用程序,用来发现Windows 7的Localization问题。

要说啥是Web 2.0,就我的理解,就是利用AJAX等交互性强的网页技术(比如SilverLight),提供一个方便用户参与的平台,在这个平台上,用户的行为和选择可以影响网站的内容。

这个内部应用也是这样,用户上去看到的其实只是一张接一张的Windows 7截图,但是都是Localized过的,比如我选择检查中文简体,看到的就都是翻译成中文简体的截图,我要做的其实就是看看这些截图上的翻译是否正确,是否让我这个母语是中文的人觉得舒服,如果是,那我就把他标为Good,如果不好,我就把它标为Bad,当然,我还可以标出哪些部分我觉得翻译得不好。这些人肉检查的结果,会被Windows产品组进行分析,从而修正不恰当的Localization。

上面说的只是基本功能,重复做这些人肉判断的东西也挺枯燥,关键的是——这个应用还有得分(score)和排名(ranking)。这两样东西真是众多成功Web 2.0应用的杀手锏,把得分和排名放在显目位置,用户就是喜欢攀比这些东西,从Level 1到了Level 2,就想进Level 3,从而想进Level 4……

让用户参与影响产品的结果,有了得分和排名,这个本来挺枯燥的人工检查过程,变得很让人上瘾。



PTU2 之 同袍
4月 20, 2009, 1:33 下午
Filed under: 电影电视

多年之前还在大学的时候看的《PTU》(《机动部队》,其实就是香港巡警),觉得很不错,但是同学们却普遍不以为然,尤其是片尾那段慢动作的枪战让很多同学觉得很倒胃口。如果当年的同学再来看《PTU2之同袍》,不知道会作何感想,就我而言,我觉得现在看PTU2的感觉也许和当年同学们看PTU1一样。

PTU1主线是一夜寻枪的故事,表现的是警察内部的微妙人际关系,几个警察在香港的黑夜和各方势力周旋,最后的结局,内地版让人唏嘘命运无常(林雪捡回自己的枪,得意洋洋地归来,嘎然而止),香港版让警察的这种关系更深刻(在内地版结局的基础上,所有警察做了一个天衣无缝的口供,共同邀功——难怪被删)。这样一个故事,反映的是香港警察的一种状态,不敢说其他地区其他职业也有类似现象,但是这个故事让人觉得这是警察队伍的特有现象。

到了PTU2(也许不应该叫PTU2,之前曾有几个PTU相关的电视电影),还是那样几张面孔——沉稳老练的任达华,看似很有领导能力的邵美琪,猥琐的林雪,连抢匪也是熟面孔,但是故事已经没有之前深刻。因为,同袍的故事和警察的角色联系相当松散,完全可以这么改写故事:一个软件公司,存在利益不均衡,一个小组A受器重,另外一个小组B觉得受排挤,最后小组A的Manager X和一个组员M被promote,而小组B没有机会,这样双方更加斗得眼热,这时候来了一个突然任务,要短时间内deliver一个产品,要求两个小组合作完成,一开始双方还是勾心斗角,最后在合作过程中,还是发现先要解决共同问题,Manager X也充分发挥了领导能力,M也和小组B的人搞好了关系,最后任务完成,大家尽释前嫌。你看,没有警察背景,要讲的道理还是差不多,还可以把这个故事套到任何一种需要团队合作的职业中去。所以,PTU2的故事,本来就和警察角色结合不紧,所以只是借了PTU1的躯壳,没了PTU1的神采。

PTU2的剧情没有PTU1那么紧扣人心,唯一让人意外的是,和PTU1结尾坏蛋全部殒命不同,在PTU2中没有死一个人。这样一个剧情设置,不知道是为了体现“不战而屈人之兵”的最高境界,还是为了迎合整个电影的基调。这是一个和PTU1完全以一样的电影,不应该有太高期望。



时间线
4月 19, 2009, 11:08 上午
Filed under: 电影电视
一直在跟看美剧《Lost》,虽然之前制作方多次宣称《Lost》不会设计时间旅行(Time Travel),但是第五季从一开始就走向了时间旅行。《Lost》的编剧都很天才,利用时间旅行的情节不光解释了一些故事(比如Jin在时间穿梭中见证了法国女人的遭遇),还引入了新的勾人的谜团(一秒半钟的一个巨大雕像的背影,应该是埃及神话中的神Anubis)。

《Lost》走向时间旅行的道路没什么可以惊讶的,但是我向观众关心的是《Lost》将是采用何种时间旅行模式,影视作品中的时间旅行无外乎两种:

  1. “回到未来过去式”,代表作品就是电影三部曲《回到未来过去》,这种模式下,人如果回到过去,可以改变历史的走向,送一本体育年鉴给祖宗,可以让他知道体育赛事结果,从而大发特发。不管怎么解释这种时间穿梭,或者说宇宙是多线的,或者说时间就是橡皮泥一样揉的,总之历史是可以被改变的。
  2. “机器猫式”(我喜欢这个名字),大家最熟悉的作品应该就是《机器猫》,主角和机器猫穿梭到过去,只能作为观察者,有时候他们想去改变什么,都是发现自己的干预只是促使了事情的发生。在《机器猫》的时间里,时间是可以穿梭的,但是命运都是注定的,无法改变。

《Lost》属于那种模式呢?一开始,我们几乎就以为这将是一个“回到未来过去式”,要不然各路神仙费尽心机要让几个主角回到七十年代的岛上干嘛,肯定是希望他们做些什么改变命运,当Sayid射了少年Ben那一枪之后,我们彻底相信了……但是,Ben居然没有死透,这时候Jack作为医生被要求去治疗Ben,而Jack冷酷地拒绝了,我们以为历史真的要被改变了,但是,因为Jack的拒绝,Ben被送到了岛上Others手里治疗——好了,这就是命运,你越是想改变它,你越是将他推向注定的轨道,《Lost》一下子来了个180度转弯,走向了“机器猫式”。

不过我还是有点不确定,既然一切都是命运,什么都改变不了,那岛上的人还奋斗什么呢?随波逐流岂不更好,而各路神仙明知命运如此,似乎还心有不甘,似乎能够改变什么,所以关于时间旅行的模式,我想还没有完全确定,也许,在某种情况下,又会转向“回到未来过去式”。



索马里的舞台
4月 13, 2009, 2:30 下午
Filed under: 八卦杂谈
新闻上总是有索马里海盗已经有很长一段时间了,毫无疑问,打击索马里海盗已经成了一个Show场,你方唱罢我登场,但是就是不见索马里海盗问题得到解决。

各大国小国已经把打击索马里海盗当成了一个表演的舞台,都要尽尽责任派海军去游弋一番,但是,索马里海盗问题的解决不能靠这种治标不治本的方法的,何况现在连标也没怎么治好。海盗首领都说,他们本来也不想做海盗,但是国内社会动荡,就业机会少,也只好投身绿林了。要从根本上解决索马里海盗问题,就得登陆索马里维持社会问题发展经济,但是有黑鹰坠落的前车之鉴,哪个国家都不会出头做这个事情的,所以都是派海军去巡游,一方面显示自己有责任心,一方面还可以操练一下水师,索马里老百姓的问题,倒是没人真的想去解决。



泰国政局
4月 12, 2009, 1:55 下午
Filed under: 八卦杂谈
刚刚拿泰国举了个例子,泰国就真的出事了,真是说曹操曹操就到。

长期只看到中国和美国的政治舞台,容易忽视世界上其他国家的奇特的政治现象。比如说,泰国这样的,军队可以选择不保护政府,事实上他们一直选择不保护政府,这在我朝和米国都是不可思议的。你说这是好事还是坏事呢?要说好,可以说是国家暴力机关不干预政治,让政府和民众自由角力;要说不好,那就是搞得社会动荡时局不稳,奋斗多年的成果,一朝动乱就化为乌有。

在黎巴嫩,国家拥有军队,但是政党也可以有自己的军队,而且国家军队管不住他们,所以几年前以色列和真主党武装打了一场,但是并不是和整个黎巴嫩宣战,但是把黎巴嫩也揍得很惨。事后,有记者去采访黎巴嫩民众,我记得一个大学生被采访的时候说,她认为真主党可以向以色列宣战,但是“应该先和我们商量再做决定”,听到受高等教育的人说这样的话,我觉得不难理解为什么这个国家没有强有力的中央政府了。



4月 11, 2009, 2:01 下午
Filed under: 八卦杂谈

美国最近连续不断地发生枪击事件,让我想起一个说法,说美国容许公民持枪是为了给公民机会“推翻暴政”,充分体现了民主精神。

美国人就是否容许公民持枪一直有不同观点,也喜欢就这个问题争论,上次去Redmond的培训课程里,有一项就是让我们分组找个观点来讨论讨论,结果很多组的美国佬都要讨论是否应该禁枪,正方反方说的无外乎都是那些耳熟能详的理由。

这些话我和美国佬也没什么好说的,美国的具体情况我也没他们清楚,就找了个马来西亚的哥们从局外人角度聊了聊,这哥们很不屑美国人的持枪是为了让公民“推翻暴政”这种观点,说在泰国民众没有枪,一样把政府给撅了。

在世界上某些国家,因为历史文化的原因,的确有可能通过游行示威等方式改变政局,比如格鲁吉亚和泰国,其后果就是,政局太好被改变了,所以一直在变,永无宁日。这种情况山姆大叔当然是不能容许在自家演绎的,虽然他很喜欢别人家发生这样的事情,所以美国不可能是泰国,老百姓别想通过游行示威翻天,这样看来让老百姓拿枪似乎的确是国父们为了民主自由的延续做的正确决定。但是,我听说过有美国人把闯入家里的贼射死的,没听说过美国人把闯入他们家讨税款的IRS特工射死的,所以用枪去对抗暴政,实在很扯淡。



从每日必博到每周一博
4月 11, 2009, 3:03 上午
Filed under: 工作心情
曾几何时,每天都有脑力和时间写博客,现在忙起来了,一周能有时间写一篇就不错了。而且,当有时间可以写的时候,发现也没什么好写。我觉得这是一个危险的信号,说明自己的想法越来越少了,很大程度上也是因为没有时间去想。以后,要时常逼迫自己去多写,多写才会多想。
 
 
 


Who Wants To Be A Programmer?
4月 6, 2009, 2:16 上午
Filed under: 原创卡通

上周看了《贫民窟里的百万富翁》,让我想起来可以问这样一个问题:为什么一个程序员要加班工作?

image

第一个选择:“他有太多工作。”(因为图片空间问题,我就用了He,并不是歧视女程序员)有时候这是一个原因,但是其实工作是做不完的,不用只争朝夕,所以这不是最佳答案。

第二个选择:“他热爱工作。”这个理由很高尚,很多微软程序员都是因为这个加班,但是微软程序员不能代表全世界,所以这一条也不对。

第三个选择:“他不知道Work-Life Balance。”类似于第二条,但是有的程序员将工作视为生活的一部分,所以无从Balance,实际上,大家都只到WLB只是一个口号,并不是目标。

如果可以多选,也许可以将上面一二三全选上,但是这是单选题,所以,最合适的答案只能是第四项:“这是他的命运”。早年还不相信命运这说,但是现在越来越相信了,很多时候没有选择,或者说选择也改变不了什么,这就是命运。



“重大设计决策失误”
4月 4, 2009, 12:40 上午
Filed under: 技术体会

和以前部门的同事聊,都觉得以前犯了几个“重大设计决策失误”:第一,使用了LINQ,第二,使用了WCF。这两个都是被宣传得天花乱坠的技术,使用它们怎么会被认为是缺陷呢?

LINQ和WCF都体现了很好的软件思维,但是并不是适合任何场合,比如,对于效率要求高和I/O特别频繁的场合,LINQ和WCF就有问题了。

LINQ

LINQ,全称Language Integrated Query,C# 2.0还只是增加了一批不是很相关的feature,但C# 3.0增加的几乎所有feature都是为了一个feature服务——LINQ,所以很难界定怎么样的coding算是使用了LINQ。写SQL语句模样的LINQ query expression当然算是使用LINQ,只用lambda expression也可以说是使用LINQ,这里我们说的“重大缺陷”指的是用LINQ query expression来处理IEnumerable<T>。

LINQ还是体现了很棒的软件思维,但是效率上有些问题。访问一个数组或者List的速度要比访问一个IEnumerable<T>要快,首先访问IEnumerable<T>不可能用indexing的方式访问某个位置上的元素,只能从头开始找,其次,就算是一个从头到尾的遍历,访问IEnumrable<T>也要比访问数组或者List慢,因为访问IEnumerable<T>要先获得IEnumrator<T>,然后不断地调用MoveNext()函数和Current属性。总之,和操作数组和List相比,使用LINQ去操作IEnumerable<T>会慢。

LINQ这头牛吃进去的是IEnumerable<T>的草,挤出来的是IEnumerable<T>的奶(为了简单,我就忽略LINQ可以吞其他类型数据的事实了),这样即使我们已经获得了一个数组,经LINQ一操作,我们得到的是IEnumerable<T>,丧失了输入类型是数组的好处。当然我们可以再ToArray一把,但是这样带来的浪费更大。

还有,LINQ expression不能异步运行(Asynchronous),这几乎就是决定LINQ在涉及到I/O上无法scale,LINQ to SQL被毙掉也可以理解了。

这是.NET专家Jeff Richter在培训课上被问了很多关于LINQ的缺点的问题之后的原话:

“After you guys asked these questions, it seems LINQ is NOT that good.”

WCF

WCF全称Windows Communication Foundation,是.NET 3.0推出的四个Library之一。本来出发点挺好,让程序可以只使用一种API,底层可以使用任意一种Binding方式,假如一开始使用HTTP作为通讯方式(HTTP Binding),过一阵子想直接用TCP/IP来提高速度,之前的code不用改变,因为WCF把底层给抽象(Abstraction)了嘛。

对于Abstraction,最讨厌的就是有Abstraction Leakage,也就是说没有抽象好,漏了,让上层还是被迫了解被抽象的东东是怎么回事。WCF就存在Abstaction Leakage,当调换底层Binding的时候,并不能保证上面完全没有知觉。

WCF还有一个大问题,client端获得一个server的proxy,然后通过这个proxy往server发请求,而且还支持异步(这点比LINQ做得好,eh)。问题是,WCF规定,一个proxy上如果抛出一个Exception,那么表示这个proxy坏了,不能再用了,好,现在client端通过一个proxy依次异步发送3个请求A、B、C,Server端成功处理了B和C,但是对A失败了,返回一个错误,而且这个错误信息赶在B和C的成功信息之前回到了proxy,那么按照WCF,B和C也无法获得结果,因为A的失败导致这个proxy进入失败状态。

********

LINQ和WCF都是很多软件工程师的心血结晶,我不是说它们烂得不能用,只是提醒它们没有你想象的那么好。当你使用一种技术的时候,你就依赖了这种技术,之后它的成败就会影响你的成败,所以不要只是看一个技术被宣传的优点,也要看到它的缺点,知己知彼才能百战不殆。