谷歌员工眼中的6个关键点
- 在我向你提供课程列表前,先读第一二点
- 全职工作人员——基于你的行业经验和学术背景去选择性的看待这个回答
- 准大学生——请直接跳到第七点
标记说明:
- # 可选的
- **必须的
#第一点:让我们回到这个问题本身,也即是如何准备才能让自己成为“优秀”的软件工程师?
是的!这个问题的剩余部分都是可选的。加入谷歌不是登月计划。任何优秀的软件工程师都有好机会成为谷歌工作文化的一部分。问题是你如何定义“优秀”。
**第二点:调整态度
在你给谷歌招聘人员留下深刻印象之前,让我们来看看谷歌的软件工程师这一角色是否是你真正想要的。
软件工程师并不是像普遍观念所说的那样有趣。除了用户界面和用户体验的职位,通常来说,不管你用什么文字编辑器——Eclipse、Vim或者 Emacs——你的屏幕将是黑的,无聊和枯燥的。全职的软件工程师,不仅需要有从事复杂算法的能力,还需要足够的包容和耐心来一丝不苟地关注大型程序上的 细节。
在谷歌,通常大多数软件工程师的角色主要是处理数学问题。你掌握了多少种语言或者你把Java、C、C++等玩得多溜是无所谓的。
重要的是这个四个目标:
- 你创造有效算法的能力
- 你阅读别人写的代码以及发现其中存在任何问题的细心品质
- 你的学习和实现新技术趋势并且适应需求的好奇心
- 最后也是最重要的:你创造了什么,如何创造的?
我必须之处要实现以上四个目标并不容易。我们大多数谷歌员工都有一段苦逼时间来达到这些目标,但是我们尝试过,所以你也应该去尝试。
每个人都有不同的学习方法。于我,我每天读一篇我在Quora链接上找到的研究论文(可能和也可能不和计算机科学有关),一篇谷歌的研究文章(内部记录)。
一旦你加入谷歌,将可以访问所有的代码库,数据库,论坛,研究论文和一些能给你学习时提供巨大帮助而你却无法在维基百科上找到的项目。但当你在为加 入谷歌而准备路上时,有几样事情在学习的过程中很常见。在第五点中,你将会更多地了解到——怎样来实现这四个目标——但在这之前有些前提还是需要看看的。 所以,我们进入下一点吧。也即是:
#第三点: 2014年技术发展指南——来自谷歌
作为一个成功的软件工程师,有着扎实的计算机基础是很重要的。对于大学生,通过自我把握节奏地亲身实践学习,来专业性地或者非专业性地培养他们的技术能力,跟随这份谷歌指南是一条建议路径。
- 请自己权衡使用这份指南
- 这份指南之外可能也有你想学或者想做的其他东西——尽管去做吧!
**第四点:对专业性学习的建议
- 计算机科学入门课程
注:计算机科学的入门课能提供编程的一些指导。
在线资源:
Udacity – intro to CS course,
Coursera – Computer Science 101
*译者注:这些在线资源大都是英文授课,因此没有翻译课程名(下同),另外作为程序员英语必须得好啊,可以参看伯乐在线老码农写的《老码农教你学英语》一文。
- 至少用一种面向对象的编程语言写代码:C++,Java,或者Python
初学者在线资源:
Coursera – Learn to Program: The Fundamentals,
MIT Intro to Programming in Java,
Google’s Python Class,
Coursera – Introduction to Python,
Python Open Source E-BookIntermediate Online Resources:
Udacity’s Design of Computer Programs,
Coursera – Learn to Program: Crafting Quality Code,
Coursera – Programming Languages,
Brown University – Introduction to Programming Languages
- 学习其他编程语言
注:可以将这些语言加到你的仓库里:Java Script, CSS, HTML, Ruby, PHP, C, Perl, Shell. Lisp, Scheme.
在线资源:w3school.com – HTML教程*, Learn to code
- 测试你的代码
注:学会如何跟踪bugs,创建测试,并且破坏你的软件
在线资源: Udacity – Software Testing Methods, Udacity – Software Debugging
- 培养逻辑思维和积累离散数学知识
在线资源:
MIT Mathematics for Computer Science,
Coursera – Introduction to Logic,
Coursera – Linear and Discrete Optimization,
Coursera – Probabilistic Graphical Models,
Coursera – Game Theory.
译者注:coursera课程大多都有中文字幕,对于学习语言门槛会降低,不过仍推荐学习原版课程。
- 培养算法和数据结构的深刻理解能力
注:了解一些基本数据类型(栈、队列和包),排序算法(快排、合并排序、堆排序)和数据结构(二分查找、红黑树、哈希表),大O表示法等
在线资源:
MIT Introduction to Algorithms,
Coursera – Introduction to Algorithms Part 1 & Part 2,
Wikipedia - List of Algorithms,
Wikipedia - List of Data Structures,
Book: The Algorithm Design Manual
- 培养对操作系统的深刻理解能力
在线资源:UC Berkeley Computer Science 162*
*译者注:这个链接是YouTube上的,国内有很多电驴的资源,亲测可用(如果找不到可用链接,译者可提供)
- 学习人工智能的知识
在线资源:Stanford University - Introduction to Robotics, Natural Language Processing, Machine Learning*
*译者注:斯坦福Andrew Ng的这门机器学习课程强烈推荐,译者也有大量该课程资源。
- 学习如何构造编译器
在线资源:Coursera – Compilers*
*译者注:这门课程也是相当实用,最好跟着可能动手完成课程的编译器项目。
- 学习密码学
在线资源:Coursera – Cryptography, Udacity – Applied Cryptography
- 学习并行编程
在线资源:Coursera – Heterogeneous Parallel Programming
**第五点:对非专业性学习建议
- 参与课堂之外的项目
注:创建和维护一个网站,构建你自己的服务器,或者做一个机器人。
在线资源:Apache List of Projects, Google Summer of Code,Google Developer Group
- 参与大系统(代码库)中的小代码片段,阅读和理解已有的代码,查文档并且跟踪调试。
注:用GitHub来阅读别人的代码或者去贡献一个项目是一种很好的方式。
- 和其他程序员一起参与项目
注:这将会帮你提高在团队工作的能力,也使你能够向他人学习。
- 锻炼你的算法知识和编程能力
注:通过像CodeJam或者ACM ICPC这些编程竞赛来锻炼你的算法知识
*译者注:国内有很多OJ也可以起到这个作用,比如POJ、九度等
- 成为一个助教
注:帮助教其他学生将会有助于增加你在这个学科的知识
- 软件工程方面的实习经历
注:确保你在实习招聘期来临前申请了实习工作。在印度和美国,实习期在暑假,5至9月份,而申请通道通常提前几个月就打开了。
在线资源:google.com/jobs
#第六点:谷歌推荐/赞助的项目和团队
在你兴趣领域内,你可能选择订阅的课程很少。这些课程和项目是非常好的学习地方,但他们不会增加或减少你进谷歌的机会——他们不等于实习。(更多信息来自 Robert Love)
这门自我把握节奏的在线课程是为任何想学习更多关于结构、可视化、操作数据的人准备的。
这个为期两天的互动会议将给一二年级的大学生提供一些关于谷歌文化和这家公司职业前景的介绍。
3. 谷歌编程之夏
一个全球在线项目,提供给上完中学且年龄在18以上学生开发者津贴,让他们为各种各样的开源软件项目写代码。
4. 谷歌奖学金政策
这个项目提供学生在暑假期间为互联网工作的机会和在公共利益组织上提出的技术政策。
5. 谷歌学生退伍军人峰会
谷歌学生退伍军人峰会包括为老兵适应工作环境而准备的职业培养课程。也可以参看:Ellen Spertus 在 How
can I effectively use my last two years of college to prepare for a
great Software Engineering job at Google/FB or a startup? 这个问题上的观点。*
*译者注:这是Quora上Ellen Spertus对另一个问题(我是怎样高效地利用大学最后两年来为谷歌/Facebook或者初创企业的一个很好的软件工程师职位做准备的)的回答。
**第七点:对数学课程的建议
(对准大学生而言)
个人观点:任何忽视这些学科企图将使你进入完全以错误方式学习的平庸程序员的范畴。之前准备的越充分就越使得写代码越享受。这些是软件工程的几个前提,对软件工程你需要去理解算法的精髓。如果软件工程师能够回忆起学校里学的简单知识,大多数他们犯的错误本可以避免的。
在你深入学习数学或者计算机科学中,你将意识到你“大学本科时学过的数据结构”和“研究生时学过的机器学习”的重要性。因此,要想设计复杂的算法,一下是你必须精通的课程清单。对于大学研究生,如果你忽视了这些学科,我强烈建议你应该你能做到的最好的方式去复习它们。
在你学习完学校课本上的介绍性大纲之后,练习下面的课程来加深理解吧。大多数大学生(甚至在职员工)低估了这些课程然后成为了另一类平庸的程序员;
- 线性代数
1. Linear Algebra | Mathematics | MIT OpenCourseWare (我推荐的)
2. Coding the Matrix: Linear Algebra Through Computer Science Application (同事推荐的)
学习这些会帮你理解后续的回归模型——机器学习基本的一步。任何学校、大学、研究室或者机构都不会教你这些线性代数课程。自己去学吧。
- 微积分
1. Calculus 1 - Ohio State University
2. Pre-Calculus Courses - Universitat Autonoma de Barcelona
3. Calculus for Beginners and Artists – MIT
- 统计&概率
注:当你上大学和读研究生时,大纲就会变成机器学习的算法了。对于大多数大学生,机器学习课程的头三个月里数学使他们苦不堪言,而当他们好不容易赶上进度了,大纲又推进到更加机器学习复杂的领域,比如深度学习,神经网络和神经网络流处理。
#准大学生:谷歌推荐/赞助的项目
- 谷歌的Code-in项目(GCI)
这个比赛为年龄在13至17岁的准大学生介绍了各种各样使得开源软件开发成为可能的贡献。
谷歌RISE是一种对合伙人的奖励,它奖励旨在促进和支援为全世界的K12*小学生和中学生的STEM*以及计算机教育举措的项目。
*K12,从幼儿园到12年级
*STEM,Science,Technology,Engineering,Math,科学、技术、工程、数学
这个项目使得来自不同社区的中学生可以接触到STEM领域的大学和职业。
编程是种新能力-它承载着创造、创新和文明改造世界的潜能。这个举措旨在激励数以百万计的女孩体验代码的魔力。
这个为期一天的项目旨在为优秀的高年级中学生在上大学前提供有价值的商业技巧。
先驱者项目是一个全球性的网络,这里聚集着领导者、倡导者和计算机教育大使,大使们负责让全球的青年和教育工作者通过计算机科学被联系和激励。
谷歌科技博览会是对13到18岁青少年开放的全球性竞赛。学生在线提交项目并得到赢得大奖的机会。
CSSI是一个为期三周的暑期项目,针对即将进入大学且对学习计算机科学感兴趣的新生而设。
30天的DIY和制作活动。Maker Camp是一个在Google+上对所有人开放的免费虚拟暑期露营活动
在Google+ 上和老师、教育组织协作来为K12学生提供经验性的学习机会。