我是如何在自學編程9個月后找到工作的

1

天津11选5走势图分析 www.lixcgb.com.cn 昨天在我在國外網站 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)人脈 > 經驗 > 知識。

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

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

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

最后就是你的知識,而且這很重要。如果沒人幫你遞簡歷,說你是個優質資源,那知識就是你最后的王牌。你發布了兩個安卓的應用,簡歷上至少有東西可寫??贍苣慊卮鴆渙吮晃實降奈侍?,但如果給你時間,你總能做出一個產品。所以知識成了你唯一的資源,但不那么有力。當你坐在一個 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
原文地址: https://www.reddit.com/r/learnprogramming/comments/9j3oi5/after_9_months_of_teaching_myself_how_to_program/

共 1 條評論

  1. 回復

    自學需要毅力。

發表評論

您的郵箱不會公開,當您的評論有新的回復時,會通過您填寫的郵箱向您發送評論內容。 必填字段 *

為何看不到我發布的評論?

正在提交, 請稍候...