【為什麼我們挑選這篇文章】程式設計每年都在變化,本文原作者 John Washam 當年求學時 C++ 都算新潮了,更別說 Python,聽都沒聽過,但為了完成人生目標「到 Google 工作」,他幫自己設計了一套學習寶典,雖然最後沒進 Google,但只用了 8 個月就進到亞馬遜 AWS,還是非常強大!(責任編輯:鍾佳瑀)
本文經 AI 新媒體量子位(公眾號 ID:QbitAI)授權轉載,轉載請聯繫出處
作者:量子位
Google 工程師條件:名校出身、CS 專業背景、博士學位加持,技術過硬?國外一個叫 John Washam 的小哥告訴你:不用,自學 8 個月 也可以!
John Washam 勵志要成為一名 Google 軟體工程師,但沒有 CS 專業背景的他,只能通過自己的努力來達成理想。於是,8 個月的時間裡,小哥花了數千小時閱讀書籍、編寫程式碼、觀看 CS 技術講座,一路披荊斬棘、打怪升級。
最終,雖然沒有去 Google ,但他人到中年,還順利成為了一名亞馬遜 AWS 的技術專家,年薪百萬。
更加難能可貴的是,小哥還將 自學經驗 編寫成了一份 教程 ,在 GitHub 上線以來,已收穫近 10 萬星的好評。
正如他所說:
即便沒有面上 (?) 夢寐以求的 Google,但是教程,也可以用來好好充實一下自己
(教程有 中文版 哦~~)
GitHub 超 10 萬星自學寶典
是什麼樣的程式設計教程,能如此火爆?
小哥最初的目的是「考上」Google ,於是每天自學 8-12 個小時,堅持了 8 月有餘。邊學還順手整理出了這份自學專案。不過在完成這項學習計劃後,他最終被亞馬遜錄取,成為一名軟體工程師。
Washam 表示:
無論你要面試哪家軟體公司,這裡的資料可以讓你做好充分的準備,包括去像亞馬遜、Facebook、Google 和微軟這樣的科技巨頭。
接下來,我們就跟著 Washam 的腳步去瞭解一下這份面試寶典。
1. 選擇語言、必備知識資源
首先要做的就是選擇一門語言,在 Google 一般是 C++、Java、Python,有時也會用到 JavaScript、Ruby。背後還有一些如 SQL、HTML 等技術沒有列出。
接著開始學習計算機硬體知識:
然後補充計算機專業的基礎數學知識,如算法複雜度 / Big-O / 漸進分析法、數據結構、樹、排序、圖論。
此外還有遞歸、動態規劃、組合與概率、NP&NP -完全和近似算法、緩存、線程與進程、系統設計、可伸縮性、數據處理。
看到這麼多知識點,你會不會覺得有點懵呢?Washam 告訴你一點小技巧。因為你不可能一遍就記住所有知識點。所以需要把要回顧的知識點做成 Flashcard:正常的及帶有程式碼的,類似於背單詞。
每種卡都會有不同的格式設計。專案主頁中就有 Flashcard 的程式碼,可以根據自己的學習特點去製作。
Washam 還留有一組 ASCII 碼表、OSI 堆棧、Big-O 記號及更多的小抄紙,以便在空閑的時候可以學習。每 coding 半個小時就要休息一下,並去回顧你的 Flashcard。
當然,論文的閱讀也是必不可少的,尤其是 Google 曾經發表的一些基礎技術論文。
書籍則推薦一些關於算法和 C++程式設計之類的。
2. Google 面試注意事項
面試的第一步當然是要有一份好的履歷,這樣才能為你爭取到寶貴的面試機會。知名科技部落客 Steve Yagge 給出了 10 個 tips,幫你做出一份還不錯的簡歷。
這位 Steve 曾經在亞馬遜、Google 都工作過,Washam 的這個專案就大量地引用了他的技術博客內容。
在面試時,你可能會遇到這 20 個問題,每個問題準備 2-3 種回答。準備點故事,而不要只是擺一些你完成的事情的數據。
面試官在也會問你還有哪些問題,不要說自己沒有什麼要問題,可以試試問一些此類問題:
當然,進入 Google 也不意味著結束,你還要新的學習過程。Washam 還有一份附加內容,包括 Emacs 和 Vim、Unix 命令行工具、密碼學。這些內容雖然不會直接用到,但是會大大提高你的效率。
3. 一個 Web 前端的新征途
其實嚴格來講,John 並不是一個程式設計小白。
從高中起,John 就開始學習程式設計,學的是 BASIC 語言,這還在是上世紀 90 年代。大學畢業拿到經濟學學位後,他先是在軍隊服役兩年,駐紮韓國。退役後他留在韓國教英語,突然發現自己離開 CS 領域的這幾年間,太多的新技術新工具出現,自己的知識結構出現了斷層,無法支撐起一個工程師的職業生涯了。
於是他利用一切業餘時間,艱苦地學習 Perl、HTML、CSS(當時這還是新東西)、JavaScript 和 SQL。
終於在 2001 年,John 正式成為了一個網頁開發工程師,開始了 19 年的碼農生涯。
截止 2017 年,John 的職業生涯可謂十分成功:在大小公司都有過任職、組建管理過專案團隊、經營壯大過初創公司,自己還親自創辦了 3 家軟體公司,其中 2 家至今還在健康運營。
按照 John 自己的話說,這十幾年的工作經歷,將他鍛鍊成了一個合格的工程師、一個優秀的產品經理、一個 CEO、一個市場銷售。
但是他的目標不止於此。他的夢想是在 Google 任職軟體工程師,在充滿智慧和創造力的團隊裡提高自己。
最初他認為憑自己的工作經驗可以輕鬆獲得職位,但拿到了 Google 面試題他才發現自己欠缺太多。
一個優秀的軟體工程師應該精通數據結構和算法、彙編語言、內存設計等,還要綜合考慮程式碼和程序結構對機器在應用場景下的影響。
於是他以這份 Google 試題為指導,開始了程式設計自學。
並且在 GitHub 上建立了「9894 專案」,因為 Google 建立於 1998 年 9 月 4 日。後來這個專案改名為現在的「coding interview university」。
4. CS 自學三點注意事項
John 結合自己的學習經歷,給出了三點自學程式設計的建議。
一、早問早計劃,不要想當然
John 最大的教訓是自己花了太多時間學習根本用不上的東西,比如他曾經用了 3 周時間閱讀了 1000 多頁 C++ 的資料,但是最後面試和工作中用的卻是 Python。
原因是他擔心面試時可能會被問到。
這個例子不是說 C++ 沒必要學。而是強調你要 提前收集信息做出計劃 ,在不同的專案上分配合理的學習時間,提高效率。 切忌「我覺得……」。
二、影片比看書效率更高
觀看影片的學習效率自然要比自己啃書快。
找到好的教學影片,意味著你有更多的時間實際演練程式設計題目。
三、反復溫習十分重要
不斷反復是形成記憶的關鍵,正如我們在上文提到的,John 推薦使用記憶卡。
他自己製作了 1792 個電子 Flashcard。一有空閒時間就掏出來溫習,比如超市排隊時、公車上等等。對於一個卡片的的問題,回答正確還不夠,John 會在一段時間內多次回答正確才會標記為「已掌握」。
最終這位小哥沒有去 Google,而是接到了亞馬遜的 offer,現在他在亞馬遜做軟體工程師。
但是他自己說之前的學習經歷並不是無用功,現在他已經全面掌握了軟體工程的基本技能,無懼工作中的任何挑戰,並且實現自我飛躍的那一天越來越近。
I’m about as prepared as I can be. I can’t keep studying and putting off the application forever. At some point, I have to take the leap.
I see a bright future ahead.
Thanks for taking the time to read my story.
而且 John 小哥的經歷,也不侷限於工程師本身,多於更多人而言,也有值得參考之處。
他認定了一個目標,然後制定計劃、勤奮付出,最後天道酬勤獲得回報。
John 可能也是一個「一萬小時定律」的擁躉,但就算按照他每天 12 小時、堅持 8 個月 (每月 31 天),他從一個網站前端到 AWS 技術專家,歷時也不過 2976 小時 ——遠未到 1 萬小時。
但就是這樣目標堅定的 8 個月,John 從入門到獲得大廠認可,百萬年薪加持。
這是我們在 GitHub 看到最勵志的故事,也是我們希望讓更多人看到的原因,並且由衷希望更多人因為這樣的經歷和分享,創造屬於自己的故事。
坊間笑談太多的「從入門到放棄」,但也有人「從入門到百萬年薪」。
生命不息,奮鬥不止,Keep walking~
(本文經 AI 新媒體 量子位 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈GitHub 上最励志的计算机自学教程:8 个月,从中年 Web 前端到亚马逊百万年薪软件工程师 | 中文版 〉,首圖來源: Unsplash。)
你可能有興趣
◊ 【照片動動動起來】Google 跟柏克萊用 Python 寫出全新讓靜態圖 2D 轉 3D 的無痛方式!
◊ 微軟工程師推出 Python 零基礎課程,用 10 分鐘的短片讓你輕鬆上手!
◊ 程式教育納入課綱,中學生該學 Python 還是 Java?其實科技思維才是重點