Category Archives: 0和1

FF3下载日

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

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

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

准备拽着2.1怪兽出去吓人

  刚刚改进了pFind 2.0的N端可变修饰生成的递归部分的代码,发布2.0.003补丁。

  五月份主要工作就是用pFind 2.0和pFind 2.1(流程2)进行大规模的伴随测试。经过对答案,两者都修正了不少BUG。pFind 2.1 Alpha 2估计会于下周一19日发布。我们会带着2.1去用户那里进行Beta测试,这比原计划提前了将近10天。

  fy领导的pFind M版也有进展,M是面向未来的版本,已经实现了对ETD的支持,多母离子窗口等梦幻特性。马上就要展开M版和2.1版(流程1 )伴随测试。

  按照计划,6月发布pFind 2.1 Beta 1。到7月底,在至少两家生物实验室完成Beta测试,8月8日,正式发布pFind 2.1的final release,“奥运献礼版”。另外,pFind 2.2也会很快着手,预计在12月1日发布,这就是这么多年传说中的集群版。

  最近压力很重,hchi昨天请病假,我还一直欠着pLabel和pScan的设计审阅和双人编程没空展开。不过也很有成就感,pFind 2.0陪着pFind 2.1跑了接近百万张质谱数据,每张谱、每个候选肽、每个打分、每个EV值……一直精确到小数点后五位,确保完全一样。有一次,18万张谱里只有1张不同,结果是1.000007对0.999998,但是hchi穷追猛打,一口气追下去,最终修正了一个很隐秘的BUG。

  pFind 2.1 Alpha2 目前还没有界面,8万行C++代码;pFind 2.0经过大规模整理删除,11万行C++代码;正在彻底重写的pLabel 2万行C++;等待大规模重构的pBuild,2万5千行C++;pScan接近1万行C++。这些代码都是在将近18个月里完成的。

  接下来这个夏天,拽着2.1怪兽出去吓人,把Mascot打得满地找牙。

Google App Engine视频

  Google App Engine不顾俺三番五次申请,就是不给试用帐号。郁闷呀。

  这里有一段视频,演示了简单的Google App Engine开发步骤。尤其是用GQL调用传说中的MapReduce海量分布式存储,看得俺直掉口水。趋势不可逆转,很快多数软件都会以ASP(Application Service Provider)方式提供服务。我很想知道微软首席架构师Ray Ozzie看到这东西是什么感觉。

  按一般观点,类似俺们pFind这种计算密集型应用,核心模块必须使用C/C++ API,否则慢得难以忍受。然而,一旦基础架构的分布式规模达到Google所谓的“云计算”这种级别,就算有几十万张谱,也可以充分地分而治之,被分解到巨大的PC Farm里,让集群节点一对一PK,甚至进一步按蛋白数据库再细分任务。这种情况下,即使单个节点的线性效率稍差,也可以接受,可能用Python就够了(对比:按我们现在的经验,没经过精心优化的Matlab代码鉴定一张质谱大约5分钟,当然可以进一步采用各种优化加速手段,例如psyco)。到时候,最主要的速度限制也许就来自网络带宽,上传多少即时鉴定多少。

  未来某天的软件创业故事:逃课的小孩在大学宿舍里编写了一款网路游戏(比如,也许是跑在iPhone或Android上的多人联机MMORPG),上传到Google App Engine,再到常去的论坛发个帖子,邀请大家来试玩,结果这个游戏一炮而红,Google和中国电信作为基础服务提供商,对利润进行分成。这个故事不会很快变成现实,但是也不会很慢,技术演化总是被低估。

pFind新版开发启动

  三月份大部分时间在写材料和开会。甚至出现了一个meeting week,周一到周五全都用来赶场参加各种会,最夸张的一天开了三个会,一直弄到将近23:00才散,差点没赶上5号轻轨末班。

  上周终于着手2.1新版设计。鉴于大伙儿元气大伤,取消了setup会议,单独找每个人面对面交流再汇总Todo List。

  周三下午,把电脑和投影仪搬到会议室里,直接对着代码展开第一个模块的设计。双人编程,正确说,应该是四人编程,推敲所有细节,甚至明 确参数命名。一开始当然有点痛苦,各人都没有特别细致的思路,更别提大家的一致。不过几个回合重构下来,最终一版的空模块(只定义了接口和架构)编译通 过,每个人都很开心,团队的信心和士气提高了不少。这不仅因为完成了第一个里程碑,还因为统一明确了设计原则和质量底线,后续设计工作照方抓药就可以了。 磨刀不误砍柴工,设计阶段精耕细作从来都不会白费。

  上周的另一件事是继续调试2.0老版本。多谢chh支援,困扰两个多月的BUG总算有些眉目:第一组实验中,碰到一个变态的蛋白,修饰 位点组合爆炸,出现九千多万种可能性,把递归程序撑爆了;第二组实验中,为压力测试调大了参数,有个地方的vector容器装不下。把两个地方剪枝条件加 强就解决了。折腾这么久,真算职业生涯的奇耻大辱。搞到最后老板都不好意思问了;反而是老妈每晚的餐桌上都关心进展;去参加文献club,生物学家也问 “你的BUG怎么样了”。

  另一方面,由此看来,老版pFind的潜力也就仅限于此了,稍微上点数据量就开始这里那里到处漏水。这也正是彻底重新设计架构,开发2.1版的主要原因。

  我预计新版的C++代码可以从18万行降到10万行左右,速度提高一倍以上,而海量数据的处理上限,可以有不止一个数量级的提升。当然新版的一个重要变化是实现跨平台,为将接下来的分布式集群版打基础。

关于C++的ABI

  如果要给最头疼的C++特性投 票,我会选ABI兼容:C++标准没有明确跨编译器的二进制兼容,于是各个编译器的实现都不同。用VC在Extension Dll里实现一个类,到了gcc代码里就不能直接调用。这带来了很多麻烦,尤其在有移植和平台兼容需求的大项目里。最近我的项目进行下一步规划,就为培训新手挠头。

  更糟的是,这还导致其他编程语言不能简明地“胶合”C++:大多数编程语言的编译器或解析器都是以C/C++实现的。按理说来,在这些语言中调用C++的类应该是很容易实现的天然属性。但是正由于ABI不兼容,这些语言要支持C++二进制调用就必须先选择编译器:到底是支持VC还是 gcc?因此很多语言避开C++,以纯C形式的动态链接库(Windows下就是Regular Dll)作为对外胶合的二进制接口。这进一步影响到不少混合语言项目选用C而非C++与动态语言进行高低搭配。

  作为实现“底层硬核”的系统级语言,C++的调用接口这种基础机制不理想,负面影响有些大。

  当然也有不少对应的解决方案。最有名的是COM,它利用类似虚函数表的方法,建立语言无关的接口兼容模型,微软把Windows系统的几乎所有的模块接口都变成了COM,比如ActiveX和DirectX。还有其他一些常用方案,像SWIG。普通一点的方法是用C语言接口做桥接。

  前几天刘未鹏征求中国程序员给B.S.的问题,俺问ABI标准啥时候有指望。据说问题的关键不是技术,而是C++标准委员会各大厂商间的政治原因。

  BTW:最近玩D语言,本来就是一帮C++高手另立山头搞出来的,自然是针对后者的软肋作改进,目前看起来的确很美好。不过二十年前C++刚从C里面蜕变出来时,看起来也很美。路漫漫其修远兮。

返璞归真

  过去一年左右,听过的最有收获的技术讲座,就是阿北的云风的

  两人都是骨灰级程序员,阿北写过将近20年的程序,云风C++经验也超过15年;都是一线架构师,在相对自由的环境下,按照自己的思 路,架构一个完整的大系统。所以尽管他们开发的是不同产品,用的是不同技术,讲座内容听起来居然有某些相似:把握技术的方向感,设计上的返璞归真。

  其中不少一带而过的设计细节都会引发我的兴奋和一点遗憾:兴奋缘于共鸣,而遗憾则因为“如果早两年前能明白……”。不过反过来说,很多事只有躬身入局试过才能真正明白,否则就是听到了也会放过去。

  春节闲翻书,又读了一遍Conversation with I.M.PEI。 贝聿铭从名校毕业后,有十一年都专做贫民区改造项目。这阶段的工作在师友看来有些低档,但是他自己认为非常重要:因为他借此熟悉了社会是如何运作(这一类项目,大多和政府法令和补贴有关,所以必须学会跟着老板去和政府官员和媒体打交道),学会了在受限的条件下作出最合适的设计方案(书里举例说明当时如何想方设法,既能设计出完美的建筑,又能满足严格的成本限制)。通过这些磨练积累,才有了后来的卢浮宫金字塔、香港中银大厦、香山饭店和伊斯坦布尔博物馆。

  国内软件业正在发生变化。一大批工程师已经积累了“贫民区改造项目”的经验。一旦这些人得到环境的支持,拥有了独当一面自由发挥的机会,就能做出真正有趣有影响力的设计。接下来几年俺们等着瞧吧。

混合编程的前世今生

  老妈在玩Python语言,她说Python简洁严谨的风格很像Fortune,“不像C++那么乱哄哄”。从穿孔纸带开始,老太太算是各种技术都经历过一遍了。虽然比不上她老人家,俺用来赚过银子的编程语言,从本科大一兼职开始算,也有十种以上了。

  说起不同的编程语言,就掺乎到Language Wars,历来是吃力不讨好的大坑(Joel on software有一篇很经典)。最近几年的趋势是混合语言编程,用静态语言实现关键模块,用动态语言做胶水,必要的时进一步用DSL归纳特定领域的高效开发模式。

  Google一下,原来很早就有牛人预计到了这种趋势,看看John K. Ousterhout在10年前于IEEE Computer发表的这篇论文,不得不佩服他眼光很毒。其中关于gluing language和component frameworks的提法,如今已经成为业界的标准术语。

  最初的潮流推动者是微软,早期VB正是一种经典的胶水语言:从Web到Office,从ActiveX到DirctX,Win32系统 中几乎所有功能模块和技术特性,用VB都可以轻松整合。即使用今天的观点来衡量,VB6.0 / VC++6.0这一对仍然堪称黄金搭档,整套架构以COM技术为核心基础。只可惜.net技术推出后,VB突然莫名其妙地失去了定位,有一阵似乎希望变成 “另一种C#”,不断向系统级语言演化,反而让老用户无所适从。等明白过味儿来,.net 3.0不得不从头引入新的IronPython

需求分析VS惯用法

  让出Web开发和企业级开发领域后,C++集中于系统级开发,也就是一般应用软件的“硬核”部分。所以一个有趣的现象是,尽管C++的市场份额在下降,C++程序员的平均工资却在提高。

  但C++的复杂性一直让人头疼。最近关于C,C++,D语言的大争论,国内外都引起强烈反响。和以往“编程语言口水仗”不同,不少经验丰富的程序员和架构师发表了自己的意见。

  刘未鹏刚发布的这篇《学习C++:实践者的方法》值得推荐。学习C++容易钻到语言细节的牛角尖里出不来,相信很多人都有共鸣,而且身边的新人还在不断重复这种弯路。其实,对系统功能需求本身的理解和分析,比你用了几种惯用法和设计模式,重要得多。BLOG后半部分还给出了学习要点的列表,比较中肯。文中提到的Bjarne Stroustrup的回信Andrei Alexandrescu的专访云风的BLOG,都值得看一看。

  BTW1:下班时fy大侠评价:“系统跑得很流畅”。这一阶段的优化工作干得很苦,结果也令人欣慰:内存占用降到了老版本的1/5,从 而避免了进程空间2G上溢崩溃的问题,速度也有所提高。改进效果在越大的数据上越明显。human库同时指定5、6种可变修饰,pFind不再那么吃力 了。

  BTW2:近几个月的重构,“水面以下”的进展是以exception throw替代掉原有C风格的return false和GetLastError()。十几万代码,三十几个模块,逐步利用各种机会顺手重构,到今天算基本改完了。目前的异常和日志机制让我满意。 如果要列出用C++而不用C的最主要原因,我大概会选STL和异常处理。

  BTW3:闲暇时玩玩D语言,编程的感觉很好。变化的正是C++那些让人别扭的历史包袱。

BUG修复了,爬到终点

  晚上7点,完成了三十分钟的Rebuild All,开始重跑测试流程,守在键盘旁边,不停刷新Track日志,听到心脏砰砰在跳。

  输出无误!

  老生常谈的教训:在压力下急躁失措,没有坚持逐步迭代重构的原则。妄想在一次大动干戈、没有单元测试的修改中,同时满足“大规模优化流程“和“添加复杂的新功能”两个目标。最终只好回滚代码版本,从头再来,反而耽误了更多进度。

  deadline拖延了一周总算有交代,阿弥陀佛,这次算是扛过去了。陈老板说,他的本事就是:“每次都能在快跳楼之前把活做出来”。

  check in到版本服务器,给组里发邮件。长出一口气,好像卸掉了千斤重担,突然感到很饿,才意识到忘了吃午饭。折腾了十天,名符其实的“寝不安席,食不甘味”。于是赶紧出门,回来沐浴更衣,补充给养,明日整军再战。

  后天,合作伙伴大队人马过来了解进度,善哉善哉。

  SD2China的VIP沙龙,胡百川说:“项目经理的阵前折损率是很高的”。

Andrei Alexandrescu专访

  很多朋友都问参加SD2China(软件开发2.0大会)的感觉,还在“反刍”中,也想等等看别人的BLOG有什么整理。回过来审视自己手头的pFind 2.0工作,有了不少新的视点和思路。

  参加SD2China原因之一是冲着Andrei Alexandrescu去的,他的课程都听了,得到亲笔签名的C++ Coding Standards:101 Rules, Guidelines, and Best Practices。这里有段专访,里面提到C++0x标准提案里,他最喜欢的三个features是:variadic templates、auto和concept,说到俺心里去了。