Monthly Archives: July 2008

《长征记》偷窃和苏格拉底

  我爱死色诺芬的《长征记》了,随便翻开一页,从来没有让人失望。

  昨晚翻到一页,看到有一次计划偷袭时,两位来自不同城邦的指挥官互相打趣:

  色诺芬说:“……我为什么建议偷袭而不是强攻峡口呢?因为我听说,克里索甫斯,你们斯巴达人从小就开始练习偷窃,能偷到法律允许的任何东西而不被捉到,是一种荣誉;而偷东西时手脚不利索,被捉到,却要受到苔杖刑罚。现在正是你们表演这种才能的好机会。只要以最低成本偷占这块高地,全军就能少挨打,这个形势和你们的风俗是一样的呀。”

  克里索甫斯说:“是吗,不过我倒听说雅典人也不是吃素的,你们最擅长贪污公款,这可是偷窃的最高难度。事实上和我们不同,你们中间越是高官贵族,偷的越多,你们一定认为偷窃能力是当统治者的必备资格。所以现在是你们大显身手的时候才对。”

  色诺芬说:“好了好了,我吃完饭就带部队出发,去夺取此山。我已经有向导了,轻步兵伏击成功,抓了一些跟踪袭扰的混蛋……”

  给没看过《长征记》的扫扫盲:波斯国王的弟弟小居鲁士起兵争夺王位,麾下最精锐的部队是一支希腊雇佣军。他们长驱直入,从地中海一直打到两河流域,接近波斯首都,今天的伊拉克巴格达。这时却发生了戏剧性的变化,居鲁士意外被杀,树倒猢狲散,往日的战友争相投降国王。一次背信弃义的诱捕把希腊高级将领一网打尽。

  身陷万里外的敌境腹地,群龙无首,内无粮草外无援兵。一万希腊人却创造了奇迹:选举将领,约束军纪,击溃围追堵截,行军万里,杀出一条返回祖国的生路。两个指挥官,一般是克里索甫斯指挥前队开路,色诺芬带领其余断后。两人性格不同,但相互信任,配合默契。克里索甫斯病死后,希腊人内部出现裂痕,频繁的兵变和选举使色诺芬无法充分施展智谋,部队遭受了很多损失。

  BTW1:以前就提过,中国古代的史官很少真正上战场,更别提指挥部队,因此很难细致客观地描述战争。而古代希腊罗马的贵族们,像色诺芬,后来的亚历山大和凯撒,都留下了不少精彩的战争笔记。

  BTW2:色诺芬回到希腊的同一年,苏格拉底却被处死。很想知道这时他的心情。色诺芬和苏格拉底曾经同在骑兵部队服役,据说战场上还被苏格拉底救过。他参加雇佣军前找苏格拉底商量,后者还对他执意离开雅典不满。色诺芬的《会饮》不如柏拉图的《会饮》有名,但他记录的苏格拉底是不是更接近真实呢。

  BTW3:《战争与和平》开头就提到,书架上有凯撒的《高卢战记》和《内战记》,其实安德烈一开始就打算离开美丽的妻子,到战场上一死了之。

关于异常机制和编程style

  首先放张照片,程序员责任重大,除了正常逻辑部分,还必须在异常发生时周到地帮助无辜的用户。

  八卦点题外话,是在Google著名华裔程序员王忻(Niniane Wang)BLOG上看到这张照片的。她刚刚发布了引起轰动的Google Lively。新闻里说Lively是工程师20%时间的业余开发成果。考虑到她的年龄只比我大一个月,实在让人绝望呀。 你去看看linux操作系统内核的历代版本负责人,从Linus本人上大学期间发布0.02开始……2.2版、2.4版、2.6版的总维护人都不到26岁 就掌管内核代码主干版本。像大一还没上完就写出抢占式调度补丁的Robert Love(很多人都说他有可能是下一版2.8内核的代码总维护人)这种,都只能算稍微年轻一点的。到了30岁,程序员的黄金时代就过去了,只好靠留大胡子唬人了(Guido van Rossum进了Google以后,真的留起胡子来了,咣当)。

  回过头来说正经的,相对C,C++最有价值的改进就是exception了。这半年来pFind的重构,一 个水面以下的最大变化,就是把以前return false和GetLastError()风格,用throw和try代替。当然这需要大量的体力活,刚开始遇到不少疑惑。但后来所有人都发现这是偷懒的 好方法。一个例子是,老版代码发现一个bug,异常位置和崩溃位置差很远,就是因为前者的return false链条断掉了:出错的函数上面套了11层调用者,有一层没判断返回值。纯C语言的灵活性和直观性的代价是,程序员必须是铁人,有能力妥善处理一切细节。

  有了完整的exception处理机制,一旦出现崩溃,pFind2.1就立刻把运行现场所有的信息都记录 下来,这样有利于调试,特别是无代码,或BUG重现需要很长时间的情况。这两种情况俺们都要面对:pFind将在网上开放下载,散播到世界各地的生物学实 验室;蛋白质鉴定是计算密集型应用,有时候release版运行一整夜才跑到出问题的地方,指望debug版加断点调试是很低效的。

  至于现场信息的携带,没有复杂的异常类继承体系,仅仅依靠字符串。组里聪明的年轻人设计了一个异常信息格式化的类,可以很方便地在每个堆栈展开catch的地方追加新的现场内容。这样一层一层加上去,形成类似JAVA的异常报表。

  常见的疑问是exception有性能问题。可能不同应用要求不一样。经过实际测试,pFind的性能瓶颈不在这方面。似乎新版GCC编译器对此做了优化。

  说到C和C++的比较,很多人可能要提到云风Linus,以及之前关于C++的大论战。 在很多技术问题上赞同云风的观点,甚至有点崇拜。但一直老老实实用C++,没有追随他叛出山门,回到C语言。原因很简单,C++对这个项目更合 适:pFind是一个有二、三十个模块,几十万行代码,十几个人合作,历时五年的项目;它很看重速度和性能,但优化的大头,都在流程和算法方面,除了最关 键的“热点”以外,其他部分不必也不能牺牲代码的可维护性;而开发人员水平又参差不齐,很多人无法达到用纯C开发大型系统必须的素质要求(像前面提到的 bug,传统C风格异常机制下,出错后需要11个函数依次return false,穿越4个不同作者不同时期的代码,只1处懒惰就抵销了其他所有严谨。俺的团队很难达到这种程度的严丝合缝,也没必要付出这么高的开发成本)。 这就注定了C++是唯一的可选项。一直在关注其他各种语言,比如D语言,但现实来说只有C++符合条件。

  Andrei Alexandrescu对这个问题的看法很中肯: 像Linus这样的牛人,他很清楚自己在干什么,开发操作系统内核,合作者都是天才,所以他就真的不需要C++。云风的deepcold引擎很类似,对性 能,尤其是一小段时间内(例如0.2秒内)的数据吞吐反馈能力有严格要求,网易又有一帮真正的geek组成的技术团队。

  C++最大的陷阱就是程序员——尤其是新手——过分追求奇巧淫技的风气。所以在pFind内大面积推广的都 是最朴实的,甚至有点土气的style。例如,继承只在纯虚类接口一种地方使用(具体说就是工厂方法模式);而功能复用都以内嵌对象来实现,不允许继 承。(整天喊口号:“接口上移,功能外抽”)。对神奇的泛型基本回避,限制写模板,熟练使用STL就行了。尽管Andrei Alexandrescu的《Modern C++ Design》里的内容很酷(软件开发2.0大会还专门买了一本新的,请他本人签名)。但pFind团队没有能力把握这种style。

  C++是一种多style语言,架构师需要做的,就是明智地裁剪符合需要的子集。约束团队抵御诱惑,不拿手头的任务当学习新技术的小白鼠。

  BTW1:Python和C++社区的关系很好,很多老牌C++程序员同时也是Python著名玩家,例如豆瓣的阿北。C++标准委员会那帮人甚至在boost里加上了连通Python的内容,还公开说Python是C++的最佳伴侣。Python和C++差异很大,比如是动态语言,比如“所事情只需要一种方法”的设计哲学,这种不同恰恰造成了互补。

  BTW2:最后推荐Google刚刚公布的C++代码规范。哈欠,睡觉去了。

2006年圣诞节在星巴克唱歌的一家人要回国了

  2006年圣诞节见到一家人在星巴克门口唱歌,我还在BLOG里猜测那个父亲是AMD的工程师。刚刚发现了这个,原来他是专栏作家。这一家人打算年底回国。祝顺利。

  这让我记起07年初偶遇的那场独特的轮滑婚礼,第二天在网上找到了报道和照片。世界真小,或者说网络真大。

推荐一下“豆氏”的BLOG

  病了,发烧拉肚子。最近几天旁边的同事接二连三倒下,据说是某个周扒皮为了pFind 2.1的里程碑,剥削得太狠了。这不,俺的报应来了。

  这种时候,写不出什么一本正经的BLOG,就推荐豆氏的BLOG吧,最酷的是想象力。我很喜欢她在医院打点滴时,画在兔子胳膊上的漫画作品;还有刚刚发的“野比死了”也很好玩。

  你要是不知道野比是谁,或者看不出哪里好玩,说明我们不是一代人。搜了搜,3月11日的BLOG记的东西有点类似:“最后一次武道会时,悟空对贝吉塔说:少年组比赛开始了,你不去看看咱们的孩子?”。



野比死了

野比不知道现实世界是如此残酷
野比不知道小静需要如此多的爱
野比不知道小静有这么多的理由
野比不知道小静生气的时候如何去开导她
野比不知道小静说你没有别人收入高的时候如何面对她
野比不能给小静买新房子
野比不能在小静出去玩的时候开车去接她
野比发现自己全力付出只换来小静的冷嘲热讽
野比不知道小静为何不接自己电话
野比不知道小静总是问他如果我们分手了我就要找个有钱人是不是真的
野比一直在努力但是没有人去认可
野比加班到十二点回为了没有带红茶回去而被奚落
野比总是听到小静说强夫的事业
野比总是听到小静说出木杉的才华
野比不能带小静去看奥运会
野比死了
野比死于自杀,那年他32岁

我的奥运门票

  拿到了奥运门票。我买的是男子体操全能决赛,体操项目里最好看的一场。到时候去给杨威加油微笑

  门票并不贵,两张一共300元。票价便宜的后果就是全中国13亿人民都来抢,买到一张非常不容易,第一轮抽签时,我定了七千块钱的票,只中了这300块的两张;第二轮又定了三千块钱,结果一张都没中(当然,这么低的中签率,原因之一就是俺只定热门项目的决赛,比如足球、篮球、乒乓球、羽毛球、体操、跳水还有110米栏)。现在想来,能中一场已经很幸运了。

  整整7年前,在思源楼11层的电视机里,萨马兰奇老头好像恶作剧一样,故意把Beijing这个词放到一句话的最后才念出来。愣了一下,然后就欢呼。我靠着窗户边,清楚地听到外头“轰”一声,就像打雷一样,整个城市一下子沸腾起来。那天晚上和几个兴奋的哥们打车,想直奔长安街,可三环上走了一半就彻底堵住了,人们像潮水一样涌到主路上,司机们一起按喇叭,还有人爬到车顶上去挥舞国旗,交警们容忍了不少胡闹。还记得玉渊潭公园的烟花放了好久。

  昨晚路过北四环,巨大的鸟巢和水立方发射着奇幻的光芒。OK,总算要到了。

C++0x能不能在09年发布?

  搞定了pFind里程碑,放松下来踅摸踅摸天下大势。有段时间没跟进C++0x的进展,今天上网搜索了一下,整理出来。

  C++委员会6月份刚刚在法国的Sophia Antipolis举行了会议(WG21)。会议的最大成果是确定了C++0x发布时间,漫长的投票表决过程总算接近结束。今年9月将提交委员会草案,以便公众审阅和反馈,进入ISO程序。Herb Sutter强调,9月的委员会草案就是”feature-complete C++0x“,以后的修改仅仅是bug修正和澄清。希望C++0x的这个“x”是9,而不升到A。

  技术细节上,这次会议有两个最主要的features通过投票:

  首先是传说中的Initializer lists提案(N2672  N2679),以后可以用更直观的方式初始化STL容器了:

     vector<string> v = {“xyzzy”, “plugh”,  “abracadabra” };
     map<string,string> phonebook =
          { { “Bjarne Stroustrup (cell)”, “+1 (212) 555-1212″ },
             { “Tom Petty (home)”, “+1 (858) 555-9734″ },
             { “Amy Winehouse (agent)”, “+44 99 74855424″ } };

  第二项是thread_local( N2659 )。经过近一年来的几次投票,并行机制的内存模型、原子操作和线程包装的多项提案都已经通过投票,这大概是C++0x最重要的变化。

  其实每次都会投票通过几十个features,只不过大多数没引起注意,比如我无意瞅到了一项07年获得通过的提案,是Herb Sutter代表微软提交的空指针关键字nullptr (N2431) ,这就可以用nullptr替换VC++下的NULL宏,免得每次往gcc下移植都得手工加入。

  这次唯一留的尾巴,大名鼎鼎的conceptsN2081),仍在等待“check in”。按照Herb Sutter的说法,这方面争议基本解决。9月份的San Francisc会议只要就此投票,即可扫清最后障碍,发布标准草案。 

  以上信息都依据网上来源:Bjarne Stroustrup的C++0x概述报告slices,Google的Lawrence Crowl对线程模型的报告slices, MS的Herb Sutter的BLOG、CodeGear的Alisdair Meredith的BLOG。他们都是委员会成员。另外我还找到一个旁听会议的Java程序员的BLOG,由于视角不同,难免有不少比较,比如C++委员会与JCP的异同。当然,你也可以参考正式、全面但枯燥的会议记录

发布pFind 2.1 Beta 2

  欢迎大家访问pFind Studio官方站点,包括软件简介、用户手册、演示视频和发表论文。稍后会提供pFind 2.1版的注册和单机版下载。我的RCM论文也在网站上全文公开,欢迎多多引用

  pFind 2.1颇有突破,接下来几天的blog,总结一下这半年的经验。今天先说第一条:建立风险识别和控制机制。

  去年“软件开发2.0”大会,晚上参加胡百师主持的“项目管理”VIP沙龙,现场有不少项目经理和架构师,讨论话题很多。胡百师建议:“除了Todo List和Bug List,项目经理手里应该有一份Risk List。”

  插话一下,那时正是pFind 2.0压力最大,进度拖延,BUG丛生的阶段。偷闲参加“软件开发2.0”大会,跳出来换换脑筋,从技术架构上,从项目管理上,从产品设计思路上,彻底反思了之前的工作。除了本篇BLOG讲的软件工程问题。再举个技术上的例子:听Baidu的前任总工程师的讲座,谈到一个检索加速的案例,他随口说了一句: “大家都能猜到,这是倒排索引的设计出了问题”……回到组里再听ly重构索引的ppt,意识到必要性,马上把这个Feature加入pFind 2.1的Road Map。

  跑题了,回来接着说。4月pFind 2.1启动时,我在Google Doc建立项目手册,专门加上了“风险识别和对策”一章,列出各种想到的风险,按重要性进行排序,然后一一填上预防措施,还有最坏情况下的取舍方案,然后每周跟进。

  可能项目启动那天是黄道吉日,最让人睡不着觉的几条,都没真正造成威胁。进度比预计顺利得多。还有一大堆惊喜。

  俺的成功经历实在不多,尤其是这么完美的比赛过程,所以难免有些迷信。有些运动员总在关键比赛前换上同一双球鞋,俺也决定以后抱着“Risk List大法”不放手了

  我猜我的合作伙伴可不喜欢这样,因为这次开发我可能根本没干正事,就是忙着扮演一个政委、牧师或居委会大妈,不停地骚扰大家:时刻在人家耳朵边上唠叨一些政治正确的废话,比如“复用接口上移,复用功能外抽”;逼着每个人修改变量名和类名,加空格和缩进;像个秃鹫一样在别人工位后面露出头:“嘿……没事……就是……那个……你的代码还没上传到SVN上呢”;每过两三天就发一次邮件,强调里程碑和Bug List;在别人最忙的紧要关头,要求双人编程和code review……

  Joel on software说:“开发人员把不务正业的程序经理拿来当早餐吃掉”。老实说,绝对是因为ly、hchi、lqliu这帮家伙太神奇,折腾出好多变态的成果来(嗯,早就等着拉2.1出去吓人)。我这个所谓“产品经理”其实是蹭饭的角色(更喜欢临阵杀敌)。《最后期限》里说:“你可以不雇我,但一定要考虑一下我的团队,他们真的很棒”,Bingo。