# 谷歌/亚马逊/脸书/苹果等一线科技公司面试必备，最全软件工程师求职准备清单

##### LaiOffer  
May 6, 2021

在美国求职软件工程师的小伙伴们经常询问：“我好想去谷歌/亚马逊/脸书/苹果公司工作，但是一直过不了技术面试！真的好难啊！”

其实想要通过FLAG级别的公司面试，最需要的就是软硬实力兼具！尤其是像谷歌/亚马逊这样的公司，对技术方面的要求极高。

在谷歌面试的6个环节中，技术面试一直是权重最大的，以其难度大、出题灵活性，以及种类多变的现场互动闻名。今天我们就以谷歌/亚麻技术面试为例，分别从硬实力和软实力两个维度去刨析拿下技术面试的关键点。

## Part 1: 硬实力

所谓硬实力，就是候选人所应具备的技术能力。尤其是对于软件工程师这样的岗位，技术就是根本，可以从写码、系统设计、网络、Debug、数据结构、算法等角度来准备。

### **1. Coding（写码能力）**

首先作为一名软件工程师，要有一门自己绝对擅长的语言，并能在既定的时间内，用代码来解决现实社会中的问题，并具备高效性（效率最大化）、易读性（代码不复杂）、和可维护性（能够长期使用）。

当具备这样的能力之后进行面试，面试官还会就候选人的理解和逻辑能力进行进一步的考察。

### **2. System/OODesign（系统/面向对象设计）**

面向对象设计和系统设计可以说是技术面试中很多同学最担心的部分了。尤其是像亚麻这样的公司，即使是new grad，对于系统/OOD题目也几乎是必考。

通常情况下，面试官会考察候选人能否将一个模糊的需求细化、抽象成计算机能够模拟和解决的问题，是否了解要设计一个大型系统，应该考虑哪些方面。

比如说，亚麻就有一道面试真题是这样问的：

_Interview Question：Design a system for a parking lot where drivers can also have memberships (but also support guest drivers). The parking lot has counter screens on each row._  
_面试问题：如何为停车场设计一个系统，让司机可以作为会员停车，同时也支持非会员停车，并可以让停车场的每一排都有一个自助柜台？_

像这样的问题就对面试者计算机知识储备和在复杂情况下的全局设计能力有很高要求。

面向对象、数据库、分布式系统、多线程等知识缺一不可，也是需要同学们日积月累才能形成的知识结构。

### **3. Networking（网络）**

如果你的求职方向是网络工程师，那这一部分的技术需要你对web application的常见网络架构有一定理解，经典的题目有：

_面试问题：_ _从浏览器输入一个 URL 到页面渲染完成，需要经过哪些步骤？_ _DNS 的基本原理是什么？_

不过具体如何准备还是要看岗位要求，把job description上的所有需求都掌握，才能更好拿捏面试官想要考察的知识。

### **4. Debug（故障排除）**

Troubleshooting考查的是现实工作场景中如何debug的能力，也是作为软件工程师必备的能力。

一套标准的Troubleshooting工作需要遵照以下顺序：

- Examine（识别、跟踪、确认故障）
- Diagnose（推算潜在风险、验证推断、反复验算）
- Test or treat（评估风险等级后安排debug优先级、在emergency情形下需要将“止损”作为首要目标）

对于测试部分的要求大多为单元测试，要求面试者能够自己写test来验证代码的正确性。

### **5. Data structure & Algorithms（数据结构&算法）**

对于数据结构和算法的考察在面试中非常常见。面试者要能够深度理解各种数据结构和算法，对应选择高效的解决方案，并能够向面试官阐明原因。

数据结构部分会知识点会包括但不限于：

- 二叉树 Binary Tree
- 栈 Stack
- 队列 Queue
- 哈希表 Hash Table
- 链表 Linked List
- ……

算法部分的考察会包括但不限于以下知识点：

- 动态规划 Dynamic Programming
- 递归 Recursion
- 图搜索算法 Graph Search
- 分治 Divide Conquer
- 二分查找 Binary Search
- ……

能够从实操层面上真正理解好以上知识点，才是面试通过的关键。

## Part 2: 软实力

软实力是候选人技术水平以外的综合能力，代表了软件工程师沟通、表达，和团队协作的能力。在大厂面试中，软实力起到的作用不亚于技术能力。同学们可以从沟通技巧、提问话术、开放式思维、提出假设和解决问题的能力来入手提高。

### **1. Communication（沟通能力）**

或许很多人已经觉得老生常谈，沟通能力有什么难的？在面试里又如何体现呢？

其实，很多细节都可以暴露出候选者的沟通能力，比如在解题前，面试者是否有跟面试官沟通明确题目要求，有没有分析各种可能的情形？

而在得到面试问题后的3-5分钟，面试者又是否主动阐述自己想法，与面试官确认好题目的scope和corner cases了呢？这些都是面试官考察面试则沟通能力的细节。

我们这里为大家列举了一些常见的提问，比如：

_面试问题：_ _这个题的数据规模有多大？会超出正常内存容量上限吗？_ _这个题的输入保证是valid data吗？_ _网络断开的情况要考虑吗？_ _这个corner case有一定歧义，怎样输出比较合理？_

在谷歌的技术面试里，很多面试题是“故意”设计成开放式问题的。面对这种问题时，应该多向面试官提问，获得一些关键的hints，来解锁一些隐藏解题路线。

面试官考察的是你能否从一个基本的解开始，不断进行优化，直到达到最优解。

### **2. CART四部曲（解题思路）**

面试过程中，解题思路比结果重要。

比如，Think out loud就是面试官最看重的品质之一，指的是在解题过程中，要将你的解题思路清晰地呈现给面试官。

为了达到这一点，在面试过程中我们可以使用CART原则，即Clarify，Assumption，Result，Test。

- Clarify（即听清问题的重点，询问有歧义或不明确的部分）
- Assumption（提出自己的假设）
- Result（提出自己的解决方案）
- Test（验证自己的方法和代码的正确性）

这样一步一步清楚阐明自己的解题思路，可以让候选人的思路过程清晰地呈现给面试官，更容易让面试官了解到面试者不仅有很强的技术，也是个拥有着极强逻辑思维和软实力的人。
