Category Archives: 0和1

条条大路通罗马

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

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

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

加班和躬身入局

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

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

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

搞清楚细节,少用“大词”

  尼采说“上帝死了”,和过去时代的人的最大不同是,我们有很多观点,但信仰很少。所以另辟蹊径的创新点变得容易生存,但谣言和似是而非的误解也开始无孔不入。传统上要求知识分子阶层具有的“独立思考,自我批判”,变成了每个社会个体生存的必须技能。

  项目管理如何分辨消息的真伪是非,刘未鹏的BLOG推荐Scott Berkun的“How to detect bullshit”,值得一读。

  又想到技术面试。人的差别实在太大:有的孩子大学一年级只上了一半,但已经值得你用两个工程师的价格去聘了;有人虽呆过不少外企的研发部,留下不错的第一印象,可实际合作起来让同伴滴汗;大多数人倾向于稍微夸大自己的能力;也有人天性谨慎或老实,真本事不漏在外面。

  圣人说:“听其言,观其行”。掂量所谓编程高手的道行是不是真牛,只要深入最朴素的细节去问就好了:

  • “你以前负责的那个项目听起来利用了Factory Method模式,不错。那我们聊聊虚函数继承的机制。”
  • “读过Linux内核代码,太好了。请用C实现一个字符串的快排算法吧。”
  • “拿过这么多证书,不容易。我们正在开发一个处理百万元素矩阵的动态规划算法,你觉得应该注意什么?”

  没有实战经验的家伙,一般不得不堆些似是而非的“大概念”来掩饰自己的空虚,例如真正实践过几个设计模式的程序员,很少会在描述系统架构时蹦出 “面向对象的编程语言”这种广告词汇(市场部门描述技术的语言,大概就和让俺描述最新一代化妆品和裙子一样,经常血拼的女孩子听了会晕的)。

多核时代

  年初Intel发布了试验性的80核CPU。16核龙芯正在计划投入实用。其实尚在开发中的最新一代龙芯(GodsonT)走得更远。春节前,生物信息组的代码在上面试跑过一次,都把我吓傻了,他们居然还觉得“达不到期望”,还在大改。IBM的千核CPU(Kilocore)也披露了。

  自从C++委员会主席Herb Sutter发表The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software,JAVA神童Rickard Oberg表示赞同后,软件业似乎一瞬间就进入了多核并发时代。从纯技术角度看,近五年最激动人心的创新是什么?不,不是.net或AJAX,而是GFSMapReduce

列车准点到达

  3月份大多数工程任务的最后一个里程碑都定在23日。下午5点开始陆续收到邮件,除了进度报告,还有大家各式各样的感想和致谢。

  这个月,机构调整,生物信息方向的三个课题组被合并,改换门廷影响到每个人;用户反馈和不断讨论激发出很多新想法,陆续添加到Todo List的工作量超过原计划的三分之一;博士们还在为申请科研基金点灯熬油……

  玩得很惊险刺激,比如最艰难的Web新版,好象是天生命运不济似的,从.net运行时安装缺失,到COM组件编译链接失败,到注册表异 常,到MFC DLL调用约定,到STL版本兼容,再到Windows操作系统漏洞……几乎每个有可能出错的地方都一个不落地出了问题。直到昨天,我还发邮件预计无限期拖延,没想到两位英雄奇迹般地击毙了所有BUG,在最后时刻上演胜利大逃亡。

俺和圆周率不得不说的故事

  今天是3月14日,圆周率“Π”的日子。

  最初接触圆周率是小学二年级。那几年似乎流行背诵圆周率。为了显摆记忆力,我一口气背到小数点后二十位:3.14159265358979323846,到现在都时不时拿出来吓人。其实吧,是上课偷看课外书,照着人家写的窍门背下来的:“山顶一寺一壶酒……”

  本科编过一段算圆周率的代码。不记得从哪本数学书上抄来的迭代公式。用rainbow实验室的服务器跑了一整夜,好象是算到四万多位崩 溃的。当时年轻气盛,还跑到学校的BBS上把结果贴出来,邀请高手来打擂台,谁写的程序算得更多,或者同样结果但运行时间更短,我都请客吃饭。只记得 BBS一次无法提交这么长的内容,是分几个帖子发表的。

用Javascript实现《星际争霸》

  12月的《程序员》专题是浏览器端开发,N多AJAX和Flash实战例子。

  有个Thoughtworks的小伙介绍用XP过程开发Javascript程序,例如Pair和TDD,有一段写LOG这种看似low-tech-method是如何“必杀”,很受启发,最近正在为pFind系统的调试头痛。

  印象最深刻的是幻宇开发的这个游戏,居然用Javascript在WEB上实现了一个《星际争霸》。刚看到时吓得跳起来,简直牛得没边了。只可惜不能在Firefox浏览器下正常运行。

XP和项目管理

  越是不了解XP缺少实际TDD体验,甚至是已经脱离一线开发的人,越喜欢说“XP是反软件工程的”、“XP不要设计”、“XP让程序员开心,却是项目经理的噩梦”。引用一篇Robert C. MartinAgile Methods – The Bottom Line,专门论述了XP如何为项目管理提供强有力的支持。

  类似Robert C.Martin这样,敏捷阵营的领袖大多仍在参与软件项目的实际编码,所以XP很贴近软件项目的实际需要,例如设计模式、单元测试等。这两天在对质谱鉴定系统进行残暴的支解,各个模块拆得七零八落,但依赖了CppUnit,还是可以有条不紊地重构,又一次体会到TDD的妙处。上来敲感想。再一搜索,呵呵,原来以前写过类似的内容,几乎是重复了