前几天见到了神交很多年的小纯纯同学(Hesey Wang,阿里技术专家)。2014年小纯纯同学写过文章谈自己对工作的态度,凑巧我当时也写了篇文章回忆自己和正则表达式的缘分,大家还互相引用了。最近有不少同学对工作比较迷惘,问我对刚工作的人有什么建议,索性把这篇文章贴出来吧。


我已经很久不写正则表达式了,甚至都有些生疏,但还是有朋友把“正则表达式”和我联系在一起,这真让人惭愧。估计是Jeffrey Fridel的《精通正则表达式》写得太好,身为译者的我也沾了不少光,收获不少虚名。为撇去浮名,有必要专门写写我和正则表达式的故事。

我和正则表达式的缘份始于我的第一份工作。那时我刚刚离开学校,说起来很好笑,我在学校里竟然没写过什么真正能用的程序,写的都是数据结构、数值分析的那些“裸”程序,此外就是把离散数学的习题集反复做了好几遍。在普遍需要工作经验的求职市场上,找工作当然不顺利,尤其我不是北京的高校毕业,在北京找工作更加困难。好不容易找到一家公司愿意收留我,周四上午面试、下午复试、周五就签合同,通知“下周一来上班”了。

我清楚地记得,上班的第一天,为了不让其他人看穿自己其实没有项目经验,我特意带了那本厚厚的影印版《the Java Programming Language》,一来给自己壮胆,二来也抱抱佛脚,因为之前在学校写的都是C++程序,Java确实不熟悉。而且第一天上午确实没太多事情干,这本书救了我的命。

好日子在下午就到了头,项目经理给我们做培训。我满心欢喜地参加培训,希望通过培训来“软着陆”时,等来的却是高强度的信息轰炸:一小时内讲完了JBuilder、JUnit、Ant三样东西,我完全没有接触过,但公司要求“明天就开始使用”。

读书时虽然不排斥学习新的知识,毕竟习惯“循序渐进”,这种“培训”闻所未闻,结束之后只觉得大脑一片混沌。于是我在QQ向同学吐槽说“公司这么不讲道理,纯粹血汗工厂”,答复却是:“赚翻了,赶紧学,我们想用还不让用呢”。好吧,当时被“堵”的感觉特别糟糕,但转念一想,这么说也有道理,所以我拼命忍住反感,硬着头皮学习。

到了周三,我终于可以稍微熟练地掌握周一培训的三样东西时,想稍微可以喘口气之后,项目经理又扔来实际任务了:写爬虫程序从页面上抓取需要的信息。结果我又紧绷起来,虽然之前也学过HTML,也做过网页,但都是在浏览器里看看就完事,从没想过“反过来”的事情,对于“从HTML代码里拿到需要的信息”这回事,我毫无概念。

不过既然安排了任务,当然不能不敢说不会做,因为之前曾有一起进来的研究生同事提意见说“不会做”被教训了——“这是什么理由,不会赶紧学”,所以我还是一口应承下来,虽然完全没有头绪。

这样漫无头绪地干熬了两天,到周四快下班的时候,项目经理问我“快做好了吗?”,我只能硬着头皮撒谎说“快了,还差一点”,他说“好,你多用Google吧,查查正则表达式的资料”。

所以,“(遇到问题)多用Google”和“正则表达式”成了我当天听到的最有信息含量的两点。我从下午6点开始搜索正则表达式,弄懂基本的例子已经是9点多了,这时候我已经可以确认,沿着正则表达式这条路走下去可以完成任务,所以我决定熬夜把程序调出来。结果周四晚上熬了一夜,但那个周五下午的阳光特别明亮。

这就是我和正则表达式结缘的开始。

后来,因为要抓的东西越来越多,我用得也越来越熟,这反过来又提升了我的兴趣,所以决定花点时间专门学一学。当时网络上的资料还没有今天这么多,所以学习很多时候还得靠专门的书籍,找好书的有效办法就是上亚马逊搜索看书评(当时亚马逊还没有中文站),评价最高的书一般都不错,同时还得保证这本书有电子版,所以我选了那本Mastering Regular Expression。

看开头几章还算容易,能和自己的工作结合起来,后来就越来越深入缥缈了,但我舍不得停下来,索性把atomic grouping, lookaround, anchor等等功能都囫囵吞枣看完了。或许是当时年轻的缘故,所以即便用不上,看过之后仍然有比较深刻的印象,觉得正则表达式的功能着实强大,并时常憧憬以后可以用上这些功能。

过了一年多,通过很偶然的机会知道武汉博文视点的周筠老师正在找人翻译Mastering Regular Expresson这本书(后来才知道,是当时《程序员》杂志的主编孟岩推荐引进的这本书)。既然读过这本书,对这本书也很有些感情,我便报名参加了试译。认真而惶恐地递交自己的试译稿之后,焦急地等了两个礼拜,博文视点的编辑问我“你能不能独自翻译这本书?”,我开心地一口应承下来(又是后来才知道,本来是计划找多名译者合力翻译的),这才有后来《精通正则表达式》简体中文版的翻译出版。

现在想起来,自己但是能获得这个机会,有相当大的偶然成分。许多人说,“人生就是选择”,但我不这么认为,这个世界是充满了偶然的,我们都离不开偶然。

通读《精通正则表达式》是偶然。因为当时我特别想多学有用的知识,但又没有人告诉我应当学什么,与其瞻前顾后怕耽误自己的时间,不如就把手边的东西扎实学好,所以就啃下了这本500页的大书,虽然我90%的时间用到的内容不过其中的30%,但后来看起来并不吃亏。因为这个世界上不认真的人太多了,很多时候你只要稍微认真一点,就超越了大多数人。而且我特别认同李笑来老师讲的一个道理:许多人总困惑于“我特别想练习写作,就是写不好开头所以不敢动笔”,他的答案是“很简单,那你不要开头,直接从第二段开始写就好了”。

翻译《精通正则表达式》也是偶然。翻译是我在大学时考完GRE之后“无所事事”时找到的兴趣,曾经想通过翻译赚点外快。结果被骗了,翻译稿是被人家认可了,可因为不好意思一手交钱一手交货,一分钱也没拿到。不过以此为契机,我觉得自己的翻译可以被人认可了,所以更有兴趣学习和练习。加之当时网友大多古道热肠,秋风(姚中秋,当时主持了很多自由主义的讨论)和林猛(当时在北大读博)两位前辈给了我很多翻译的建议和指引。所以在正式接手翻译《正则表达式》之前,我已经积累了十多万字的翻译经验,其中很多还是被批评后反复修改、讨论的结果。这些经验没有为我赢得什么实质的报酬,却是日后争取到翻译《精通正则表达式》机会的宝贵积累。

正是出于上面所说的一系列偶然因素,我才与正则表达式结缘,而且主要的缘份也到此为止。后来我并没有写过太复杂的正则表达式,没有机会密集使用正则表达式,也没有仔细做过表达式的性能调优,充其量是检查不要有明显的性能问题……如今,每次听到大家把“正则表达式”和我联系到一起,我都感到非常惭愧。

对我来说,真正重要的因素都不是我料想过的:复习GRE提高了英语,热心前辈的建议和指引帮我提高了翻译水平,公司的“高压”让我有机会认识并迅速掌握正则表达式,项目经理的严格培养了我通过Google自学的能力,亚马逊的书评和电子版的存在让我选择《精通正则表达式》作为学习资料……只要其中任何一个条件发生变化,我可能都不会与正则表达式结缘。

如果要问我从中学到了什么,其实就是别太在乎自己患得患失,而要坚持不断思考,不断学习合适的工具、正确的方法,更好地解决问题。上大学的时候,我读到马尔萨斯的《人口论》,绞尽脑汁也不知道该如何破解自然资源增长速度与人口增长速度不匹配的难题,直到后来才恍然大悟,原来马尔萨斯忽略了科技和智慧的作用。我每次想起这段经历,都深感计算机科学的神奇:同样复杂的问题,竟然可以想到既减少时间又减少空间的办法,代价仅仅是认真的思考而已——持续运用智慧解决各种问题,把事情做得更好,就是我的经验。


最后推荐一个InfoQ中国的公众号。现在大家可比我刚做开发那时候幸福多了,当时虽然Google没被封,中文资料却少得可怜,全都是“C#好还是Java好”,“感觉做程序员没前途了怎样转行”之类的口水话题。我还记得自己看得很多的一个技术资料网站是TheServerSide,被逼学了不少英文。现在好了,InfoQ堪称全中国最好的坚持深度的原创技术社区,程序员、架构师、技术领导,都应该来这好好看看。

An image to describe post 我与正则表达式的缘分