Category Archives: 打工日记

昵称征集

  今天在家又养了一天病。正事不能干,躺在那里就想些无关紧要的点子。比如给新版本的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万行左右,速度提高一倍以上,而海量数据的处理上限,可以有不止一个数量级的提升。当然新版的一个重要变化是实现跨平台,为将接下来的分布式集群版打基础。

面试和激情

  昨天去合作伙伴,一个刚“海龟”的生物学家那里,帮忙进行面试。她正在组建自己的团队,希望搞出类似国外Yates实验室那样的环境:医学家、生物学家、化学家、质谱专家、软件工程师和数学家都坐在一起,有任何领域的迷惑,一转头就可以拍拍身后的那个牛人解释清楚。所以除了购买各种仪器、访问国内有关的机构以外,就是打招人的广告。昨天面试者申请的是计算机方面的岗位。

  晚上,她写了封感谢邮件给老板:“I am jealous of you. I definitely want to talk to you about how to concentrate the best people in own lab”。BOSS H转发给我,附带一句:“为你骄傲!”。人人都有虚荣心,所谓成就感,就是这种东西吧

  说回面试,很遗憾这位面试者最终没有得到offer,他是请了假从南京赶过来,得到这种回答再赶回去,那种沮丧我们都能感到。真心希望 他以后能有好的发展。不知道这位面试者能不能看到这篇BLOG,不管怎么样,我还是想从尽量客观的角度,写写我的看法,希望对别人有用。

  这位老兄的问题肯定不是基础素质,他的教育经历相当值得自豪:小学两次跳级,只上了4年,中学在少材班,也只上了4年,14岁考上全国 最知名大学计算机专业,因为学业出色,大三就保送了研究生,不到18岁。我想这经历会让大多数招聘者从一大堆简历里把自己挑出来。由于进入社会的年龄小, 所以工作经历和项目简介就比同龄人厚好多。

  那么为什么参与招聘的人,无论是生物还是计算机领域的,都投反对票呢? 答案在于细节,我提到过这个问题。细节能表现出passion,或所谓的“能量”。

  整个上午的ppt和交流,研究生时代开始经历过的众多项目,却没有一个能让他表现出兴趣、热情、激动和成就感。在反复提示和要求下,他 勉强讲了几个自认为最漂亮的工作,仍然轻飘飘不接触细节,不得不多次打断他,“你只要讲一个具体项目就够了,一个让自己骄傲的工作:项目总体的需求是什 么?你和谁合作?系统分成多少模块或层次?你负责哪里?你的前后左右,上下游是谁?你们之间怎么确定接口?你遇到最大麻烦是什么?最初怎么考虑解决方案? 实际尝试了哪些办法?最终怎么把它干掉的?”

  搞技术的,尤其是研发领域,和搞艺术创作有类似之处,归根到底就是我和作品之间的问题。我们不得不孤独地面对古怪的系统,只有全力以赴 投入进去,用激情驱动自己面对那些枯燥的细节,绞尽脑汁,才有可能把问题pk掉,让机器正常运行起来。这是痛苦的修炼,也是让人激动的过程。如果一个技术 人员真正经历过这些,不管他有多内向,多不善表达,谈到自己的工程时,都会两眼放光,如果别人表露出轻视,他会热情地保卫自己的工作,因为这倾注了他的心 血。很多人会表现得非常激烈,甚至暂时忘掉自己在面试,忘掉礼貌和场合,例如会试图夺下你的笔,竭力利用纸或白板解释细节。

  曾国藩说躬身入局才能成事。对繁琐的工作细节有激情,这是到目前为止我见到过的所有出色技术人员的共同特点。(其实不只是工程师和科学家,我认识的出色的销售人员,也会表现出同样的狂热)。捕捉激情,是Joel on software提到的招聘秘诀,也正是《最后期限》里强调的招聘者所必须的“鼻子和胃口”。这也是曾国藩的“带兵之法”:找到愿意干事,有热情干事,有能力干事的人,他们会在关键时刻拯救你

  另一方面,曾参与的项目有多少历史意义多大规模,其实并不重要。我才不管您做的东西是关乎国计民生,或仅仅源于业余时间的自学探索:这 都和技术本身无关,只能说明你以前的老板有多伟大,不能说明你的能力。被面试者需要证明的是,自己面对新问题有没有学习和解决的能力,这当然也包括态度。

  再回来说面试的事,正式程序结束后,这哥们在闲聊中提到,想转入纯粹的生物研究,不想再碰计算机问题。这就间接验证了我的印象:将近 10年的职业生涯里,尽管物质条件上混得不错,但他不太喜爱所从事的专业和工作。这不是能力问题,而在于是否适合,这种情况下,的确需要仔细考虑以后路怎么走。

到上海出差

  吊着石膏到上海出差。刚到,把住宿安顿好了。路上挺顺利。感觉上海人没有传说中那么难打交道。无论是出租车司机,还是招待所的工作人员,都挺热情周到的。

  公事以外还有重要任务:拜访老妈的师友。当年生下我以后,她到上海读研究生(我三岁时来看过妈妈,冰砖很好吃,这是俺对上海的最初印象,哈哈)。

  OK,去干正事了。回头再写。

拼命的家伙都会有个更好的2008

  刚刚翻了翻07年1月份的BLOG。时间过得挺快,一年下来这是第73篇BLOG,平均5、6天一篇。更忙了,尤其是下半年。

  像06年一样,年初就列了4个最重要的目标。若有冲突,别的事一律让路。现在再总结,很踏实。

  无法同时应付太多的纷扰和诱惑。搞清楚最想要什么,忽略其余,然后全力以赴。这种单细胞生存方式比较适合我。

  从1月26日第一次现场常驻开始,整年的工作主题都与生物实验一线联系起来,这是很酷的经历。hchi从上海回来对我说:“我明白了,要做的比别人好就得拼命”。道不同,不相与谋,俺年终总结的Google Doc上这么写:“最大的个人收获是交到几个搞生化的朋友,专业领域虽不同,但拥有一样的热情和专注,自己很受鼓舞。”,希望所有正在拼命的家伙都会有更好的2008。

  新的目标还没想,明天再说,现在的任务是放松。

  引用吴晓波BLOG里的一段

The woods are lovely,
dark and deep.
But I have promises to keep,
And miles to go before I sleep

  这是美国桂冠诗人罗伯特·弗罗斯特(Robert Frost)的诗句。我的最鬼灵的朋友覃里雯,将之翻译为:“树林美丽、幽暗而深邃,但我有诺言尚待实现。还要奔行百里方可沉睡。”

加班,走神

  连续参加考核、汇报和总结,没空写代码。昨天的会史无前例,漫长的七个小时,23:30才到家。

  据说我们开会很像吵架,思路稍有差池,立马被乱棍打死。leo大虾再次显示传说中的“老师潜力”,在3小时的讨论中,即使下面闹成一锅粥,仍然心平气和,硬是让每个人听懂了老版索引那些恐怖的数据结构和读写流程,并接受了他的重构方案。

  经过一个月头脑风暴,pFind下一版慢慢清晰了。这其中SD2China对我整理思路有很大帮助。

  还有最后两个features,要赶在下周一功能冻结前加进去。所以今天来加班。但实在没状态,于是索性放松下来处理些杂事:上网听音乐,收发邮件,整理代码,讨论架构,翻译Tina文档每天计划的段落……

  冬至,别忘吃饺子。

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”,然后用字符串比对,现有的高效库和高效算法很多,还可以用后缀树这种经典的文本分析数据结构来进一步优化存储和增删改方式。

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