本文是对Google的 Software Engineering Prep Doc
的文档进行解读,好让自己知道面试过程的一些细节与考查内容。
祝你在即将到来的interview中好运!这里是一些对你准备有所帮助的tips,我们希望你能花一点时间来阅读其中的条目与链接。但是要注意,这里的很多内容都来自第三方,这些建议本身没有经过Google的直接认可。
1. Plan Ahead
- 电话面试(Phone interview):
你需要准备一台有网络连接的电脑
。在面试开始前,你会收到一个Google Doc
的一个链接,在整个面试过程中你都会用到它,大部分是用于与代码相关的问题
。 - 现场面试(Onsite interviews):
确保在面试的早晨准时来到我们的面试地点,准备好接下来一整天
的技术类问题
——你也希望在面试中尽力而为吧!
2. What to expect
我们的面试主要考察你的计算机科学原理(包括 编程能力,数据结构,算法,系统设计,复杂度分析
等等),以及 你如何在回答中使用它们
,我们也可能对你在学校里/空闲时所做的项目进行 开放式讨论
。
3. Interview Questions
面试的内容可能会包括:
- 你简历中的任何内容
- 在白板上回答编程问题
- 设计复杂的算法并分析它的性能
- 逻辑问题
- 系统设计能力
- 核心的计算机科学原理(哈希表/堆栈/数组等)
因为项目的复杂性与规模,拥有上面这些计算机技术的基础是Google所有工程职位的必备条件。
你可以访问 topcode.com 来进行练习,启动 Arena
部件并进入练习的房间即可。我们建议你在 first/second division
来做这些问题,以充分准备你的面试。
4. How to succeed
在Google,我们相信着合作与观点的交流,你有时候可能需要从 面试官
处得到 更多的信息
,来判断 你的结果是否达到了最好
。
- 询问你的面试官是OK的
- 如果你不理解,可以直接寻求
help
或者clarification
- 如果你需要对某些事情进行
假设
,可以先询问面试官这个假设是否正确 - 在给出回答前,首先按你所理解的
定义
并构建
问题 - 描述你希望如何解决问题的
每个部分
我理解下的回答范例:
我要解决的问题是,如何XXX
那么要解决这个问题,需要从以下几个方面来考虑:XXX/XXX/XXX
首先我们可以XXX,随后XXX,最后XXX,得到最终的结果
当然我们需要根据具体情况来选择回答的模式 - 让面试官知道你的
思考过程
——他对你的思考过程和你的最终答案都很感兴趣 - 最后,要
注意倾听
,尤其是你的面试官尝试帮助你的时候
5. What is Google looking for
我们要寻找的工程师要 不仅能解决之前遇到过的问题,也能找出之前没遇到过的问题的答案
。
面试官将结果与思考过程视为同等重要的,你要注意自己是否:
- 聆听并理解了问题
- 在继续之前是否问了正确的问题
- 享受寻找多个答案的过程
- 寻找更多的观点与方法来解决这个问题
- 看起来容易接受新的观点与建议
- 有能力解决更加困难的问题
Google重视 高效、清晰、简洁的代码
。
6. Technical Preparation tips
- 算法复杂性:
阅读复杂的算法,包括大O时间复杂度 - 排序:
- 知道如何排序,不要写
冒泡排序
- 至少知道一种 时间复杂度的排序算法,当然,最好知道两种,比如
快速排序
与归并排序
——在快速排序不合适的时候,归并排序会很管用
- 知道如何排序,不要写
- 哈希表:
描述哈希表示是如何工作
的,使用大概一个面试的时间使用数组来实现
一个 - 树与图:
- 学习树的
构建,遍历与修改
方法。你需要至少熟悉二叉树,n叉树与字典树
,你需要了解至少一种平衡二叉树
的体系,无论是红黑树、伸展树还是AVL树
,以及它们是如何实现
的。 - 你需要熟悉树的
BFS与DFS
,并且了解前序、中序与后序遍历
之间的区别。你需要了解它们的时间复杂度
,它们考虑的情况以及如何在代码中实现
它们。 - 有三种方式在内存中表示一张图:
对象与指针
邻接矩阵
和邻接表
,你需要对它们的表示
与各自的优缺点
有充分的了解。 - 最后,如果有机会,学习一些更好的算法,比如Dijkstra与A*
- 学习树的
- 其它的数据结构:
当然越多越好。另外需要了解最著名的几个NP-complete
问题,比如旅行商问题
背包问题
,在面试官变相询问你的时候能够有效识别它们
- 操作系统、系统编程与并发:
进程
线程
与并发
的问题。知道锁、互斥锁、信号量与监视器
以及他们是怎么工作的
,知道死锁与活锁
,以及如何避免死锁
- 一个
进程/线程需要哪些资源
,如何进行上下文切换
,以及操作系统与底层硬件如何初始化它们 - 了解一些
scheduling
的知识,知道一些线代的并发结构
- 编程:
- 对至少一种编程语言十分熟悉
- 在面试中,你需要使用你最熟悉的语言
编程
,并且知道许多语言的细节
- 数据结构与离散数学:
- 了解
递归
原理并使用它解决问题。与之相对,你要证明一个算法会按你指定的方式工作 - 一些
离散数学
中相关的问题,如计数问题、概率问题
- 了解
- 系统设计:
对于一个大问题,把它们分解成多个小问题
,并且讨论解决这些小问题的方法 - 开发实践与开放式讨论:
- 包括验证设计,白板代码,代码的BUG、可维护性与可读性,代码的重构
- 面临的最大问题,最佳/最差设计,表现评估与优化,关于现有产品的测试与想法
7. Ask more questions!
除了Google的主要产品之外,确保对一项产品有自己的理解,详细了解我们在Google的工作。
在面试的最后,可以问对公司/工作环境/经验有什么问题,可以事先 准备几个要问的问题
,如果对面试流程、薪水或者自己的表现有疑问,可以直接传达给面试人员。
8. 一些个人观点:
- 与面试官的沟通是十分重要的,要把自己的思考过程表达出来,如果无法解决要及时寻求帮助
- 解答问题时要条理清晰,回答问题的每一个部分
- 代码足够的清晰与规范
- 多准备数据结构