Author Archives: wangleheng

关于异常机制和编程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。

停BLOG14天

  按进度计划,我们会在7月1日发布pFind 2.1 Beta 2,同时pLabel、pBuild和pScan也各自发布新版。这是重要的里程碑。也许是我进入生物信息组3年以来,最重要的一个。每天都感觉在不断接近“把Mascot打得满地找牙”的理想。组里打算为上半年大规模工程开发圆满完成好好庆祝一番(庆祝的事情交给我筹备,可我现在一点心情都没有)。

  未来10天,Todo list上还留着不少待处理事项,好多麻烦搞得人睡不好觉。感觉自己变得敏感易怒,刚刚还犯了一次偏头痛。

  需要集中精力,把pFind 2.1发布搞到尽量完美。所以不得不停BLOG两周,不好意思。

  那么我们7月5日再见。到时候我会邀请蛋白质组学方面的朋友试用pFind 2.1。

《一把雨伞给这天用》和《沉思录》

  周四晚上买了格纳齐诺的《一把雨伞给这天用》,周五晚上又买了马可·奥勒留的《沉思录》

  

  《一把雨伞给这天用》没有一口气看完,只在轻轨上翻了前几十页,又跳读了几个地方。苏珊娜家聊天那段,很有趣。在豆瓣上找到miserwei的书评,同样是仅仅读完了前面一小截,过了99页才找到好玩之处,与我的阅读体验类似。(BOSS H一直说,看《士兵突击》好多次,都是开个头就看不下去了。前两天,看样子他终于耐着性子熬过了前几集。如果他像我一样错序看,也许不会这么痛苦。)

  很早就想买《沉思录》,一直有种抗拒感:阳春白雪的古典哲学,因为被克林顿和温总理推崇,作者又是古罗马元首(imperator,常称为皇帝,以前讲过这个词的翻译),于是畅销起来。以前商务印书馆的简装本挤在二楼最里面的书架上;现在变成了“双语典藏版”,与经管、炒股、中国崛起、名人访谈一起摆在书店门口最显眼的地方。据说这书和《资治通鉴》一样,成了官场上的时髦礼物。这是“长尾理论”的经典案例。

J.K. Rowling在哈佛大学的讲演

  昨晚睡前花了2小时追杀3只可恶的蚊子。在等待“嗡嗡”声出现的空隙,我重温了《哈利·波特》前两本。

  J.K. Rowling于6月5日参加了哈佛大学2008年的毕业典礼,被授予荣誉学位,并作为特邀嘉宾做了标题为《The Fringe Benefits of Failure, and the Importance of Imagination》的演讲。老实说,我觉得她的讲演比去年BG的更有趣。当然,更公平来说,每年的哈佛毕业典礼的讲演都很精彩。

  看来《哈利·波特》里的很多描述和感悟,例如对失败的恐惧、贫困(罗恩一家)、种族歧视、狐假虎威的官僚以及专制压迫,都源于作者的实际体验。保守的宗教团体因邓波利多校长被描写为同性恋而抵制《哈利·波特》,Rowling就此幽默了一把。

FF3下载日

  今天Firefox 3.0正式发布。mozilla基金会号召所有开源支持者们集体行动,创造软件单日下载次数的吉尼斯世界纪录。令人惊诧的是,到现在为止,来自伊朗的下载量已经超过了16万,超过了中国和加拿大,目前排在前三位的是德国、日本和美国。

  Firefox的最大竞争对手,微软IE团队送了个恶搞的蛋糕。说起来这两个团队的关系还算不错,总是礼尚往来。上一次,是FF团队同意IE 7使用自己的RSS图标,以利于用户体验的统一。

  后续:最终的记录是八百三十多万次,下载量排名前10的国家分别为:美国,德国,日本,西班牙,英国,法国,伊朗,意大利,加拿大及波兰。