回首过去,是正则让我骚气
大牛的第一篇文章往往自报家门,而我基本上就属于自爆家门。
因为自报家门对我这样混的不算好却又面子薄的人来说是件很痛苦的事,而每次我都只能暗示自己,这是做一次职业复盘,总结下没混好的原因,目标么还是要向前看。
复盘从职业生涯的起点校招开始。校招中我的第一份简历就确定了offer,之后就开始了养猪生活,以至于放弃了其他机会。复盘其根本原因,很可能是因为一个正则:
那次笔试有一道编程题要求将ip转换成整形存储,大家都知道考点是位运算,但是这道题其实是有很多加分项的,检查ip是否符合格式就是其中一项。在面试中,面试官手持我的答案说我是少有用正则匹配进行格式检查的,而且是这少有的人中稀有的将正则规则写到严谨的,更是这稀有的人中唯一一个在检查的同时将所需要的4个ip段同时获取的,简直写的骚气!简而言之我被面试官吹成了一个SSR,而且居然还得到了骚气这个极高的属性评价,所以很快接受offer并签约了。忽略了这家公司其实不达我校应届生求职的平均水平,以及该情况导致在笔试中的对手比较菜的现实。
由于被吹的比较厉害,到现在我都还记得那天的正则我是这样写的:
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
当然凭良心说,这个公司还是值得点赞的,作为某省通信大佬的头号软件供应商,开发团队的组织和流程都很科学。而团队中骚气的氛围更是超过预期:上到项目经理承诺项目完美验收就裸奔,在庆功大会上真的守约;下到程序小哥哥用注释向测试姐姐表达仰慕之情,结果在redmine上收到附有结婚证照片的bug。
如果不是因为老板被查出和甲方领导之间的行贿受贿骚气操作导致公司分崩离析,可能我现在还在那里欢乐的Coding。
我的第二份职业经历是从一场饭局开始的,当时在老板被抓的背景下,整个开发团队有一半人等着被竞争对手收购,另一半人开始另寻出路,而我则举棋不定。在一场校友饭局上,有个在大厂做游戏主程的学长说准备出来单干了,团队还缺人。听说了我的情况,学长表示,你目前做web,又喜欢玩游戏,做服务端或者策划应该都没问题,你还有什么特长,我可以给你安排合适的位置。
我想了想说我写的正则表达式特别长。
大家都笑了,但是学长没有。“正则匹配啊,刚好我们后端用Erlang,匹配式赋值,那么你转行起来应该很快的”——学长说的一本正经,于是我就被安排的明明白白。所以我现在回首,在我模糊的记忆里,我们大学应该是有一个说骚话的选修课,我们是先后被同一个老师教过的。不过Erlang学起来的确比较快,我很快在团队挑起了大梁——我应该很庆幸,因为正则让这一切发生。
但是创业充满艰辛,最可怕的不是投资方撤资,而是团队人心离散。一件突发事故之后,大家身心俱疲处理完,我回家休养了一段时间,开始在武汉找工作。
我把简历挂在网上,收到的都是些创业公司或者外包公司的电话。一开始我并不理睬,直到给几家大型企业投简历石沉大海之后,我开始改变战略,起码见识一下公司如何再做决定。于是我进入了一段为时较长的笔试期,为了表示我不是一个搬砖工,对过于简单的笔试题我往往并不中规中矩的作答。
直到有一个光头考官看出了这一点,这段时期才宣告结束,我又开始了第三段工作。
那次的一个笔试题是: 给定两个字符串a和b,忽略大小写,判断a中是否包含b中的所有字母。这道题很简单,基础解法是嵌套循环遍历字符串的字母判断是否相等,进阶解法是遍历b,用一个HashMap存储b中字母,再遍历a检测是否包含HashMap中所有字母。
我当然不会用这两种做法,我当然要用正则:
function(a, b){
var all_char = "abcdefghijklmnopqrstuvwxyz0123456789";
var all_b = all_char.match( new RegExp("[" + b + "]", "ig") );
var in_a = all_b.join("").match( new RegExp("[" + a + "]", "ig"));
return all_b.length === in_a.length;
}
我不用循环,还顺便给IG战队打Call,简直六到我自己都掉眼泪。忘了说,当时他们招聘的是Java工程师。光头在肯定了我实现的很巧妙后问我为什么其他题用的Java这题用的JavaScript,我就告诉他因为用Java的API写起来比较长,我当时急于回家吃饭懒得写了,就随手用了JavaScript,把自己描述成一个剑客心中有剑,草木皆可为剑一样潇洒。实际上是因为一年多没用Java我把API忘得差不多了——我是一个剑都拿不稳的剑客,只好玩刀。
在了解到光头负责的项目组正在把他们在美国卖了十几年的一款基于Applet的企业产品修改为JavaScript实现,然后在国内推广铺开后,我决定那就是这家了。当时还没有流行越秃越强的说法,不然我做决定应该会更快些。
我进入了一个由Applet这种古老物件组成的新世界,而在半维护旧系统半改造系统半年多后,美籍老板突然对中国市场改变了想法。可能是觉得不管是Applet实现还是JavaScript实现都能卖出去,也可能是觉得都卖不出去,总之出于我不得而知的原因,改造停止了,只剩下维护性开发任务。几个月后,光头就回美国另寻高就了。而在失去能够欣赏我正则解题的上司和他对产品光明前景的画饼之后,我也随之离职。
我去了一家制造业企业,做自动化相关软件的需求和技术负责人。在等级森严,要求严谨不捅娄子而又平平稳稳的制造业,时光一去如水,一晃好些年。随着发际线的上移,我也开始成为技术面的面试官。在第一次参加校招,看了一眼公司的校招笔试题,一如我当年刷的搬砖工笔试题后,我笑了,我知道虽然这些年一直没有放弃对技术的学习,但是我内心骚气已然渐渐散尽,所以毫无波澜。
直到一份答案吸引了我的注意力。
这题是一个foobar的稍稍变种,将输入由整形变为了字符型,判断字符串代表的数是否能被3和5整除或同时整除并给出不同返回。
答案来自于一个学弟,用正则判断了字符串能否被5整除。在接下来的面试中,他表示如果不是怕时间来不及,他还想写出判断被3整除的正则表达式。于是在面试里,我和他一起画起确定有穷状态机,并推出了结果,最后相互一笑。
学弟最后微信告诉我他去了某互联网大厂,表示遗憾,我却没有任何惋惜,如果他接受我司的offer或许我还会私下建议他再考虑。因为那个有穷状态机的图我一直都记得,它像极了万花筒写轮眼。
确定有穷状态机-万花筒写轮眼而当时的相视一笑,在我眼中一如十年前的自己。
写到这里我心说一声糟糕,复盘了一下这篇文章,发现想的是复盘,写出来却变了。大概文如其人,一开始缺少明确目标和完整规划,想得到自己的成功就比较难。
那么一篇偏题的文章要怎么办呢?
改个标题发不就行了?毕竟,我还是骚气的。