导读:原文作者大学时修的经济学学位,早年曾在韩国当兵,并在退伍后留在韩国教授英语。然而心中对于代码的理想并没有因为时间的推移而磨灭,尽管困难重重,作者还是从零开始学习新的编程思想和技术,并花费了八个月时间来制定学习计划,将前往谷歌工作作为自己的目标。
原文:Why I studied full-time for 8 months for a Google interview
作者:John Washam
译者:Aceyclee
欢迎关注知乎专栏「极光日报」,每天为 Makers 导读三篇优质英文文章。
以下便是作者博客的全文翻译版,在文中作者详述了过往经历、做这个决定的原因、为什么选择谷歌以及自己的学习方法和经验体会。欢迎阅读。
(上图:我的陈旧白板,上面写的是 Dijkstra 单源最短路径算法)
说出来可能你不信,在过去的一段时间里,我花了上千个小时去阅读书籍、编写代码还有观看科技讲座。而这一切的努力,都只是为了谷歌软件工程师的面试去做准备。
我怎么来到这里
中学的时候,我便开始了编程。然而当我来到大学,我却修了经济学学位。我认为等我毕业的时候,肯定会有很多程序员寻找工作。可是那时的我毕竟还太年轻,我意识到我错了。
后来,我参军了,同时也成为了一名程序员。但是 HR 提供给我的入职部门却是军事情报局,因此我用了两年时间去学习韩语,并在这个岗位工作了两年。
在我离开军队之前,我试图重新拾起编程的技能,然而困难程度大大出乎我的意料。初中的时候我就开始学习 BASIC,即使到了高中我仍保持着编程的练习。可是当我重头开始 C++ 的学习后,我才意识到编程语言的迅猛发展让我难以把握。
我甚至不知道如何重建一个网站,即使我非常喜欢自己搭建网站,因为我过去用的是一种类似于 Word 的工具去发布我的网站。退役后,我决定留在韩国教授英语,然后利用周末和晚上的时间去学习 Web 开发技术,包括 Perl、HTML、CSS(当时还是特别前沿的一项技术)、JavaScript 和 SQL。
经过一年的紧张学习后,我前往西雅图地区工作,自此以后便一直留在那里。
(上图:在美丽的华盛顿贝尔维尤)
我作为一个 Web 开发者已经十五年了,并且创办了三家公司,其中的两家仍在正常运营和盈利。在此期间,我在大大小小的公司工作过,帮助初创企业启动和发展,招募和管理团队。我是一名产品经理,也是一名 CEO,同时我还是一名设计师,也是市场运营人员。
尽管我有着还不错的事业,并且一路走来的过程中也成长了许多,但我觉得这远远不够。
寻求职业改变
还记得之前我说我没有取得计算机科学与技术的学位吗,我觉得我应该做些改变!
几年前,我还以为我分分钟就能找到一份不错的工作。我觉得我是一枚香饽饽——实力不可小觑的全栈 Web 开发者。但直到2013年,求职过程中我才发现我在技术上已经缺乏底气了。我在业余时间内创办公司和挣钱,却忽视了个人技术的提升。
多年来,我仅仅浅尝辄止,博而不精。尽管我重新找一份工作并不困难,但却不是我想从事的领域。我能被雇佣的领域和我的技术一样是稍显过时的,虽然薪资不错,但我却看不到前景。
这个想法在去年的一次招聘会上达到了顶峰。我对一份由风险投资机构启动的实验室工作非常感兴趣,然而由于缺乏计算机科学学位而导致对相关技能和知识的不足,使我在这份工作面前根本没有机会。
至今我仍从事当时所拥有的全职工作。
在 2016 年年初,我决定是时候从 Web 开发者转行为软件工程师了。这意味着我需要在短短几个月时间内拿到计算机科学的学位,因此我需要非常刻苦地学习和不断地练习。但一旦我做到了,我便可以开始新的职业生涯!
你可能觉得 Web 开发和软件工程师并没有太多不同,二者都涉及编程和架构。但软件工程师还要求程序员了解数据结构和算法、汇编语言、内存考量,以及这些代码和架构决策对机器的影响。
大公司在雇佣软件工程师的时候希望应聘者能拥有这方面的知识。
我有在谷歌工作的熟人,从而了解到他在谷歌的一些经历。同时我也阅读过 「How Google Works」,因此对谷歌也是相当熟悉了。
通过期间的接触,我收到谷歌提供给候选人的培训教材副本,这便成为了我制定学习计划的基础。
在谷歌工作是非常棒的一件事情,在此之前我一直把谷歌定为我的目标。
为什么选择谷歌?
谷歌的聘用条件非常苛刻,他们只招聘最优秀的人才。所以当我把谷歌定为我的目标时,即使在谷歌落选了,我依然能非常轻松地得到其他公司的青睐。
我越了解谷歌,我便越希望能得到这份工作。
简而言之,谷歌是一家既雇用聪明有创意的人才、又对待这些人才非常好的公司。谷歌自由而创新,使员工能更好地作出对用户正确的决策。
多年来谷歌不断优化招聘流程,使之更适合聪明而热情的求职者们,大脑发热的情况早已不复存在。如今会更考察面试者编码能力、技术知识和谷歌的需求。在这个世界这是一项长足的进步。
(上图:在 2015 年的客场之旅,笔者走访了山景城总部,并在这埋下理想的种子)
谷歌的管理也是非同寻常的,管理者并不事必躬亲。他们相信工程师的决策,信任员工改变了管理者以往的形象。另外,管理者不能单方面雇用、解雇或者进行单方面宣传。许多被认为会导致办公室政治的重要管理决策,都会由专门的委员会去处理,从而消除潜在的隐患。
谷歌的人力资源部门会了解什么因素导致加班,并且他们会收集数据和员工反馈去提升评价体系、优化招聘流程、晋升通道和薪酬福利等。你可以去阅读 Laszlo Bock 著的「Work Rules!」从而了解更多信息。
是的,谷歌的福利特别好!我曾经去过华盛顿州的柯克兰谷歌办公室参观,这超出了我的预期。而我的期望已经很高了。
谷歌大学面试
还记得前边我说收到一份学习指南吗,这份学习计划看起来还不错,然而我对名单上面的知识仍旧一无所知。
我展开笔记上的主题列表,并在 YouTube 上观看麻省理工学院和加州大学伯克利分校的讲座以填充我的知识盲区。一边是链表的视频,另一边又是队列的视频,因此这份学习名单开始变得越来越长。
我的 GitHub 实在是太空了,因此我把学习清单公布在我的 GitHub 主页上。由于我写的商业和工作的代码是私人的,因此我的 GitHub 账户看起来似乎是空的。我需要新建一个投资组合,一开始我把项目命名为“Project 9894”,因为谷歌成立于一九九八年九月四日。之后我重命名这个项目为“Google Interview University”。
随后我又不断地添加了一些我发现的其他主题。
(上图:我夏季的阅读书单,只是其中的一小部分)
我有时候也会非常诧异,尽管在我的职业生涯中,我甚至不知道 CPU 是如何处理程序,内存是如何工作的,但我却刚刚足够让我得到成功。
我在 GitHub 上的小项目开始能得到 Star,因此我发表了一篇博客庆祝我拿到二十枚 Star。
有天早上醒来的时候,我发现居然得到 120 Stars。有个大 V 在晚上给我点了赞,这直接让我进入每日热榜,并持续了几天排行榜首。
许多善良的朋友给予我感谢和鼓励,原来他们要的并不仅仅是谷歌的工作,而是想成为一名软件工程师,而这份书单恰好能帮助他们。
截止到目前为止超过 21000 Stars,这仍旧让我觉得不可思议。
如果我落选了?
这并不是世界末日。
我为了能得到谷歌软件工程师的职位,付出了相当多的时间和精力去学习。即使我失败了,我拥有的这些知识和技能也足够我成功获得任意一家公司软件工程师的职位。
无论我在哪里结束,我都将成为一个初级软件工程师,而非拥有十五年经验的软件工程师,因为我确实不具备十五年的经验。当我入职的时候,我不过相当于一位 CS 专业的毕业生而已。
但我同样拥有初出茅庐不怕虎的勇气和热情,这对于我来说是个全新的领域,我才刚刚开始而已。我知道我会犯错,但我并不惧怕失误,我同样想学习各种知识,不论在哪个团队中我都能变得更出色。
不要像我一样学得太杂
没错我用了八个月的时间,但我完全可以缩短这个周期。就像任何大目标的开始,你都会犯错和走弯路,这其中总有你觉得可以做得更好的地方。
我研究了很多我并不需要的项目,其中的一些我认为我可能会在面试中用到,另一些我则认为是我开始工作时应该掌握的知识。我并不想成为团队中的吊车尾,然而事实证明我似乎准备过度了。
我用三周的时间阅读了一千页的 C++ 书籍,虽然现在我并不记得大部分内容,但我还是对 C++ 有了比较全面的了解。可结果却是在面试过程中我用的是 Python 而非 C++。我以为我需要掌握 C++、C 或者 Java,但我错了。所以应该勤问,而非假设。
其实我只需要看 3、4 本书而已,可我却阅读了远超这个数量的书籍。我有个代码目录,里面记录了我复习的几十个算法,其中大部分都不会在面试中遇到。你可以不用这样做。
(上图:堆栈算法,打印出来以供我复习)
同时我在 YouTube 上也加班加点地观看了远超我需要的视频。
我应该早点停止看书和看视频,从而进行代码的编写。这样我可以用更多的时间去实践我所学的知识。
记忆的关键在于重复训练。一旦你开始学习新东西,你需要不断地回顾和练习。每一次的复习都能巩固你的知识。一次花费足够长的时间去学习一个东西并不会让你成为专家,成为专家需要你不断地回溯你的知识。你这样做了之后你就会发现你再也不会忘记任意一个细节。
为了帮助复习,我做了 1792 张卡片(电子卡片),这有点多了。空闲的时候(比如圣诞节购物时)我便在我的手机或者平板上复习这些知识。学习新知识和复习同时进行,就算我在新卡片上得到答案,我也不会把它标记为已知,除非我多次看到它并都能正确地回答出这个问题,我才将其标记为已知的。
我的不安全感(万一他们问我关于红黑树的问题)让我尽可能地学习远超需要的知识。
但我并不仅仅只是准备面试,我同时为在谷歌的职业生涯做准备,解决大规模的问题。这意味着精通算法能节省时间、空间和 I/O 等计算机资源。
我可能永远不需要知道最大流算法(Ford-Fulkerson),但当情况出现时,我知道我能解决它也并不是一件坏事,同时我也能知道问题出现在哪里。
结语
以前我只是希望我能跳过这些学习,尽早被录用,从而我能将这些时间去学习我未来团队所需要的知识和工具。但一路走来,我才意识到这方面知识非常重要,尽管其中的大部分可能不是每天都会用到,但我仍然很高兴我付出了努力。我对计算机的历史、该领域的大拿、数据结构和算法(以及它们之间是如何相互影响)都有了全新的认识,同时我也知道了计算机的底层工作机理。
我很快就会递交我的申请,这真是个漫长的旅程——几乎整整一年。它开始于一月,但直到四月我仍旧不能承诺我能全身心投入学习。
我尽我所能去准备,我不能持续学习并无限期地推迟我的申请。有些时候我不得不大步向前。
曙光在我前方。
感谢阅读。
跌宕起伏的后续: