我是如何在自學程式設計9個月後找到工作的

Crossin先生發表於2018-09-28

昨天在我在國外網站 reddit 上看到一篇文章,作者分享了他自學程式設計 9 個月後找到工作的經歷。文章不到一天就得到3千多贊,2百條回覆。我看了下內容,非常中肯,其中有不少建議也是我在程式設計教室屢次提過的。所以我連夜翻譯了出來。原文略長,我做了適當的縮減。另外加上了一點我的想法(括號內斜體字)。雖說國情有不同,但本質是相同的,對想要入行的朋友很有參考價值。


長話短說,2017年12月,我處於人生的十字路口,無論是繼續完成看不到盡頭的化學碩士學位還是重新尋找自己的出路都令我感到糾結。那時我寫了一些程式碼(也就幾百行 Python),感覺不錯。我決定靠著積蓄來學習程式設計,直到找到一份開發的工作。

回顧這個漫長而艱難的旅程,我想分享一些經驗,它是如何開始以及如何結束的。我的觀點沒有特別的順序,雖然我會先寫一些我認為最重要的。

1)設定一個非常精確的目標。我是指現實的目標。這是你旅程中最重要的方面,你需要對終點線有清晰的認識。你學習程式設計,是因為想解決一些實際問題嗎?也許你想要自動處理你工作/生活中的一些任務,也許你想破解遊戲,也許你出於好奇心,也許你喜歡學習新事物,又也許你是一個想開發應用卻沒有資金的企業家。而本文中,我主要針對想要通過學習程式設計找工作的角度來談。

2)如果你的目標是找工作,就盯著就業市場看,而不是 Twitter 和 Medium 上的熱點。還記得第一點嗎?你必須設定一個非常精確的目標。諸如“我想成為一名開發人員並從事遊戲行業”這樣的目標就過於模糊。你的首要任務是什麼?是尋找一個真實的開發工作,還是在遊戲行業工作?如果你在遊戲行業找不到工作怎麼辦?你的城市沒有此類公司,或者你達不到遊戲公司的要求怎麼辦?其實不論你學習哪種程式語言,我敢說將來某一天這些知識都可能用在遊戲開發上,只要這是你的目標。你將需要學習大量的新東西。但是你有解決問題的能力和程式設計知識才能邁出第一步

你是一名自學成才的開發人員,不是 MIT 的優秀畢業生,找到一份異地的工作會更難。我在2017年12月犯了一個錯誤:我認為首要任務是找到一份前端開發的工作。但我沒意識到,在我的地區 C#/php/Java 的工作與前端 JS 工作的比例為9:1。因此,請查查你所在地區的公司,看看它們的職位和要求。

(如果你的目標是轉行,不妨從初級職位先入行,再不斷調整到你期望的方向)

3)永遠永遠不要假設在程式設計中什麼更難什麼更容易。當我決定學習前端時,我這樣做了。這是一個巨大的錯誤。不好說前端比後端更容易,或是更難。關鍵是,你也無法知道自己會更喜歡什麼,更適應什麼。所以不要假設。永遠不要認為 JavaScript 比 C 更容易或是更難。不同工具對於不同問題的有不同的複雜性,你還沒有到能區分什麼“更難”什麼“更容易”的程度,我也是。就別去衡量。你能說清,從現在開始的24個月內,在某平臺上提升渲染和網路效能比優化基於地理空間資料預測天氣的演算法“更容易”嗎?你確定在複雜的實時應用程式中管理狀態比編寫著色器或教電腦如何翻譯或繪畫更容易嗎?你根本就不知道。所以,千萬不要做這種無腦的假設。

4)堅持學習。你有多少時間學習程式設計?你是學生嗎?還是失業了(就像我一樣)但是有足夠的積蓄來投入學習。你的目標要符合實際,但要堅持。每天寫1小時程式碼會比每週寫一次7小時的程式碼會使你成為一個更好的程式設計師。

5)不必懂得職位所需的一切。對於框架和庫尤其如此。頂級公司非常關注資料結構和演算法,這表明你可以思考並解決問題。更具體地說,無論你選擇何種程式語言(Java,JavaScript,C#,Python 和 PHP 中的任何一種都可能找到工作),儘可能地學習它的基礎知識。我學習了前端開發。我覺得這需要從 html 到 dom,學大量的庫,transpiling,webpack 等等。但實際上,在求職面試中,這些話題很少被問起,他們只想知道我是否真的瞭解 JavaScript。我申請了3個前端 React 工作,沒有人關心你是否知道 React 的呼叫(我的意思是,如果你學習 React,你應該至少具備它的工作原理的基本知識),但成為一名優秀的 React 開發人員所需的核心知識就是了解 JavaScript。如果你瞭解 JavaScript 和 dom,那麼學習 React 只需要一週的時間。否則你永遠不會成為一個好的 React 開發者。高階函式,this 繫結,這些是 React 開發人員每天需要真正面對的問題和知識,其餘的都是谷歌搜尋。這同樣適用於任何其他語言。如果沒有紮實的語言基礎,各種 bug 會讓你一籌莫展。僅僅讀過一些東西,並不意味著你吸收了它,更不談掌握它了。一個會 10 種技能/工具,但並不真正精通一個的人,很難取得別人信任。

6)嘗試尋找一個導師。Slacks, IRC, Discord 上很多人比你有經驗,你也許能找到願意長期幫助你的。感謝 freenode 的 javascript 頻道所有成員對我學習的幫助(特別是 ljharb,slikts,stennowork,liste,innovati,zsoc,cjhonson,qswz,GreenJello,sillyslux)。請注意,我不是讓你們去聯絡這些人,他們在討論組中提供幫助而不是一對一。兩個建議:1. 不要考驗導師的耐心和意願。如果你一直在問可以搜尋或書上查到的基本問題,他們會厭煩並懶得回答你。2. 程式設計師,包括你在內,都希望別人認可自己的聰明,我認為這是理性人的本質。你可以利用這一點,比如:如果你進入聊天室並寫“平心而論,我覺得在座各位不會繫結箭頭函式”,你會得到20個回覆。而如果你問“箭頭函式怎麼用?” 可能不會有任何答案。

(一個過來人的建議和指導對於學習非常有幫助,這是任何書本、教程或者視訊都無法達到。關於這點,參與過程式設計教室碼上行動的各位同學應該深有體會)

7)瞭解什麼是程式設計將資料作為輸入,對它做一些處理,生成一個輸出。這就是每個程式所幹的事情。把兩個數字相加:輸入數字 -> 處理 -> 輸出總和。在螢幕上渲染3D模型:相機+頂點矩陣 -> 處理 -> 螢幕上的2D影象。在網站上設定你的個人資料圖片:資料輸入+地址 -> 處理 -> 來自伺服器的響應。這就是程式設計的全部,一切都是為了計算。資料 -> 處理 -> 資料。不過我對資料結構和演算法知之甚少。我不太能實現歸併演算法或實現複雜的資料結構,在面試中也沒有真正要求它們。知道時間複雜度和不同資料結構的應用對於我的面試來說已經足夠了。但在其他公司和職位上可能會有所不同。

8)瞭解程式設計師做什麼。他們通過程式碼解決問題。作為程式設計師,你需要解決問題(通常由你自己建立)。不能解決程式碼的問題,那要你何用。如果你認為跟隨 youtube/udemy 上的一些廢話視訊可能會讓你成為一名程式設計師,那就大錯特錯了。看別人替你解決問題意味著你沒有提高問題解決技巧。所以當你無法理解某些程式碼時,別急著谷歌或問人。要知道,這就是你要面對的工作。善於解決問題,有些可能是語法問題(如前所述),有些可能與效能有關,等等。學會使用偵錯程式。程式碼只是想法的實現,習慣用鉛筆和紙程式設計。定義好你的問題,輸入,輸出以及如何從一個到另一個。整理你的程式碼,看看你亂七八糟的麵條程式碼,看看你凌亂和命名不佳的函式和變數,超過幾百行就難以維護的程式碼,試著改進它。

9)掌握計算機的基本常識。認真臉。你起碼要了解馮·諾伊曼結構和記憶體模型,這些幾小時就能學完。哪怕是通過維基百科、Youtube 或者是一些部落格,至少做下這件事。搞懂記憶體模型和呼叫棧,你的程式碼水平將會提升,你也會碼得更快。你再也不會搞不清:為什麼你不能修改一個字串,或者為什麼是通過引用而不是值來傳遞非基本型別。這對提升你的學習速度,加深你對計算機執行原理的瞭解具有重要意義。

10)不要跟著視訊學習。你需要做得事情越高階,越小眾,你能使用的資源就越來越少。你要習慣用谷歌也搜尋不到多少資訊的情況。你將會需要使用文件很少或者為零的程式庫,需要檢視程式碼來搞清楚為什麼這個庫改變了那個物件型別,或者執行情況和預期不同。去 Github 上看一些熱門的庫,那裡有很多問題可研究。在你之前,那些優秀的工程師從來沒遇到過這些問題。我知道這不容易,但這是個好習慣。我還沒見到過哪個程式設計問題在視訊中比在出色的書或文章中寫得更好。而且要注意,很多做這些課程的人並不一定是優秀的程式設計師;即使他們是,他們也不見得是好的老師。我不是說“不要使用視訊”。有很多視訊幫了我大忙,幫我理解概念,解決問題,以及看怎麼使用一些技術。但是不到最後,不要用這個資源,不要依賴它。比如我自己很喜歡 Andrew Mead 的 React 課程,但如果我沒有自己去研究,一遍遍嘗試,那我看到過的內容都沒變成我自己的。靠著某個視訊,瞭解關於某個軟體特定版本的例子,只是不得已的替代方案。

(你覺得真正的程式設計大牛會整天開直播給你講怎麼寫入門程式碼嗎?)

11)除錯和版本控制。這對於學習語言和計算機基礎是最重要的,也是工作環境中最需要的東西。其次是工具的使用。如果你掌握 Java,那麼學習 Spring 比學習 docker 和 git 要容易得多。但你可能會花 95% 的時間來編寫 Spring 程式碼。又比如你掌握 Python,你可以在一個週末學會 Django,但需要花更多時間學會除錯錯誤的 Python 程式碼。關於 IDE 也是,知道 5 個 IDE 不如熟練使用 1 個。這些未必是初級職位的必備技能,你可以不去了解它們,但這個東西是長期有用的。

除錯 debug 版本控制是區分新手與程式設計師的重要標誌,對求職也很加分,參考 開發5分鐘,除錯2小時 - 該如何debug?

12)不要試圖一次學習太多東西。小步走,但要穩。我犯過這樣的錯,並且付出不小的代價。不是說讀 Hennessy 和 Patterson 的著作沒用,或者說關於設計模式的閱讀是無用的,也不是說看 Youtube 視訊、有趣的技術討論、閱讀行為驅動設計沒用,但是還記得第一點嗎?你必須明白什麼是首要的,紮實走好每一小步。如果你和我一樣,充滿好奇心,那很好。但是,先找到一份工作,在一個舒適的環境中,拿著一份薪水,跟著資深開發者學習,然後回家嘗試用 Rust 程式設計,看關於不可變性的談話,難道不是更好嗎?

關於招聘:

13)人脈 > 經驗 > 知識。

大多數公司都是長期招聘,但沒對外公佈,可能他們的網站上連個“聯絡我們”都沒有。所以在找工作時,人脈至關重要。我強烈建議你加入當地線上的社群,線下的更好。我寄出的簡歷全都沒有迴應,我得到的所有面試機會都來自我認識的人。當對方知道你是個開發者時,可能會對你說,“你感興趣的話,我可以把你的簡歷遞給我的頭兒。”

如果你是自學的開發,那求職可能有些難(不過這個視地區和職位而定)。儘管你技術很強,知識豐富,但你的簡歷上沒有經驗可寫。只是說我會 Python,沒人會給你面試機會,因為你沒法證明。招了你可能意味著公司要賠錢。養著幾個不產出還拿工資的開發者,人力部門不如做一些別的事。我知道技術過硬卻沒法展示是怎樣地痛苦,但現實就是這樣。

所以人脈之後,第二重要的是有經驗。你有兩個選擇:參與開源專案(寫點有用的庫/模組,哪怕提交一個好的修改也能加分)或者開發一些人們會用到的東西,甚至是給別人免費使用。我選擇了第二種。我為我們市的一個足球俱樂部開發了一個應用,這個俱樂部需要通知球員週日哪些青年球隊會來比賽。這個應用算不上好,但每週數百人都要用到。你能用程式碼解決一個現實生活中的問題,滿足人們的需求,已經很了不起了。我還給我叔叔寫了一個短租網站,沒有實時預定的複雜資料庫,但是解決了他的問題。就算它有很多反模式,影響大嗎?可能你做了一個精緻的 Instagram 復刻版,程式碼也更清晰,但是會有人用它嗎?其中有你的原創嗎?可能你有一部智慧電視,你總是要把硬碟裡的各種節目拷貝到電視機上來看,為此感到心累時,有想過做些什麼嗎?你有一個路由器,還有一個可以安裝軟體的程式的電視機。不如花一個月寫一個粗糙簡陋,但卻有用的 app,可以讓你的電腦和電視進行資料傳輸。這些寫到簡歷上也很好看,因為他們給你機會來談論你是怎樣解決問題的,比如你什麼地方做得好,什麼地方做得不好。我的第一個 React app 沒有用狀態管理器,隨後我遇到很多由此導致的問題,維護程式碼也越來越難。我遇到了問題,解決它,而且能知道我的解決辦法是好是壞。看看你的周圍,你能做哪些事情來幫人們解決問題?從你自己的問題開始,繼而關注別人的,哪怕是做免費服務。而你用 Django+PostgreSQL 完美復刻 Twitter 有什麼好談的呢?

(很多人說學完基礎不知道做什麼,但其實身邊處處都可能用到程式設計。我們也舉過很多例子,公眾號Crossin的程式設計教室裡回覆關鍵字 專案

最後就是你的知識,而且這很重要。如果沒人幫你遞簡歷,說你是個優質資源,那知識就是你最後的王牌。你釋出了兩個安卓的應用,簡歷上至少有東西可寫。可能你回答不了被問到的問題,但如果給你時間,你總能做出一個產品。所以知識成了你唯一的資源,但不那麼有力。當你坐在一個 10 年經驗的人面前,說著“value”而不是“variable”,別人就對你的水平有所瞭解了。假設沒人推薦你,沒人用你寫的程式碼,你的 GitHub 上是一堆剛初始化或者廢棄了的專案,或者是從教程裡複製來的一些片段;假設你被問到一些基礎問題(其實也是最難的),而你不能自信地給出一個清晰的答案,誰會付你錢呢?

14)小貼士1:如果在你正式找工作前有 6 至 7 個月的準備時間,我推薦學下 C 語言。這是一門很小的語言,但可以教會你很多。這麼說吧,如果我在花 4 個月學習另一門高階語言之前,先花 2 個月學習 C 語言(每天至少 4 小時),並且解決一些 Leetcode 上簡單和中等難度的問題,我會成為一名比現在更優秀的程式設計師。現在技術太多,高階語言中有大量“噪音”。你很快就會從“我怎麼樣從 input 到 output ”這樣的問題上被引誘到別的關注點上,而這卻是寫一個完整程式碼最最基本的步驟。我知道編寫“input”和“output”一點也不酷,但還記得第一點嗎?我們需要儘快找到一份讓自己能掙錢的體面工作。學習 C 語言,可能起初比較慢。但當你學習下一門語言時,你最後會發現和使用 C 語言解決問題是一樣的,只不過要使用無數的 API。

15)小貼士2:學會管理你的時間。你整天坐在電腦前學程式設計,順手刷一刷各種網站很有誘惑力的,但這些都是在浪費時間。如果你能把時間管理好,那你的準備時間可以大大縮減掉幾個星期甚至幾個月。

16)小貼士3:休息,社交,戀愛,娛樂,照顧自己,這些都超級重要。一個人坐在那裡,整天看著部落格,盯著Visual Studio,對你的精神健康沒有好處,而且會讓你和別人格格不入。努力學習,懂得自制,但是在生活的其他方面也要自制。因為一旦這個平衡被打破,其他地方也會出問題。

就寫這麼多,如果寫太長了,請不要介意。希望有人會覺得這篇文章有幫助,且這只是我個人的見解,可能會有很多人不贊同。


作者:ep1939

原文地址:

reddit.com/r/learnprogr



════

其他文章及回答:

如何自學Python | 新手引導 | 精選Python問答 | 如何debug? | Python單詞表 | 知乎下載器 | 人工智慧 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺

歡迎搜尋及關注:Crossin的程式設計教室

我是如何在自學程式設計9個月後找到工作的

相關文章