【伯樂在線】成爲谷歌軟件工程師你須要準備什麼?

【伯樂在線導讀】:本文源自 Quora 同名問答貼。Google 程序員 Gaurav Jha 的回答得到了 5200+ 贊。他從谷歌員工角度給出了6點重要的建議,而且回答中包含大量資源連接。 css

谷歌員工眼中的6個關鍵點java

  • 在我向你提供課程列表前,先讀第一二點
  • 全職工做人員——基於你的行業經驗和學術背景去選擇性的看待這個回答
  • 準大學生——請直接跳到第七點

標記說明:python

  • # 可選的
  • **必須的

#第一點:讓咱們回到這個問題自己,也便是如何準備才能讓本身成爲「優秀」的軟件工程師?

是的!這個問題的剩餘部分都是可選的。加入谷歌不是登月計劃。任何優秀的軟件工程師都有好的機會成爲谷歌工做文化的一部分。問題是你如何定義「優秀」。git


**第二點:調整態度

在你給谷歌招聘人員留下深入印象以前,讓咱們來看看谷歌的軟件工程師這一角色是不是你真正想要的。程序員

軟件工程師並非像廣泛觀念所說的那樣有趣。除了用戶界面和用戶體驗的職位,一般來講,無論你用什麼文字編輯器——Eclipse,Vim或者Emacs——你的屏幕將是黑的,無聊和枯燥的。全職的軟件工程師不只須要有從事複雜算法的能力還須要足夠的包容和耐心來一絲不苟地關注大型程序上的細節。github

在谷歌,一般大多數軟件工程師的角色主要是處理數學問題。你掌握了多少種語言或者你把Java,C,C++等玩的多溜是無所謂的。算法

重要的是這個四個目標:spring

  • 你創造有效算法的能力
  • 你閱讀別人寫的代碼以及發現其中存在任何問題的細心品質
  • 你的學習和實現新技術趨勢而且適應需求的好奇心
  • 最後也是最重要的:你創造了什麼,如何創造的?

我必須之處要實現以上四個目標並不容易。咱們大多數谷歌員工都有一段苦逼時間來達到這些目標,可是咱們嘗試過,因此你也應該去嘗試。數據庫

每一個人都有不一樣的學習方法。於我,我天天讀一篇我在Quora連接上找到的研究論文(可能和也可能不和計算機科學有關),一篇谷歌的研究文章(內部記錄)。apache

一旦你加入谷歌,將能夠訪問全部的代碼庫,數據庫,論壇,研究論文和一些能給你學習時提供巨大幫助而你卻沒法在維基百科上找到的項目。但當你在爲加入谷歌而準備路上時,有幾樣事情在學習的過程當中很常見。在第五點中,你將會更多地瞭解到——怎樣來實現這四個目標——但在這以前有些前提仍是須要看看的。因此,咱們進入下一點吧。也便是:

#第三點: 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 SpertusHow 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

  • 統計&機率

注:當你上大學和讀研究生時,大綱就會變成機器學習的算法了。對於大多數大學生,機器學習課程的頭三個月裏數學使他們苦不堪言,而當他們好不容易遇上進度了,大綱又推動到更加機器學習複雜的領域,好比深度學習,神經網絡和神經網絡流處理。
# Pre-University: Google Recommended/Sponsored Programs.
#準大學生:谷歌推薦/贊助的項目

這個比賽爲年齡在13至17歲的準大學生介紹了各類各樣使得開源軟件開發成爲可能的貢獻。

谷歌RISE是一種對合夥人的獎勵,它獎勵旨在促進和支援爲全世界的K12*小學生和中學生的STEM*以及計算機教育舉措的項目。

*K12,從幼兒園到12年級

*STEM,Science,Technology,Engineering,Math,科學、技術、工程、數學

這個項目使得來自不一樣社區的中學生能夠接觸到STEM領域的大學和職業。

編程是種新能力-它承載着創造、創新和文明改造世界的潛能。這個舉措旨在激勵數以百萬計的女孩體驗代碼的魔力。

這個爲期一天的項目旨在爲優秀的高年級中學生在上大學前提供有價值的商業技巧。

先驅者項目是一個全球性的網絡,這裏彙集着領導者、倡導者和計算機教育大使,大使們負責讓全球的青年和教育工做者經過計算機科學被聯繫和激勵。

谷歌科技博覽會是對13到18歲青少年開放的全球性競賽。學生在線提交項目並獲得贏得大獎的機會。

CSSI是一個爲期三週的暑期項目,針對即將進入大學且對學習計算機科學感興趣的新生而設。

30天的DIY和製做活動。Maker Camp是一個在Google+上對全部人開放的免費虛擬暑期露營活動

在Google+ 上和老師、教育組織協做來爲K12學生提供經驗性的學習機會。

相關文章
相關標籤/搜索