Cate:我是如何准备Google面试的 导读:Cate是一位加拿大的软件工程师,目前就职于Google, 本文是他在2010年在Google面试后分享的文章。 也许你可能没有参加过谷歌面试(或者没能答出面试中的一些问 题),这里我会分享一下上周我的面试经历。我个人感觉良好一一至 少已经全力以赴了,无论结果如何都会对我有很大的帮助。 由于已经签了保密协议,因此我不会写出面试的问题。然而,我 会写一下我是如何得到这个面试机会以及准备面试的过程。 首先,面试的是谷歌。如果没有在Google工作的朋友和我谈起 并推荐我,我是不会应聘的。因为我“离得比较近”,因而没有参加 电话面试,直接进行了在线面试。我并不认为渥太华和滑铁卢(加拿 大)离得很近(也许这是因为我没有加拿大人的距离感!),但是我确 实认为与人面对面的交流会比电话面试好的多。那天我的运气特别的 好,因为那天晚上的经历就像是“Ignitel Waterloo”活动,非常酷。 首先,我和招聘专员简单聊了聊,他/她告诉我可以使用白板, 并且介绍了整个面试流程。接下来我和两个软件工程师分别进行了 45分钟一对一交流。我惊奇地发现原来面试也可以这么有趣!通常 我在面试的时候都会非常紧张,然而这次没有与很弱的人一起扎堆面 试,这真的很酷!第一长面试的问题非常简单,第二场虽然难一点但 也面得不算太差。最困难的恐怕就是在白板上编程(不能用电脑!) 一一在白板上很难用TDD(测试驱动开发)!他们会告诉你不要穿正
Cate:我是如何准备 Google 面试的 导读:Cate 是一位加拿大的软件工程师,目前就职于 Google 。 本文是他在 2010 年在 Google 面试后分享的文章。 也许你可能没有参加过谷歌面试(或者没能答出面试中的一些问 题),这里我会分享一下上周我的面试经历。我个人感觉良好——至 少已经全力以赴了,无论结果如何都会对我有很大的帮助。 由于已经签了保密协议,因此我不会写出面试的问题。然而,我 会写一下我是如何得到这个面试机会以及准备面试的过程。 首先,面试的是谷歌。如果没有在 Google 工作的朋友和我谈起 并推荐我,我是不会应聘的。因为我“离得比较近”,因而没有参加 电话面试,直接进行了在线面试。我并不认为渥太华和滑铁卢(加拿 大)离得很近(也许这是因为我没有加拿大人的距离感!),但是我确 实认为与人面对面的交流会比电话面试好的多。那天我的运气特别的 好,因为那天晚上的经历就像是“Ignite! Waterloo”活动,非常酷。 首先,我和招聘专员简单聊了聊,他/她告诉我可以使用白板, 并且介绍了整个面试流程。接下来我和两个软件工程师分别进行了 45 分钟一对一交流。我惊奇地发现原来面试也可以这么有趣!通常 我在面试的时候都会非常紧张,然而这次没有与很弱的人一起扎堆面 试,这真的很酷!第一长面试的问题非常简单,第二场虽然难一点但 也面得不算太差。最困难的恐怕就是在白板上编程(不能用电脑!) ——在白板上很难用 TDD(测试驱动开发)!他们会告诉你不要穿正
装,实际上最好也不要这么做一我费了不少时间坐在地板上写白 板,身边到处都是各种记号笔。可以想象如果穿裙子会是怎样的情景! 他们提前会发一份面试需要准备的事项列表,这对我非常有帮 助。虽然我大学的课程学得很好,但最好还是有针对性地复习一些专 题。除了通常的准备,这里还有一些额外可以关注的内容一一保持与 最新的业界资讯更新,大量使用G00ge的产品,思考如何使用技术 改变生活,撰写博客(是的,最后两项也很有帮助)。与此同时,我 已经很好地掌握并运用Jawa5扩展,像是范型、枚举、for-each等等。 下面是我用来准备的相关资料: ·读《Effective Java(第二版)》-一一作为一名合格的ava程序 员没有任何理由不推荐这本书。 ·读《程序员面试攻路》并运行所有书中的例子一对于回顾 类似树、列表这样的数据结构基础概念非常有帮助。我不是很喜欢递 归那一章(从我自己使用的角度),我更推荐使用送代。尽管如此, 它真的是一本非常有用的好书。 ·读《编程人生》 -一一这本书中有很多人在谷歌工作,这从 另一方面说明了谷歌的文化。书中同样还充满了很多我以前从未注意 到的有趣编程故事,还有这些牛人是如何解决问题,讨论AP叫以及增 强程序扩展性等内容。 ·复习《CombinatorialAlgorithms:Generation,Enumeration,and Search》中的背包问题(Knapsack),旅行商问题(Traveling salesman) 以及NP完全问题(在秋季学期里我学了组合数学并且从头到尾读完
装,实际上最好也不要这么做——我费了不少时间坐在地板上写白 板,身边到处都是各种记号笔。可以想象如果穿裙子会是怎样的情景! 他们提前会发一份面试需要准备的事项列表,这对我非常有帮 助。虽然我大学的课程学得很好,但最好还是有针对性地复习一些专 题。除了通常的准备,这里还有一些额外可以关注的内容——保持与 最新的业界资讯更新,大量使用 Google 的产品,思考如何使用技术 改变生活,撰写博客(是的,最后两项也很有帮助)。与此同时,我 已经很好地掌握并运用 Java 5 扩展,像是范型、枚举、for-each 等等。 下面是我用来准备的相关资料: • 读《Effective Java (第二版)》 –——作为一名合格的 Java 程序 员没有任何理由不推荐这本书。 • 读《程序员面试攻略》 并运行所有书中的例子——对于回顾 类似树、列表这样的数据结构基础概念非常有帮助。我不是很喜欢递 归那一章(从我自己使用的角度),我更推荐使用迭代。尽管如此, 它真的是一本非常有用的好书。 • 读《编程人生》 –——这本书中有很多人在谷歌工作,这从 另一方面说明了谷歌的文化。书中同样还充满了很多我以前从未注意 到的有趣编程故事,还有这些牛人是如何解决问题,讨论 API 以及增 强程序扩展性等内容。 • 复习《Combinatorial Algorithms: Generation, Enumeration, and Search》中的背包问题(Knapsack),旅行商问题(Traveling salesman) 以及 NP 完全问题(在秋季学期里我学了组合数学并且从头到尾读完
了这本书)一一坦率的说,我不很喜欢这本书。我感觉这更像是一本 数学书。如果你是一名程序员而不是数学家,用实际的代码来解决这 一类问题可能会更有帮助,而且Wikipedia读起来肯定更容易理解。 ·做一些《va解惑》中的问题,这会帮助锻炼你阅读代码找错 的能力。虽然我没有被问到这类问愿,但是我确实需要仔细检查自己 的代码。BM在我的手机屏幕上给我出过电子商务的问题,我知道谷 歌也会使用这类题目。 ·复习并发问题一一死锁、活锁、互斥量、锁和信号量等等。 在Jawa中什么时候使用synchroni位ed关键字?你怎么样避免死锁和活 锁? ·复习树的遍历一一前序遍历、中序遍历和后续遍历,深度优 先搜索vs广度优先搜索、A算法,D水stra算法等等。 ·复习平衡二叉树一一红黑树、AvL树和伸展树(Splay-tree。 ·复习图一一图的表示,最小生成树,图的搜索等等。 ·算法复杂度分析。 ·编程实现6种排序算法一包括算法复杂度为O(n log n)的那 些算法,使用TDD风格编程(我使用的测试用例可以参考这篇博客). ·编程实现哈西表,要求只能使用数组。支持包括:范型,动态 数组,延迟初始化,要求测试优先 ·练习所有手头上能够找到的问题一一搜索“Google interview questions”,不用有什么顾虑,可以看看这些问题。有时候我用clipse 写代码,但也会用Google docs。我会找一个朋友市查我的代码并向
了这本书)——坦率的说,我不很喜欢这本书。我感觉这更像是一本 数学书。如果你是一名程序员而不是数学家,用实际的代码来解决这 一类问题可能会更有帮助,而且 Wikipedia 读起来肯定更容易理解。 • 做一些《Java 解惑》中的问题,这会帮助锻炼你阅读代码找错 的能力。虽然我没有被问到这类问题,但是我确实需要仔细检查自己 的代码。IBM 在我的手机屏幕上给我出过电子商务的问题,我知道谷 歌也会使用这类题目。 • 复习并发问题——死锁、 活锁、互斥量、 锁和信号量等等。 在Java中什么时候使用synchronized 关键字?你怎么样避免死锁和活 锁? • 复习树的遍历 ——前序遍历、中序遍历和后续遍历,深度优 先搜索 vs 广度优先搜索、A*算法,Dijkstra 算法等等。 • 复习平衡二叉树——红黑树、AVL 树和 伸展树(Splay-tree)。 • 复习图——图的表示, 最小生成树,图的搜索等等。 • 算法复杂度分析。 • 编程实现 6 种排序算法——包括算法复杂度为O(n log n)的那 些算法,使用 TDD 风格编程(我使用的测试用例可以参考这篇博客)。 • 编程实现哈西表,要求只能使用数组。支持包括:范型,动态 数组,延迟初始化,要求测试优先。 • 练习所有手头上能够找到的问题——搜索“Google interview questions”,不用有什么顾虑,可以看看这些问题。有时候我用 Eclipse 写代码,但也会用 Google docs。我会找一个朋友审查我的代码并向
我提问。 ·经常找在谷歌工作的朋友聊天,问很多问题。他非常棒,并且 全力帮助我准备面试。不仅如此,通过理解他为什么认为我适合在谷 歌工作,我也更深入地理解了自己想去谷歌工作的理由(是的,这的 确有点迂腐。但是正如我的导师告诉我的,即使是谷敬,挑选你喜欢 的公司和公司桃选你也是同样重要)。 虽然我自己认为只是准备充分,但在谷歌工作的朋友戏称我准备 得“几近完美”。除了这些准备之外,我还能做些什么呢? ·更多的代码分析实战一尽可能多地找代码去分析。 ·计算数列的和。例如,你如何计算数字1-n的和?请给出证明。 回顾我在第二场面试中的分析,我给出的答案是:(n-1(n-2)+ (n-2(n-3引+…+(32)+(21)。当然,我没有及时地给出答案,所以 我的时间复杂度上限是0()。 ·复习va函数库,数据结构,这个时候,我会认真地回答:“我 知道有这样的数据结构不会接收重复的值,只是现在记不起来叫什么 名字了”。实际上只要实现St接口就可以做到,这个我也是下午才 刚学会。 ·复习函数库中的某些关键点一Arrays和Strings非常有用. ·练习在白板或者纸上编程。你可能想当然地想在白板上插入一 行或者进行重构,这可是非常困难。,同样地,在白板上写代码很容易 忘记写return语句。Eclipse从来不会让我自己写这些声明和reum语 句,并且会把我的代码放在函数的中间,而白板可做不到!
我提问。 • 经常找在谷歌工作的朋友聊天,问很多问题。他非常棒,并且 全力帮助我准备面试。不仅如此,通过理解他为什么认为我适合在谷 歌工作,我也更深入地理解了自己想去谷歌工作的理由(是的,这的 确有点迂腐。但是正如我的导师告诉我的,即使是谷歌,挑选你喜欢 的公司和公司挑选你也是同样重要)。 虽然我自己认为只是准备充分,但在谷歌工作的朋友戏称我准备 得“几近完美”。除了这些准备之外,我还能做些什么呢? • 更多的代码分析实战 —— 尽可能多地找代码去分析。 • 计算数列的和。例如,你如何计算数字 1-n 的和?请给出证明。 回顾我在第二场面试中的分析,我给出的答案是: (n-1)(n-2) + (n-2)(n-3) + … + (3)(2) + (2)(1)。当然,我没有及时地给出答案,所以 我的时间复杂度上限是 O(n³)。 • 复习 Java 函数库,数据结构。这个时候,我会认真地回答:“我 知道有这样的数据结构不会接收重复的值,只是现在记不起来叫什么 名字了”。实际上只要实现 Set 接口就可以做到,这个我也是下午才 刚学会。 • 复习函数库中的某些关键点——Arrays 和 Strings 非常有用。 • 练习在白板或者纸上编程。你可能想当然地想在白板上插入一 行或者进行重构,这可是非常困难。同样地,在白板上写代码很容易 忘记写 return 语句。Eclipse 从来不会让我自己写这些声明和 reurn 语 句,并且会把我的代码放在函数的中间,而白板可做不到!
接下来该做什么? ·等待。 ·等待。 ·等待! ·无论结果如何,我都希望能得到一些反馈。 ·把面试的问题写成代码(同时写好测试用例!) ·完成《Java解惑》中的问题 ·整理面试经历一一我花了很多时间准备这次面试,相信你可能 己经收藏了这些面试题目。 ·寻找其它的机会。我对BM特别感兴趣,找一些在那里工作的 朋友看看有没有什么合适的机会。 ·和导师们谈谈这次面试经历
接下来该做什么? • 等待。 • 等待。 • 等待! • 无论结果如何,我都希望能得到一些反馈。 • 把面试的问题写成代码(同时写好测试用例!) • 完成《Java 解惑》中的问题。 • 整理面试经历——我花了很多时间准备这次面试,相信你可能 已经收藏了这些面试题目。 • 寻找其它的机会。我对 IBM 特别感兴趣,找一些在那里工作的 朋友看看有没有什么合适的机会。 • 和导师们谈谈这次面试经历