2018,一個轉行程式設計師的成長 | 掘金年度徵文
年終總結已經寫過了,這次看到掘金的活動,想參加下。拿第一就不指望了,留給大佬們。我只想小冊 6 折的機會,2019 年多買幾本小冊。我很愛學習的 :-D
自我介紹
我之前在掘金寫過很多文章,可能很多人看過《我如何零基礎轉行成為一個自信的前端》 一文。沒看過的朋友,我還是簡單介紹下。我是轉行做前端的,轉行之前做過外貿和英文編輯,從沒見過程式碼。2017 年自學了 10 個多月,2017 年 10 月 8 日正式開始程式設計師工作,到現在有一年多工作經驗了。
2018 學到的
一,新人先懸置爭論
CS 世界是有很多爭論的。有人非常討厭 JS,也有人認為 JS 是最好的語言。Kyle Simpson 應該算是 JS 的優秀佈道者了吧,照樣會有人批評。這些批評看起來有很嚴肅的論證和思考,我都沒法看出來是不是胡噴。對於這些爭論,新人是很難分辨的,因為你還沒有達到語言設計的高度去批判性思考。
既然缺少判斷能力,那新人怎麼確保自己不被帶偏呢?我自己的一個經驗是,先找權威學,然後在實踐中去驗證。比如,我在跟著 Eric Elliott 學習函數語言程式設計的時候,確實能在寫 React 應用時感受到程式組合的靈活,pointfree 的簡潔易擴充套件,過程抽象的能力如何在解決實際問題時派上用場等。
同時,也有很多人批評函數語言程式設計,對於這些觀點,我先懸置起來,等我自己被坑了,獨立總結出來的知識,才更寶貴。同理,Eric Elliott 批評的程式語言裡面類繼承的問題,比如猩猩香蕉問題(你本來只想要一根香蕉,結果你繼承來的是一座叢林裡面的一棵樹上的猩猩手裡握著一根香蕉),我同樣不發表看法。我知道這個問題的存在,但我沒寫過類 Java 語言,沒有自己踩過坑。
二,學習語言特性,不只是學語言
2018 年年初我學習過 Swift 和 iOS 開發。那段時間我還簡短學過 Go。學多門語言的過程中,我比較了這些語言各自是怎麼實現程式擴充套件的,是通過組合還是通過繼承實現的。Swift 的面向介面程式設計(Protocol-Oriented Programming)給我留下很深刻印象,在我有限的 iOS 應用開發經驗中,我發現這種程式擴充套件機制非常靈活和易用。
在學習 Haskell 的過程中,我發現惰性求值很有意思,然後我通過查資料,自己在 JS 裡實現了。我在這兩篇文章裡面有詳述:
同樣,用 ES6 箭頭函式實現 Y Combinator 等組合子我也折騰過。這些知識是通用的,並不侷限於一門程式語言。
三,不要忽視了綜合能力的提升
忽然畫風轉了一下,是因為自己最近在這一塊感受比較深。之前都在小公司工作,壓力比較小,沒有經歷過一執行緒序員必經的磨鍊,所以自己在工作上還是比較嫩的。年底進了阿里,受到的衝擊和自己相應的變化比較大。
綜合能力首先是理解複雜業務的能力和處理複雜系統和流程的能力。這一塊我適應的比較慢,還好師兄比較有耐心,讓我有時間調整。提升這方面的能力一是要多問,不要太擔心自己問的問題太弱智,每個細節都問清楚才放自己過。二是要有思考的習慣,每天做的雜事要有反思。這樣做一是為了看清全域性圖,讓做事有條理。二是要理解做這些事情的意義,試著看自己能不能找出優化的空間(我還在嘗試,沒達到這個高度啦)。
再就是程式設計師的一些基本功。比如高併發工作狀態下,怎樣通過一些小工具和指令碼來自動化工作流等。說來慚愧,我直到最近才知道 git cherrypick 怎麼用。
然後就是溝通表達的能力。這一塊在螞蟻新人培訓裡面感受比較深。在培訓裡面分組玩“盜夢空間”的遊戲,我所在的小組,因為組長的協調和溝通,完美完成了超高難度的群體任務。表達溝通能力可以讓自己的工作放大很多倍。只顧埋頭寫程式碼其實是很吃虧的。
2019 年想做的
除了在工作上能獨立負責一條業務線這個艱鉅任務之外(這已經足夠我扛了),學習上我還有這些方向:
- 往底層學習。前段時間斷斷續續在學 AST 的應用,寫 Babel 外掛和 Codemod 的使用等。下一步是學習下簡單的編譯原理,熟悉編譯器的實現。
- 學好數學。學這個的目的是想學機器學習。計劃是用兩個季度學數學基礎,下半年開始繼續學機器學習。年底看能不能用 Tensorflow.js 寫個簡單點的應用。
希望年底回看這篇文章時不會發現自己在說空話。