Category Archives: 0和1

想买lehuo域名的朋友,抱歉

  这个月很忙,又收到两封买域名的邮件都没有回,想了想,索性直接发到BLOG上。每个月都会收到询问的邮件和电话,花费不少精力。很多打到手机上的电话还是长途,俺是穷人,肉疼呀

  lehuo.com和lehuo.net的确在我手里,而且lehuo.org和lehuo.com.cn等等一整套都在。我不懂域名投资,注册它们是准备自用的,是俺的joyfire.net的中文翻译拼音。

  和我联系的大多是startup。非常欣赏他们的激情和创意。之前也说过,最近是创业好时机。应该说买家给的价已经很高了,如果单纯为钱,可能就卖掉了。但近期内我的确不打算转让,包括作为投资入股一类的方案,都不会接受。

  只要有想象力,一定能找到更好的域名。真心祝愿朋友们创业成功。

  BTW 1:如果非要拿下,请参考mayi.com和mayi.net的价格,真到这么高我就卖,哈。

  BTW 2:前一条的麦田BLOG的cn域名失效了。自己搜索吧。个人意见是,创业资金很重要,花太高代价仅仅为了买几个域名不值。

怎么学计算机

  有人带着上高中的孩子来问我,怎么学计算机。

  这是很宽泛的话题,简单来说“学计算机”有两种意思,一层是学会“用”计算机;另一个层是学计算机专业技术,例如会开发软件或设计硬件。

  这事对于非专业人士很难一两句话说清楚。推荐老妈在深圳上计算机课时对学生们说的经典语录。

  对于第一种意义的学:“教育局的教材简直是微软产品说明书,毫无意义;拿这些内容来考试,更是荒唐(想想看,如果津巴布韦拿QQ使用方法作为考试内容)。等你们工作了,这些软件早就过时了,关键是学会思维。”

  对于第二种意义的学:“计算机是很笨的机器,要和笨蛋打交道,就必须非常周到,方方面面都考虑清楚。”

  高中生想报考计算机、通讯或自控类的大学专业,家里有台计算机未必有什么正面作用(大多都成了高级游戏机)。报班去学五笔字型,更是浪费金钱和生命(还不如报班学好标准普通话,语音输入软件已经很普通,我们组里的研究生就可以给你写一个)。中学阶段,学好数学和英语两门基础课才是最有效的准备。

  其实对年轻人来说,更重要的问题是确定到底适不适合IT行业,是否真正愿意把它当作终生事业。我见到太多基础和天赋都不错的人,上了几年大学后,甚至得到很令人羡慕的工作职位后,才发现对自己做的事没激情,陷入迷茫和焦虑。

  有些孩子又得说了,我怎么知道自己适合做什么呢。全部精力都用来对付高考了。很少接触社会。

  OK,提供一些未必科学的判断方法。你的父母家庭都从事什么工作?你自己的性格呢?喜欢折腾仪器吗,比如拿着家里的单反数码相机爱不释手,把大小功能都踅摸一遍?组装过,或希望组装半导体收音机吗?对魔方、乐高玩具、围棋、筛子这些游戏着迷吗?愿意对着枯燥的证明题绞尽脑汁一坐就是几个小时,证不出来就睡不着觉吗?学习逻辑和中英文语法规则的时候,是不是很轻松?对线条和空间方位敏感吗?

  如果仅仅为了钱,为了光鲜虚荣,从事一个行业,没有一点本能的兴趣的话,会很苦。

技术报告:pFind研发中的工程问题

  上周领导推荐我参加一线科研骨干的公开报告。其他报告人都是博士,讲的都是高深的学术题目。而我分享的是pFind开发中的工程问题,很浅显。听众反应似乎还不错,大概正是由于简单,大伙都能听得懂吧。

  很多人向我要slides,索性共享在学术主页让大家下载。报告分两部分,前一半是关于计算蛋白质组学的背景介绍,不关心的话,可以直接跳到后面软件工程和架构部分。因为是连夜准备的,排版有些粗糙,有时间我会继续修改完善,不好意思。

《寻羊冒险记》和C++0x

  这两天和瓶子哥进行双人编程,对pFind内核进行新一轮的重构迭代。好久没有经历这么高强度的编程了。今晚10点回来的地铁里,脑袋都木了,发呆,差点儿坐过站。

  今天的todo list里规定必须写blog,所以就打开Firefox,登录上来开始敲字。但说实在的,累,脑袋里没找到特别鲜明的主题,罗列点杂七杂八的流水帐。不好意思:)

  前天到清华参加AKA的linux kernel会议路上,顺便到光合作用买了村上春树的《寻羊冒险记》卡特琳娜·哈克的《空房间》。非常喜欢《寻羊冒险记》,觉得比《挪威的森林》更好玩。

    

  Herb Sutter刚刚在他的BLOG上给出了C++0x的最新进展。像6月Sophia Antipolis会议预计的一样,C++委员会在San Francisco会议上投票通过了草案,正式进入ISO标准公示阶段,点击这里下载C++0x草案文本。另外,Herb Sutter结束了长达10年的C++委员会的主席任期,由P. J. Plauger接任。

软件中的隐喻(Metaphors)

  引子:老妈从深圳带来的《代码大全》,一直没看,不喜欢太厚的书(更喜欢作者早期的《Software Project Survival Guide》小册子,微软开发三部曲还是我大一第一学期花5块钱从地摊上淘来的)。今晚又犯病睡不着,索性听着音乐,找出来翻。的确把软件开发的事情都说完了。看到“隐喻”这一章有所感,上来敲点东西。

    

  隐喻(Metaphors)是XP编程的12个实践里很重要的一个,但是一直不像双人编程(Pair Programming)、重构(Refactoring)和持续集成(Continuous Integration)那么广为人知。

  其实这个概念是软件开发里最常见的现象和思维方式。《代码大全》里这样举例:

  计算机科学领域中有着所有学科中最为丰富多彩的语言。你走进一间安全严密、温度精确控制在20℃的房间,并在里面发现了virus(病毒)、Trojan horse(木马)、worm(蠕虫)、bug(臭虫)、bomb(逻辑炸弹)、crash(崩溃)、flame(口水战)、twisted sex changer(双绞线转换头)、fatal error(致命错误)……在其他领域里,你能遇得到这些吗?

  软件是一种看不见摸不着的抽象产品。因此我们不得不大量借用实体世界里的概念进行类比。例如在软件工程领域,随处可见各种建筑学的隐喻:architecture、scaffolding、construction;另一种常见的隐喻,是把软件项目当作生命体:incremental、iterative、adaptive和evolutionary。

  我们组内其实也在使用自己的隐喻体系。比如用“发车”和“跳”来形容pFind引擎的两种不同的搜索流程。

  其实,区分老手还是菜鸟很重要的标准,就是看他了解多少“行业黑话”。最初我在组内汇报到处写“bug”和“crash”这些词时,BOSS H很紧张、困惑,甚至有些愤怒。后来他就习惯了,明白这是工程开发中令人不快、但不可缺少的主题:某种意义下,编程的主要内容就是在有限成本条件下,尽可能有效地大量试错(胡思乱想:似乎创业也同样)。

  XP之所以强调重视隐喻,就是希望项目内建立统一清晰的概念词汇表。当提到某个词汇,在所有人脑子里都代表同样的逻辑概念。很多青涩的项目经理以为这种统一是理所当然的,他们错了。大量误会都源于鸡同鸭讲。

  对于我们生物信息这样的交叉学科,隐喻更是特别重要。生化学者和程序员简直就像不同的星球上的文明,需要很长时间才能彻底理解对方的意思。一个真实的例子:关于buffer这个词,在程序员世界里是一块预先申请好的内存区域,而对于生化领域来说,这表示做实验的缓冲溶液,我是在前线陪着生物学家杀老鼠做实验,花了三天时间才弄明白他嘴里的buffer不是我心里的buffer。有时不同的词汇又代表相同的意思,例如,生物学家喜欢说“高通量”,经过一段时间以后,我才能确认这就是计算机领域的“高吞吐”的绝对同义词。

  类似的,从事金融软件开发的哥们嘴里充斥着“期货”、“杠杆”、“抵押”、“融资融券”这种神秘密码。

  为了交流和思考,你必须把面对的专业领域里的术语迷宫搞清楚。对于传统行业,这种事也许只需要经历一次。对程序员来说,每个软件项目都是全新的思想历险,所以你要随时准备更新自己的隐喻词典。

  很多生物专业出身的学者学习能力都很强。他们要完成自己的研究,就必须对截然不同的众多领域都有所了解:从培养植物动物微生物,到临床小分子药物代谢,到遗传学和环境学,到化学试剂和各种分子式,到物理和精密机械领域的各种泵、质谱、磁场、超导题的原理,最后到Perl语言写软件处理大量信息……这就导致他们视野很宽,思维方式很全面。最关键的是,人不可能天生就是通才,出色的生物学者大多都善于跨领域交流和学习

  BTW 1:前面BLOG提过,程序员大都很着迷电影Matrix。因为这部电影把软件领域的隐喻反过来又映射到实体世界。电影名字本身就是一个很精彩的隐喻,Matrix在数学领域是“矩阵”的意思,在虚拟现实领域大量应用矩阵运算,比如《精品飞车》里的光影效果;而Matrix的另外一个意思是子宫,暗示电影里所有的人类都被放在那个黏糊糊的囊里养殖起来,以为自己生活在21世纪的地球,其实被接入了一个巨大的在线游戏,终其一生处在一个梦境,而Architect,那个机器,那个高等存在,控制着我们,随时以上帝的形象改变我们的命运,甚至kill掉我们的process(进程)。

  BTW 2:如果一个人开始仅仅守着自己的一亩三分地,不敢尝试未知领域,没勇气让Metaphors和外界进行碰撞的那一天,大概也就是他衰老的开始吧。

标准和政治

  还没搜索到旧金山会议和C++0x草案的消息,看样子是拖延了。索性沉下去挖掘点可写的历史遗迹。

  以前提过,没有ABI标准是C++语言最大缺憾之一。Google一番,发现Pete Becker于2003年提交过有关的N1496号提案。提案建议添加shared关键字,用来申明动态链接库对外共享的变量、函数、类和模板。不过该提案最终未被纳入C++0x标准。

  从技术角度,它不失为一个不错的解决方案。麻烦在于政治原因。“委员会设计”就是这个样子,张雨生的歌里唱:“看你服气不服气,51比49”。 

  说起厂商政治问题,Bjarne Stroustrup有个著名的观点:“通过技术突破来解决政治问题”。也就是说,如果厂商的工业级产品各占山头互不兼容,C++标准委员不打算插进去,搞出个姥姥不疼舅舅不爱的another来。除非它在技术上拥有足够的创新优势,现有解决方案无法比拟。“STL的成功源于技术突破。它可不仅仅是另一个容器库,因此不需要和许多市场上已有的商业容器库(其中几个还很不错)直接竞争。”

  由此就知道C++为何迟迟没有GUI标准了,Bjarne Stroustrup说:

  “我怀疑其政治上的可行性……很多大公司在其专有GUI库上都有重大商业利益。即使标准委员会提供一个替代品,现有GUI库也不会轻易退出市场,厂商的抵制会导致用户忽略新标准。许多ISO标准正是因为无人理会而变成一纸空文,C++标准可不想成为其中之一。”

  老大的意思很明确:同志们就不要盼了。假设哪天C++标准里真加入GUI,一定源于某种革命性的技术突破,能把现有GUI解决方案打得满地找牙。这种救世英雄横空出世,是需要点儿运气的。

近在咫尺

  8月8日近在咫尺。

  旁白:软件行业的惯例,越接近deadline,越像恐怖片情节。《梦断代码》里提到一本叫The Limits of Software的回忆录,记录了美国航空管理局Advanced Automation System项目的悲惨过程。1500名IBM程序员,每天花掉政府百万美元。项目后期,巨大的压力带来严重的心理创伤,“没有人——哪怕作者——可以全身而退”。有人砸烂自己的汽车;有人疯掉;有人自杀;有个项目经理开始吃纸上瘾,项目拖后得越多,他在开会时嘴里的塞的纸就越多。该项目最终因为超出了技术和人力的极限而失败。

  我还好,没吃纸,只是每晚三点钟才能睡着。7月份的Beta测试中,BugFree里共登录了75个Bug,目前还剩12个待修正,4个推迟到下一版;Todo List里还有8件事没做,包括3个技术报告,1个软件著作权申请;hp忙得脚朝天,对donkey和shark进行全面清理。

  压力大,火气就大,总发恶狠狠的邮件:

  最出色的工程师都会主动追求细节和完美,绝不会摆出一副“别来烦我”的死样子,给提意见帮忙完善产品的人施加压力。“不怕神一样的对手,就怕猪一样的队友”。谁让我闻出来,有不肯追求自己产品完美的味道,就滚出团队,别给我拉后腿。  

  8月8日正式发布,世界各地任何崩溃信息或使用疑问,都会转给软件负责人进行客户支持。如果软件本身问题一堆,人机交互界面设计得很垃圾,你就等着处理潮水一样的客户支持邮件吧。

  05年我刚接手pFind工作时,发过一封邮件,重温一下……

  发几张图,到了8月8日,大家就可以到官方站点上注册并申请免费下载最新版本的pFind Studio了。

pScan启动界面,pFind Studio家族系列里最年轻的应用软件,首次公开亮相。

pLabel的主界面,接近两万行代码进行了彻底重构,与老版完全不同了。

把全世界竞争对手的软件打得满地找牙。

关于异常机制和编程style

  首先放张照片,程序员责任重大,除了正常逻辑部分,还必须在异常发生时周到地帮助无辜的用户。

  八卦点题外话,是在Google著名华裔程序员王忻(Niniane Wang)BLOG上看到这张照片的。她刚刚发布了引起轰动的Google Lively。新闻里说Lively是工程师20%时间的业余开发成果。考虑到她的年龄只比我大一个月,实在让人绝望呀。 你去看看linux操作系统内核的历代版本负责人,从Linus本人上大学期间发布0.02开始……2.2版、2.4版、2.6版的总维护人都不到26岁 就掌管内核代码主干版本。像大一还没上完就写出抢占式调度补丁的Robert Love(很多人都说他有可能是下一版2.8内核的代码总维护人)这种,都只能算稍微年轻一点的。到了30岁,程序员的黄金时代就过去了,只好靠留大胡子唬人了(Guido van Rossum进了Google以后,真的留起胡子来了,咣当)。

  回过头来说正经的,相对C,C++最有价值的改进就是exception了。这半年来pFind的重构,一 个水面以下的最大变化,就是把以前return false和GetLastError()风格,用throw和try代替。当然这需要大量的体力活,刚开始遇到不少疑惑。但后来所有人都发现这是偷懒的 好方法。一个例子是,老版代码发现一个bug,异常位置和崩溃位置差很远,就是因为前者的return false链条断掉了:出错的函数上面套了11层调用者,有一层没判断返回值。纯C语言的灵活性和直观性的代价是,程序员必须是铁人,有能力妥善处理一切细节。

  有了完整的exception处理机制,一旦出现崩溃,pFind2.1就立刻把运行现场所有的信息都记录 下来,这样有利于调试,特别是无代码,或BUG重现需要很长时间的情况。这两种情况俺们都要面对:pFind将在网上开放下载,散播到世界各地的生物学实 验室;蛋白质鉴定是计算密集型应用,有时候release版运行一整夜才跑到出问题的地方,指望debug版加断点调试是很低效的。

  至于现场信息的携带,没有复杂的异常类继承体系,仅仅依靠字符串。组里聪明的年轻人设计了一个异常信息格式化的类,可以很方便地在每个堆栈展开catch的地方追加新的现场内容。这样一层一层加上去,形成类似JAVA的异常报表。

  常见的疑问是exception有性能问题。可能不同应用要求不一样。经过实际测试,pFind的性能瓶颈不在这方面。似乎新版GCC编译器对此做了优化。

  说到C和C++的比较,很多人可能要提到云风Linus,以及之前关于C++的大论战。 在很多技术问题上赞同云风的观点,甚至有点崇拜。但一直老老实实用C++,没有追随他叛出山门,回到C语言。原因很简单,C++对这个项目更合 适:pFind是一个有二、三十个模块,几十万行代码,十几个人合作,历时五年的项目;它很看重速度和性能,但优化的大头,都在流程和算法方面,除了最关 键的“热点”以外,其他部分不必也不能牺牲代码的可维护性;而开发人员水平又参差不齐,很多人无法达到用纯C开发大型系统必须的素质要求(像前面提到的 bug,传统C风格异常机制下,出错后需要11个函数依次return false,穿越4个不同作者不同时期的代码,只1处懒惰就抵销了其他所有严谨。俺的团队很难达到这种程度的严丝合缝,也没必要付出这么高的开发成本)。 这就注定了C++是唯一的可选项。一直在关注其他各种语言,比如D语言,但现实来说只有C++符合条件。

  Andrei Alexandrescu对这个问题的看法很中肯: 像Linus这样的牛人,他很清楚自己在干什么,开发操作系统内核,合作者都是天才,所以他就真的不需要C++。云风的deepcold引擎很类似,对性 能,尤其是一小段时间内(例如0.2秒内)的数据吞吐反馈能力有严格要求,网易又有一帮真正的geek组成的技术团队。

  C++最大的陷阱就是程序员——尤其是新手——过分追求奇巧淫技的风气。所以在pFind内大面积推广的都 是最朴实的,甚至有点土气的style。例如,继承只在纯虚类接口一种地方使用(具体说就是工厂方法模式);而功能复用都以内嵌对象来实现,不允许继 承。(整天喊口号:“接口上移,功能外抽”)。对神奇的泛型基本回避,限制写模板,熟练使用STL就行了。尽管Andrei Alexandrescu的《Modern C++ Design》里的内容很酷(软件开发2.0大会还专门买了一本新的,请他本人签名)。但pFind团队没有能力把握这种style。

  C++是一种多style语言,架构师需要做的,就是明智地裁剪符合需要的子集。约束团队抵御诱惑,不拿手头的任务当学习新技术的小白鼠。

  BTW1:Python和C++社区的关系很好,很多老牌C++程序员同时也是Python著名玩家,例如豆瓣的阿北。C++标准委员会那帮人甚至在boost里加上了连通Python的内容,还公开说Python是C++的最佳伴侣。Python和C++差异很大,比如是动态语言,比如“所事情只需要一种方法”的设计哲学,这种不同恰恰造成了互补。

  BTW2:最后推荐Google刚刚公布的C++代码规范。哈欠,睡觉去了。

C++0x能不能在09年发布?

  搞定了pFind里程碑,放松下来踅摸踅摸天下大势。有段时间没跟进C++0x的进展,今天上网搜索了一下,整理出来。

  C++委员会6月份刚刚在法国的Sophia Antipolis举行了会议(WG21)。会议的最大成果是确定了C++0x发布时间,漫长的投票表决过程总算接近结束。今年9月将提交委员会草案,以便公众审阅和反馈,进入ISO程序。Herb Sutter强调,9月的委员会草案就是”feature-complete C++0x“,以后的修改仅仅是bug修正和澄清。希望C++0x的这个“x”是9,而不升到A。

  技术细节上,这次会议有两个最主要的features通过投票:

  首先是传说中的Initializer lists提案(N2672  N2679),以后可以用更直观的方式初始化STL容器了:

     vector<string> v = {“xyzzy”, “plugh”,  “abracadabra” };
     map<string,string> phonebook =
          { { “Bjarne Stroustrup (cell)”, “+1 (212) 555-1212″ },
             { “Tom Petty (home)”, “+1 (858) 555-9734″ },
             { “Amy Winehouse (agent)”, “+44 99 74855424″ } };

  第二项是thread_local( N2659 )。经过近一年来的几次投票,并行机制的内存模型、原子操作和线程包装的多项提案都已经通过投票,这大概是C++0x最重要的变化。

  其实每次都会投票通过几十个features,只不过大多数没引起注意,比如我无意瞅到了一项07年获得通过的提案,是Herb Sutter代表微软提交的空指针关键字nullptr (N2431) ,这就可以用nullptr替换VC++下的NULL宏,免得每次往gcc下移植都得手工加入。

  这次唯一留的尾巴,大名鼎鼎的conceptsN2081),仍在等待“check in”。按照Herb Sutter的说法,这方面争议基本解决。9月份的San Francisc会议只要就此投票,即可扫清最后障碍,发布标准草案。 

  以上信息都依据网上来源:Bjarne Stroustrup的C++0x概述报告slices,Google的Lawrence Crowl对线程模型的报告slices, MS的Herb Sutter的BLOG、CodeGear的Alisdair Meredith的BLOG。他们都是委员会成员。另外我还找到一个旁听会议的Java程序员的BLOG,由于视角不同,难免有不少比较,比如C++委员会与JCP的异同。当然,你也可以参考正式、全面但枯燥的会议记录

发布pFind 2.1 Beta 2

  欢迎大家访问pFind Studio官方站点,包括软件简介、用户手册、演示视频和发表论文。稍后会提供pFind 2.1版的注册和单机版下载。我的RCM论文也在网站上全文公开,欢迎多多引用

  pFind 2.1颇有突破,接下来几天的blog,总结一下这半年的经验。今天先说第一条:建立风险识别和控制机制。

  去年“软件开发2.0”大会,晚上参加胡百师主持的“项目管理”VIP沙龙,现场有不少项目经理和架构师,讨论话题很多。胡百师建议:“除了Todo List和Bug List,项目经理手里应该有一份Risk List。”

  插话一下,那时正是pFind 2.0压力最大,进度拖延,BUG丛生的阶段。偷闲参加“软件开发2.0”大会,跳出来换换脑筋,从技术架构上,从项目管理上,从产品设计思路上,彻底反思了之前的工作。除了本篇BLOG讲的软件工程问题。再举个技术上的例子:听Baidu的前任总工程师的讲座,谈到一个检索加速的案例,他随口说了一句: “大家都能猜到,这是倒排索引的设计出了问题”……回到组里再听ly重构索引的ppt,意识到必要性,马上把这个Feature加入pFind 2.1的Road Map。

  跑题了,回来接着说。4月pFind 2.1启动时,我在Google Doc建立项目手册,专门加上了“风险识别和对策”一章,列出各种想到的风险,按重要性进行排序,然后一一填上预防措施,还有最坏情况下的取舍方案,然后每周跟进。

  可能项目启动那天是黄道吉日,最让人睡不着觉的几条,都没真正造成威胁。进度比预计顺利得多。还有一大堆惊喜。

  俺的成功经历实在不多,尤其是这么完美的比赛过程,所以难免有些迷信。有些运动员总在关键比赛前换上同一双球鞋,俺也决定以后抱着“Risk List大法”不放手了

  我猜我的合作伙伴可不喜欢这样,因为这次开发我可能根本没干正事,就是忙着扮演一个政委、牧师或居委会大妈,不停地骚扰大家:时刻在人家耳朵边上唠叨一些政治正确的废话,比如“复用接口上移,复用功能外抽”;逼着每个人修改变量名和类名,加空格和缩进;像个秃鹫一样在别人工位后面露出头:“嘿……没事……就是……那个……你的代码还没上传到SVN上呢”;每过两三天就发一次邮件,强调里程碑和Bug List;在别人最忙的紧要关头,要求双人编程和code review……

  Joel on software说:“开发人员把不务正业的程序经理拿来当早餐吃掉”。老实说,绝对是因为ly、hchi、lqliu这帮家伙太神奇,折腾出好多变态的成果来(嗯,早就等着拉2.1出去吓人)。我这个所谓“产品经理”其实是蹭饭的角色(更喜欢临阵杀敌)。《最后期限》里说:“你可以不雇我,但一定要考虑一下我的团队,他们真的很棒”,Bingo。