巴别塔上的雇工


One Advantage of Managed Code over Native Code
10月 30, 2007, 7:29 上午
Filed under: 技术体会

今天和朋友聊技术问题的时候说到Windows下的内存管理,有一种模式叫做Low Fragmentation Heap(LFH),对于频繁分配释放内存而且大小不一的程序,最好enable LFH,不然内存碎片会很多,当然实际上有了LFH还是有很多内存碎片,2G的用户内存空间都用光了,很有可能只有一小部分是payload,怎么减少内存碎片成了一个大问题。

一个很自然的想法就是,干吗不在内存吃紧的时候做一次碎片整理呢?对于native code还真就不行,假如code中有char *ptr = (char*)malloc(some_size) 这样的语句,假如现在要压缩内存碎片,把ptr实际指向的内存换个地方,这倒是可以做到,但是谁去更新ptr的值呢?没有,所以对于native code,CRT和OS没法去做虚拟内存的碎片整理。

对于.Net和Java,碎片整理是可能的,VM在移动内存块的时候,把引用这些内存的变量值也更新。这样,就有这样的可能,同样都是占了接近2G虚存,native code可能只有效利用了一小部分,而对于managed code,由于GC不断的做碎片整理,内存比较紧凑,有效内存使用率会更高。



西点
10月 29, 2007, 1:14 下午
Filed under: 八卦杂谈
昨天在健身房踩单车的时候,拿了一本《精品购物指南》来看以忘记腿部的痛苦,这样的杂志,大部分都是只需要动眼不动脑的内容,不过有一篇关于西点军校如何培养人才的文章还是不错,我还记得几点。

身体力行
就是“跟我上”,而不是“给我上”,做事身先士卒,对其他人的鼓舞作用是巨大的。如文章中所说,很多国内的领导就很忽视这点,能够下命令做指挥,却不能身体力行。

德智体(Body, Mind, Spirit)全面发展
心智和道德的作用毫无疑问;革命是身体的本钱,干哪行革命都是这样的,包括脑力劳动。

团队互动
要让团队能力发挥到最大,不光只是简单的下命令然后去执行,更重要的是每个人都能够提出自己的意见和看法,要容许这种互动。

换位思考
将军要能够从士兵的角度想一想,士兵也应该能够从将军的角度想一想。



2007 EE & TwC Forum
10月 26, 2007, 1:46 上午
Filed under: Uncategorized

昨天举行MS在中国的第二次年度EE & TwC Forum,这次来的人比去年少了不少,有演讲者开玩笑说工作超过五年的员工是绝对不会愿意来的,看样子去年很多人刚刚工作了四年,来了,今年干到五年,不来了:)

这样的会还是还有必要的,让MS CRD各衙门相互感受一下都在干什么,干得怎么样,估计是干了五年的人都很忙,自己那摊子事干不完,所以也抽不出一天工夫来看看。

今年的礼物是一套工具,Made in China:)

图像051



知行合一
10月 24, 2007, 7:58 上午
Filed under: 八卦杂谈

说来惭愧,看《明朝那些事》才知道王守仁这样一个人,之前对“知行合一”也没印象,虽然实际上至少听说过一次,是在《水浒传之英雄本色》中(这个《英雄本色》是徐锦江拿了最佳男配角那个,不是周润发拿最佳男配角那个),林冲(梁家辉)第一次见到鲁智深(徐锦江)时,侃到武功分上乘下乘,上乘武功讲究“知行合一”bla bla bla。以前看此片的印象就是这段林冲给鲁智深对牛弹琴讲大道理比较有趣,上周末电视上又看到此片听到“知行合一”这个词,愣了一下,水浒的故事是在宋朝,而提出“知行合一”的王守仁是明朝人,那林冲咋会说这么说话呢?当然了,香港电影人对这些历史细节不怎么讲究,连东方不败都会吟颂“江山如此多娇,引无数英雄竞折腰”,无疑当初他们觉得这些话比较酷而且贴切,所以也不管三七二十一拍出来了:)

《明朝那些事》的作者对王守仁极为推崇,我看的时候倒不以为然,他的哲学思想再深刻,能有我马列主义毛泽东思想邓小平理论深刻?我左八荣,右八耻,发展在腰间,和谐在胸口,用得着深究几百年前古人的思想吗?不过既然在电影中又看到这个词,倒是激发我挖掘一下“知行合一”到底何解。

《明》里面这么写:“什么是知行合一?答:就是知与行的合一。评:废话。”

王守仁也是儒家的人,我个人也不想太深究他的哲学思想,以我的理解,“知行合一”就是理论和实践要结合,不要理论多实践少,或者埋头就干不寻求理论指导,或者理论和实践都有但是脱节没有关系,这些似乎是初中政治课本里面的话哦:)

像香港电影人这样历史顾问都不请一个,比较酷的台词拿来就用,是“行”得力但是缺少“知”,当然最后电影拍出来也挺好看,也就被我这样喜欢较真的人嘲笑一下而已。

按照电影中的情节,像鲁智深这样的人在武术上就是“行”多“知”少,打架多打出功夫,但是没有学习武术理论,所以碰到真的高手,还是吃亏。

林冲倒是“知行合一”,理论一套一套,有报国之心,也在国家部门踏实工作,不过情况发生变化被人陷害之后就是没知也没行,干挨打,当然最后还是发飚了,谁也挡不住。

在大学里学的那些东西算是“知”,不过“行”也不够,而且“知”和“行”真的是脱节,离“知行合一”差得远呢。

在软件这行当里,研究部门如MSR搞的算是“知”,各种软件理念的大佬(Agility,CMM)搞的也是“知”,真正能开发出有用的软件是“行”,有很多知行不合一的情况,95%的innovation是bullshit,照搬开发模型也肯定会自找苦吃。

就个人而言,及时的更新自己的知识结构,不断的把知识应用到实践中去,也根据实践需求更改自己的To-Study-List,这就是“知行合一”。 就此事而言,知道"知行合一"这回事是"知",用这句话要求一下自己是"行",这也是"知行合一".



Funny Story
10月 22, 2007, 9:51 上午
Filed under: 工作心情

最近有一个有趣的故事,不过难得朋友聚在一起让我有机会说,所以写在Blog上这样每个人都可以看到。先不要看结尾,从上往下看。

前一整子我参加一个培训,课程是非常交互式的,Coach是一个Dev Manager,他告诉我们,当有一天我们当上Lead或者Manager,要明白下面Engineer碰上问题的时候,通常不需要说太多,只需要加以引导,属下就能够自己找到问题的解决办法,真是金玉良言。

Coach为了让我们有切身体会,决定demo一下,从学员中找了一个叫Peter的哥们,让Peter扮演Dev Manager,Coach自己扮演一个Engineer,模拟的场景就是Engineer向Manager反映情况,而不管他说什么,Manager只说一个字“Why”,然后Engineer就会解释一下问题,这个过程中获得对问题的深入了解,可能提出新的问题,然后Manager继续问Why,直到Engineer自己发现解决方法。

"OK, Peter, no matter why I say, you just ask ‘why’. Ready? Here we go." 交代清楚,Coach模拟进入Manager办公室状,"Hi, Peter, do you have a second?"

 

 

 

 

 

 

Peter说——"Why?"

!@#$%^&*()

Coach以头戗墙。



Inheritance
10月 20, 2007, 3:37 下午
Filed under: 技术体会

我入行的时候有幸及时拜读了Robert C. Martin的Agile Software Development,受益颇多,之后开发观念一直受其影响,这本书中提到的几条设计Principle尤其映像深刻,不过有一条LSP的观念在我脑子里最近受到了点冲击。

LSP(Liskov Substituion Principle)很简单:Subclasses should be substitutable for their base classes.还有一个完整版,大概意思就是,如果S能够作为P的subtype,那么S就必须在任何P能出现的场合都能出现,了解LSP就该知道不要简单的用is-a关系来定义subtyping。正方形能够作为长方形的子类吗?咋一看,是is-a关系,正方形就是一种特殊的长方形,可以让正方形继承长方形,但是这样会出问题。

如下,Square是一种Rect,但是它有一个特点是长宽总是一样,所以Square的SetWidth/SetHeight实现要把长宽都设上,在PlayRect这样的函数中,一个Rect实例和一个Square实例传进来得到的结果是不同的,一个是12.0而另外一个是16.0,这就违背了LSP。

image

知道了LSP,在design的时候就知道使用inheritance要谨慎了,能用delegation解决就别用inheritance。

最近看到Generic里面的Design Pattern,对于Decorator是类似这么实现的。

image

我一开始就是不明白为什么HeaderDecorator要继承T,后来明白这是一种Code Reuse的使用方法,作者也没想subtyping,也就是说,语法的inheritance并不表示一定是subtyping关系。

话说回来,LSP也只是一个原则(Principle),就和法律一样,对人的行为作一个限定,但是这世界也有不同理念的法律存在,好比我国和谐社会禁止吸毒,人家荷兰没这规矩也国泰民安(我不是说吸毒是好事啊,比方而已),软件开发领域对inheritance应该怎么用也有不同见解。

B. Meyer认为有12种可以用inheritance的场合,subtype只是其中一种,我看了一下,都还很有道理,不过我还是认为应该尽量避免用inheritance。

我们是在Software Industry里面干活啊,这行里面我们肯定会看别人的code,自己写的code也会有朝一日给别人看,代码不是写出来之后就肯定由作者一个人管的,所以还是尽量让自己的code傻瓜(foolproof)一些吧,软件的质量往往是由团队中水平最低的程序员决定的,不是由最高的决定的,尤其对于C++这样复杂的语言,写的太fancy了别人很可能看都看不懂。还有,Meyer说的12种适用inheritance的场合都以静态的角度看程序,而软件需求是在变化的,code跟着变化,如果变化导致不得不面对以前滥用inheritance的局面,比如现在必须添加一个inheritance,这样就multiple inheritance了,理想情况是马上做refactoring,不过实际情况往往是这样,维护的程序员一看这样的code到处都是,算了,既然以前都能这么用inheritance,那还是继续用吧,于是,code就越做越烂了。所以,还是一开始的时候就坚持Favor Composition Over Inheritance的好。



The War… Is Over, or Just at the Beginning?
10月 19, 2007, 1:32 上午
Filed under: 工作心情

早上就看到这则新闻,Platform is over, Web wins(也可以算是旧闻Open-mouthed)。

先不管这个论断是否合适,既然Web赢了,那谁是输家呢?毫无疑问,至少其中之一是Desktop。当然输了不等于死了,在只有一个浏览器的OS出台之前,总还是要有人去做Desktop吧。

即使此战的结果是Web赢了,但是现在各路英雄对RIA(Rich Internet Application)都颇有投入,到底谁会在Web Platform War中胜出还不确定,或者这就是一场没有结尾的战争,故事才刚刚开始。



Revisting Design Patterns: Generics
10月 16, 2007, 2:45 下午
Filed under: 技术体会
一直以为自己对Design Patterns(以下简称DP)还是有些了解,最近用C++,发现到了Generics世界里就玩不转了,有必要重新学习一下。

对于Object Oriented(以下简称OO)世界中的DP,《Design Patterns Explained》这本书介绍的非常深入浅出,DP就是在某种Context下解决某种Problem的套路,对于大部分DP解决的问题,如果一种物体可能变化或者有多种行为,那就把它抽象表示(interface或者abstract class),然后用多态来满足变化和不同行为。OO世界的DP还是比较直观的,虽然每个class/interface不一定表示现实世界中一个看得见摸的着的物体种类(椅子、鸡蛋etc),如果一切就是这么直观简单该多好啊!

OO的DP的问题就是大量使用多态性,这样就导致虚函数的调用,虚函数是在runtime是binding的,速度自然比静态绑定慢,更别说inline函数了。要是追求高效率(high performance),而且希望code能够灵活(high flexibilty),倒是不要求动态改变结构的话,无疑就是要用上Generics了。长时间以来我对Generics的理解也就停留在用template做个简单的算法(比如说max, assert)、写个generic Singleton、用用STL这个层次,最近用C++写Generic代码,本以为和OO的DP类似,把要抽象的东西用typename表示就可以了,结果总是搞不定,找到这篇文章一看,和我以前理解的DP实现方式完全不一样,还有这样的Generic Techniques,Gee z,发现自认为懂的东西突然变得很陌生是比较痛苦的,是很痛苦的,不过心若在,梦就在,大不了重头再来Open-mouthed

几年前在工作中刚刚接触使用C++的时候,也看了不少C++书,不过有本Addison Wesley的《Modern C++ Design: Generic Programming and Design Patterns Applied》,没看几页我就觉得作者使用太多生僻俚语和单词(刚才翻了几页没这感觉了),看不下去,真是一个错误的决定,Generic DP的相关文章几乎都会引用此书,需要好好研读一下。



用这个字体写Code不错
10月 15, 2007, 7:51 上午
Filed under: 技术体会

写Code需要长时间盯着屏幕,而且还要保持心态平和精神专注(打游戏也要长期盯着屏幕,不过情绪越high越好,有点区别),高人认为缺省字体实在太伤眼睛,试用了一下推荐的Consolas字体,一开始有点不习惯,觉得有点发虚,但是很快就适应了,感觉非常好,不刺眼睛,看Consolas字体的code,即使逻辑乱成一团麻,还能保持好心情不急躁:)

image

但是在我的显示器上,大写M字母有点不协调,所以这两天我尽量不用带大写M的标示符:)

image



What is success?
10月 12, 2007, 12:42 下午
Filed under: 工作心情
这两天参加一个内部培训,叫Development for Expert Developer,注册的时候还以为是教SDE技术知识的,上课的时候才知道,这个培训是给Senior SDE头衔的工程师准备的,不过参加这个培训的没有一个有Senior SDE头衔Open-mouthed 培训内容也不是技术,而是技术之外的东西。这是一个很好的培训,A good developer should know that development is not only programming; a great developer should know that development is not only development。

培训老师自称,在MS的在职人员中,他是排第44位入职的,的确是老微软了,不过这位老先生的头衔还只是Dev Manager,很让人诧异,这样的老资格搞管理的话怎么着也应该混个VP或者PUM吧。课上这位大佬越聊越开心,说到他在这个级别干了十几年了,没有promote是因为自己不想promote,因为再往上责任会更大,工作需要占用更多时间,而他还有家庭要照顾,有业余活动要参与,所以现状他很满意,虽然每年的performance review都是Outstanding,但是就是不愿意promote。

按照通常人的想法,爬的越高就越成功,真的是这样的吗?记得某个美国佬说过,一个人要是白天不用为吃饭穿衣发愁,晚上有睡觉的地方,每天都能干自己想干的事,就非常成功了。先搞清楚自己的人生目标是什么,到这世上来干吗,实现这个目标就是成功了。

每个人都该花些时间想清楚自己的人生目标是什么,因为这会知道我们每天做什么怎么做,如果做的事情偏离了自己真正的目标,那么做的越成功也就越失败。