谷歌工程师条件: 名校出身, CS 专业背景, 博士学位加持, 技术过硬?
国外一个叫 John Washam 的小哥告诉你: 不用, 自学 8 个月也可以!
John Washam 励志要成为一名谷歌软件工程师, 但没有 CS 专业背景的他, 只能通过自己的努力来达成理想.
于是, 8 个月的时间里, 小哥花了数千小时阅读书籍, 编写代码, 观看 CS 技术讲座, 一路披荆斩棘, 打怪升级.
最终, 虽然没有去谷歌, 但他人到中年, 还顺利成为了一名亚马逊 AWS 的技术专家, 年薪百万.
更加难能可贵的是, 小哥还将自学经验编写成了一份教程, 在 GitHub 上线以来, 已收获近 10 万星的好评.
正如他所说:
即便没有面上 (?) 梦寐以求的谷歌, 但是教程, 也可以用来好好充实一下自己.
PS: 教程有中文版哦~~
GitHub 超 10 万星自学宝典
是什么样的编程教程, 能如此火爆?
小哥最初的目的是 "考上" 谷歌, 于是每天自学 8-12 个小时, 坚持了 8 月有余. 边学还顺手整理出了这份自学项目.
不过在完成这项学习计划后, 他最终被亚马逊录取, 成为一名软件工程师.
Washam 表示:
无论你要面试哪家软件公司, 这里的项目可以让你做好充分的准备, 包括像亚马逊, Facebook, 谷歌和微软这样的科技巨头.
接下来, 我们就跟着 Washam 的脚步去了解一下这份面试宝典.
选择语言, 必备知识资源
首先要做的就是选择一门语言, 在 Google 一般是 C++,Java,Python, 有时也会用到 JavaScript,Ruby. 背后还有一些如 SQL,html 等技术没有列出.
接着开始学习计算机硬件知识:
然后补充计算机专业的基础数学知识, 如算法复杂度 / Big-O / 渐进分析法, 数据结构, 树, 排序, 图论.
此外还有递归, 动态规划, 组合与概率, NP&NP - 完全和近似算法, 缓存, 线程与进程, 系统设计, 可伸缩性, 数据处理.
看到这么多知识点, 你会不会觉得有点懵呢? Washam 告诉你一点小技巧.
因为你不可能一遍就记住所有知识点. 所以需要把要回顾的知识点做成抽认卡 (flashcard): 正常的及带有代码的, 类似于背单词.
每种卡都会有不同的格式设计. 项目主页中就有抽认卡的源代码, 可以根据自己的学习特点去制作.
Washam 还留有一组 ASCII 码表, OSI 堆栈, Big-O 记号及更多的小抄纸, 以便在空余的时候可以学习. 每编程半个小时就要休息一下, 并去回顾你的抽认卡.
当然, 论文的阅读也是必不可少的, 尤其是谷歌曾经发表的一些基础技术论文.
书籍则推荐一些关于算法和 C++ 编程之类的.
Google 面试注意事项
面试的第一步当然是要有一份好的简历, 这样才能为你争取到宝贵的面试机会. 知名科技博主 Steve Yagge 给出了 10 个贴士, 帮你做出一份还不错的简历.
这位 Steve 曾经在亚马逊, Google 都工作过, Washam 的这个项目就大量地引用了他的技术博客内容.
在面试时, 你可能会遇到这 20 个问题, 每个问题准备 2-3 种回答. 准备点故事, 而不要只是摆一些你完成的事情的数据.
面试官在也会问你还有哪些问题, 不要说自己没有什么要问题, 可以试试问一些此类问题:
当然, 进入 Google 也不意味着结束, 你还要新的学习过程.
Washam 还有一份附加内容, 包括 Emacs 和 VIM,Unix 命令行工具, 密码学. 这些内容虽然不会直接用到, 但是会大大提高你的效率.
一个 web 前端的新征程
其实严格来讲, John 并不是一个编程小白.
从高中起, John 就开始学习编程, 学的是 BASIC 语言, 这还在是上世纪 90 年代.
大学毕业拿到经济学学位后, 他先是在军队服役两年, 驻扎韩国.
退役后他留在韩国教英语, 突然发现自己离开 CS 领域的这几年间, 太多的新技术新工具出现, 自己的知识结构出现了断层, 无法支撑起一个程序员的职业生涯了.
于是他利用一切业余时间, 艰苦地学习 Perl,HTML,CSS(当时这还是新东西),JavaScript 和 SQL.
终于在 2001 年, John 正式成为了一个网页开发程序员, 开始了 19 年的码农生涯.
截止 2017 年, John 的职业生涯可谓十分成功: 在大小公司都有过任职, 组建管理过项目团队, 经营壮大过初创公司, 自己还亲自创办了 3 家软件公司, 其中 2 家至今还在健康运营.
按照 John 自己的话说, 这十几年的工作经历, 将他锻炼成了一个合格的程序员, 一个优秀的产品经理, 一个 CEO, 一个市场销售.
但是他的目标不止于此. 他的梦想是在谷歌任职软件工程师, 在充满智慧和创造力的团队里提高自己.
最初他认为凭自己的工作经验可以轻松获得职位, 但拿到了谷歌面试题他才发现自己欠缺太多.
一个优秀的软件工程师应该精通数据结构和算法, 汇编语言, 内存设计等, 还要综合考虑代码和程序结构对机器在应用场景下的影响.
于是他以这份谷歌试题为指导, 开始了编程自学.
并且在 GitHub 上建立了「9894 项目」, 因为谷歌建立与 1998 年 9 月 4 日.
后来这个项目改名为现在的「coding interview university」.
CS 自学三点注意事项
John 结合自己的学习经历, 给出了三点自学编程的建议.
一, 早问早计划, 不要想当然
John 最大的教训是自己花了太多时间学习根本用不上的东西, 比如他曾经用了 3 周时间阅读了 1000 多页 C++ 的资料, 但是最后面试和工作中用的却是 Python.
△这是 John 的算法学习资料, 最后证明走了冤枉路
原因是他担心面试时可能会被问到.
这个例子不是说 C++ 没必要学.
而是强调你要提前收集信息做出计划, 在不同的项目上分配合理的学习时间, 提高效率. 切忌「我觉得......」.
二, 视频比看书效率更高
观看视频的学习效率自然要比自己啃书快.
找到好的教学视频, 意味着你有更多的时间实际演练编程题目.
三, 反复温习十分重要
不断反复是形成记忆的关键, 正如我们在上文提到的, John 推荐使用记忆卡.
他自己制作了 1792 个电子记忆卡. 一有空闲时间就掏出来温习, 比如超市排队时, 公交车上等等.
对于一个卡片的的问题, 回答正确还不够, John 会在一段时间内多次回答正确才会标记为「已掌握」.
最终这位小哥没有去谷歌, 而是接到了亚马逊的 offer, 现在他在亚马逊做软件工程师.
但是他自己说之前的学习经历并不是无用功, 现在他已经全面掌握了软件工程的基本技能, 无惧工作中的任何挑战, 并且实现自我飞跃的那一天越来越近.
而且 John 小哥的经历, 也不局限于程序员本身, 多于更多人而言, 也有值得参考之处.
他认定了一个目标, 然后制定计划, 勤奋付出, 最后天道酬勤获得回报.
John 可能也是一个「一万小时定律」的拥趸, 但就算按照他每天 12 小时, 坚持 8 个月(每月 31 天), 他从一个网站前端到 AWS 技术专家, 历时也不过 2976 小时 -- 远未到 1 万小时.
但就是这样目标坚定的 8 个月, John 从入门到获得大厂认可, 百万年薪加持.
△外媒调查亚马逊软件工程师平均年薪超过百万人民币
这是我们在 GitHub 看到最励志的故事, 也是我们希望让更多人看到的原因, 并且由衷希望更多人因为这样的经历和分享, 创造属于自己的故事.
坊间笑谈太多的 "从入门到放弃", 但也有人 "从入门到百万年薪".
生命不息, 奋斗不止, Keep walking~
学习是一个艰苦的过程, 当然如果能把技术学成, 最后也一定可以获得高薪工作. 掌握一个好的学习方法, 跟对一个学习的人非常重要. 今后要是大家有啥问题, 可以随时来问我, 能帮助别人学习解决问题, 对于自己也是一个提升的过程. 自己整理了一份 2019 最全面前端学习资料, 从最基础的 HTML+CSS+JS 到 HTML5 的项目实战的学习资料都有整理这是我的前端技术交流群 518672693 有问题随时在里面问我, 能给大家提出很多宝贵建议.
来源: http://www.jianshu.com/p/48030e92730b