帮他多转发转发吧,说不定Google看到后直接给他下offer啦!不过也不知道具体出处,期待作者自己来评论区认领走吧!
的确如标题所言,为了准备 Google 软件工程师的面试,我花了数以千计个小时读书、写代码、观看计算机科学相关的讲座。
这个计划是怎么产生的呢?
我中学时期就开始编程,但是大学却选了经济学。这是因为我担心毕业时会有太多程序员找工作。现在想想我错大发了。
后来为了称为一个程序员我加入了军队,但是招聘人员却把我送到了军事情报处,于是我花了一年学习汉语,又在韩国服役了两年。
在退役前我试着重新拿起键盘,却发现物是人非,区别太大了。我从初中到高中一直使用的是 BASIC。但是回归后使用的是 C++,这两者间差别太大了,一时间我无法适应。
但是我很喜欢做网站,那会儿使用的还是 WordPress。我不懂怎么从零开始搭建一个网站。
在退役后,我决定在韩国再留一年,教英语。同时不忘初心,晚上、周末都用来学习 Web 开发,用的是 Perl, HTML, CSS (这在那会儿是个新生物), JavaScript 和 SQL。
在经过一年高强度的学习后,我得到一份在西雅图编程的工作,从此以后我就待在西雅图了。
从此以后我做了 15 年 Web 开发者。我创办了三家公司,其中两家至今还在盈利。这些年我在大公司、小公司都待过,见证、助力过创业公司的启动和成长,也招募、管理过团队,也当过产品经理,设计师,市场人员和 CEO。
在这个过程中我收获了很多,也算是比较成功。但是还差得很多。
职业方向的改变
还记得我错选经济学,没拿到计算机学位那部分吗?最终有所改变。
工作几年后,我觉得我已经大成了,去哪家公司都妥妥的,毕竟我是一位“全栈工程师”。
然而在 2013 年找工作时,我意识到自己原来差的这么多。
过去那些年我花了太多时间追寻金钱,甚至空余时间也在运营公司,这让我的技术止步不前。我的技术栈有些跟不上时代了。
过去那些年我的技术一直是够用就行了。虽然技术面比较广,却没有任何一个方向称得上专家。
别会错意了,我想找到工作还是没问题的,只不过不是我想要去的技术或者领域。我还是可以被一些技术栈不是很新的公司聘用的,给的待遇也不差,但是我对那样的前景无法感到兴奋。
我的这种“差得很多”的自我认识在去年一次找工作时达到了极点。我对一家风投投资的本地创业公司工作很感兴趣。但是由于我没有计算机学位,不具备这个学位掌握的技术和知识,导致我最终没有机会。
那时我一直在我公司中全职工作。
在 2016 年初,我觉得是时候做出改变了,从 Web 开发者到软件工程师。为了在几个月内掌握计算机学位学习的知识,我需要刻苦学习和练习,虽然长路漫漫,但我相信,一旦成功,我就会进入一段新的职业生涯。
有人可能觉得 Web 开发者和软件工程师没什么区别。它们都需要编程和技术,但是软件工程需要更多知识,比如数据结构和算法,编译型语言,对内存的关注,理解不同的代码和架构对运行机器的影响。
大公司招聘软件工程师时,期望候选人掌握这些知识。
我向在 Google 工作的一位朋友咨询了关于在 Google 工作的问题,也读过《How Google Works》,对 Google 有了一定的了解。
偶然一次机会,还得到一份 Google 面试候选人的指导笔记,这成为我学习计划的基础。
Google 是一个非常棒的公司,在意识到这一点之前,它就已经是我的目标。
为什么我的目标是 Google
目标设到月球,即使失败,也能落到众星之间。
Google 的门槛非常高,他们只想招聘最棒的人才,所以我把目标设定的高一点,即使最后没去成 Google,去别的公司应该也没什么问题。
而且,随着对 Google 的了解越深,我对它的渴望就越发强烈。
Google 有很好的“招培育留”氛围。简单地说,Google 选用聪明、有创造力的人,然后把他们照顾得很好。Google 奖励能创造价值的人,鼓励大胆创新,给员工自由,让他们为用户做出好的决定。
Google 的招聘流程经过多年调整,招聘以聪明、激情为准。脑力测验早就不用了,候选者的编程能力,技术知识,是否“够谷歌”(这个词蕴含的内容太多了…)。
Google 的管理也很不一般。他们的管理非常宽松,相信工程师可以做正确的决定。对雇员的信任使得 Google 的管理角色不同于平常公司。此外,管理层不能单方面决定雇佣、开除或者提拔一个员工,大多数重要的决策都需要由委员会投票决定,这样可以降低风险。
Google 的人力资源部一直在进步,他们根据数据和员工反馈来提升评估系统,这个系统包括招聘、提升、奖励等内容。
我的天,Google 的优点太多了。我曾去过一次 Google 的办公室,我本来的期望就很高,结果发现那儿的情景比我想象的还要好!
关于谷歌面试学院
还记得那份告诉我该学习什么的面试指导笔记么?虽然上面的内容我很多都不懂,但至少它让我有了目标。
我把笔记上的题目变成提纲,然后通过观看麻省理工学院和加州大学伯克利分校在 YouTube 上的讲座来一一学习。每个链接上可能有多个学习内容,很多视频基本都会引出下一个视频,就这样我不停地学习,学习提纲逐渐丰富。
由于之前我的写的商业、工作代码都是保密的,我的 Github 基本是空空的,看起来像根本没有在敲代码一样,于是我把这份学习提纲上传了上去。我需要创建一个作品,开始我叫它“Project 9894”,是因为 Google 创建于 1998 年 9 月 4 号。后来我把它改名为“谷歌面试学院”。
在学习的过程中,我把自己发现的话题都一一添加上去。
过去我总觉得“知识够用就行了”。这么多年职业生涯中我根本不清楚 CPU 怎么处理一段程序,内存如何工作,或者其他的知识,我很佩服自己这么多年是怎么过来的。
我的 Github 小项目渐渐开始得到一些关注,我甚至写了篇文章庆祝项目得到 20 个 star。
有天早晨我发现我的项目有 120 个 star 了!某个业内知名人士前一晚上在推特上分享了我的项目,让我的项目收到很多关注,甚至进入了 Github 当日流行榜。好几天我都是 Github 流行榜的第一名哈哈。
许多善良的人主动鼓励、感激我,这让我发现原来有数以千计的人跟我一样,不仅想去 Google 工作,也想成为一名软件工程师,我列出的学习内容正是他们需要学习的方向。
到目前为止它有超过 21000 个 star 了,难以置信。
如果我无法获得 Google 工作怎么办
只要不是天塌下来,都没关系。
为了成为 Google 的软件工程师,我投入了大量的时间和精力,即使我不幸失败了,我学到的知识和能力也足以让我去任何其他公司任职。
不论结局如何,起码我会成为一名入门级别的软件工程师。我不认为我有 15 年的软件工程师经验,因为我过去的确不具备这个能力,我和刚毕业的计算机学生一样还只是新手。
这对于我来说是一段新的旅程,才刚刚开始,即使我会犯很多错,也毫不畏惧,因为我有学习新内容的热情,我要学习所有需要的知识,成为团队中优秀的一部分。
叮嘱:别像我一样学过多东西
我花了八个月时间准备面试,但事实上我可以缩短很多时间。跟做其他复杂的事情一样,一开始都需要试错、走弯路,总有一些事我想回去重做。
我学习了很多我不需要的内容,有些是因为我觉得面试需要,有些是我觉得工作里会用到。我不想成为团队中的负担。但事实证明我操心太多了,很多内容都没必要学习。
我花了三周阅读一本 1000 页左右的讲 C++ 的书,那么多内容我没记得多少,但是起码对 C++ 了解多了一点。本来我以为会用到 C,C++,或者 Java,结果我面试中准备用的是 Python。记住这个教训:别猜,去问!去查!
到后来才发现,我只需要读三四本书就够了,我读的太多了。
我归纳了一本重复查看的算法总结,里面记录了很多我不希望在面试中遇到的问题。这其实是无用功,你不必这么做。
我花了很多时间看视频,然而本应该少看一些的,应该随着时间慢慢增加内容。
我应该尽早停止看书,换成看视频,早点开始编程验证、解决问题。早点开始动手实践我所学的。
隔一段时间重顾知识是记忆的关键方法。不要一次性学完一项知识就不管了,这样你无法真正的掌握。隔一段时间回顾一下,每次重复,你都会加深自己的理解,次数多了,你就会理解每个细节,成为真正的专家。
为了帮助回顾知识,我做了个手机上用的知识点抽记卡,里面有 1792 份知识,现在想想内容有些过于多了。一有时间我就回顾上面的知识点,比如圣诞节购物、排队等公交时。当抽记卡上的问题我能正确地回答时,就标记为“理解了”,否则从抽记卡上看明白答案,等待下次回答问题正确了再标记。
我内心的恐惧让我学习了太多不需要的知识,比如“要是他们考我红黑树相关的知识怎么办”。
但是我不想面向面试学习,我想要为了在 Google 工作、解决重量级问题而学习。这就意味学习算法还是有用的,它们可以提升计算机的时间和空间效率。
或许我永远用不到 Ford-Fulkerson 算法(一类计算网络流的最大流的贪心算法),但学习后我起码知道如果有类似的问题出现,该怎么解决。
总结
现在我了解了计算机的历史,编程中最伟大的部分–数据结构与算法,还有计算机系统底层是如何工作的。
在开始准备谷歌面试之前,我总希望可以跳过所有准备阶段,直接应聘,然后去学习工作中用到的语言和工具就好了。
但是在这个过程中,我意识到这些知识是多么重要,虽然它们可能在日常开发中应用不到,但是我相信我的付出会给自己带来内在的提升。
我马上就提交申请了,为了这件事我几乎准备了一年(一月份开始,但直到四月,我才能够保证全职学习)。
我觉得我已经准备的差不多了,是时候提交申请,对我这段时间的学习进行一次检验了。
这将是我人生的一次飞跃。我看到前方有一个光明的未来。
谢谢你花时间读我的故事。