软件工程师的必修和选修(转)

谷歌员工眼中的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 MethodsUdacity – 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 RoboticsNatural Language ProcessingMachine Learning*

*译者注:斯坦福Andrew Ng的这门机器学习课程强烈推荐,译者也有大量该课程资源。

  • 学习如何构造编译器

在线资源:Coursera – Compilers*

*译者注:这门课程也是相当实用,最好跟着可能动手完成课程的编译器项目。

  • 学习密码学

在线资源:Coursera – CryptographyUdacity – Applied Cryptography

  • 学习并行编程

在线资源:Coursera – Heterogeneous Parallel Programming

**第五点:对非专业性学习建议

  • 参与课堂之外的项目

注:创建和维护一个网站,构建你自己的服务器,或者做一个机器人。

在线资源:Apache List of ProjectsGoogle Summer of Code,Google Developer Group

  • 参与大系统(代码库)中的小代码片段,阅读和理解已有的代码,查文档并且跟踪调试。

注:用GitHub来阅读别人的代码或者去贡献一个项目是一种很好的方式。

在线资源:GithubKiln

  • 和其他程序员一起参与项目

注:这将会帮你提高在团队工作的能力,也使你能够向他人学习。

  • 锻炼你的算法知识和编程能力

注:通过像CodeJam或者ACM ICPC这些编程竞赛来锻炼你的算法知识

在线资源: CodeJamACM ICPC*

*译者注:国内有很多OJ也可以起到这个作用,比如POJ、九度等

  • 成为一个助教

注:帮助教其他学生将会有助于增加你在这个学科的知识

  • 软件工程方面的实习经历

注:确保你在实习招聘期来临前申请了实习工作。在印度和美国,实习期在暑假,5至9月份,而申请通道通常提前几个月就打开了。

在线资源:google.com/jobs

#第六点:谷歌推荐/赞助的项目和团队

在你兴趣领域内,你可能选择订阅的课程很少。这些课程和项目是非常好的学习地方,但他们不会增加或减少你进谷歌的机会——他们不等于实习。(更多信息来自 Robert Love

  1. 谷歌课程——Making Sense of Data

这门自我把握节奏的在线课程是为任何想学习更多关于结构、可视化、操作数据的人准备的。

2. 谷歌课程——BOLD Discovery

这个为期两天的互动会议将给一二年级的大学生提供一些关于谷歌文化和这家公司职业前景的介绍。

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

  • 统计&概率

注:当你上大学和读研究生时,大纲就会变成机器学习的算法了。对于大多数大学生,机器学习课程的头三个月里数学使他们苦不堪言,而当他们好不容易赶上进度了,大纲又推进到更加机器学习复杂的领域,比如深度学习,神经网络和神经网络流处理。

#准大学生:谷歌推荐/赞助的项目

这个比赛为年龄在13至17岁的准大学生介绍了各种各样使得开源软件开发成为可能的贡献。

谷歌RISE是一种对合伙人的奖励,它奖励旨在促进和支援为全世界的K12*小学生和中学生的STEM*以及计算机教育举措的项目。

*K12,从幼儿园到12年级

*STEM,Science,Technology,Engineering,Math,科学、技术、工程、数学

这个项目使得来自不同社区的中学生可以接触到STEM领域的大学和职业。

编程是种新能力-它承载着创造、创新和文明改造世界的潜能。这个举措旨在激励数以百万计的女孩体验代码的魔力。

这个为期一天的项目旨在为优秀的高年级中学生在上大学前提供有价值的商业技巧。

先驱者项目是一个全球性的网络,这里聚集着领导者、倡导者和计算机教育大使,大使们负责让全球的青年和教育工作者通过计算机科学被联系和激励。

谷歌科技博览会是对13到18岁青少年开放的全球性竞赛。学生在线提交项目并得到赢得大奖的机会。

CSSI是一个为期三周的暑期项目,针对即将进入大学且对学习计算机科学感兴趣的新生而设。

30天的DIY和制作活动。Maker Camp是一个在Google+上对所有人开放的免费虚拟暑期露营活动

在Google+ 上和老师、教育组织协作来为K12学生提供经验性的学习机会。

时间: 2024-11-03 03:29:41

软件工程师的必修和选修(转)的相关文章

《构建之法》学习(3)——软件工程师的成长

<构建之法>学习(3)--软件工程师的成长 1.1个人能力的衡量与发展 积累软件开发相关的知识,提升技术技能 积累问题领域的知识和经验 对通用的软件设计思想和软件工程思想的理解 提升职业技能 实际成果      衡量软件开发的工作量和质量 项目/任务有多大? 花了多少时间? 质量如何? 是否按时交付? 1.2软件工程师的职业发展 职业发展--考级之路 职业成长--Steve McConnell版本 职业成长--大公司版本 职业成长--自我评估 1.3技能的反面 通过玩魔方的例子说明了技能提升的

如何成为合格的软件工程师

一个成功的软件开发团队里,首先要确保团队里的成员是合格的软件工程师.那么该如何成为一名合格的软件工程师呢?这是我们要考虑和学习的.为此,我们需要先了解一些基本概念和技术. 既然是一个开发团队,那么绝大部分的软件都是由多人合作完成的,大家的工作相互有依赖关系.所以需要单元测试来保证整个开发过程各个模块的正确性,单元测试可以保证自己负责的模块功能定义尽量正确,模块内部的改变不会影响其他模块,而且模块的质量能够得到稳定的.量化的保证.书上介绍了一种用VSTS写单元测试的代码: [TestMethod(

《构建之法》---软件工程师的成长&amp;两人合作

本周学习了<构建之法>第三.四章的内容. PSP对软件开发的工作质量的衡量简单指标为:项目/任务有多大.花多少时间.质量如何.是否按时交付共4个因素.而要成为一名合格的软件工程师,要对上述4个因素尽量在用户需求上做到尽善尽美. 软件工程师的职业发展有: 职业发展---考级之路 计算机等级考试 (http://sk.neea.edu.cn/jsjdj/index.jsp) 全国计算机技术与软件专业技术资格考试 (http://www.rkb.gov.cn/  ) 职业成长---Steve McC

JAVA软件工程师笔试试题

JAVA软件工程师笔试试题 (考试时间:120分钟 试卷分值:150分 ) 一. 逻辑推理题[10分] 1.甲.乙.丙.丁四位同学中有一位同学为海啸灾区捐款1000元,当老师询问时,他们分别这样回答: 甲:这1000元不是我捐的 乙:这1000元是丁捐的 丙:这1000元是乙捐的 丁:这1000元不是我捐的 这四人中只有一个人说了真话,由此可见这1000元是谁捐的( ).[2分] A.甲 B.乙 C.丙 D.丁 2. 甲.乙.丙三人是同一家公司的员工,他们的未婚妻A.B.C也都是这家公司的职员.

一位软件工程师的6年总结

一位软件工程师的6年总结 一位软件工程师的6年总结http://www.jsjbbs.cn/thread-3001-1-1.html(出处: http://www.jsjbbs.cn/) “又是一年毕业时”,看到一批批学子离开人生的象牙塔,走上各自的工作岗位:想想自己也曾经意气风发.踌躇满志,不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼,希望对所有的软件工程师们有所帮助,早日实现自己的人生目标.本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议,前面几点旨在确定大的方

推特公司对软件工程师高效工作的建议-转载

“我们很难测量软件工程生产力,”推特公司工程效率部的技术总监彼得.塞贝尔说,“但是我们肯定能破坏它.” 在一场脸谱网举办的大会上,塞贝尔这样说道.这场大会集结了1800名来自约400家不同公司的软件工程师,他们开发的应用软件可能会被数百万甚至数十亿人使用.它讲述了一个关于推特公司软件进化升级的故事:一个有许多不同程序语言的babel,像Ruby, Java, and Scala,因为需要各类工程师一起协作,所以很难完成,但最后(大体上)完成了. “作为一个知道如何去升级软件的行业,我们也知道如何

vc++视频教程 软件工程师培训课程 VC知识库大讲堂

下载地址: http://www.enginedx.com/78/m299/ <C/C++软件工程师实战能力集训大纲>的现实意义在哪里?]         1.作为一个C/C++软件工程师,需要掌握的东西真是挺多的:        2.纵观目前中国的C/C++ 人才队伍,能满足以上能力要求的,只在少数.很多用人企业感叹,社招的人员能力参差不齐.普遍现象是他们只对其中的某一小部分内容有一个熟练的掌握,而对大部分的内容一知半解,甚至一无所知.这也是直接导致国内软件业开发实力普遍不强的最重要的原因.

JAVA软件工程师应该具备的技能有哪些?

前言:有朋友问我:学历和能力哪个重要?我个人觉得能力大于学历,没有能力哪来的学历,学历只是证明能力的一方面.为此在能力方面畅谈java软件工程师必备的能力.作为一名合格的java工程师,不仅需要学历,更重要要有扎实的能力(技能)功力. 1.编程语言能力. 作为一名专业的软件工程师,应该能够熟练掌握JAVA语言,并且能够深入理解OOP.OOA.OOD等编程思想.精通一门编程语言能为以后的软件开发打下坚实的基础. 2.编码能力. 这里说的编码可不是照着书本敲代码,而是能够独立的运用代码,编写一个程序

软件工程师

软件工程师的技术要求是比较全面的,除了最基础的编程语言(C语言/C++/JAVA等).数据库(SQL/ORACLE/DB2等)..NET平台技术.C#.C/S B/S程序开发,还有诸多如JAVA SCRIPT.AJAX.HIBERNATE.SPRING.J2EE.WEB SERVICE.STRUCTS等前沿技术.除此之外,关于网络工程和软件测试的其他技术也要有所涉猎,以利于操控全局.