之前《每一次面试都是对技术的提高(上)》中已经介绍完了第一个面试流程,最后并没有拿到期望的Offer,但是Amazon把我转到了另一个部门继续面试,算是给了第二次机会。
这个部门用到的技术主要是正则表达式,SQL语句,Linux指令还有Shell脚本。我自然能感觉到这个机会应该是第二个那个中国的面试官帮我争取的,当然我在简历中写上的一些正则表达式的几个项目,也给予了一定加分。
不过,我也在跟经理的电话交流中,坦诚我在Linux方面知识的不足,以及SQL语句的遗忘,因此对方在次考虑上给了我时间来准备和复习,让我在觉得可以了的时候告之然后安排电话面试。
所以,放下电话我就开始准备,计划安排每天要准备的内容:先花两天看Linux指令,花两天天看Shell脚本,再花一天熟悉Linux中的正则表达式规范,花一天复习SQL语句。这样子的话,基本是一周左右的时间。
之后我就放下了所有的工作,之前一直在做的算法题也停止了更新,全心投入到新一轮面试的准备工作之中。其实之前一直都知道Linux是很重要的东西,我也一直看《鸟哥的Linux私房菜》不过因为没有任务的推动力,也缺乏高手的指点和帮助,所以学习的进程十分缓慢。但是这次为了面试,我对Linux的部分指令有了更深的了解。指令很多,根据职位的要求,最终把重点放在了awk,sed,grep,tail这些日志查询指令上。对于用户管理,远程系统访问上,我都没有花时间去看。然后把Shell脚本也学习了一番,各种FAQ也浏览了一遍。
至于正则表达式,我本来以为可以不用详细看,但是之后发现原来Linux中正则表达式的语法有很多不同之处,特别有POSIX标准,POSIX扩展跟我原来在JavaScript以及C#中用到的都很不一样。好在Linux还支持Perl兼容模式,跟我所知的正则表达式的比较接近。
在SQL语句上,我只是做了简单的复习,因为之前在实习的时候一直是用.NET和SQL Server,所以SQL的使用上还是比较清楚,只是偶尔需要查询一番语法规范。虽然我一直在MSDN上看SQL,但是我并不担心他们在Oracle或者MySQL上的兼容性。
因为每天都铺在面试的准备之上,安排7天完成的任务,我后来差不多4天就全部看完了。 周五跟Amazon的人电话,周二我就回复邮件表示已经准备好了,可以面试了。在压迫之下,爆发出的能量果然是相当可观的。
当时的想法一来可能是有点着急,怕机会流逝了;二来也是觉得要给对方表现出自己较强的学习能力;再者也考虑到他们安排面试也要时间,之间我还可以继续看。
果然,他们把时间安排在了下个周三。而且这一周里,我也没有去扩充知识,而是用刚学的脚本和指令,完成了“C++语法高亮shell版”。用Shell脚本明显要好于之前的JavaScript写的内容。我可以批量处理我的C++代码,于是乎之前之前写的算法题都被我用这个脚本处理了。
第四次电话面试
电话面试如期而来,这次是Phone Screen的形式,在Collabedit上写代码。其实用电脑写代码是我比较适应的方式。
整个过程,面试官总共提出了4个问题,分别关于SQL(只是简单的Select),正则表达式(匹配要求项),awk(提取日志文件中的某些行)以及一道基础算法题(自然是用的C++完成)。
整个面试也非常的流畅,最后也留下了富足的时间让我来提出一些问题。我便问了一些关于新部门职位的任务以及所需的技术。看起来这个部门刚成立一年多,所以在招不少人加入,看起来机会不错。
这次面试很顺利的拿到了Onsite的机会,可惜之后的一个月,我要面对期末考试,毕业典礼还有母亲陪游等事情,所以只能把面试推后。但是又怕机会流逝,所以直接放在了送母亲回去的第二天。而Facebook的Onsite面试也紧跟在Amazon面试的下一周。所以那个月里,我基本上就是在飞来飞去,体验到各种航班晚点的不幸遭遇。
而那段时间里,我也没有时间和精力来准备面试,提升能力。所以只能凭着之前的经验去应对了。
第二次Onsite
面试过程还是4组,前面两个似乎是经理或者高级高级工程师,他们向我详细介绍了我所面试组的职责和行为,以及整个部门之间的工作流程以及分配。最后一组面试官是两个人,他们也是刚进该组不久的工程师。
不过跟上一次不太一样的地方在于,这次提出的问题不再是纯算法的技术内容,多半涉及到的是设计方面的构思,以及问题的解决方式,还有就是对于以做过的项目的介绍。
因为我把很多的项目都放在了Github上,然后列在简历之中,所以对于做过的项目自然没有可以讲出自己碰到的阻碍,遇到的挑战,以及解决的方法。而设计方面,我准备甚少,经验也微薄,答得就漏洞百出,自己也是不知所云。至于解决问题方面,题目十分开放,我也只能自我感觉是怎么样就怎么回答,也不知道是否接近他们想要的答案。
面试中也有问一些之前我准备的那些内容。比如SQL,都是很简单的联表查询;Linux指令方面,做了一道跟grep相关的题目,我记不住指令的参数,直接请求拿出我带来的手稿(只是grep man page的打印稿)来查询,面试官也同意,因为我用的那个参数他也不知道其存在(应该是做经理太久了,很长时间没写代码了吧);还问了一个tar的不解压查询,我对tar不是很了解所以没有答出来。
算法方面的两个题目,我都是用HashSet来解决的,复杂度都都在O(n)。其实C++的STL里面没有HashSet,我也只能假设已经存在,面试官也表示认可。
这次面试依然不是太好,因为对于面试所要求的技能并没有达到其要求,所以过了一个星期之后,HR就打来电话表示歉意,我也没有多问原因,毕竟自己差不多知道其中的差距和自身的不足。
但不管怎么说,面试中我都有了很多的进步,对于算法和数据结构的能力的提高,还有在Linux上面的了解,以及面试经验上的增长。特别是为了准备面试上,我真的深深体会到:计算机语言上的问题都不是什么问题,只要给我时间我就可以快速的了解。但是想要真正用这些语言流畅的解决问题,还是需要长时间的经验累计。
现在工作已经落实了,我也停下了面试的准备,也不能在通过面试来发现自己的缺陷,提高自己的能力。不过一年后,我想我还是会再去尝试Amazon。