巴别塔上的雇工


The Art of Computer Programming
2月 27, 2009, 3:16 下午
Filed under: 技术体会

在收拾办公室的柜子的时候,看到压在最底下的《计算机编程艺术》(The Art of Computer  Programming,简称TAOCP),如果不是要换办公桌,都想不起来还有这三卷书压在箱底。

三年前买这套书的时候,偶尔还翻一翻,后来工作忙起来就没时间看了,把它们遗忘在角落里了。这让我想到,很多程序员的大部分工作其实都是不需要参考TAOCP这样书的,虽然程序员都必须能够理解时间复杂度、空间复杂度以及各种算法,但是大部分程序员不会在平时的工作中自己去实现一个排序算法之类的东西,更多地是去处理自己软件产品特有的一些问题。

高德纳(Donald E. Knuth)这本书的名字叫计算机编程的“艺术”,我觉得这个名字不是很确切,没有对作者不敬的意思,我离高老爷子的水平差十万八千里:-) 我只是觉得这三卷,加上后来出版的第四卷,讲的主要都是算法和数据结构,这当然是计算机编程的基础,也是部分艺术,但并不是全部艺术。

我理解艺术就是创造有美感的东西。利用算法+数据结构解决一个问题,解决得很漂亮,这是艺术,这是TAOCP涉及到得艺术,但是在计算机编程中还有别的艺术。一个软件产品可能有很多人参与,代码会相当庞大,只是能掌握算法+数据结构未必能够掌握这么复杂的软件系统,要优雅地控制这些复杂的东西,所以诞生了一系列的Paradigm,不管是Structured Programming还是Object Oriented Programming,都是为了控制住软件的复杂,计算机编程的艺术包含很重要的一点就是要控制复杂(Control Complexity)

除了Complexity Control,我觉得TAOCP还有一个方面的“艺术”没有涉及。虽然全书到处都是让人头晕的数学公式,TAOCP还是用bottom-up的方式来解决问题,也就是先假设运算的平台是拥有寄存器、内存和一套指令集的机器,然后考虑在这个平台上怎么设计算法和数据结构,这就是传统的Imperative Programming;还有一种top-down的思考方式,就是先不考虑平台,先用数学描述问题是什么,然后再考虑怎么解决,这样最有数学的美感,这就引出了Functional Programming。TAOCP没有探讨Functional Programming,而我觉得Functional Programming是计算机编程中谈得上是艺术的一个重要部分

高德纳把编程当作一个项艺术来研究,我就想,很多东西都可以上升到艺术的角度,比如可以管武术家叫Martial Artist,为什么不可以管计算机程序员叫Programming Artist呢? 再一想,武术等其他艺术已经有几千年历史了,不少人真的能够称得上艺术家,但是计算机编程才几十年的历史,还不成熟,虽然Programming Artist这个称呼很酷,但是现在还是不要用吧。



我的必备开发工具集
2月 26, 2009, 12:07 下午
Filed under: 工作心情

工欲善其事,必先利其器,做事不能只靠脑子,还得使用工具,这里总结一下我个人必备的软件工具。

Visual Studio,这是工作必须的,我想说的是一些Add-on

  • Rock Scroll 取代Scroll Bar,能够更清楚地看到整个文件的结构;
  • TestDriven.NET Visual Studio自带的TDD功能也不差,但是TestDriven.NET还带.NET Reflector,在VS中使用很方便;
  • Wombat Style,再字体换成Consola,It’s So Beautiful!

VIM,我最喜欢的文本编辑器!可以通过VisVim在Visual Studio中调出VIM,算是VIM和VS的不怎么完美的组合。同样,使用Wombat Style,Beautiful! 我曾经觉得既然用VIM就不需要去学习用Emacs了,但是最近对Functional Programming感兴趣,有时间的话一定要接触接触Emacs,因为它是用LISP写的。

FireFox + FireBug + YSlow! 分析优化网页的免费组合,实际上FireBug上还有更多的扩展工具。IE是Windows自带的,当然也会使用,但是尽量不要使用IE6,升级成IE7或者IE8吧

Network Monitor,有时候需要看不是关于浏览器的HTTP讯息,或者需要看TCP/IP一层发生了什么事,就需要动用Network Monitor。

SystemInternals套装,在Windows上开发这套工具会派上大用场,我最喜欢的是DebugView,和Trace配合使用可以省去很多使用Debugger的时间。

SVN和Mercurial,简单易用的版本控制工具,因为我喜欢频繁地check in,所以总要给自己建一个私人的版本控制库。



To Be A Web Developer
2月 26, 2009, 12:33 上午
Filed under: 工作心情

下周我将加入Microsoft Exchange产品部门的OWA组(Outlook Web Access),AJAX技术的基础XmlHttpRequest就是这个团队创造的。我也将转型成为Web Developer,这是我很长时间梦想的工作,虽然我一直在学习Web Development,但是工作中还一直没有机会去创造Web,这次转换角色意味着很多新的知识要学习,很多新的技术要掌握,我喜欢新东西:-)

这是我爱Microsoft的一个主要原因,在Microsoft可以有很多选择的机会。随着持续的工作和学习,工程师也会发现自己的兴趣转移了,或者发现自己真正的兴趣并不是当前的工作,在大部分公司,因为业务范围窄,你没有别的选择,要追寻自己的梦就只能去另外一家公司。在微软,业务范围相当广,从操作系统到应用软件,从在线软件到桌面软件,从零售产品到企业级产品,应有尽有,只要你真的追寻自己的梦想,就可以不用换一个公司就能找到自己感兴趣的领域。

I LOVE THIS COMPANY!  



你确信真的是在用SCRUM?
2月 25, 2009, 9:55 上午
Filed under: 工作心情

有不少公司的不少团队都声称在使用SCRUM这种软件开发流程,SCRUM不是最轻量的Agile Process也至少是最轻量的之一,这也就意味着,问几个轻量级的问题就可以弄清楚这些团队是不是真的在使用SCRUM。

Q:“你们的Product Owner是谁?”

A:“Product Owner是什么东东?”

Q:“那你们的Scrum Master呢?”

A:“哦,你是说管事的,我们的Product Owner和Scrum Master是一个人,就是XXX。”

Q:“你们每天在Scrum Meeting上都看Burndown Chart吗?”

A:“Burndown图是给Manager看的吧,我们就不看了。”

Q:“你们的Load Factor是多少?”

A:“80%”

上面的对话纯属虚构,但是反映的是我所知的一些团队对Scrum的理解和执行。我不是Scrum的权威人士,但是实地说,我觉得这样的理解和执行是错误的。

当然,你可以说Scrum是死的,人是活的,用不着完全按照Scrum教材上说的来做,但是Scrum已经是很轻量的软件开发管理了,你要是忽略Scrum的几个关键点,那就比Scrum还轻量,这样的“管理”就更像是“软件开发不管理”,然后所谓的Scrum就不是虎,而是猫了。

搞不清楚Product Owner是谁很要命,做软件就是给客户用的,Product Owner要么是客户,要么能够代表客户,他/她决定产品的方向和不同功能的优先级,搞不清楚他/她是谁那你每天忙活为了什么?

Product Owner和Scrum Master不应该是同一个人,不然的话,等于有一个人既是裁判又是球员,这种情况下他/她的判断力不能保证。

Burndown Chart显示的是一个Sprint中每天的工作进度,灵活就在于可以根据进度及时调整,没有Burndown,每天的进度就反映不出来,也就做不到灵活调整。你可以说我们一直这么做也没出什么岔子啊,但是没发生不等于不会发生,软件开发管理应该防备意外的发生。

关于Load Factor(LF),一个事实就是微软所有实行Scrum的团队的平均LF为大约45%。如果你们真的能维持80%的LF,有三种可能:第一,你们在做假账;第二,你们真的有很高的工作效率,但是,很快就会团队成员受不了而离开;第三,你们都是钢铁侠。

 



奥斯卡最佳观众奖
2月 24, 2009, 1:38 下午
Filed under: 原创卡通

image



看奥斯卡颁奖典礼
2月 24, 2009, 1:41 上午
Filed under: 电影电视

昨晚看CCTV-6的奥斯卡颁奖典礼转播,当然,实际上是颁奖典礼的剪辑版,凡是小奖就被剪掉不放了。我觉得这种做法欠妥,很不专业,革命只有分工不同,没有高低贵贱之分,为什么只放前台风光无限的最佳男女主角和导演,就删掉编剧等后台工作者呢?CCTV-6号称电影频道,不应该给中国观众这种拍电影就是前台那几个人的映像吧。

最佳男主角西恩.潘在做获奖致辞时,镜头有一个明显的剪切,少放了一段话。我想这哥们一定说了什么不和谐的话,后来搜了一下,原来他批评了反对同性恋婚姻的行为,他的获奖电影《Milk》主题也是关于争取同性恋权益。

“For those who saw the signs of hatred as our cars drove in tonight, I think that it is a good time for those who voted for the ban against gay marriage to sit and reflect, and anticipate their great shame, and the shame in their grandchildren’s eyes if they continue that way of support. We’ve got to have equal rights for everyone.”

最后那句“我们应该让所有人拥有平等的权利”倒是播了,说明CCTV-6也认同这种价值观,但是CCTV-6觉得同性恋话题不适合,所以删掉了——犯得着吗?

给人映像最深的是印度人A R Rehman获得最佳歌曲奖说的话:“我一生都面对爱与恨的选择,我选择了爱,所以我在这里。



愤怒的公牛
2月 22, 2009, 8:50 上午
Filed under: 电影电视

奥斯卡颁奖典礼之前,找了一个老电影来看,1980年的《愤怒的公牛》,马丁.斯克赛斯(Martin Scorsese)导演,罗伯特.德尼罗(Robert De NiRo)主演,拿了两项奥斯卡奖,但不包括最佳导演,马丁.斯克赛斯到了下个世纪的2006年才靠翻拍《无间道》拿到了奥斯卡。

片头很棒,罗伯特.德尼罗在笼罩着雾霭的拳击台上做准备动作,伴随着音乐,如同独舞,这段非常有美感,也奠定了整个电影的基调。

有人评论说此片讲的是一个拳击手的灵魂“自我救赎”,我说,咱别非得每个电影都要搞一个积极正面的中心思想行吗,这个电影哪里涉及到“自我救赎”了?这就是根据一个拳王个人传记拍摄的电影,这个拳王性格存在严重缺陷,打老婆,多疑,放荡不羁,最后众叛亲离,成了大肥佬,在酒吧里做主持人来谋生,这就是这个拳王的人生故事,这个拳王没有自我救赎,所以这个电影也不是关于什么灵魂的人生救赎。

罗伯特.德尼洛在片中表演很出色,马丁在镜头处理上也有很多巧妙的处理,但这只是说他们把故事讲得很好,并不表示这是一个“好”故事,更不表示这是一个关于灵魂自我救赎的故事。

如果非要说此片有什么积极作用,那就是主角形象是一个反面教材,每个男人都应该从他身上吸取教训,不要太愤怒,好好对家人,遵纪守法,不然最后孑然一身的滋味不好受。我这样理解这个电影是不是很肤浅?如果你这么觉得的话,一定要告诉我怎么深刻地理解这个电影的,不过一定要说得具体,也别Copy+Paste。



Revisting Multi-threading in Browser: A Blessing or A Curse
2月 22, 2009, 3:52 上午
Filed under: 技术体会
前几天我写Multi-threading in Browser: A Blessing or A Curse,主要观点是在RIA(Rich Internet Application)平台中支持多线程是个危险的做法,这个特性很有可能误导程序员写出更烂更buggy的程序,我倾向于Multi-threading in Browser是一个Curse。我并不反对多线程编程,我只是觉得滥用错用多线程会打开程序员的痛苦之门,而没有深入了解Mulit-Threading的话,滥用错用是很容易的。
 
后来几天,听了Jeffrey Richter关于.NET Threading的课程。Jeff也反复强调,现在普遍存在对线程的错误认识。Threading就是一把双刃剑,用得好可以优雅地消灭怪兽,但是不小心就把自己给砍了。Jeff的观点都写在MSDN Magazine的专题上,别以为看一遍就能完全理解,有的文章我之前看了好几遍都不理解,直到面对面问Jeff才搞明白。
 
我得说,我现在更倾向于Multi-threading in Browser是一个Blessing,毕竟现在的趋势是CPU多核化,也就是说如果线程数和CPU核数相同,那么这些线程可以同时运行不需要context switching,效率也很高,如果只是单线程的话岂不是只利用了一个CPU核,太浪费了。更重要的是,我得知Adobe用来开发AIR和Flash得语言Flex居然不支持Multi-threading,我还不大了解细节,但是可以想象,如果点击一个Button会引发一段很长时间的运算,如果程序员没有把这个运算分成chunk的话,那在这段很长时间之中,整个界面都不会有响应。既然他们是Silverlight的竞争对手,那么他们有的功能我们要有,他们没有的功能我们更应该有,在Silverlight中加入多线程支持将可能是绝杀。
 
话说回来,先要学好怎么用Threading,看Jeff的文章
 


全球数据中心构想图
2月 21, 2009, 2:10 下午
Filed under: 原创卡通

现在电脑硬件很便宜,但是维护电脑运行和制冷的电力消耗代价很大,成了数据中心(Data Center)的主要开销。据说微软试运行露天Data Center,因为这样不需要额外的空调设施,虽然电脑坏得快,但是总的说省的空调电费远远超过了更换电脑的价钱,这样就节省了一大批开支。

我听到这个消息,就有了一个疯狂想法,既然冷却是个大问题,那干脆就在南极和北极建立Data Center,既自然冷却,又能够将电脑放在室内利于保养。

natural_cooling

首先要解决运行Data Center的电力问题,可以在Data Center附近建核电站,既然已经有集装箱式Data Center了,那研发出集装箱式随地部署的核电站也应该可能:-);还有一个问题就是连接Internet,北极好歹还有和大陆相连的地方,南极就需要铺海底光缆了。

不过南极北极到底还是太偏远,在第三极西藏建Data Center也许更现实。西藏地域位置本来就四通八达, 接入Internet代价相对小,和南北极不一样,还可以利用太阳能发电,真是为Internet时代而生的宝地。

Wow, 真是一个疯狂的想法!



如何充分利用培训
2月 21, 2009, 2:05 上午
Filed under: 工作心情

每年到最近这个时候,公司都回安排Wintellect的老朋友来中国培训,过去两周我大部分时间都在参加这些培训,范围从传统的ASP.NET到正在力推的Silverlight,从比较浅的C#功能到深入的.NET Threading。

对我来说,这一次的培训效果是最好的。来的培训师都是这方面世界上数一数二的高手,公司让他们来也花了很多钱,实在没有理由不充分利用这些培训。

  • 事先准备 参加培训之前对相关主题得要有个基本了解,比如你去听的课程叫Advanced ASP.NET,不能连ASP.NET是怎么回事都不明白就去,否则肯定听得云里雾里。不想浪费课程上的七个小时的话,就该事先花一个小时准备。
  • 坐在前排 我看到很多同仁很早到达了会场,却选择靠后坐,这是不明智的。这是培训,不是慰问演出,前排位子不是给领导预定的,要想听清楚,看清楚,让自己投入到学习中去,就应该坐在前排。
  • 关掉电脑 在培训课上不时有人把电脑掉在地上,我坐在前排所以不知道后面掉电脑具体是什么原因,但是掉电脑至少有一个前提就是说你还在用电脑,既然是听课为什么要用电脑呢?好吧,我知道你一边听一边还要写段code验证一下刚听到的知识点,但是我也知道你也会顺便查看一下EMail,然后顺便看一下今天股市行情,再看看NBA明星赛进行得怎么样,还要看看《巴别塔上的雇工》……等你终于抬起脑袋,发现Coach已经讲了很多,而你却没听进去,接下来的课程你就不知道他在说什么了。这一切都是因为你打开了那该死的笔记本电脑——关掉它
  • 多问问题 我说过,不问问题,难取真经。不要把疑惑留到培训之后,只要你有问题,就举手问,如果你不立刻问,你接下来可能就听不懂,而且课后有可能忘了这个疑问。这几个培训,我问了成吨的问题,我学到的大多数东西不是来自于Coach准备好要在课上讲的,而是来自于Coach对我这成吨的问题的回答。由于早期教育的原因,国人倾向于少问问题,或者有问题宁可私下去问,也许是害怕有的问题太低级了怕人笑话,我觉得这种观念是绝对错误的!你脑子的问题很有可能也是其它听众的问题,你公开问出来,让Coach公开回答,这样大家都学习进步了。没人敢说了解某个知识的全部,了解得深接触得多才会有更多需要探索的疑问,问题多并不显得水平不够,问不出问题才显得水平不够

希望上面总结的几点能够帮助你下次参加培训的时候学到更多,如果你有别的建议,欢迎补充:)