Tag Archives: pFind

pFind 2.0最后定版

  pFind 2.0昨天整理完毕,清理实验性或过时的算法,例如原有8个搜索流程只保留了最新的“发车模式3”。调整界面隐藏尽可能多的选项,以减少参数配置的出错机率。一口气删掉了5万多行代码。下周一pFind 2.0 final release,成为历史坐标。

  这是四月初,我请全组到新家吃饭。Boss H在网上订的黑森林蛋糕,据说有四百多块钱。

  最近一段,pFind 2.1开发进入关键战役,今天是第三个milestone,预计下午2点开始第一次集成测试。

  按组里惯例,C++和Matlab版同时展开。fy大侠带M团队,我带C团队。C版只实现最成熟的技术路线,保证工程质量,关注速度和吞吐上限;而M版还要验证一些相对激进的思路,昨天一问,M版也在不断重构架构优化速度,代码质量很高。很期待两个版本的PK。以前各个软件C、M两个版本最后“对答案”时,或者异曲同工,或者不约而同,相互印证借鉴,很有乐趣。

  周四要在全组讲pFind技术报告。为表示对一线开发者的尊重,除了简单提一下系统设计编码原则,我本人不会多讲,而打算让各个模块的作者亲自演示:先后实现了哪几种不同方法,跑了哪些数据和参数,在精度和速度上有多少进步……在所有人面前汇报自己创造的成果,体验成就感,鼓舞士气。

  从本科大一假期到软件公司打工开始,我总是天经地义的开发主力。这次pFind 2.1却只扮演项目经理角色,不负责模块的具体编程实现。精力都放在接口设计、代码审核、双人编程培训、进度监控和文档上。心情有些复杂:不挽起袖子敲代码,就没有那种“百万军中取上将首级”的快感了。

昵称征集

  今天在家又养了一天病。正事不能干,躺在那里就想些无关紧要的点子。比如给新版本的pFind2.1各个模块起名字。

  不少科研团队都喜欢给产品和工作设备起昵称。微软Windows各版本的昵称都是加拿大滑雪胜地附近的景物;豆瓣用《指环王》里的角色命名服务器;我到过的一个生物学实验室里,每一台显微镜都用诺贝尔奖得主的名字来命名。

  pFind2.0时代,我就想用NEO来命名蛋白鉴定引擎。但是,当时刚好在反向工程分析Mascot(pFind的头号竞争对手),脚本代码的注释里有不少程序员相互的玩笑和批注,发现他们居然已经抢走了这个好名字。我猜对方的研发人员里一定有不少MATRIX迷,这下知道他们为什么给自己的公司起这种名字了

  又考虑GATTACA。这部科幻电影对生命科学家的影响,就像MATRIX给程序员的震撼一样。主题上符合俺们pFind的生物信息功能。GATTACA这个名字是一种暗喻:它同时就是一段DNA碱基序列片段(人类基因组计划完成以后,网上也有好事者在人的基因库里做过blast)。

  也想过用Made in China的东西。比如传统神话里的“孙悟空”就很酷,或者到中国科幻作家的作品里寻找灵感,例如刘慈欣的“三体”。不过已经有互联网公司用“孙悟空”来命名自己的搜索引擎了;后者又显得不吉利:不可解的十八阶积分方程,不可预测的动态体系,感觉好像BUG总也调不完一样。

  除肽鉴定引擎以外,pFind系统的其他模块都等着起名字。按以前的想法,它们也都是MATRIX里的角色:数据索引模块命名为“ORACLE”(那个先知老太太,她实际是一个拥有高级权限的内核进程,负责索引和检测MATRIX系统里的异常变量,协助系统升级);日志和异常抛出处理部分叫 “SUBWAY STATION“(NEO昏迷后,throw exception的地方,里头是个死循环,等待系统catch);授权和注册码部分叫“MR KEY”(中国匠人,其实就是盗版软件里常见的注册码生成器);肽到蛋白归并模块叫“ZION”(清醒人类的总部,所有飞船的基地,虽然,最后NEO发现,所谓真实世界,只不过是另一层Virtual machine,又一个MATRIX)……一旦引擎的昵称换了,它周围的模块都要跟着重命名。例如鉴定引擎叫孙悟空,其他模块就应该叫八戒、沙僧、白骨精什么的。

  征求意见中,欢迎贡献灵感。大伙儿也可以秀一秀自己系统的昵称。

  BTW:欧美科幻小说与理工研发领域的联系源远流长。科学家和工程师们都很喜欢借用科幻小说里的人和物。比如美军第一艘核动力潜水艇,就用凡尔纳小说《海底两万里》里的海底机器来命名。美国冷战高潮时期的太空军备竞赛计划,借用了电影《星球大战》的名字。反过来,小说家和电影人对科学的理解也非常到位。比如斯皮尔伯格的《AI》中,对人工智能、感情和灵魂的探讨。反观国内,影视编导往往把科学表达成了现代巫术,长生不老药和阿拉丁神灯的新版本。

pFind新版开发启动

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

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

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

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

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

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

BUG修复了,爬到终点

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

  输出无误!

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

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

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

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

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

挺不住了挺不住了

  工作上压力太大了,上来发泄。怎么离pFind 2.0发布的时间越近,活反而越干越多了?挺不住了挺不住了。顾炎武说成功者大多“以兴趣始,以毅力终”,现在就想把“兴趣”啊“毅力”啊,都扔到太平洋里去,然后躲起来滑一个星期的单板。

  离deadline还有10天。 记录今天(应该是昨天)的声音:

  zf说:“发现了严重BUG。”

  合作的生化学家说:“给,这是我们上周点灯熬油重作的实验数据,3个G,38组,搜一下,顺便说一下,数据里fy发现的现象是@#$%^&这么一回事,你们的pFind和国外竞争对手软件从核心算法上都不支持这种电离模式。”

  合作的生化学家又说:“搞科学的就是有偏执;女孩子逛街看中什么,你这次不让她买,回去睡不着觉,也是偏执——两种现象属于同类生化反应。”

  Boss H说:“坚持过这一段,让你去上海待一个月,放松一下。”

  CSDN客服说:“请携带您的门票和证件,准时出席会议,谢谢。”

  某美女说:“你有很多优点。”

  另一个美女说:“原来生活可以这样,可以这样慢和放松,其实你们也可以。”

  老妈说:“晚上早点睡,不准熬夜了……我的腰椎一直没缓解。”

  许三多说:“就像死过一回。”

  姚明说:“球队需要我们带领度过难关。”

  钱文忠说:“玄奘,这个中国历史上最有名的留学生,终于通过有五百个著名教授参加的毕业答辩了。”

  俺爬俺爬,终点在哪里呀……

条条大路通罗马

  开了一天会,合作伙伴、项目申请、科研基金、最新动态、工程测试、专利申请、域名抢注、软件版权、人员调整、财务状况、未来进度……一大堆问题搞得身心疲惫,快下班时,大伙无意间议论起一个算法问题,这才感觉好玩起来,放松起来,记录之。(晚上又是应酬,给领导敬酒啊什么的,似乎这一整天,就这个问题的思考是个快乐的瞬间)

  zf帮Boss H统计蛋白质数据库的数据分布情况,从上T数目的肽里,把拥有相同元素分子式的肽序列都归到一组(蛋白质或肽都是由碳、氢、氮、氧、硫五种元素组成的)。

  以往zf是用哈希表做的,最初用前两位当key,后来进一步优化,用五种元素原子个数组成的向量来降维,但这样对付海量数据,速度还是太慢,程序一跑好几天。Boss H希望干脆把哈希变成一个map,也就是说,设计一种key,相同的元素分子式,有且只对应唯一个key。

  Boss H是数学出身,所以首先想到一种很“数学”的办法,用五个素数作为基,例如2、3、5、7、11,然后取对应原子的个数的指数幂再连乘起来。例如,某个肽含有的碳、氢、氮、氧、硫原子数目依次有N1,N2,N3,N4,N5个,那么算出来的key就是2的N1次方,乘以3的N1次方,乘以5的N3次方,乘以7的N4次方,最后乘以11的N5次方。得到的每种不同的数字,自然就唯一代表着一种独特的元素组合方式。更妙的是,为防止这个数据过大,上溢,导致计算机无法处理,可以给它取log,连乘变成了连加,缺点是,对应的结果不再是整数,浮点判等会稍微麻烦一点。

  俺是软件工程师,自然用很“工程”的办法,就是把碳、氢、氮、氧、硫的个数都变成0101的二进制串,然后依次排列起来(本质上,就是把N1,N2,N3,N4,N5依次乘以2的32、64、96、128、160次方,或者说把他们各自对应的0101二进制串依次左移动到合适的位置,再加起来),类似IP地址那样,比对是否相等时,直接用二进制掩码方式就能处理了。存在的小问题是,需要预先进行一个统计,搞清楚自然界里蛋白质分子中,碳、氢、氮、氧、硫各元素的原子数目的最大上限是多少,蛋白质是大分子,动不动成千上万的氨基酸链起来,必须保证二进制位数足够,不过这不算什么大问题,不够加长二进制串的长度就是了。

  fy大侠匆忙间刚够听明白问题的确切意思,于是在最短时间里想出个最直观的办法,那就是用ASCII码文本连起来组成一个字符串作为 key,不同元素的原子个数之间用一个符号隔开,例如“31@24@11@13@1”,然后用字符串比对,现有的高效库和高效算法很多,还可以用后缀树这种经典的文本分析数据结构来进一步优化存储和增删改方式。

  这么一个小问题,原来有这么多不同的招数,条条大路通罗马。思考是一件非常有乐趣的事。

进入2.0时代

  刚接手pFind 1.5版时就提过,软件的2.0研发是个危险路段, 前方路况复杂,但既有架构又往往需要大动干戈甚至推倒重来,就好象给高速行驶的火车换轮子。反过来说,微软的很多著名软件,例如DOS、Windows、 Word、Excell、IE等,在最初阶段都被嘲笑为拙劣的模仿者。但这些软件一到3.0版,总能把原来的市场领跑者打得满地找牙,这体现了微软出色的 执行能力,把握细节的设计和竞争中的韧劲。

  所谓Web 2.0概念,就是商业上形容那种感觉:网络创业开始成熟,开始总结套路,为后面3.0、4.0、5.0……打基础。对玩家来说,千头万绪之中找到方向和走法至关重要。

  回过来再说自己的事,经过漫长的Beta,12月初,pFind Studio 2.0套件终于计划正式Release了,包括质谱和数据库预处理软件、搜索引擎、后处理平台和谱峰图形化标注界面等一整套鉴定工具。这几个月的痛苦前所 未有:海量数据测试,现场调试,打电话发邮件开会,重构,Features取舍,修改方案,熬夜加班,咳嗽两个月不好……总感觉快扛不住了。自我安慰:等 正式发布那一天,俺就是“世界上最棒的蛋白质鉴定软件系统”的Architect了,到时候充实地好好歇几天,阿弥陀佛,一定要爬到那一天呀。

  下面记录点具体案例,等俺老了,可以借此回忆激情燃烧的岁月(说别人都没意思,俺们现在的战况是:大老板H都上阵肉搏了):

  上周六临晨2点,BOSS H给我打电话报喜:“解候选肽理论库的不定方程组的代码编出来了!”昨晚,这一幕惨剧再次发生,11点多BOSS H又来电:“通过各种生化条件限制,我把理论候选肽数据库的数字从两千万缩减到六百了”,他兴奋地描述组合生成深度优先算法中的小招数,一直打到手机没钱 为止。

  这还不够疯狂,和BOSS H电话断了,打着哈欠收邮件,我靠,fy大侠也没闲着,半夜00:40邮件:“有线索了!”,看了好久的谱,他有个惊人发现……

  于是今天打乱私人安排去加班(幸亏没耽误晚上的蓝色宝石周年聚会)。BOSS H和fy先PK,排优先级,决定先写fy这边……明早新程序跑出结果,刚好赶上生物学家们过来开会,希望可以把鉴定出的糖修饰谱个数提高一倍。

  最后预告一下,刚好在pFind 2.0发布前,我计划参加2007软件开发2.0大会,我主要关注系统开发的这个Track,希望多交流。

加班和躬身入局

  一整天才搞定一个BUG,规划好久的新流程总算基本调通了。初步测试效果相当令人振奋。加班回来晚了些,今天的节气是“霜降”,十点走出轻轨站,雾蒙蒙的。

  细节是魔鬼,所谓核心竞争力全在这儿。比如leo遇到的问题:理论上,蛋白理论酶切和肽序列统计排序是简单的算法,用STL的hash表就可以实现。但实际应用就没那么容易了,真正对付业界常用的蛋白质库,hash表里的海量数据一下就把32位进程的3G内存空间耗尽了。怎么重构,是外排、索引还是用AWE API实现自己的hash表?看来leo得踅摸两天了。

  要拥有比赛资格,就得面对细节和变化的挑战。曾国藩说:“在局外呐喊议论总是无益,必须躬身入局,挺膺负责,乃有成事之可冀”。拼凑一个根本不考虑2.0版的demo,几百个数据模拟一下,在论文里讲个好故事,不屑或不敢考虑实用?差得太远了。

奇迹出现了

  在北京蛋白质研究中心这两周,掉进深坑又爬出来的感觉。pFind系统首次投入实际的一线生物科研,这是个里程碑。

  从第一天开始就不断出状况,几乎所有模块都面临没考虑到的选项。困难的“周全”程度,似乎是有意考验一遍团队里的每个成员。俺的最主要工作就成了不断呼叫“家里”火力支援,几乎把组里每个人都搬来呆了两天……

  28日deadline,我却不得不在15:00离开现场,去医院检查心脏。之前好些天胸闷,从27日开始胸口后背刺痛,影响到工作。 坐在出租车上打了几个电话,情绪低落。领导来电:”我判断不可能出现奇迹,别再指望了,安安心心去医院,先把身体情况搞清楚”。

  到医院请主任级专家看,结果心脏没事,肋间神经的问题,放射性的疼痛类似心脏症状。哈哈,长出一口气,这是长期坐在电脑前姿势不正,过于劳累造成的。

  晚上坐在电脑前反复刷邮件,等到21:00,按耐不住打电话过去,原来他们刚刚干完。给领导发短信:“奇迹发生了”。pFind终于跑 出了结果,帮生物学家得到了迄今为止公开报道的最好鉴定数字(当然,主要是人家的生化分析方法特别巧妙,pFind只是长长的实验分析链条的最后一环)。 发邮件给现场的四位大侠:“传说中的英雄,传说中的温酒斩华雄,哇啦哇啦……”

  今天又跑去。假期路上都没人了。看到了刚印好的精美Poster,生物学家们要在10月5日在韩国召开的HUPO 2007(第六届人类蛋白质组学大会)上公布这个结果。我在4月份写BLOG,希望有朝一日,pFind成为顶级刊物生物实验中的数据分析工具,也许这个愿望有机会实现了,比我预想的时间更早。

  贴张照片,背景是昂贵的LTQ-FT(线性离子阱-傅立叶变换离子回旋共振质谱仪)。超导的东东,强磁场能把附近的银行卡消磁。这几天刚好出问题,请了一位德国工程师来修,从下飞机就开始按小时计费。