去年一高中老同学从Google离职回Duke去读博,她问我有兴趣去面Google,我把简历发给她。
10月份,我就收到一封来自谷歌招聘人员的电子邮件,问我是否有兴趣电话聊聊。我们约定在第二天电话。她先给我介绍Google,再询问我的工作经验、社区活动,还有一些技术问题,目的是为了评估我的计算机科学知识。我当时并没有比较好的回答她一些技术问题,然后她告诉我,我需要为真正的技术面试做好充分准备。
幸运的是,她帮我安排了技术面试。为了有更多的时间复习,我选择在把技术面试安排在一个月后。她还为我提供了一些面试技巧和复习链接,我可以用它们来为面试做准备。
接下来的整个月,我都在努力复习,从基本的排序算法到动态规划。我从YouTube的公开排序算法视频开始复习,还读了 《Cracking the Coding Interview》 几章,并试着回答书中的问题,确保每次都是把答案手写出来,而不是用电脑打出来。
我还复习了数据结构,特别是树、图和哈希,了解广度优先搜索和深度优先搜索两者的区别并编写代码,这是非常有必要的有价值的。掌握用动态规划解决问题对面试很有帮助,但是理解动态规划是相当困难的。
技术电话面试持续了大概45分钟,从一个系统设计问题开始。之后,面试官会提供准备好的技术问题,需要使用谷歌文档编码。这就是为什么在纸上中练习写代码是很有必要的,因为在实际的面试中,没有编译器给你使。
面试题是关于马在棋盘上的问题。我不会在文中讨论更多关于这个问题,但在本质上,它可以通过简单的广度优先搜索来解决。不幸的是,我在实现过程中犯了严重的错误。首先,我试图过早地优化它,结果导致了一个错误的实现;其次,我在BFS实现中错误地交换了for循环和while循环。有趣的是,当审查代码时,实现结果确是深度优先搜索。面试结束了,我不知道结果如何。
过了几天后,招聘人员来电话给我反馈结果了。她提到我的面试得到的反馈褒贬不一,针对这次面试她提了有效的意见,我也认同她的观点。她提到会再给我来一次技术电话面试,以得到更具体的反馈。我把复试定在两周后,以有更充分的准备。
但是第二次技术面试让我更失望,我认为这个问题很棘手,我设计实现成一个动态规划的解决方案,然而面试官告诉我这个问题可以通过基本的递归来解决,然后我就懵了。最后,我感觉到面试失败了。
几周后,招聘人员又来了反馈电话,结果当然是跟我想的一样,她说我以后可以重新申请。好吧,看看有机会也许下次再来吧。