没想好放哪


2009年3月的一天下午,我在某家饭馆静候各位已知未知朋友来相聚。七点多,进来一位文静白皙的理工男,虽然不认识,但听他打探的口气,我确认他是来这桌吃饭的。打过招呼,才知道是松鼠会的大掌柜姬十三(想起来真荣幸呀),我连忙说“我知道你们我知道你们,德国之声评选十佳中文博客的时候我就知道你们了……”。
一下子,陌生感就卸去了大半,我们就开始像熟人热切地攀谈起来:从我印象深刻的《第一推动》丛书,到科普先驱站点三思科学,再到妙趣横生的博闻网,都成了我们的共同话题;最后我还说起了自己幼年的奇思妙想:既然我们能看到几千万光年外的星球“几千万年前”的样子,那么,距离我们几千万光年外的外星人(如果有的话),是否可以看到地球上的恐龙是为什么灭绝的,用录像带记录下来,再发送回地球(如此一来,几千万年后我们就“可以”看到恐龙究竟是怎么灭绝的)?这个“异想天开”的想法,姬十三丝毫也没嫌弃,反而正经地跟我讨论了一番可能性——这样的“待遇”,对我这种“科学票友”来说,算非常非常难得咯。
从那个晚上开始,我知道,松鼠会的口号“让科学流行起来”不会仅仅是一个口号。所以,前些天知道松鼠会要举办“科学嘉年华”大型科普活动,我就非常有兴趣参加了。

(more…)

beta技术沙龙越办越有意思了,上次错过了阙宏宇的mod_cache(还有关于线程进程的讨论)就很可惜,这次关于Lucene的演讲,是无论如何不应该错过了。

到目前为止,全文检索已经完全不算高技术门槛了,记得以前看过一本书里面写:“今天,任何程序员,都可以很容易地构造一个全文检索应用”。是的,全文检索的基本原理大家都知道差不多了,剩下的只是实践。我见过纯粹自己开发的,具有AS(Advanced Search)、BS(Basic Search)、DI(Digest)等结构,“像模像样”的全文检索架构,不过应用更多的,却是在开源项目上完善、定制而来的,Apache的Lucene就是众多开源全文检索项目中,名气最大、资格最老、应用也最广泛的一个。本期beta技术沙龙,讲的就是大型网站中lucene的应用,主讲人是手机之家团队的唐福林(“手机之家”总是有些东东来共享,比如上次的DAL,这真是不错)。

众所周知,用Lucene构造一个“索引-查询”的应用是非常简单的,搭好环境,参照(修改)示范代码,很容易就可以成功。但是,要构造一个真正大规模、稳定、可靠的应用,就不说这么简单。程序的编写、模块的分布、架构的设计,都有许多费心思的讲究。按照PPT提供的数据,手机之家目前的Lucene应用,采用的是Lucene 2.4.1 + JDK 1.6(64 bit)的组合,运行在8 CPU, 32G内存的机器上,数据量超过3300万条,原始数据文件超过14G,每天需要支持超过35万次的查询,高峰时期QPS超过20。单看这些数据可能并没有大的亮点,但它的重建和更新都是自动化完成,而且两项任务可以同时运行,另一方面,在不影响服务可靠性的前提下,尽可能快地更新数据(如果两者发生冲突,则优先保证可用性,延迟更新),其中的工作量还是非常大的。

演讲的主要内容都PPT里,非常丰富,我就不再赘述了。要补充的是,这份PPT做得非常清楚,需求-目标-进度-设计-上线-测试-上线,整个流程非常清楚,给出的数据同样非常精当,我想,这也反映了手机之家团队的开发规范。

因为对Lucene的使用稍微有些经验,我在这里补充几句,权当狗尾续貂:

  1. 在大规模的应用中,Lucene更适合用于狭义的“搜索”,而不应当负责数据的存储。我们看看Lucene的源代码也可以知道,Document和Field的存储效率是不够好看的。手机之家的团队也发现了这一点,他们的办法是,用Lucene存放索引,用Memcache + Berkeley DB(Java Edition)负责存储。这样有两个好处,一是减小了Lucene的数据规模,提高了程序的效率;另一方面,这套系统也可以提供某些类似SQL的查询功能。实际上,Lucene Project自己似乎也注意到了这个问题,在Store中新增了一个db选项,其实也是利用的Berkeley DB。如果仅仅用Lucene存放索引,而不存放Document,并且合理配置,一台机器可以支持几十G甚至上百G的索引;如果需要用Lucene存放索引,最好在读取时使用FieldSelector,只读取需要的Field,如果使用恰当,性能会有10%左右的提升。
  2. 在大规模应用中,Cache是非常重要的。PPT中也提到,可以在程序提供服务之前,进行几次”预热“搜索,填充Searcher的Cache。据我们(银杏搜索)的经验,也可以在应用程序中,再提供针对Document的Cache,这样对性能有较大的改善(同一个JVM内部的Cache,速度更快一些)。Lucene自己似乎也注意到了这个问题,在2.4版本中提供了Cache,并提供了一个LRU Cache实现。不过据我们测试,在极端情况下,这个Cache可能会突破大小限制,一路膨胀最后吃光内存,甚至从网络上找的许多LRU Cache实现在极端条件下都有可能出现这样的问题(这也是我们百思不得其解的地方:反复检查程序的逻辑都没有问题),最终自己写了一个LRU Cache,并修改多次,目前来看是稳定的。
  3. 在编写Java服务程序的时候,记得设置退出的钩子函数(RunTime.getRunTime.addShutdownHook)是一个非常好的习惯。许多Java程序员都没有这种意识,或者有,也只是写一个finalize函数,结果程序非正常退出时,可能造成某些外部资源的状态不稳定。拿Lucene来说,之前的IndexWriter是默认autoCommit的,这样每添加一条记录,就提交一次,好处是如果中断,则之前添加的记录都是可用的,坏处则是,索引的速度非常低。在新版本中autoCommit默认为False,速度提升明显(我们测试的结果是,提高了大约8倍),但如果中途异常退出,则前功尽弃。如果我们添加了退出的钩子函数,捕获到退出信号则自动调用writer.close()方法,就可以避免这个问题。
  4. 目前的Lucene是兼容JDK 1.4的,它的binary版本也是JDK1.4编译的,如果对性能要求比较高,可以自行下载Lucene Source Code,用更新版本的JDK编译出.jar文件,据我测试,速度大约有30%的提升。
  5. 如果对并发的要求较高,可以考虑采用多IndexSearcher的技术,也就是在一个应用服务中,开启多个IndexReader(可以对同样的索引开启多个),每个IndexReader再生成一个IndexSearcher,将这些Searcher放在一个“池”里头,给搜索请求调用。这样可以大幅度提高并发的性能,代价是在写程序的时候就要考虑到这一点,进行相应的调整。

P.S. 据我观察,国内公司内部的项目,一般取的名字都中规中矩,以’er’结尾的比较多,多是Indexer, Crawler, Layer之类。好像很少有外国那种“天马行空”的奇特名字,譬如Hadoop(这是一个“没来由”的名字)、Lucene(这是个少见的姓)。国内我接触过不多,以前抓虾有个重要的DB叫tudui(“土堆”),目前银杏有个项目叫LaserTank,都是跟实际用途毫不相关的,印象反而深刻。

2009年4月25日,周六。受李笑来老师检出糖尿病的消息影响,我来到新街口的慈铭做体检。虽然有一年多没做体检了,我还是很有些信心的,也一直坚持锻炼,历次检查都是正常,“不可能有问题吧”。
果然,事情不出我的所料,除去那些不能现场出结果的项目,其它都是一次通过,毫无问题。不多长时间,就只剩胸透没做了。
“照完就完事”,我这么想着,走进了检查室,像其他人一样,站好。不料,检查的过程似乎要更长一点;更让人不解的是,年轻的检查员起身,到旁边叫来一位年长的大夫。隔着玻璃,我听不到他们说了什么,只看到他们在屏幕上指指点点,一旁的父亲也凑上去询问,脸色隐约有变。
终于结束了,我忐忑不安地走出来,只见体检单上写着:左上肺叶有不规则片状阴影,建议确证。大夫说:看症状像肺结核,不过我们只管体检,要确诊,请去大医院,或者专业医院。
我连忙对父亲说,没事,没事,还不知道呢,等明天去医院看看再说。心里却收得有些紧:肺结核,就是古代说的“痨病”吧,是不是还得吃“人血馒头”~~。

  • 背景:肺结核是一种常见的疾病,在发展中国家,发病率尤其高。空气中到处都有结核杆菌,在个人免疫力下降,或者过度劳累时,病菌容易趁虚而入。患病之后可能并不会长期咳嗽,低热(尤其是午后或傍晚)、盗汗(睡觉醒来全身湿透)、精力严重下降,也是肺结核病的症状(在我身上,这三点体现的很明显,尤其是精力,我有时候百思不得其解:为什么我早上锻炼了,全天的精神反而更差了,也有朋友抱怨“你总是很累”)。

4月27日,周一。早上来到新街口的北京市结核病防治医院,医生问了问状况,让去拍个片子。看了看,确实有阴影,但还不能确诊,需要进行痰检、皮试(检查血液是否感染),才能确认。血检是当时就能出结果,痰检必须连续三天送样本。

  • 背景:在确诊之前,需要检查血液、痰液里是否存在结核杆菌。血液状态可以通过皮试检查,若发红,则表示已感染。痰液检验结果若呈阳性,则处于开放期(也就是可能传染他人),应隔离治疗。痰检必须是每天清晨漱口之后马上采样送检,涂片结果当时可出,培养的结果则要两个月之后才可见到。另外,在采样时,一定注意牙龈不要出血,否则容易被认定为血痰,影响结果。

4月30日,周四。最后一次送痰样本。医生检查了皮试结果,确认已经感染结核杆菌。因为五一劳动节医院休息,痰检结果要等五一之后才能知道。

5月6日,周三。再次去医院,挂了号,医生说,你这个情况真奇怪,看片子是有,皮试也是阳性,但怎么痰检都是阴性(也就是不传染他人),再去做血液抗体检查,看看是否有抗体。等了半个小时,结果出来了,没有抗体。“这个情况确实比较少见,你等等吧,我们研究研究,你过一周再来好了。”

5月13日,周三。去医院取了会诊结果,医生说,已经开会研究过了,判断还是感染了肺结核,就是不排菌,不传染,开始服药治疗吧。于是登记了相关信息,签了一份“同意治疗”的文件,领了药。医生嘱咐说:一定要注意休息,晚上不能睡太晚(我习惯12点睡觉),11点之前,必须睡觉。

  • 背景:按照政府规定,对于肺结核病人,采取免费治疗政策。据我所知,“免费”的范围包括:在治疗周期内(一般为半年到九个月),免费提供抗结核病药物,两次免费胸片(分别在治疗的第二个月和第六个月),而且,这项政策不受户口所在地的影响,在当地发现,就可以在当地享受免费待遇。
    一般来说,治疗结核病常用的药物有:利福平、异烟肼、乙胺丁醇、吡嗪酰胺和链霉素。这五种药物都属于抗生素,其中的每一种都可以杀死几乎所有细菌,但因为患者体内可能有大量细菌,单独用药总可能要留下死角(产生抗药性之后情况会非常麻烦),所以一般采取混合使用的办法,并至少治疗六个月,这样可以保证不复发。
    利福平、异烟肼和吡嗪酰胺,这三种药可能导致恶心和呕吐,并对肝功能有影响,作为辅助,可以服用保肝药(西药有肌苷片,辅助治疗肝炎的,便宜而且效果好,如果想吃中成药,一般服用护肝片,注意,保肝药不在免费范围之内),外加维生素B和维生素C。另外,服用利福平之后,汗液、尿液等可能呈橘红色,并有特殊气味,这是正常反应,不必惊慌。
    乙胺丁醇一般在治疗初期大剂量服用(剂量是其它药物的两倍),效果明显,但两个月后应减少,因为它会影响视力。链霉素是最先发现的能够治疗结核的药物,一般在结核病晚期注射使用,它会影响听力和人体平衡。

6月11日,周四。到现在为止,已经治疗了一个月了。按照规定,必须检查肝功能,并查痰。因为来了才知道要查肝功能,早上又吃了饭,只能下周二再来。医生并且嘱咐:查痰前三天,必须停药。
回想起来,治疗第一个月的反应真是很大,视力、精力都受到很大影响。眼睛特别容易疲劳,人也特别容易累——本身患病精神就不好,吃药以后更加厉害了,许多时候在公司就呼呼大睡起来,而且有好几天,我下班的时候感觉人要虚脱了,都不知道自己怎么骑车回去的(我一直觉得,在北京,除非下雨雪,否则上下班开车不如骑车),手上的许多工作更是搁置下来,包括年初制定的写书计划,答应帮派朋友做的事情,等等,外出活动更是难得了(只有一个周末去国图看了书,而且只看了半天左右)。

6月16日,周二。去医院查肝功能,并送了查痰样本。上班的时候,有个电话没接到,看号码,是医院打来的,打回去,因为是总机,只得作罢。

6月17日,周三。再次去医院,被告知,查痰样本仍然是阴性,只是转氨酶水平高了一些,超过了正常限度,暂时不用中断治疗,过两周再来查。

  • 背景:在治疗初期,因为服用抗生素的剂量比较大,副作用明显,肝功能的某些指标可能出现异常,这有可能是正常反应,不必紧张,应当判明原因之后再做决定。

7月2日,周四。去医院查血常规、肝功能。血常规的结果一切正常,肝功能显示转氨酶水平已经降下来了,但还是超过正常水平一点点,负责通知的医生说:你改天再来医院找大夫看看吧,到底要怎么办。

7月7日,周二(读者可能注意到了,我一般在周二或者周四去医院,因为该院只有周二和周四才能做血液检查,为了免除多跑一趟的可能,我尽量选择这两天去)。我又一次来到医院,医生说,转氨酶水平已经降下来了,目前稍微高一点,不是问题。从开始治疗到现在,已经两个月了,需要拍片比较(这一次是免费的)。把两张X光片放在一起比较,可以看出病灶处的阴影已经减少了很多,效果比较明显。“从现在的状况看,可以停用乙胺丁醇和吡嗪酰胺了,你只需要坚持服用异烟肼和利福平,坚持四个月,应该就可以痊愈了。”
这真是一个好消息!

总结这几个月的经历,有几条经验:

  1. 定期体检是一个好的习惯。有人觉得自己“身体好”,也有人怕检出问题心慌,但是,这都不应该成为拒绝体检的理由。许多时候,细密客观的医学指标,比笼统的生理感觉可靠得多。
  2. 多了解一些疾病的早期症状是非常有利的。李笑来老师曾说,如果他明白自己的许多反应是糖尿病的“征兆”,就会更早地发现问题所在。我自己的情况也是,虽然我发现的时候不算晚,但如果知道盗汗、低热和精力下降可能是肺结核的反应,我也会更早地开始治疗。这方面,我想到的一个好办法是阅读医学手册,看过一遍,就能大致知道什么病有什么症状。推荐默沙东制药《默克家庭诊疗手册》《默克诊疗手册》,有纸版书,默沙东中国网站还可心地提供了中文版在线阅读和查询
  3. 治病的道理,同其它许多事情一样。如今医学已经非常昌明了,对许多疾病都有可靠的疗法,但这并不是说患者就可以高枕无忧:一方面要充分了解、摆正心态,既不能恐慌,也不能无视;另一方面,也需要遵照医嘱,配合治疗,定时定量服药。有句老话说:“持之以恒,万事必成”。治病也是这样。
  4. 结核病治疗期间,应当尽量保证营养(肉类、蛋类、蔬菜类),并注意休息。照中医的说法,必须“静养”,而且身边人确实有“静养”之后迅速康复的例子,但照我的经验,减少劳作,按时作息,也可以保证疗效。
  5. 生病期间,心态难免会有变化,这时候,亲人和朋友的支持是很重要的;如果自己生病了,应当感激他们的每一点支持和关爱,如果亲人或朋友生病了,不妨多尽一份力量去关爱他们吧。

出版两年之后,《精通正则表达式》马上要第四次重印了,这个消息很是让我兴奋。

我读大学的时候,有幸接触到侯捷老师的许多文章,尤其是他谈关于选择技术书籍的言论,感觉受益匪浅——正是从此,我深刻认识到,“学习”的宾语不应该是“教材”,而是“知识”。认识到这一点,就豁然开朗了;当然,也无比真切地知道了好的书籍是多么重要。

另一方面,我也深信,总的来说,知识的价值是在传播中实现的。我经历过“有了新的收获自己保密,一人独享”,也经历过众人把自己的心得拿出来分享、彼此协作的环境,两厢对比,后者提供的满足感远远超越前者。因此,有更多的人迅速学会“卑之无甚高论”的正则表达式,不需要重走我自己当初学习的弯路,对我来说,也是一种不小的满足(相比之下,帮人写各种表达式所得到的满足,实在是“很小很小”)。

在这里还要感谢博文视点的编辑许莹,她细心地把目前勘误列表列出的所有错误都做了订正。因为《精通》一书中存在的错误,始终是我的一块心病。

另外,要兑现我年初的计划,今年要写一本关于正则表达式的书,正好在这里征集大家的意见:你们是期望它更加“下里巴人”,包括Word, EditPlus等等常用软件的应用例子,以应付更广泛的工作呢;还是希望更加“阳春白雪”,与狭义的“IT行业”(也就是开发)靠的更近呢? 或者有什么别的想法,还请不吝赐教。

虽然医生嘱咐要静养,可谁让“小姬看片会”那么好玩呢?周六下午两点钟,我顶着大太阳来到微软亚洲研究院地下一层的会议厅,加入了第9期小姬看片会。

本次看片会的主题是“人工智能如何改变世界”,选的影片是BBC的VISIONS OF THE FUTURE。这样“科技含量高”(用松鼠的行话说,就是“高级”),又比较偏IT的主题,放在这里举办(尤其还有免费饮料提供),真是再合适也没有了。
参加的人很多,看来大家热情都比较高,我首先找了个僻静地方“潜伏”下来,过会儿居然有人来打招呼,一看居然是刘未鹏,不久又遇到图灵的刘江老师。寒暄一阵,眼看影片要开始了,我提议搬三把椅子坐到中间的过道里,这样比较靠前,大家一致同意,于是搬了三把椅子,在过道里前后排成一列,影片正好开始。

影片分好几个方面,介绍了广义上的“人工智能”:模拟人类行为、虚拟现实、机器与生物的结合等等。关于狭义的“人工智能”,也就是与“智慧”相关的内容,并没有占太多的比重。我觉得,作为科普影片,这样的安排,是没有错的。
影片结束之后,照例是嘉宾与观众的互动环节,这次的嘉宾都很“高级”,几乎都是IT专业人士,即便有研究科幻非IT人士,来头也相当大。难能可贵的是,他们回答起问题来,丝毫没有普通人想象中的“死板”,而是妙趣横生,许多时候台上台下笑成一片,这正好应了松鼠会的口号:让科学变得有趣。另一方面,它也说明,活动办得非常成功。

我不是研究人工智能的,只是以前稍微看过一点点资料,参加完这次活动,也有两点想法,可惜小姬没给我当场提问的机会(观众实在是太热情了),写在自己blog上吧。
关于“人工智能”,我想大概可以分为好几个方面,之一就是“仿真”(也就是模拟生物体的机能),在片中我们可以看到,现在已经有机器人可以惟妙惟肖地模仿人类的许多行为,譬如会走路的机器人Asimo;换句话说,神秘而简单的生物行为,可以通过物理模型、数学公式来分解,加以实现。人类“潜意识”里的某些“感性”动作,譬如“向前走五步”,可以转化为一系列精妙的指令,以另一种方式来“理性”实现。当然,这个方面也存在困难,譬如王启宁博士所说,用电气元件模拟生物行为,总是存在若干困难,因而有时候,“电气元件–生物”混合的方式,反而效率更高。这一点在影片中也有提及,研究人员记录了小白鼠脑内的海马区(与短期记忆相关的区域)在不同情况下的电流脉冲,再照这些规则制造出芯片,植入小白鼠体内,据称“反应速度提高了40%左右”。我对这个例子很有兴趣,可惜,它在影片中只是一带而过。
另一个方面,也是大家非常感兴趣的方面,就是“机器能否具有智慧”,或者说“机器能否像人一样思维”。这个问题,关于这个问题,前面有过著名的图灵检验,后来塞尔教授又提出过“中文屋子”问题,于是产生了“强人工智能/弱人工智能”的分野。按照程序的逻辑,我们关心的是“接口”,而不是“实现”。也就是说,不管我们面对的“其实”是机器,还是人,只要我们无法做出区分,就可以认定,对方“就是”人,虽然就其“本质”上来说仍然是机器。我之所以对那个小白鼠的例子感兴趣,原因也在这里:如果我们不去关心这些脉冲所“承载”的意义,而只是在“黑屋子”外,模拟我们观察到的一切,能产生完全相同的结果,那么或许可以说,电脑模拟的这些信号,本身也“承载”了同样的意义?
关于这个问题,现场的毛老师也提到,关于“什么是人(智慧)”,我们目前可能很难给出一个确定的定义,而只能通过多个特征加以描述和归纳,如果机器实现了这些特征,我们仍然“愿意”觉得,这还是与人有区别的,或者说,大家心中,其实多少还有一点对“人类本质”的偏执。在我看来,这有点类似波普尔所说的“本质论”和“标签论”的关系,通过“贴标签”而不是“追求本质”的方式(譬如把某种现象定义为“重力”而不是研究“重力的本质是什么”),科学已经取得了长足的进展,未来有一天,如果我们彻底无法区分面对的是人还是机器,我们是认定“这就是人”,还是心智紊乱,或者苦心积虑地找到另一种“定义”,把对方排除出“人”的范畴?这是个有意思的问题。
另说一点,在看片的时候,我忽然想到象棋与围棋,机器“深蓝”已经可以在国际象棋上打败人类世界冠军,但是对于围棋,目前人工智能却束手无策,最好的围棋程序,也敌不过一般的围棋爱好者。大家认为,主要原因是围棋的可能性太多,决策树太过复杂,超过了目前计算机的计算能力。如果人类的大脑能够处理这样两类计算量迥然不同的任务,这到底说明,我们理解棋类游戏的算法思路有问题(也就是说,大脑的运算能力是一定的,只是我们还没找到围棋的高效算法),还是人类大脑的运算(思维)能力,其实是不能以单一维度衡量的(从某个维度上来说,在解决围棋的问题上,大脑可以展现出远远高于象棋的计算能力)?

好了,闲话这么多,就此打住。最后给松鼠会提两点意见:
1.我看片的时候,听讲解的同时看了看字幕,发现字幕有一些翻译错误,所幸不是很严重。因为字幕是合成在影片一起的,所以,这样的问题也不能怪罪松鼠会。不过以后准备材料时,多注意一些这样的细节(如果同一部片子有多个字幕,不妨选择质量最好的那个版本),另外互动环节如果出现问题应该当时纠正(比如有人说“吃转基因食品,我们的基因就会随之变化”,应当有人马上澄清),可能更好点。
2.如果能够在影片结束后,做一些入门性的背景介绍(譬如这一次的,可以介绍图灵检验,中文屋,图灵完备性等概念),这样可以真正“以科普为中心”,而不会“以影片为中心”,对主题起到辅助和补充的作用(而不限于影片所介绍的知识),在专业的嘉宾和热情的观众之间夯实基础的沟通桥梁,效果可能更好。

本期beta技术沙龙的主题是“手机之家新系统介绍及架构分享 ”。手机之家是老高(高春辉)一手创办的网站,在我的印象里,上一次记得高春晖还是他的“高春辉的个人主页”,之后,好像就一直在折腾手机之家。现在的手机之家,每天PV超过700万,作为一个手机专业网站,相当了得(从我看到的数据,远远超过友人网)。

因为堵车的缘故,我赶到活动现场,演讲已经过去了大半,只抓住个尾巴。不过,手机之家有7年的发展经验,浓缩到这小小的讲座,即便只窥到一鳞半爪,也是很有启发的。

印象比较深刻的一点是Cache的结构。通常,Cache都被“扁平化”为单层的key-value对,这样的好处是,Cache的用户都可以方便地使用,没有太多的限制;而坏处在于,数据的结构被完全拆散了,同一个对象可能会按照不同的key来存储,而且各个对象之间的关联完全不存在了。
对这个问题,手机之家的解决办法是,在Cache和应用程序之间增加一个管理层,将程序员与Cache隔离开来,程序员可以不关心Cache的机制,只需要按照namespace(也就是划分层级的规范)来开发就可以。这个管理层,可以实现对Cache中对象的批量操作,也可以在某个对象发生变化之后,更新相关联的对象(直接更新父节点)。
这种办法的效果不错,而且演讲结束之后,还有朋友专门提出关于namespace的问题,看来,大家都觉得这思路很巧妙。

另一点印象就是老高他们重点介绍的DAL,也就是Data Access Layer,它把存储和缓存整个装到一起,与业务逻辑层完全隔离——业务逻辑单元完全只需要按照DAL设定的“增、删、改、查”四个接口操作数据就可以了。虽然普通的DBMS(譬如最常见的MySQL)也提供了这四种操作的接口,但相比DAL,一方面缺乏高效的缓存管理,另一方面,在大负载量、大容量下应用,还需要做许多工作;而有了DAL,前端程序不但不需要关心表的设计和结构,甚至连表的切分都不需要关心,相当省心。目前的DAL可以应付手机之家的现状,但PPT中也介绍了DAL 2.0的若干构想,包括提供类似Lucene(也就是全文检索)的查询功能,以及拆分核心功能、兼容插件的架构。
看得出来,DAL好像要从一个为手机之家打造的模块,变成“通吃(兼容)各家网站”的工具,在过去,有手机之家的经验做积累,对于未来的走向,也有明确的规划。我觉得,这是一条有风险、也有前途的路:一方面,对于通用组件的开发,我时常感到头痛,也许是经验不够的缘故,事先定义好的接口,往往(必然)被新冒出的需求所困扰,或者修改接口,或者眼睁睁把新需求踢出自己的“一亩三分地”,承认自己干不了;另一方面,之前固然有LiveJournal造出memcached的例子,但这样的几率实在是不高,况且,国内开源软件的氛围也与国外大不相同。
不过,无论如何,我都很佩服老高的这种“野心”:敢想才能敢干,而且,如果DAL真的能成功,成为“现成”的解决方案,就能省下大量的资源,投入到更有意义更有价值的地方,这绝对是一件功德无量的事情。

有兴趣的朋友,可以参考活动的PPT :)

手机之家的架构分享
beta沙龙-手机之家架构的发展和变化
与”手机之家新系统介绍及架构分享”有关

P.S.手机之家还在招聘 PHP/Java 人手,有意者给老高发邮件: gaochunhui (AT) gmail.com

接连完结了好几桩心愿。

大约是从大学开始,就没用过钢笔了,一直用的签字笔,圆珠笔。然而,对于钢笔,我总有种独特的感情,我现在还清楚记得,我的第一支钢笔,是小学三年级的时候,父母带我去新华书店,花三块钱买的英雄钢笔。
去年,我忽然心血来潮想起用钢笔,找来找去却只有派克笔,派克笔的笔尖太粗,墨水出的多,实在不合适写中文;SOGO的地下超市倒是有英雄钢笔,可惜都是礼品包装,太隆重了,而我只是希望能找到一支满意的、普通的英雄钢笔。
过年在家,终于找到一家专卖英雄钢笔的小店,挑了半天(英雄的质量控制,实在是…),终于找了支满意的所谓“超滑特细笔”。还买了一瓶“英雄203”纯蓝墨水,这么多年了,只有外包装盒变了,墨水瓶仍然是原来的样子,小时候,我就用空墨水瓶做煤油灯,停电了,靠它来看书,写作业。

英雄钢笔,英雄墨水

把给爷爷写的信寄出了。从上一封信,到这一封信,不知距离了多少年。
虽然会时常给家里人打电话,但每次回家,爷爷总是说,希望能写信回去。我念大学的时候,电脑还不如今天这样普及,赶上了通信往来的尾巴,给同学写信之余,也会“顺手”给爷爷写信。后来电脑逐渐普及,就不再去邮局寄信,也不习惯填满长长的信纸了。
但爷爷仍然是希望能写信,每次离家,他都会叮嘱“有空还是写封信回来”。而我总是推说忙,忙,去邮局太麻烦。于是渐渐的,他只说“要注意安全,保重身体”。但我总能体会到他的对信件的期望,会想到鲁迅先生的话:“我知道这是失明的母亲的眷眷的心”;我又无比真切地回忆起他曾讲过自己不吃豆豉,是因为小时候穷,为了念书,吃不起菜,只有吃豆豉,也想到他讲过,在日据时期,伏身在稻田里躲过日本兵的经历,更觉得他的期望沉甸甸的,无奈总是懒,总是没有行动。
前段时间读到朱光潜先生的“三此原则”:此身能做的,绝不推给他人;此地能做的,绝不带到外地;此时能做的,绝不拖到将来。又想起我写过的“一代人,一代人,生命的重叠,其实很短暂”,却把写信、寄信的事情一再拖延,实在是无比惭愧。
不过,终于把信寄出去了,给他汇报的时候,我能感觉到话筒那端的欣喜。

最后一样说来有些稀奇。
前些日子去东四的“潇湘味道”吃饭,正好遇到老板曹哥。他说起之前不久,曾有个女孩来吃饭。进门就问“老板,你是株洲的呀?”确认之后,她自己介绍自己是湘潭的。在“不知道吃什么好”的时候,正好从订阅的博客上看到,东四四条的潇湘味道有糖油粑粑,特意赶来尝尝。曹哥于是赠送一盘糖油粑粑,女孩吃的很高兴,连声说以后还要多来。
听完这个故事,我大笑说,那女孩讲的博客,肯定就是我的那篇博客了,我前些日子刚好写了篇,说东四四条的潇湘味道有糖油粑粑,而且老板是株洲的
曹哥很高兴,他之前是宾馆的大厨,做菜功夫了得,教了我好几招:怎么看注水肉,怎么做木耳,怎么煎糖油粑粑……条条都是经验之谈,大饱耳福,受用无穷。
我又提起,长久以来,我总好奇,饭馆的厨房里,都有怎样的秘密,洗菜、做菜、排菜,对我来说,都是特别有意思的事情,只是苦于没有机会。曹哥大方应允我有空的时候,可以去厨房帮忙,算是了却了我的一桩心愿。
告别的时候,他神秘地说:等你来了,我再教你几个私房菜,以后朋友一起的时候,你可以露一手咯。

糖油粑粑,馋呀

兑现年初的话,把技术blog开了。

现在只有一篇,名字也没想好,暂定“Tech, Tech”;不过,凡事总有个开始,对吧。

Tech, Tech

欢迎访问&订阅

//bow

  1. 保证《技术领导之路》的质量。这本书,如果不出意外,应该是年中出版。每次看到《精通正则表达式》长长的勘误列表,收到热心读者的来信,都非常惭愧。《技术领导之路》会认真审校,尽最大可能减少错误。
  2. 重新开始写技术Blog。这一两年都没有认真写技术Blog,前天上网一点资料,不料中文英文大都不对,最后自己翻手册才搞定。目前网络的技术文章,翻译&转载的很多,而翻译&转载时,往往忽略了原文的图片,也弄乱了原文的数据格式,对普通文章来说,这可能不是问题,但对技术文章来说是很大的问题。我们写(或者翻译、转载)技术blog,有责任保证每一点都亲自测试过,否则容易导致“知识的退化”,给读者帮倒忙。
  3. 生活要更规律一些。随意性太强往往会浪费大量的时间、精力,这些年来我努力让自己的生活规律一点、再规律一点,虽然做的还很不够,但已经颇有收益。就像汽车匀速行驶时最省油一样,规律能够让我们的生活保持良好的节奏,提高效率。一个人的时间是有限的,效率提高了,才能做更多的事情,退一万步说,至少能获得更丰富的生活体验。
  4. 多看些书。查了去年在国图的借阅记录,只有不到30本,加上买的、从别处借的,零零总总也不超过50本,远没有达到自己每周1-2本书的预期。技术书看的更少,自己买了寥寥几本,倒是博文视点的赠书占了大头,想起来都非常惭愧。对知识的趣味和渴求,需要由不懈的阅读来支撑,否则很难维持。
  5. 准备动手写关于正则表达式的书。一方面是愧对博文视点的周老师一番好意,几次邀请;另一方面,我也希望能为《精通正则表达式》接上地气,真正让更多的朋友用好正则表达式,节省大家的时间。初步打算是,先在blog上发布一些想法、例子、文章,根据大家的反馈充实。这几年来,我欣喜地看到,许多专业书籍和文章也具有了真正的趣味,能真正做到深入浅出,让读者体会知识的妙趣,这很了不起。亚里士多德讲“人具有从知识中获得愉悦的本能”,我是深信不疑的。努力尝试写这本书,希望它能真正切合大家的需求,又有趣味,也需要各位读者理解并支持(欢迎留言,也欢迎致信yusheng.regex (AT) gmail.com)。

我喜欢的专栏作家连岳,曾经写过一篇《小树慢慢长大》,最后一段我印象尤其深刻:

像蔡明亮一样种一棵树吧,至少,也得经常看看一棵树,看看它是怎么长大的,开始像马克·吐温一样慢慢成长,不要停下来。

« Previous PageNext Page »