Category Archives: 打工日记

pFind引擎核心搞定了

  静下心来搞pFind蛋白质质谱鉴定系统的引擎核心。今天终于搞定了所有问题。版本冻结。

  春节回来,进展如下:

  • 约束组里用版本管理服务器交流代码;review,写注释
  • 修正内存泄露bug;修正离子误差计算bug;修正默认评价算法bug
  • 评价模块添加一种新算法
  • 重构体系结构,用工厂类集中管理各个算法模块
  • 添加算法调试流程
  • 添加性能测试流程;对Intel编译器进行性能对比测试,相对VC7.1提高9%以上
  • 对外交流,初步形成集群版本的规划

  这周末,check in第一个里程碑版本。

周末比平时忙

  害怕周末,比平时紧张。

  周五晚上写代码到2点,周六上午上在职研究生英语课迟到,老师问我why,我说cold,他说我不诚实。一整天上课都没状态,最后的小测验成绩可想而知。晚上回来又写代码到半夜,然后整理“每周收藏”。今天又为二手房的事疯狂跑。累。

  blog上好久不谈技术了。上周打算读的书也只看了几章,的确好玩,等有精力再写吧。

  持续重构pFind搜索引擎,搞定了遗留的BUG,添加了“算法调试”和“性能测试”两个流程。有了单元测试保护,这过程是种享受。三月底发布里程碑版本。

  接下来又要折腾论文的事情。

C++和集群系统

  现代C++的发展方向让人困惑:泛型技术的确很酷,却妨碍了模块的动态链接。没有Java Bean这样的标准组件模型可能算是C++语言最让人头疼的地方,程序员被各种编译器和操作系统的细节淹没。

  大型系统里,C++到底负责哪些部分更合适?时髦的体系结构是这样的:用C++实现library层,用Java甚至更华丽的动态语言实现业务层和界面层。看起来很美,比如Eclipse和SWT

  串联质谱鉴定系统搜索引擎pFind以外的模块如何组织?一直拿不定主意。

  上周去合作单位,实际操作同类的国外工业级产品,集群系统的体系结构给我留下了深刻印象:由C++实现各种独立的后台服务,无论命令行、Java GUI界面、分布式网络协议或Web界面方式,都能操作这些服务进程。的确是简明漂亮的方式。

  好的解决方案往往都很简单。比如集群节点间的通讯服务,其实只需相互交换简单的消息,再利用NETBIOSNFS共享具体数据就行了。

小心2.0

  到海外发展的职业球员一般在转会第二年遇到瓶颈。对于系统分析员有个类似规律:小心进入新领域后的第二次设计。

  刚涉及陌生领域,战战兢兢,因此放低期望值,尽量采用熟悉可靠的设计和技术,遇到变化能容忍妥协。而到了“第二个赛季”,虽然客观上面对前一版剩下的“难啃的骨头”,但由于对领域知识有所了解,半瓶水晃荡,需求分析时就会有意无意添上很多漂亮但不重要的内容,设计时也总想用时髦的新技术弥补上一版的遗憾……眼高手低往往搞砸。就连成熟的大公司开发的软件产品,“2.0”都是危险阶段。

  到目前为止,在生物信息组的工作还算满意,但接下来进入深水区,必须加倍谨慎。

  • 备份到目前为止的资料、邮件、文档、工具、代码和测试数据
  • 沉下心,扎扎实实沟通,需求分析很琐碎,文档、画图、开会……要拿出热情来
  • 整理需求,分级排序,时刻提醒自己,那些很酷的东西,比如分布并行,比如Web Service,比如泛型技术,并不一定真正重要
  • 修改接口协议要谨慎,一定要修改,必须首先更新相应的单元测试代码
  • 多花时间帮各个算法模块的作者,在保证代码工程强度的前提下,让博士们腾出更多精力投入研究
  • 里程碑和deadline,重要的不是日期,而是不断监测和调整
  • 砍掉不必要的,砍掉风险大的,砍掉机器可以做的,砍掉资源不够的……逼急了,砍掉某些人

测试进度

  昨天是测试第一天,整天都在忙着组织:配置测试平台、上传测试用质谱、挑选蛋白质数据库索引、解决平台差异、帮助不熟悉自动化测试工具的同事编写脚本、定位缺陷、修订测试案例、添加单元测试代码、发布补丁、汇总进度……直到晚上20:00才搞完。

  回去路上又碰到个神神叨叨的讨厌的家伙,只好从轻轨下来直接打出租车摆脱他,到家直接上床呼了,没开电脑写BLOG。(2011年博客搬家时补:这个跟踪的家伙是我的情敌,真是二,后来居然在晚上加班回家路上用电棍袭击我,被打翻在地上揍一顿就老实了。当时我们也很害怕,差点报警。现在想想2006是有趣的一年,还真遇到过不少稀奇古怪的事)

  美美睡一觉就舒服多了。今天组里的测试工作很顺利。虽然下午有会,还是追上了进度计划。目前共完成测试用例204个,累计报告7个问题,汇总出3个BUG,已修复1个,完成总工作量的21.9%。我自己也一口气测了40个测试用例,位列排行榜第二。

  明天可能有更多空闲调BUG,希望18日的milestone有个好心情去滑雪

瞻前顾后

  进度比一开始计划慢了,不过总算是在2005年初步跑通了整个流程,验证了新的框架。上周把各个模块的单元测试代码和数据整理完了。今天唐发来了集成测试计划,总共设计了931个测试案例(辛苦辛苦),放假前的10天,平均每人每天需要测试10~11个。

  另外一方面,工程组面临着巨大的压力。似乎又要新开始一个关于交通仿真的项目,数字图书馆这边也在提新的需求……不管怎样,有了去年的痛苦教训,我绝不会再介入其他项目;前几天部门领导谈话,轮到我这组时,提到实验室和公司剥离后的去向问题。

  不管如何,决心静下心来,把精力集中在pFind软件开发和学术论文上,其他事和我无关。发现自己很不善于并发应付太多件事,所以今年我要明确几个主题,其他事情都让路。也许除了pFind工作和论文,买房也算一件重点吧。房子一直在看,房价一直在涨,总说:“到顶了,要调控了,泡沫要破了”,看来不靠谱,要当机立断。

跑通了

  万岁!10:43的时候,蛋白质多肽串联质谱鉴定系统终于输出完整的结果了,刚好是今年的最后一天。秀一下输出的XML报表,嘿嘿。

  从一窍不通到熟悉生物信息基本概念;从阅读几万行代码,到重写了几乎整个系统;从频繁的开会交流,制订接口,培训单元测试工具,双人编程,到最后阶段大胆的重构……踏踏实实干了不少事情。年底的气氛总是浮躁,能控制住自己静下心来,集中精力保证每天八小时工作质量,不加班,也没偷懒,真不容易。成就感:)

  一下子精神起来了(昨晚应酬,早上上班还很疲惫呢)。接下来,整理单元测试代码,准备过几天的汇报演示,1月份开始集成测试。测试方案花了不少心血准备,这下终于可以用上了。

  下雪了,心情不错,新年快乐。谢谢各位同事给我的帮助

蛋白质数据索引

  阅读代码,画图,然后重构,单元测试……搞定了数据库部分。

  被数据结构的细节所纠缠。由于性能原因,无法使用通用数据库平台,只能自行开发一个数据服务。用各种酶在不同修饰条件下,对几十G 蛋白质数据进行酶切,得到肽离子,建立索引(即使最小的库,都有将近九千万条,而且每新增一种酶或修饰,数量还要翻倍),然后用文件映射方式,通过共享内存提供服务。

  其实我很欣赏系统最初的体系结构设计。但是由于1.5版deadline很紧张,老板施加了巨大的压力。为赶进度,工程师编程顾不上接口和重构,产生了大量的耦合和拷贝,弄得整个架构动弹不得。我接手后,只好回过头用几倍的时间阅读和重构代码,何苦呢?

  彻底重新设计了数据访问类,用一个纯虚父类做接口,隔开其他部分。每种具体实现方式作为一个子类,比如目前读取共享内存的代码。还打算把1.0版不通过索引的数据访问方式代码也移植过来,实现另外一个子类,提供给系统内存小于1.5G的用户。

  固定了接口,新版本就可以再实现其他数据访问方式,比如通过关系型数据库和Web Service提供数据服务。用关系型数据库的话,为保证效率满足Web应用,就必须用集群或网格了。这种情况一般都考虑Oracle,但涉及到老板的银子……听说Google采用MySQL,很希望知道他们的方案。

  今天跑通了单元测试案例,用的是马(Horse)的蛋白质库,不加任何修饰。Debug版访问所有肽链一遍,2.266秒。以前还真没对付过这种级别的海量数据。

BTW:早上去了趟所里,玩了玩曙光3000,酷。

里程碑、系统分析、提问和倾听

  士气很高,可能因为pFind开发进度顺利吧。算法层的单元测试案例完成后,就可以放心把各个模块留给博士们独立开发了。开始画应用层SDK的业务流程。周四下午拖着别人开会。傻乎乎的外行问题、写写擦擦的白板、乱七八糟的稿纸。周五整天都在修改Visio图。每30分钟拿着修改稿跑去访问(或者说骚扰更合适)一圈,好累,总算把系统业务流程严谨地定义到白纸黑字上了。下周被其他项目拖住的工程师也能过来了,要启动新的里程碑了,嘿嘿。

  交流真是一种技能。很多时候,你以为懂了,达成一致了,其实没有。必须把细节清楚列在纸上,拿给人家看,被认同,这才算数。

  例子太多了。比如我找几个博士聊过很多次后,仍然以为蛋白质片段匹配的误差分析,是各种质谱类型对应不同的统计图;直到在业务流程上写注释,才意识到可能有误解。跑去一问,原来所有质谱都应该提供多种误差分析工具,只不过生物学家针对每种质谱类型有不同侧重。实际上,调查对象已经多次明显表达出这个意思了,但我的耳朵一直在按软件工程师的思路去听。系统分析像是深入陌生的专业领域签合同,应该始终提醒自己,与领域专家的交流要虚心,提问要细致再细致,总结文档要明确再明确。

  BTW:老板原则很“完美”,不仅要求牛paper,还要实现真正可用的商业级系统。纸上漂亮的模型遇到实际数据不一定管用,实验室的博士生真比别处辛苦。

搞定了两个模块

  昨晚十点多回来,酒有些晕,睡不踏实,挣扎起来继续调程序。凌晨两点,两个多肽质谱预处理模块的CppUnit测试案例都正常通过了,哈哈,绿色进度条特别顺眼。

  需求沟通、接口规范文档、体系重构方案、老版本代码review、人力进度协调、双人编程和单元测试……其实到昨天为止,我并不像表现的那么有把握。这两个模块的完成证实了开发方案的可行性,下一步就很有信心了。