昨天在我在國外網站 reddit 上看到一篇文章,做者分享了他自學編程 9 個月後找到工做的經歷。文章不到一天就獲得3千多贊,2百條回覆。我看了下內容,很是中肯,其中有很多建議也是我在編程教室多次提過的。因此我連夜翻譯了出來。原文略長,我作了適當的縮減。另外加上了一點個人想法(括號內斜體字)。雖然說國情有不一樣,但本質是相同的,對想要入行的朋友頗有參考價值。javascript
長話短說,2017年12月,我處於人生的十字路口,不管是繼續完成看不到盡頭的化學碩士學位仍是從新尋找本身的出路都令我感到糾結。那時我寫了一些代碼(也就幾百行 Python),感受不錯。我決定靠着積蓄來學習編程,直到找到一份開發的工做。php
回顧這個漫長而艱難的旅程,我想分享一些經驗,它是如何開始以及如何結束的。個人觀點沒有特別的順序,雖然我會先寫一些我認爲最重要的。html
1)設定一個很是精確的目標。我是指現實的目標。這是你旅程中最重要的方面,你須要對終點線有清晰的認識。你學習編程,是由於想解決一些實際問題嗎?也許你想要自動處理你工做/生活中的一些任務,也許你想破解遊戲,也許你出於好奇心,也許你喜歡學習新事物,又也許你是一個想開發應用卻沒有資金的企業家。而本文中,我主要針對想要經過學習編程找工做的角度來談。前端
2)若是你的目標是找工做,就盯着就業市場看,而不是 Twitter 和 Medium 上的熱點。還記得第一點嗎?你必須設定一個很是精確的目標。諸如「我想成爲一名開發人員並從事遊戲行業」這樣的目標就過於模糊。你的首要任務是什麼?是尋找一個真實的開發工做,仍是在遊戲行業工做?若是你在遊戲行業找不到工做怎麼辦?你的城市沒有此類公司,或者你達不到遊戲公司的要求怎麼辦?其實不論你學習哪一種編程語言,我敢說未來某一天這些知識均可能用在遊戲開發上,只要這是你的目標。你將須要學習大量的新東西。可是你有解決問題的能力和編程知識才能邁出第一步。java
你是一名自學成才的開發人員,不是 MIT 的優秀畢業生,找到一份異地的工做會更難。我在2017年12月犯了一個錯誤:我認爲首要任務是找到一份前端開發的工做。但我沒意識到,在個人地區 C#/php/Java 的工做與前端 JS 工做的比例爲9:1。所以,請查查你所在地區的公司,看看它們的職位和要求。node
(若是你的目標是轉行,不妨從初級職位先入行,再不斷調整到你指望的方向)webpack
3)永遠永遠不要假設在編程中什麼更難什麼更容易。當我決定學習前端時,我這樣作了。這是一個巨大的錯誤。很差說前端比後端更容易,或是更難。關鍵是,你也沒法知道本身會更喜歡什麼,更適應什麼。因此不要假設。永遠不要認爲 JavaScript 比 C 更容易或是更難。不一樣工具對於不一樣問題的有不一樣的複雜性,你尚未到能區分什麼「更難」什麼「更容易」的程度,我也是。就別去衡量。你能說清,從如今開始的24個月內,在某平臺上提高渲染和網絡性能比優化基於地理空間數據預測天氣的算法「更容易」嗎?你肯定在複雜的實時應用程序中管理狀態比編寫着色器或教電腦如何翻譯或繪畫更容易嗎?你根本就不知道。因此,千萬不要作這種無腦的假設。git
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 種技能/工具,但並不真正精通一個的人,很難取得別人信任。web
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
原文地址:
════
其餘文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | 如何debug? | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺
歡迎搜索及關注:Crossin的編程教室