本文源自 Quora 同名問答貼。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-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學生提供經驗性的學習機會。