【伯樂在線導讀】:本文源自Quora 同名問答 po 文。Google 程序員 Gaurav Jha 的回答獲得了 8000+ 頂。他從谷歌員工角度給出了 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-Book Intermediate 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
● 培養對操作系統的深刻理解能力
● 學習人工智慧的知識
在線資源:Stanford University – Introduction to Robotics , Natural Language Processing, Machine Learning *
* 譯者註:史丹佛 Andrew Ng 的這門機器學習課程強烈推薦,譯者也有大量該課程資源。
● 學習如何構造編譯器
在線資源:Coursera – Compilers *
* 譯者註:這門課程也是相當實用,最好跟著可能動手完成課程的編譯器項目。
● 學習密碼學
在線資源:Coursera – Cryptography , Udacity – Applied Cryptography
● 學習並行編程
** 第五點:對非專業性學習建議
● 參與課堂之外的項目
注:創建和維護一個網站,構建你自己的服務器,或者做一個機器人。
在線資源:Apache List of Projects , Google Summer of Code , Google Developer Group
● 參與大系統(代碼庫)中的小代碼片段,閱讀和理解已有的代碼,查文檔並且跟踪調試。
注:用 GitHub 來閱讀別人的代碼或者去貢獻一個項目是一種很好的方式。
● 和其他工程師一起參與項目
注:這將會幫你提高在團隊工作的能力,也使你能夠向他人學習。
● 鍛煉你的算法知識和 Coding 能力
注:通過像 CodeJam 或者 ACM ICPC 這些 coding 競賽來鍛煉你的算法知識
● 成為一個助教
注:幫助教其他學生將會有助於增加你在這個學科的知識
● 軟體工程方面的實習經歷
注:確保你在實習招聘期來臨前申請了實習工作。在印度和美國,實習期在暑假,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 獎金
谷歌 RISE 是一種對合夥人的獎勵,它獎勵旨在促進和支援為全世界的 K12* 小學生和中學生的 STEM* 以及計算機教育舉措的項目。
*K12,從幼兒園到 12 年級
*STEM:科學、技術、工程、數學
這個項目使得來自不同社區的中學生可以接觸到 STEM 領域的大學和職業。
● 用代碼創造
編程是種新能力 – 它承載著創造、創新和文明改造世界的潛能。這個舉措旨在激勵數以百萬計的女孩體驗代碼的魔力。
● 高中座談會
這個為期一天的項目旨在為優秀的高年級中學生在上大學前提供有價值的商業技巧。
● 先驅者
先驅者項目是一個全球性的網絡,這裡聚集著領導者、倡導者和計算機教育大使,大使們負責讓全球的青年和教育工作者通過計算機科學被聯繫和激勵。
● 谷歌科技博覽會
谷歌科技博覽會是對 13 到 18 歲青少年開放的全球性競賽。學生在線提交項目並得到贏得大獎的機會。
CSSI 是一個為期三週的暑期項目,針對即將進入大學且對學習計算機科學感興趣的新生而設。
30 天的 DIY 和製作活動。Maker Camp 是一個在 Google+ 上對所有人開放的免費虛擬暑期露營活動
● 互聯教室
在 Google+ 上和老師、教育組織協作來為 K12 學生提供經驗性的學習機會。
本文由伯樂在線 – 青勁草翻譯,黃小非校稿。未經許可,禁止轉載!
英文出處:Gaurav Jha。歡迎加入翻譯組。
(本文轉載自合作夥伴《伯樂在線》;圖片來源:@sage_solar,CC Licensed;未經授權,不得轉載)