Internship: 关于Software Engineering Prep Doc

本文是对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. 一些个人观点:

  • 与面试官的沟通是十分重要的,要把自己的思考过程表达出来,如果无法解决要及时寻求帮助
  • 解答问题时要条理清晰,回答问题的每一个部分
  • 代码足够的清晰与规范
  • 多准备数据结构