直到进入美国谷歌总部工作
我于2020年3月底加入了美国的Google担任软件开发职位。由于在美国流行着像”How I got into Google!”这样的帖子,我也想写一篇自己的经历。
背景
这是一个美国本科毕业的女性,专业是计算机科学。在东京的一家外资IT公司工作了大约4年。她通过外资IT公司的L1签证从日本移居到美国。后来通过婚姻获得了绿卡,已在美国居住了大约12年左右,目前居住在硅谷。她能够流利地说英语,相反,她的日语并不太好。她已经学习完了《破解编程面试》这本书,虽然她不认为自己是个聪明的人,思维较慢,需要花时间学习新事物。她已婚并且有一个3岁的孩子。在加入Google之前,她在一家初创公司从事数据工程相关的工作。
面试准备
如果在硅谷进行软件工程师面试,首先推荐阅读的是《Cracking the Coding Interview》,因为硅谷的科技公司大多按照这本书中讲解的策略进行面试。我几年前解过一遍,觉得相当困难,大约花了三个月的时间。
编程面试
leetcode.com是软件开发职位的编程面试练习的最佳选择。
截至2020年,总共有1000多个编程问题发布在该平台上,实际面试中也有大部分问题是从这些问题中选出的。然而,解答所有问题是不现实的,所以支付Leetcode的订阅费用并解答被高概率提问的问题是很有乐趣的。
(2022年更新)然而,在Google的面试中,几乎不会出现与Leetcode相同的问题。但是,通过准备经常出现的问题并确保可以应对任何问题,就可以放心了。
目标是在45分钟内完成2个Medium难度的问题,或者1个Hard难度的问题。
刚开始只需要做1个Medium难度的问题就需要花费1到2个小时,但是习惯之后就能迅速解决。
然而,达到迅速解决问题的水平所需的时间因人而异。我自己花了大约4个月的时间,而我的朋友,一个超级聪明的人,只用了1个月。
我总共解了300道题,直到我觉得我已经完全准备好了。其中有80道简单题,170道中等题,还有大约50道困难题。
在高级水平考试中,经常会出现困难级别的问题。
基础算法
二分查找、递归树遍历(中序,后序等)、广度优先搜索、深度优先搜索、快速排序、归并排序都是必须掌握的算法。必须在三分钟内能够无错误地编写出来。
虽然不是基本的,但实际上是必不可少的算法
滑动窗口、迭代树遍历、快速选择、并查集、拓扑排序是一些难度略高于基础的算法,出现频率非常高。必须在5分钟内能够无错误地进行编写。
高级算法
「KMP、Dijkstra、ベルマンフォード、ヒストグラムの最大長方形エリア」は、実装が難しく、説明を求められると苦労するアルゴリズムです。しかし、出題確率は高く、これらのアルゴリズムを使用できれば、合格の可能性が高くなります。5分以内にバグのないコードを書ければ良いです。
我认为高级算法对于资深级别的人来说是必须的。
例如在与图相关的问题中,如果权重为负,那么能使用的算法只有贝尔曼-福特算法。
每天练习编程时,我会选择一个随机的算法作为热身,用简单的语言解释算法的运行方式和计算量(BigO)。然后,在三分钟内完成算法的实现。
作为算法的实现前提条件,自己能够清楚地解释自己的解决方案,并与面试官讨论并思考出最佳解决方案,双方都满意后再进行编码,这就是编程面试,因此也需要良好的对话能力。我通过一个名为interviewing.io的免费面试练习服务进行了多次练习(大约20次)。
分布式系统设计
面试要求设计大规模系统,例如最简单的例子是设计bitly.com的系统。更困难的问题可能涉及Facebook的Newsfeed或ticketmaster.com等。据说,作为一名高级工程师申请时,可能会提出更难的问题,需要准确向面试官了解问题的范围,并展示出设计最佳系统的能力,这是非常困难的面试。
对于从事分散系统设计工作的人来说很好,但大多数工程师很少有这样的机会,面试变得非常困难。推荐的学习方法是…
Designing Data-Intensive Applicationという本
Youtube (Gaurav Sen, System Design Interview, Tech Dummies) 自分は全部のビデオをみた笑
Grokking the System Design Interview 分散システムデザイン面接用の有料オンラインコース。どうアプローチすればよいか詳細を説明しているのでとても役立つ勉強ツールだけれども、2020年現在ソルーションが古いかなと思う。
有料の面接練習サービス。自分はExpertMitraというサービスを使った。
以下是面试中的讨论要点:
– 使用关系型数据库还是NoSQL数据库。
– 如何构建数据库索引(2022年补充)。
– 如何进行扩容。
– 如何实现容错性。
– 如何提升性能。
– 云原生设计(2022年补充)。
请注意,以上是对原文的一个汉语翻译,具体表达可能有所不同。
具体来说,数据库使用MySQL、MongoDB、Cassandra、ElasticSearch等,缓存使用Redis,消息队列使用Kafka,通过使用这些技术特点来进行描述。
此外,还学习了MapReduce、Apache Spark、负载均衡器等。
自己不确定自己的知识是否足够,因此感到非常不安,而这是一个非常令人不安的领域,所以付费面试准备服务非常有用。
关于Google的软件工程师招聘
如果是新毕业生,只需进行编码面试和行为面试。
如果有工作经验,并且想要晋升为高级职位,需要进行编码面试、分布式系统设计面试和行为面试。
在硅谷的科技公司中,代码面试被认为是最重要和最具挑战性的。
我的准备时间
总共六个月。
作为全职开发人员和一个有三岁孩子的职业母亲,我的日子非常辛苦。
平日,在孩子入睡后我会学习三个小时,周末会学习三到四个小时。
非常感谢在过去的六个月中几乎全部帮我哄孩子入睡的丈夫。
想要尝试挑战的人
日本的Google也有开发团队,非常热门。
如果你想尝试在海外工作的话,可以考虑加入日本的分公司然后转移到海外。
在美国已经拥有H1签证、绿卡或美国国籍的人,非常鼓励你们尝试。只要做好准备,感觉并不是那么困难。
顺便提一下,我也尝试了在亚马逊和Facebook面试,但是系统设计面试太难了,没能通过,哈哈。