本文源自 Quora 同名問答貼。Google 程序員 Gaurav Jha 的回答獲得了 5200+ 贊。他從谷歌員工角度給出了6點重要的建議,并且回答中包含大量資源鏈接。
谷歌員工眼中的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*
*譯者注:這個鏈接是上的,國內有很多電驢的資源,親測可用(如果找不到可用鏈接,譯者可提供)
學習人工智能的知識
在線資源: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來閱讀別人的代碼或者去貢獻一個項目是一種很好的方式。
在線資源:Github, Kiln
和其他程序員一起參與項目
注:這將會幫你提高在團隊工作的能力,也使你能夠向他人學習。
鍛煉你的算法知識和編程能力
注:通過像CodeJam或者ACM ICPC這些編程競賽來鍛煉你的算法知識
在線資源: CodeJam, ACM ICPC*
*譯者注:國內有很多OJ也可以起到這個作用,比如POJ、九度等
成為一個助教
注:幫助教其他學生將會有助于增加你在這個學科的知識
軟件工程方面的實習經歷
注:確保你在實習招聘期來臨前申請了實習工作。在印度和美國,實習期在暑假,5至9月份,而申請通道通常提前幾個月就打開了。
在線資源:.com/jobs
#第六點:谷歌推薦/贊助的項目和團隊
在你興趣領域內,你可能選擇訂閱的課程很少。這些課程和項目是非常好的學習地方,但他們不會增加或減少你進谷歌的機會——他們不等于實習。(更多信息來自 Robert Love)
谷歌課程——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
統計&概率
注:當你上大學和讀研究生時,大綱就會變成機器學習的算法了。對于大多數大學生,機器學習課程的頭三個月里數學使他們苦不堪言,而當他們好不容易趕上進度了,大綱又推進到更加機器學習復雜的領域,比如深度學習,神經網絡和神經網絡流處理。
# Pre-University: Google Recommended/Sponsored Programs.
#準大學生:谷歌推薦/贊助的項目
谷歌的Code-in項目(GCI)
這個比賽為年齡在13至17歲的準大學生介紹了各種各樣使得開源軟件開發成為可能的貢獻。
RISE獎金
谷歌RISE是一種對合伙人的獎勵,它獎勵旨在促進和支援為全世界的K12*小學生和中學生的STEM*以及計算機教育舉措的項目。
*K12,從幼兒園到12年級
*STEM,Science,Technology,Engineering,Math,科學、技術、工程、數學
前沿計算機科學研究院(LEAD-CSI)
這個項目使得來自不同社區的中學生可以接觸到STEM領域的大學和職業。
用代碼創造
編程是種新能力-它承載著創造、創新和文明改造世界的潛能。這個舉措旨在激勵數以百萬計的女孩體驗代碼的魔力。
高中座談會
這個為期一天的項目旨在為的高年級中學生在上大學前提供有價值的商業技巧。
先驅者
先驅者項目是一個全球性的網絡,這里聚集著領導者、倡導者和計算機教育大使,大使們負責讓全球的青年和教育工作者通過計算機科學被聯系和激勵。
谷歌科技博覽會
谷歌科技博覽會是對13到18歲青少年開放的全球性競賽。學生在線提交項目并得到贏得大獎的機會。
計算機科學暑期研究所(CSSI)
CSSI是一個為期三周的暑期項目,針對即將進入大學且對學習計算機科學感興趣的新生而設。
Google+露營項目
30天的DIY和制作活動。Maker Camp是一個在Google+上對所有人開放的免費虛擬暑期露營活動
互聯教室
在Google+ 上和老師、教育組織協作來為K12學生提供經驗性的學習機會。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。