Category Archives: 0和1

参加Open Party归来

  今天第一次参加Open Party的活动

  先说八卦。有对新婚夫妇,是去年11月在Open Party认识的,所以回来请大家吃喜糖。我没抢到,哇哇哭。

  这次由ThoughtWorks提供场所。俺的隐秘动机,是想刺探传说中的TW是什么样子:

  没有格子间,没有领导单间,除了会议室,全是开放的公共空间,很敞亮。墙上都是白板,贴满了User Story和CRC卡片,连临街的落地窗户也被用上了。游戏间放的是WII,零食还好……基本符合想象,不错不错。

  言归正传,听了如下几个技术报告:

  1. 詹建飞的《OPhone平台和程序开发》
  2. 刘华的《Mozilla架构平台》
  3. Cat Chen的《JavaScript异步编程模式》
  4. 段练的《GWT技术》
  5. 王家宽的《用wxPython开发理财软件》

  其中段练的《GWT技术》留下深刻印象,尤其是他开发的那个Web版化学分子结构编辑器让人叹服,回来查了查,原来专业是化学,业余爱好是编程;另外,Cat Chen的《JavaScript异步编程模式》功底很深,虽然只听了后半截仍然相当震撼;最近在乱看分布式存储方面的技术,成立涛的《Erlang与CouchDB》其实很感兴趣,可惜由于时间冲突,只听了几句。

  BTW:休假即将结束,要收心干正事了。

Beta技术沙龙:利用SNMP进行服务监控

  昨天参加Beta技术沙龙霍炬银杏搜索利用SNMP作服务监控的系统实现

  架构很简洁清楚,容易理解。上层包装也有不少好玩的,例如直连GTalk,无论管理人员的物理位置在哪里,都能实时监控服务状态,进一步手机短信也不难了。

  报告摘要里,对需求的解释很到位:“运营大规模SAAS,对所有服务的状态进行管理和监控是难点之一……”。这正是我感兴趣的原因。日后pFind提供在线云计算服务,必然要考虑这方面的基础设施。其他听众包括,鲜果有道,还有做安全检测的,看来都是有目的而来。

  (顺便提一下,查了查我BLOG的订阅分布:Google Reader、鲜果、抓虾、豆瓣九点……Google Reader还是占压倒性优势)

  银杏主要针对十几种服务进行监控。我想,也许还能支持更细粒度的监控。例如在大规模集群环境中,监控每个节点上的计算进程,以保证MapReduce形式的大规模云计算服务的可靠性。会后交流时,我就此问了霍炬的想法,他没有明确的同意或反对。

  这是第一次见到霍炬真人版。果然是好工程师。逻辑清晰,思路活跃,解决方案明快有效,没有拖泥带水的废话和掩饰。

  会后又和tinyfoolnzinfo聊天(主要是他们说,俺听)。nzinfo第一次见,大侠居然在自己的iPhone上安装gcc和vi,更过分的是还装git版本管理。这么牛,怪不得有资格做tinyfool的竞争对手。nzinfo演示了几种iPhone上最著名的金融终端,包括布隆伯格(Bloomberg)的,各种分析工具还真挺全面。

  tinyfool刚发了一篇BLOG,谈谈对双人编程、单元测试、重构的理解,说得很到位,推荐。

  奇怪,这帮注重实战的工程师,全都开始踅摸起数学、折腾起matlab。难道是传说中的天下武学殊途同归。

推荐Resys Group

  误打误撞,发现牛人团伙。

  原本打算参加这期Beta技术沙龙,听霍炬讲的报告《大规模软件服务的管理和监控》。结果粗心大意,把时间记错了一天,今天下午就闯到奇遇花园咖啡馆去了。

  也幸亏记错了,才能遇到Resys的牛人们线下聚会,正在讲数据挖掘和推荐系统的算法(collaborative filtering),于是就买了饮料,蹭听了一场。

  讲演者是The Ensemble团队的中国成员,传说中的xlvector大侠。具体内容,当然是他们拿到Netflix Prize比赛leaderboard头名的比赛经验。

  下面开始八卦,给没听过Netflix Prize的火星人科普一下:

  美国DVD在线租赁商Netflix于2006年发起的竞赛,悬赏100万美元,只要提交比其现有Cinematch效果好10%的新算法,就获得巨款。Netflix公开了四十八万多用户对一万七千多部电影的上亿条评分记录,要求算法推测另外三百万条记录。同时,100万美元存入银行,每年5万利息作为年度进步奖,发给当年取得最好效果的参赛者。

  Netflix Prize产生了轰动效应。大概是因为,这让公众亲眼目睹,靠数学和编程是如何挣到真金白银的100万美元的。主流媒体,例如《纽约时报》对此给予了大量报道(2009年7月27日的报道是:Netflix Challenge Ends, but Winner Is in Doubt)。技术领域的超女选秀?你终于明白了。对Netflix来说,得到了性能超群的数据挖掘算法,还做了广告,名利双收。

  回来再说xlvector的讲座,八卦内幕相当精彩:一开始你追我赶;接着合纵连横,世界各地的独立的技术和参赛者逐渐融合,成为团队;最后,居然涉及复杂的商业谈判,大鱼吃小鱼,直到非此即彼,参与两个巨型阵营的团战……

  伴随比赛过程,发表了大量的高水平论文,也申请了不少的算法专利,还有不少好玩的讨论:

  比如有人研究了参加者的性别,发现一开始有很多女性参赛者,而且成绩很不错,但最后两个“超级大国”团队里没女性。研究结论是:女性不会投入两三年时间去做一件根本不可能成功的事;男性相对单细胞一些,杀红眼了就钻进去出不来了。

  参赛者Bill Bame在BLOG写到,他发现团队里都是两种人,一种是数学家,一种是工程师,思维方式行事风格截然不同,但两种人都发挥了至关重要的作用。

  The Ensemble团队最后30天工作中,租用了EC2云计算平台进行模型的训练与融合,每小时0.2$。MapReduce模式比较适合离线推荐算法。

  OK,八卦写完了。很久没遇到这么好玩的东西。推荐Resys Google Group。这篇BLOG中链接和引用,都是我回来刚搜索出来的,未必全面准确,大家继续挖掘吧。另外,明天的Beta技术沙龙,我也很期待,号召大家参加。

  最后赞一下奇遇花园咖啡馆。今天交流到最后,xlvector跑到墙边(整堵墙是一块巨大的黑板),用粉笔演算方程。一帮怪人在下面长吁短叹,其他客人头也不抬,继续喝咖啡上网。

照片来自wentrue的flickr

  BTW:只是咖啡馆附近的西直门地铁,实在让人恼火。感觉自己是实验小白鼠,在八卦阵里撞来撞去,难道就没有专业人士稍微做些优化吗。

pFind并行版定型

  里程碑。pFind并行版代码冻结,按期到站。今天彻底休息了一下,睡了一整天,半夜回魂,上网,来随便敲些文字,放松,没逻辑。(瓶子哥被我折磨得快断气了,所以deadline一完,就逃出北京城,找某人疗伤去了)

  最近一个月,除了并行版的研发工作,忽略了所有其他。活在自己的气场里,感觉非常独特。过山车:没进展时,回家的轻轨就显得特别久,疲惫沮丧,手指尖都懒得动;一旦有突破,又好像成了世界之王。

  接下来,做PPT、写技术报告、论文投稿、还想申请发明专利……停,今天不想这些。

  感谢CCTV、感谢MTV……特别赞一下新人,扛起搜索引擎的日常维护,让我省了不少心。组里工程水平已上轨道。每周定期review SVN提交代码,我可改的地方越来越少。

  提到这个,想起BOSS H以前说:“你的最大本事就是那些code style(编程风格)和design patten(设计模式)吧”。这话对也不对,其实关键在于如何培训和实行,让新人遵守规范,习惯双人编程,学会制定Todo List,懂得倾听,整个团队用统一的思路进行编码和架构。

  反过来,也夸夸自己。pFind Studio有十几万行C++,几十个模块。但进组几个月的新人就可以独立调试细节,重构全局流程。干活的人自然是能力出众,也多少显出一点儿我这架构师的本事,哈。

贝塔技术沙龙:iPhone开发

  参加贝塔技术沙龙,活动位置在西直门奇遇花园,参加的工程师很多,不少牛人,比如《走出软件作坊》的作者阿朱,抓虾的徐易容,sohu论坛的架构师钱宏武等。

  TinyfoolRobin Lu先后讲PPT,由浅到深介绍iPhone开发。Tinyfool上来不废话,敲键盘写demo,实际Run出一个hello world。然后Robin Lu再给出更系统性的介绍,比如常用的设计模式等等。对于我这种不熟悉Apple开发环境的菜鸟来说,学习曲线刚刚好。

  像Tinyfool说的,Object-C语法的确有些怪。但对于接触过多种编程语言,尤其是了解动态语言特征(比如消息映射、委托、依赖注入)的程序员来说,只要把概念对应到具体实现方式,剩下就是Goolge文档、照方抓药了。

  随后的提问讨论也很精彩,而且涉及到技术以外的内容,例如App Store的商业模式等等。有个在Google实习做Android研发的清华学生提了不少好问题,包括iPhone和Android的对比。他每提一个问题,我就暗自点头:“对,我也正想知道。”

  大家的共识是,应用平台的成功取决于能否建立良好的生态体系,让消费者、第三方的开发者都遵守规则,分享收益。当然,一旦领先者找到聚宝盆大赚特赚,而竞争对手却无法从模仿其商业模式中获利,就会有破坏性创新出来搅局。个人觉得Android的开放机制对iPhone的App Store封闭模式有威胁。当年,就是土气但开放的PC战胜了高贵而封闭的MAC。

  96年看比尔盖茨的《未来之路》,预言到2010年,普通消费者就可以用手机从网络上购买游戏和音乐,查询和预订周围好吃的馆子。现在支付宝、点评网、App Store都很普及,一旦3G搬到手机上,Big G的预言就算实现了。只可惜MS并没有在这波竞争中取得优势。

  最后抽奖,我幸运得到了一本《iPhone开发基础教程》,内容的确不错。

基于云计算的蛋白质组学

  又到了写BLOG的Deadline。对我来说写作是种享受。只是之前这段碎碎念太多,BLOG总在码琐事。所以这次Todo List要求必须写技术。

  这个月的Journal of Proteome Research上刚刚发表了一篇论文,利用Amazon Web Services提供的EC2平台进行质谱数据的肽和蛋白质鉴定。这正是俺加入生物信息课题组五年来朝思暮想的目标。科学界对云计算概念接受速度之快令人惊讶,已经看到物理、生化、机器翻译领域的不少研究,都是租用云服务以完成海量计算任务。

  今年7月我们将发布pFind 2.3。速度精度都将有进一步提高,敬请期待。

  虽说要写技术,还是忍不住写点八卦。

  周五带小弟去和美女们KTV。通宵的麦克风争夺战打完,五打(60瓶)啤酒喝下去,得出鉴定结果:计算所的程序员男生实在太腼腆内向,无论是飙歌还是拼酒,都被生化丫头们比下去了,与写代码时的生猛劲头儿形成鲜明对照。

  和职业有关?错!恰恰是俺们唯一的女生不露怯,对方阵营唯一的男士三次敬酒,wyj美女都是干干脆脆吹下去一整瓶,和她开发新版搜索引擎一样气势逼人。

  没有生人,这帮家伙就活跃多了。上周末,请组里未婚人士到家里玩WII。整晚俺都在担心客厅的木地板,也奇怪楼下邻居为何不在临晨3点报警。

重读Google老三篇

  昨晚会议结束得太晚,没赶上末班地铁,只好打车回家,俺的银子呀wuwu~

  最近在读文献。上周过了几篇蛋白基因组学(proteogenomics)的天书,实在抓狂。这周的主题回到软件领域:大规模分布式计算。昨晚是Google老三篇(GFSMapReduceBigTable)的文献讲评,瓶子哥顺便讲了讲Google Cluster,我又带了几句Chubby论文。讨论很热烈,结果就说多了。

  我负责主讲BigTable,这次细读,发现以前读的时候忽略了很多细节。

  比如,BigTable使用bloom filter算法进行元数据cache加速。bloom filter有单边特性(它说不存在的,必然不存在;它说存在的,也许有小概率错误),这的确最适合cache这种场合。

  再如,google的分布式锁服务Chubby,在GFS和BigTable中都起到关键作用。在同步控制方面,GFS和BigTable设计思路几乎一致,都是用Chubby对master节点的元数据条目加锁,但具体数据服务节点(GFS叫chunk seriver,而bigtable叫tablet server)的同步正确性,需要客户端自己来保证。这样设计的目的很明确:尽可能保证全局服务的简洁高效,防止master节点成为瓶颈,这对大规模的分布式场景是非常重要的;当然,副作用就是客户端程序的要求更高。

  BigTable的一个重要应用是Google Analytics。另外进展很快的个性化搜索也用BT来存储用户历史和参数。之前发布的Google App Engine的python存储API,有很明显的BigTable痕迹。

  身边已经开始有人从Amazon和Google租用云计算能力了,新概念被接受的速度超出我的想象。

编译加速、分布式版本管理和IE7漏洞

  pFind代码慢慢变得庞大,每次make clean再make all,等待越来越漫长:喝咖啡、收邮件、伸懒腰、作体操、聊八卦……因此这两天在考虑引入distcc和ccache。

  总踅摸着用python写个make的替代品,今天刚刚接触到scons。不好意思,穿越了。

  一查Google Reader的starred items,发现很早就标过一篇BLOG,解释distcc、ccache和scons如何联用的。

  所以一线体会很重要,没有切身接触到实际问题,对技术方案就不会那么敏感。

  另一个例子:Eclipse CDT的团队负责人Doug Schaefer的BLOG上刚刚发了一篇Time for Distributed Source Control is Now

  好几年前Linus就在谈论内核代码如何利用Git进行分布式版本管理(Google Tech Talk视频)。但我们这里SVN用得还行,相安无事,感觉离那些太空武器还很遥远。然而最近一段时间,团队越来越大,逐渐分成几个方向,出现异地开发(比如到生物学家这里常驻),问题就多起来。

  回头再查,云风的BLOG早把我们面临的问题总结出来了

  若干年前我们淘汰了加锁的协作编码方式,到今天是时候再做一些改变了。或许,分布式的版本控制工具才是未来的发展方向。我想总有一天,CVS/SVN 这类集中式版本控制工具会被淘汰掉的。

  说说我的困扰吧,可能很多开发小组也遇到过。

  1. 我们禁止提交不能编译通过的代码,尽量不提交不能测试通过的代码。结果,对于很复杂的模块,有人几乎一个月都没提交过一次。他总是觉得程序还不太成熟,但几经修改的代码其实从来没有作版本控制。

  2. 有些模块由两个人合作编写,关系非常紧凑。有时候需要在两人之间交换一些代码,为了方便,大家通过代码仓库中转,结果在仓库中留下许多未完成的版本。

  3. 代码被用笔记本带回家,结果在家完成的部分无处可以提交。(为了安全,我们的代码仓库不能从外网访问)

  4. 某人写了一个模块,总是有 bug 没有修改完,而不敢提交。这个时候,另一个人希望协助他找问题,却没有合适的途径 share 那段完成了一半的模块。跑过去 XP 一下么?天哪,为什么我们这里每个人用的编辑器都不一样,还都爱用些特别个性的配色方案呢?

  当然也不是100%同意他的观点。比如第4条,对于我们来说,双人编程和Code Review是很频繁的。

  说到穿越、火星、反应慢,最近还有件事。

  一直患有打补丁强迫症,以前都第一时间升级Windows补丁。可是这次的IE7严重漏洞,直到昨天正在跑实验的机器被Windows Update强制重启后才注意到(微软太霸道,跑了两天的实验又得重新来过)。用惯Ubuntu以后就很少启动Windows,就算启动,一般也用Firefox浏览器。

  搜索了一下,Yahoo上有一篇:Chinese Team Mistakenly Released Unpatched IE7 Exploit。找到文中所提的中国的KnownSec team的BLOG,他们是这么解释的:

  鉴于此漏洞的危险性,作为微软的安全服务提供商,我们已第一时间发布公告,并提交给美国微软相关部门,这里不再公布具体细节。

  KnownSec team于近期捕获利用IE7一个内存越界的漏洞进行攻击的恶意代码。此漏洞于11月在小范围内泄露,于12月9日前后才完全出售流通,有人制出网马生成器,相信会在短期内十分流行。

  由于最初捕获时,在网络上发现了网马及代码帖子,误以为是已修补的漏洞,不是0DAY,便在内部共享粘贴,导致代码散布。这是我们的失误:(

昵称

  又要起名字了,按组里惯例,昵称都源于动画片

  前两天我们用淘汰的老旧电脑攒了个山寨版集群,用于分布式搜索引擎的调试,瓶子哥起名叫Monsters,真吓人。

  争论最激烈的是pFind 2.2内核,有人推荐WALL.E,有人认为它的女朋友EVA更酷,还有人喜欢圆乎乎的功夫熊猫ABAO。投票表决中。

  好像没在BLOG上提过pFind 2.1内核的昵称。hchi哥是2.1的第一贡献者,他给2.1命名叫DORAEMON。

  现在在上海,刚下火车就开始调试代码。中午又跑去吃牛排。一向喜欢坐火车,有规律的铁轨声让人心境平和。瓶子哥说,那是因为没有屏幕和鼠标键盘。年底还有6周,努力把能搞定的事都按时收摊。

电子竞技、周扒皮和工程师性格

  最近开始很严厉地执行todo list,以便把上半年落下的进度追回来,争取年初的愿望不落空。心情好多了,忙碌带来充实,另一方面,又感到自己变得刻薄而急躁。

  今天周末,居然一直睡到12:40才起床。打电话到办公室,旁边组的人说,组里工位上一个人都没有,我也就索性找借口不去加班,放松一天。游戏风云频道正在直播G联赛总决赛,于是看了一整天电子竞技比赛。

  很喜欢游戏风云频道,没有故作深沉的老家伙(年纪太大的,估计也看不懂星际、魔兽和CS吧,哈哈),主持人和嘉宾经常为比赛结果打赌,然后在转播中各为其主;对战术有不同意见,就会吵吵闹闹,恨不得剪刀石头布。别看圈子里都是年轻人,但无论是俱乐部、职业选手、媒体还是赞助商,还都很像样子,整体运作挺规范。

  跑题了,回来再说自己的情绪。翻了翻上周的邮件,口气总是很强硬:目标是什么;每个人负责哪一块;已经完成的milestones;距离deadline还有多久;最悲观情况下,哪个要壮士断腕,哪个要力保……很像周扒皮半夜鸡叫?提醒自己约束暴躁的性格。

  说到情绪和性格,《梦断代码》里提到,美国做过一项IT专业团队的个性特征的研究:“77%的样本偏爱思考后决策,只有23%的样本偏向感性。而普通人群里,这两类人大概相等。41%的受访者是内闭型思考者,比例两倍于普通人群。极端情况下,程序员的行为特征——避免目光接触、难以读懂身体语言、沉迷于偏僻的课题——非常类似 Asperger’s Syndrome(一种轻度自闭症,高智商人群发病率较高)。”

  这是不是意味着,只有自闭的书呆子才适合软件开发呢?

  恰恰相反,我见过的最出色的软件工程师,都特别善于沟通交流,无一例外。查《代码大全》那本厚厚的砖头,有一章专门论述程序员的必要个人性格,除了最后一条以外,几乎都与人际关系有关:Curiosity(求知欲)、Intellectual Honesty(诚实)、Communication and Cooperation(交流与合作)、Creativity and Discipline(创造性和纪律)、Laziness(懒惰)。

  的确,大多数技术人员都比较内向,善于集中精力,不喜欢多说话。恰恰因为这样,就更需要特别注意交流。例如我自己在工作的时候,就是一个典型的话痨,前两天还刚发过邮件提醒新人:“罗嗦一点,多解释一下,总是没坏处”。其实我是内向型性格,多次心理测试结果都是“哲学家”型,也就是前面提到的内闭型思考者。(哈哈,出乎很多人的意料吧)

  澄清一点,心理学所谓内向外向,并不像普通人理解的,话多就是外向。而在于你在什么状态下得到“充电”。内向的人,倾向于在独处时通过沉思和自省,得到平静和自我认同;而外向的人,则通过与别人分享和交流的过程,得到自信和升华。

  人际交流是一种技巧,是可以学习和积累的。其实不少内向的人都善于交际,尽管我们的“能量”源于独处时的“充电”(例如读书、写日记、锻炼、上网等),但也知道如何扮演团队中的润滑剂或领袖,在合适的时机,把能量放射出来。

  要交流,就意味着面临种种压力:语言误会、花费精力、真话带来的麻烦、利益上的冲突、器量上的修炼……但这是团队成员必须承担的责任,是职业精神的一部分。只顾自保懒得交流,是软弱和缺乏热情的表现。

  BTW 1:润滑剂,是除领袖以外,团队里另一种凝聚型的角色。《最后期限》专门提到这种人:独特的亲和力,自然而然地维护团队气氛。

  BTW 2:谢国忠的BLOG里提到了工程师,黑色幽默了一把:“所以这个世道没什么公平可说,反正谁站对了地方谁就钱赚得多。我觉得对世界最有贡献的就是工程师,但工程师赚钱赚的最少,你要为国家做贡献的就选工程师,想为自己赚钱的还是想办法钻进投行做金融去。”