以前搞化學,自學編程 9 個月後,我成了年薪 6 位數的軟件工程師

以前搞化學,自學編程 9 個月後,我成了年薪 6 位數的軟件工程師

每當我開始閱讀成功故事的時候,我都會馬上去查找作者的背景是什麼,希望能適合我。但是我從來都沒發現那些人的背景跟我一致,所以我的很可能跟你的背景也不一致。

不管怎樣,我希望我的故事能夠激勵其他人,同時能夠充當一個有用的數據點補充到你的成功故事數據集上。

充分披露

高中的時候(9年前)我上過VBA的課程。我在新生工程課程(7年前)中學習了一些C、Python、Mathlab以及Labview的知識。我從一所很好的大學畢業,拿到了化學工程學位,我的GPA成績也不錯(3年前)。離開學校(高中或者大學)以後我從來都沒有編過程,直到去年我決定要去學一下。

大學畢業後,我在一家精煉廠拿到了一份工藝工程師的工作。在我改行到軟件工程之前我一直在那裡工作。

為什麼我要換職業

我喜歡解決技術問題,但我知道到了某一刻我還是要進入商業/初創企業世界的。我一直都有讀MBA的想法,但每次看到頂級商學院的價格時,我的興趣馬上就沒了。

2017年5月27日,我又上去Google了一下MBA,但是不知怎的就看到了軟件工程方面的東西。而且這東西看起來挺適合我的。

對軟件工程師的需求日益旺盛,工資水平也很高,而且也是進入到初創企業世界的完美行業,並不需要太多的啟動資金。你需要知識一臺計算機,而且你的機會(幾乎)無限。

在這裡你只需要有個想法,開始開發,然後展示給用戶,再用一點點資金進行迭代就行,進入門檻也很低,其他任何一個行業都做不到這一點。在化學工程,基本上你需要有一間運營的工廠,或者需要很多錢去設計一家工廠,如果你有個新產品的想法的話。

我聽說過有人辭職去參加訓練營,但是我在網上看到這些情況越多,我就越意識到其實我完全可以自學,如果我夠投入和專注的話。

你也許會提出不參加訓練營的話豈不是會失去那裡提供的關係網絡和職業建議?的確,但是我很幸運,因為我生活在灣區,所以可以去出席一些回憶,在那裡我建立了自己的關係。

此外,最糟糕的情況也只是我發現自己一個人學不來,真這樣的話我再辭職參加訓練營也不遲。

目標

你需要有目標。尤其是如果你想一邊幹全職一邊自學的話。如果你不給自己額外的壓力的話你的學習就會一拖再拖。所以你需要給自己施加內部壓力。你的目標應該是簡單的、可量化的。你應該進行充分研究,提出合理的目標。我的目標是這樣的:

在1年之內拿到一份薪水跟我現在相同或者更好的軟件工程工作。

計劃

一旦你制訂了目標,就需要一份計劃來幫助你實現。這個時候你需要儘可能多地去了解別人的成功故事。當然他們的情況都不會跟你一致,但你可以從每個人身上吸取一些經驗。我利用Reddit的子版塊learnprogramming、FreeCodeCamp論壇以及Medium等資源來制訂我的計劃(並且不斷修訂)。

2017年5月27日,我決定開始我的學習編程之旅,下定決心之後我可以說是一個猛子就紮了進去。我決定每週的工作不能超過40小時,這樣我就有時間在工作之後以及週末去進行編碼。你很幸運,因為我把我的整個學習過程都詳細記錄下來了。

我的計劃經過多次迭代之後,最終大概是這樣的:

  1. 上一門計算機科學入門課程,對核心計算機科學概念有可靠的基本瞭解。

  2. 跟著freeCodeCamp學直到我自己可以開發出組合層面的全棧web app。

  3. 通過重構來清理代碼,增加測試,專注於先進的概念。

  4. 給開源做貢獻

  5. 準備面試

我的計劃一開始是非常簡單的。那時候我認為自己應該按照Google的技術指南去學,所以我選了一門他們推薦的入門課程,Udacity CS101。

第0個月——Udacity CS101,Harvard CS50

做出這一重大決策讓我充滿了能量。我一下班回到家就迫不及待開始編碼而且直到上床前都不願停下來。然後整個週末都是這樣。Udacity CS101會跟蹤完成百分比,這對我是一大激勵。我每天編程完之後都要記錄我們的完成百分比。在10天內我就完成了前面的75%。最後的25%側重在遞歸方面,這對我來說有點難。總而言之,最後我用了20天完成了Udacity CS101。

我在上Udacity CS101的同時,還一邊開始相當頻繁地上Reddit的 learnprogramming 子版塊去看。我我在上面瞭解到正在尋求改變職業的自學開發者在網上活躍是非常重要的。我決定用自己的全名在Twitter、Reddit、Stack Overflow、Medium以及Quora上面開設新的賬號,以便在網上刷存在感。

此外,我還決定不再看Instagram、Facebook以及非編程方面的Reddit子版塊,以免造成分心。我只有在查看編程相關的新聞和帖子時才會翻看我的手機。這一點很關鍵,因為可以確保我能找到最好的學習路徑和學習資源。正是因為這樣我才在edX上發現了Harvard CS50。

一開始我只是滿足於上一門入門課程,但每個人似乎都推薦Harvard CS50,所以我決定再試試這門課程。其他學校計算機科學的學生也上了這門課,並且說他們在哈佛的CS50上面學到的東西比在自己的大學學習1、2年的計算機科學所學到的東西都要多。大家的普遍共識是這門課程很難但是值得。到了第0月的月末,我已經完成了前5節課以及家庭作業。

第1個月——Harvard CS50,Linux,第一次聚會,freeCodeCamp

大概到了這個月的一半時間時我終於完成了CS50。關於學CS50的體會我不想談太多,因為我已經在這篇文章詳細談了我的 經歷 。

總而言之:這是一門很棒的課程,我高度推薦。David Malan是一位優秀的講師,而且有很多資源可以幫助你通過這門課程。你從C語言開始,然後再到Python,最後完成web開發。安排非常緊湊,涉及大量材料,但我認為是非常值得的。

在CS50之後,我決定把我的XPS 15配置成Windows和Ubuntu雙啟動。那是一個令人沮喪的週末。我把分區搞砸了,筆記本幾乎變成了一塊磚頭。我差點就想把那臺筆記本扔了買臺新的。

我慢慢放棄了Windows,最終主要以Ubuntu作為平臺。我想強迫自己適應一定程度上可行的命令行方式,但是仍然有很長一段路要走。

我開始了百日寫代碼之路,以確保自己保持專注和每天都寫代碼的節奏。記錄自己的進度非常重要。如果你每天都能取得進展,儘管看起來似乎不大,但是日積月累之後回過頭,你就會意識到其實你已經走了挺遠了,而這又會激勵你繼續前進。

我知道,關係網絡決定了我的成敗,所以我鼓起勇氣參加了自己人生中的第一次編碼聚會。我此前從未參加過任何聚會,更不用說編碼聚會了。所以一路上我都非常緊張,以至於開車到那裡停好車走進門之後,幾乎就想轉身離開回家了。

這是那個團體的第一次聚會,這一點很有幫助。我迅速意識到自己沒理由緊張。大家誰都不認得誰,沒人來這裡是為了給別人下結論的,每個人都渴望學習。而這只是一場聚會狂歡的開始。在9個月內我最終出席了超過50場聚會。

很高興,我很早就開始參加聚會。大多數人只是在尋找工作的時候才開始出席聚會,但到那個時候幾乎已經太晚了。要早點參加的理由太多了。這裡僅列舉少數:

  1. 培養關係需要很長的時間。早點開始意味著後面找工作的時候你保證可以有關係可以依賴。

  2. 跟陌生人討論編程時準備面試的很好手段。

  3. 你可以學習新的框架,瞭解到走走你前面的那些人的學習資源。這些會影響你的未來學習計劃。

我的編碼之旅走到這個時候出現了一點不確定性。到這時候我需要決定自己想要成為什麼樣的軟件開發者。

到最後,我選擇了web開發,因為它的需求似乎非常旺盛麼熱切網上有很多資源。一旦我想明白了這一點,我就需要弄清楚接下來要做什麼。一些人建議到這一階段我應該考慮想要開發什麼樣的web app然後繼續。一些人向我推薦The Odin Project或者freeCodeCamp。

那個負責籌劃我每週都參加的聚會的傢伙會Ruby,也想用Ruby做項目。我決定全身心投入到The Odin Project裡面,這是其中的一大原因。

然後2天之後我又決定放棄這個想法了。

這就是走自學路線的缺點之一。一分鐘前你以為你已經找到了前進的方向,然後第二天你又會懷疑你有沒有走對路。

第2個月——YDKJS,freeCodeCamp前端,React

我開始讀《 你不懂JavaScript(YDKJS) 》,因為每個人都推薦它作為freeCodeCamp的補充。我被迫重讀了好幾個章節,因為它的內容特別緊湊,但這是學習詞法範圍、閉包、預定等你聽到也想學到但因為很難從未試過的有關JavaScript的一切的完美資源。

我完成了freeCodeCamp的前端部分的學習。其檢查表格式以及估算完成時間起了不小的幫助作用,這激勵了我要迅速完成。我還恨不得馬上進入下一章節去學習React。然而,這也意味著我的項目都是極簡風格。我除了竭盡所能去實現用戶故事之後就不再做別的東西了。

事後看來,也許我應該把精力放在讓項目更吸引人上面。也許這會讓我更深入瞭解CSS。

下一步就是學習React,我忙得差點緩不過氣來。

我已經聽說過React的很多,並且已經準備好要成為酷小孩的一員了。然而,我還有一點躊躇,因為當時的許可問題。我真的很高興這不再是問題了。學習React對我來說很困難。當時我還沒有發現任何好的教程(但是現在似乎到處都是)。

我嘗試閱讀文檔,按照Facebook的一字棋教程去做,但我其實不是很理解它是怎麼做的。我被告知這不適合我,這意味著我對JavaScript的理解還不夠。於是我又返回來繼續讀《你不懂JavaScript》,但再次地,裡面的內容對我來說太高深了。

第3個月——freeCodeCamp React,CodeClub,開始freeCodeCamp後端學習

最後,我決定去做freeCodeCamp React項目練手,看看它究竟是怎麼做的。寫出來的代碼很難看,但的確幫助我更好地理解了React。

我參加的每週聚會決定全棧都用JavaScript而不是Ruby來做項目,並且他們還確定了第一個項目將是給這個聚會小組開發一個網站,CodeClub.Social。

我利用React和Meetup API開發了卡片,讓用戶可以通過我們的網站註冊報名參加接下來的3場聚會活動。這對我來說有點難,因為我得暫停freeCodeCamp學習來做這個,但這是一個我不容錯過的機會。我很高興能跟一小群人一起做項目。這也幫助我學習了Git和Github。

在這個月結束前,我開始在freeCodeCamp學習後端開發。

第4個月——完成freeCodeCamp後端學習及Yeggle開發

我練完了freeCodeCamp所有的API項目,但我開始從freeCodeCamp抽身出來做Image Search Abstraction Layer這個項目。

我迫不及待想要開發全棧web應用,所以我看到這個項目的名字時馬上就有了自己的項目想法。我想做一個節點app,用來存儲隨機imgur URL到數據庫上,然後再做一個前端來輸出這些隨機圖像的用戶指定數字。大家的說法是對的:當你做一個自己想出來的項目時,你會更用功也更成功。

當我把項目做成了之後,一股自豪感油然而生。雖然它很醜很笨拙,但是最重要的是能用。

我在freeCodeCamp的學習過程中,還了解到了哪些項目是我的能力範圍之內的。當時我經常會去跑步,在跑步過程中我時不時會冒出一些想法,等我回到家就把那些想法寫下來。這樣等我準備好時就有了一個項目清單了。

最後,我終於感覺自己已經做好準備,可以把自己的有用且光鮮的全棧web app分享給用戶並且納入我的組合裡面了。我已經摩拳擦掌,迫不及待。

在找新飯店的時候,我總是會打開Yelp去看看別人的點評,然後再打開地圖看看別人的點評。如果我做一個app來把這兩個一起比較一下呢?

於是我做了Yeggle,這個東西用了Node/Express/React,再加上Google Maps和Yelp API。當時有好幾個障礙我認為自己是沒法克服的,但到最後我還是設法完成了,我對這個app也感到非常自豪。然後我把它發到了Reddit上,可是沒人在意。這有點令我失望,但我是不會被這種情緒打倒的。

第5個月——StockIT

這個月我做的東西不多,因為我跑到日本和泰國度假去了,整整2周!

但是我還是開始並完成了下一個項目。我不斷讀到自學開發者找到工作是多麼的難,於是我認為自己得做點獨特的事情。我記得有一個遊戲是當道瓊斯股票走勢圖開始活動時,你有一個買入的機會和賣出的機會,其目標是擊敗市場。這個遊戲的目的是想讓你看清楚擊敗市場有多困難。

我的想法是做一個類似的遊戲,但是你的對手不是市場,而是機器學習算法。於是我創建了StockIT。

我在Pandas和Scikit Learn上面學習了一些涵括多種機器學習技術的視頻教程。我原先是希望做一些很酷的深度學習技術,但我意識到這需要大規模的數據集和時間,那些是我耗不起的。

相反,我採用了簡單的線性迴歸模型。我以為這會是困難的部分,但其實不是。讓D3跟React配合工作才是。這兩個庫都想控制DOM。還有一些別的庫可以幫助把這兩個庫湊合起來,但是我認為引入新的庫會讓項目太臃腫了。我最終用D3生成SVG,用React處理DOM,情況看起來相當不錯。

我再次把它分享到Reddit上面,這一次大家都很喜歡!

結果表明,就像VC一樣,上Reddit的人也都對機器學習著迷。Reddit用戶的厚愛讓我的信心有了極大的提升。大家都玩我的遊戲並且喜歡上了!

第6個月——jobSort(),找工作前的準備

在StockIT之後,我又開始了下一個個人項目。我希望做一個崗位看板,把一些小規模的面向技術的職位列表網站,比如Stack Overflow、Github以及Hacker News上的就業機會都集中起來展示。為了增加它的獨特性,我決定根據用戶對職位的技術需求以及需求程度進行排序。

比方說,假設我正在尋找一份需要了解JavaScript、React及/或Python的工作,並且招聘者對JavaScript和React的需求非常迫切,對Python就沒那麼關注。這種要求量化下來可能是JavaScript分數是3,React分數也是3,Python則是1.這樣就能把清單排好序了。

做這個項目的時候我碰到了各種各樣的障礙,圖中被迫調整了幾次航向,但我最後還是做出了一個自己滿意的產品。我的最後技術棧用的是React/Node/Express/MySQL。我把項目發佈到Reddit cscareerquestions 子版塊上,瀏覽量是650,因為他們不允許放個人項目上去所以被下架了。

“最後”的產品在這兒,如果你對我的折騰過程和重構感興趣的話,也可以看看我的這篇 文章 。

我原先的想法是按照自己的結構化計劃完成個人項目組合來提高自身實力,然後再去給開源項目做一些貢獻,最後再去準備面試,然後申請工作。這位朋友說服我拋棄那個計劃開始申請。於是這個月我做了一份材料和簡歷。下一個月我將開始申請。

第7個月——測試,求職

這個月我的精力主要集中在我自己的項目以及申請工作上面。我還想學習一下測試以及Redux。

我給CodeClub.Social增加了彈性框讓它成為響應式佈局。我改善了jobSort()的移動UX。我給jobSort()增加了測試,我用的時mocha/chai/enzyme,這個設置很難,不過起步很容易,但是要想100%覆蓋很難。

到了月末,我已經申請了63份工作。我把這看成是自我評估。我的組合/簡歷是不是足夠好了?如果是的話,我需要做哪些事情來準備面試?一開始我是通過Hacker News: Who is Hiring和Indeed去申請的。

起初,我申請很快,沒有對簡歷/求職信做什麼個性化處理。然後,我決定要對我的求職信和簡歷進行個性化處理,然後試著發一封郵件給公司的某人。這個辦法顯然比天女散花的做法更好。

那個月我收到了5個電話——其中兩個是來自招聘公司的,另3個是來自軟件公司的,包括:

  • 在一家.com公司的DevOps/測試角色,是份合同工

  • 一家B輪的視頻分析公司

  • 一家相當大且成功的初創企業,最近剛被一家大企業收購

我通過了其中兩家HR的篩選,但是對方都沒有要我去現場面試。當然我對這3個電話都比較滿意,從中也學到了很多東西。

網上的每個人都提到初級開發者不要指望一開始就瞭解那麼多,他們只需要對學習抱有激情和興奮就行。所以我認為這是很簡單的。我對學習就很有激情和興奮感。不過我從這些來電中學到的是,沒人會找一位初級開發者。他們希望你從第一天開始就知道該怎麼做。

這些電話教會了我需要:

  • 從第一天開始就足夠好,能給對方帶來價值

  • 要足夠自信說服他們我能從第一天開始給他們增加價值

第8個月——夜班,Redux,開源,現場面試

從這個月開始我除了全職工作外還上夜班——每週6天,每天12小時,從下午5點到凌晨5點。

我知道這個月我沒法做那麼多事情了,但是我有自己的目標,我想實現它,這樣的話我就可以有一個月的空了。

我用Redux重構了jobSort(),令人驚喜的是這沒有我想象的那麼難。我收聽了很多關於它的播客,也去讀了關於它的博客,但是那些理論都沒有太大的作用,直到我開始使用。

我真的非常喜歡Redux的數據流處理。現在看到有人抱怨Redux是很有趣的。我並不認為我有神馬資格發表什麼觀點,但是我的確喜歡reducer模式。

這個月本來我的打算是做開源的。我計劃是要做我的第一個開源貢獻,這本來是對一個很好的庫的一個很好的貢獻。我打算給React寫點東西!

每個人都說這個代碼庫很難讀,更別說給它做貢獻了。但我需要脫穎而出,我需要凸顯獨特。我知道我的貢獻不會非常顯著,但我還是想去做。

我會從閱讀所有的文檔開始,然後再去了解代碼庫。查看每一個問題,每一份新聞稿。完整閱讀React文檔是一次很好的練習,很高興我做到了。但我迅速意識到給React做貢獻的問題是“好的第一手問題”其實並不多,因為問題很快就被人搶走了。

一次我去參加聚會時,Anthony Ng建議我可以試試Downshift,那是Kent C. Dodds開發的一個自動完成庫。這成為了一個遊戲改變者。這個東西正好適合我發揮。難度合適,問題數量也合適,協作者也不太多,超級幫忙的維護者,整齊且經過很好測試的代碼。除此以外,它還是我的jobSort()應用遇到的一些問題的完美解決方案。

這個月中的時候,我收到了上個月申請的一家公司的電子郵件。他們進行了一輪初步的電話篩選,然後是技術電話篩選。他們正在尋找的技術正好是我學過的——React、Redux以及D3。我主要談了我的項目以及為什麼我要做出特定的決定。此後,他們讓我去現場進行面試。這是我的第一次現場面試!

我根本就沒有為面試做過準備,所以我的期望很低,並不指望能拿到那份工作,但是我會收穫寶貴的面試經驗。因為我還在上夜班,所以每天的睡眠時間只有3個小時。幸運的是,技術部分不是寫白板,而是1個小時的結對編程。這是相當直截了當的挑戰,但是我非常緊張。

一開始的時候,我擔心的是要確保我不用查東西也能瞭解一切。當我意識到自己沒法完成挑戰時,馬上就意識到自己需要停止擔心面試官會怎麼看待我的事情,於是我就去Google/Stack Overflow上面找答案。我最後沒有完成,預期自己會有一個悲慘結局。

既然我認為我的結對編程已經失敗,在面試的剩餘時間自己反而放鬆下來。最後,我昂首挺胸地離開了面試。最糟的情況下我也收穫了寶貴的面試經驗,最好的情況是我會得到我的第一份工作。

建議

到這裡,我基本上已經把我的故事分享得差不多了,其中也提供了一些建議。如果你讀到本文的話,很有可能不是在考慮改行就是為了改行而在學習編碼的過程中。我希望下面的建議能夠幫助你制訂計劃或者堅持目前的計劃,最後達成你的目標。

  1. 找到激勵你的東西並善加利用。對我來說,這個東西是檢查表,對過程的記錄,以及跟不同編程社區的互動。如果你沒有受到實現目標的激勵的話,那任何其他東西都不重要了,因為你完成不了的。

  2. 制訂目標並且實現目標。要我說你應該有月度目標,甚至有每天的目標更好。月度目標是為了確保你走在實現主要目標的正確軌道上,每天的目標則是為了確保你每天都能取得進展。對我有用的一個策略是前一天晚上制訂次日的目標。這樣的話你就不會一整天都去做沒有生產力的事情卻又覺得自己取得了進展。這會迫使你將每天的成就與每天的目標進行比較。

  3. 儘早參加聚會活動,不要等到覺得自己準備好了才去。參加聚會也許令人心生恐懼,就像我前面提到過那樣。但通常每個人都是很好的,並且願意幫忙。你也許會發現有的人對跟你討論沒有興趣,但那是少數,而且沒人喜歡當判官。此外,每個人都喜歡提供建議(就像我現在所做一樣)。

  4. 儘早給開源做貢獻,不要等到你覺得自己已經準備好才做。剛你開始編程的時候,Github似乎是個你永遠也不想去的可怕地方。但其實那裡是非常歡迎初學者的,而且也是學習好代碼以及讓別人審核你的代碼的好去處。如果你仍然不相信,不妨看看我的文章《為什麼你現在就應該給開源做貢獻》。

  5. 儘早申請工作,不要等到你以為自己已經準好了才去。這一條對我而言很困難,因為我認為我不一樣。我認為我不需要去市場試水一下看看是什麼情況。我以為我已經知道自己什麼時候已經為申請做好了準備。現在我告訴你。你不會知道什麼時候可以去申請。所以其實你可以現在就去申請。當然,你不應該連for循環語句都沒學就瘋狂去向300家公司提出申請。但你應該知道的是,瞭解自己應該學什麼的最好辦法就是去申請工作並且去試探一下市場。

好了,現在該你上場了,去寫代碼吧!

原文鏈接: https://medium.freecodecamp.org/how-i-went-from-newbie-to-software-engineer-in-9-months-while-working-full-time-460bd8485847


分享到:


相關文章: