學習/工作歷程

最近因為受 Alpha Camp 邀請分享自己的學習/工作歷程,所以就順便把內容整理成文章,其實從大一到大四剛好一年一個階段:

  • 大一開始自學
  • 大二進 flyingV、Inside 實習
  • 大三跟大涵他們一起成立貝殼放大
  • 大四加入愛料理

(但底下的說明完全不是這樣分的XD)

初學到進 flyingV 實習

我是從大一才開始學習寫網頁,從 htmlcss 開始,那時候就是看別人影片怎麼做,然後自己跟著做一次,每個禮拜大概會花十幾個小時練習,反正就是找版來切,玩一些 css 特效等等。學了大概半年後,有一天聽完 Tim(flyingV 執行長)來我們學校演講,就拿著兩個自己做的靜態網站投了 flyingV 實習計畫,結果大涵就收了我當實習生。

在 flyingV 時 Eugene 開始教我 JavascriptGit,對於完全沒程式背景的人來說這非常痛苦的一件事情,我連 for loop 的概念都花了大概一個禮拜才能理解。結果我 Javascript 學了兩個月之後就覺得自己翅膀硬了,跑去玩 AngularJSNodeJS(超級錯誤示範),那時候覺得自己可以做出完整的網站很有成就感,所以就一直寫,但其實寫出來的東西都差不多。

後來又過了兩三個月 JS 就寫膩了(因為寫來寫去其實都一樣的東西),所以又跑去寫 Ruby on Rails,但那時 Eugene 跟 Ronald 都對 RoR 不熟,所以 Eugene 就介紹 Richard 給我認識,安排我之後過去 Inside 實習。

在 Inside 練基本功

在 Inside 實習、其實就是 Richard 的指導,改變了我對寫程式的觀念。以前我都是覺得程式寫出來能跑就好,等到我要的功能寫出來了專案就算完成了。那時候根本不管什麼測試、重構、coding style 之類的東西,但這樣的觀念一到 Inside 馬上踢到鐵板馬上被電翻。

我實習的專案是做出一個新的 Inside Job Board,由 Richard 負責 Review,然後他在一開始就裝了一個東西叫 Hound CI幫我檢查 coding style,此外開發流程要嚴格遵守 Github flow,結果我每次寫新的 feature 一開 PR 就被 hound ci 叮得滿頭包,每天的工作流程大概像是:

  • 寫新的 feature
  • 開 PR 後被叮爆
  • 花一堆時間在修 coding style
  • 修完 coding style 補測試
  • 補完測試重構
  • 下個 feature 重複一次上述過程

那時候我才知道寫程式不是自己寫爽的就好,要有一個好的開發習慣才可以讓別人一起合作,這也是我後來到現在很堅持的一件事情,一定要有好的開發流程、好的 coding style 跟寫測試(我甚至連去參加 Hackathon 都寫測試跑 CI)。

另外一個幫助很大的就是我做了 Rebuilding Rails,他是一本電子書,教你怎麼樣自己寫一個類似 Rails 的 MVC framework。做這本書我除了學到了很多關於 Ruby 的知識以外,更重要的是讓我建立了兩個觀念(1.世界上沒有 magic,只要你願意去看 code,你就可以理解發生了什麼事 (2.原來我也有能力寫 gem、甚至寫一個 framework,而也就是這兩個觀念讓我在後面的學習能夠加速不少,我也有在去年 RubyConf Taiwan 的 Lightning Talk 上面分享這部分。

貝殼放大

大概在我到 Inside 實習沒多久,Eugene 就跑來找我說他跟大涵考慮開公司,覺得我加入他們能幫上一些忙,之後我就一邊實習、一邊跟他們一起開會討論新公司的事情,後來等到我實習結束就完全投入在創辦貝殼的準備工作中。

而我在貝殼得到最多的大概就是練習跟發揮機會吧。公司剛成立時我們有接一些案,同時也有要開發的自有產品,所以每天就是一直寫 code,剛好把我在 Inside 學的所有東西都發揮進去,特別是開發流程跟測試的部分。後來隨著技術進步,我也開始負責一些專案的規劃跟設計,雖然當初做的規劃都有不少改善空間,但至少能夠有這個機會自己做決定、自己負責,每天只要醒著就是在想我這個專案要修正什麼地方,要新增什麼功能。我想這也是加入 Startup 最可貴的地方之一,每個人都能夠有很大的空間去嘗試,就算最後失敗了也不會有人怪你,因為你自己就會覺得要把這個責任扛起來,下一次要做得更好。

另外一個學到很多的地方是帶實習生。大概在去年三月左右,貝殼開始招收第一屆實習生,這對我來說又是另外一種學習跟角色轉換,以前我是實習生給別人教,現在我要開始學習帶人。收到實習生後我就在想要怎麼把對我幫助很大的東西交給他們,然後也要讓他們有一樣的收穫,但我跟他們都很忙,很難有時間準備好教材然後跟他們上課。後來就想說與其自己準備不如找別人的東西來講,所以我就開始找文章來看,覺得不錯的就叫他們看,然後我有時間就會拉張椅子到他們旁邊坐著跟他們解釋、討論。我不敢保證我教他們多少東西(或許他們心裏覺得我很吵),但至少我在那段時間每天找文章、看懂文章再跟他們討論的過程中學到開始養成看技術文章,跟和別人分享學習心得的習慣。

離開貝殼放大

我知道有些人會想問「既然你是創始成員之一,為什麼你會選擇離開快速成長的貝殼放大?」,其實最主要的原因在於創業太忙了,我沒辦法有足夠的時間達到我想要的進步。就如同我前面所說,貝殼放大接了一些案子,同時還有自己的產品要做,那時候每天就是不斷在案子跟產品中間切換,有時候甚至要全力趕案子,連自己的產品都沒時間碰(不過在我離開一段時間之後這情況已經改善很多,現在全部資源都集中回公司產品上面了)。但同時間我自覺自己的基礎知識薄弱,所以開始上 Coursera 的課程補足一些 CS 的知識,也想準備隔年(也就是今年)的 google summer of code,所以我後來便決定離開貝殼到愛料理,算是一種取捨吧。

愛料理

愛料理相較於貝殼放大有兩點比較明顯的差異:

  • 愛料理的產品開發相對沒有時間壓力,可以有充裕時間研究合適的解決方案,就算是做同樣的事情,也可以持續嘗試不同的解法。此外產品的開發流程跟一些工具的整合都很穩定,上線後少有突發狀況。可以準時下班,而且臨時接到電話要 debug 的機率變少,學習時間也就變多了。
  • 產品的規模夠大,可以深入鑽研不同領域。當一個網站的流量到一個月數千萬 PV 時,問題就不只有如何把功能寫出來而已,performance 跟 scalability 都必須納入考量範圍內,工具的選用也會有不同。舉例來說過去寫小專案想到要做搜尋就是用 ransack,到了愛料理就要學著用 Elasticsearchsearchkick,甚至還要自己客製一些功能。

因為上面兩個原因,我的學習時間跟機會都變多了,所以在愛料理的這半年我不論在技術的廣度或是深度上都有顯著的成長。

在廣度上的話我接觸到了 DockerAWS ECSElasticsearch,最近則開始寫 Go。而且每個東西一玩都是兩個禮拜以上,雖然沒辦法完全摸透,但可以建立起一些基本觀念;在深度上的話,我從 Rails App 寫到 Rack App,再寫到 Ruby gem(內部加上自己的 gem 大概寫了十多個吧)。然後因為一些功能上的需求,我也開始有機會跟題目去 contribute open source 專案,從 formtastichtml-pipeline 甚至前陣子才 contribute Rails

除了上述這些跟工作直接相關的東西以外,我們也會一起參加 Conference、一起上線上課程,像是我們最近才一起上完一門叫做 Nand2Tetris 的課程,最後一週還在公司一起寫作業到快十二點。

當然也不是說愛料理就比貝殼放大強,大家都應該去愛料理,而是公司產品發展到不同階段,會有不同的機會跟資源可以提供給你。像在貝殼放大就可以當專案的發起人、領導者;但在愛料理這種機會就少得多,因為很多東西都成熟了,分工也細了,大家都是有固定的流程來合作開發產品。所以還是要看你想要什麼,我離開貝殼加入愛料理只是覺得目前自己最需要的是技術上的深度成長,所以愛料理比較適合我而已。

結論

展現自己的熱忱

我想在這一路上,我能得到這麼多幫忙除了運氣真的很好以外,我想另外一部份就是因為別人有看見我的熱忱(這樣講好像很厚臉皮XD)。但確實大部分的人都很樂意幫助熱血的人,後來我不管是在貝殼還是在愛料理面試人的時候,我跟同事們也主要都是看對方的熱忱,畢竟在這種要持續自學的領域,有熱忱才走得久。

但這並不是說要靠嘴巴讓對方相信你有熱忱,而是你平常就應該透過做 side project、寫文章等方式來做累積。寫得好不好不是重點,重點是讓大家知道你有多喜歡你在做的事情,而且很樂意跟別人分享。

選對環境

就像我前面對貝殼放大跟愛料理做的比較,不同性質或是發展到不同規模的公司,裡面技術部門的文化跟任務都會不太一樣,沒有分好壞,重點是選到適合自己的工作環境,才能讓自己跟公司都得到更好的發展。

先把一隻腳踩穩

我看過不少個工程師(或想成為工程師的人),總是一個東西沒學多久,就急著「跨領域」,就像我在 flyingV 時一樣。但其實這樣子表面的學習,只能讓你「做出東西」,卻沒辦法讓「做好東西」,其實把東西做出來本來就是身為工程師最基本的要求,但能把東西做到多好才是能證明你自己的價值的地方。

再說,在資訊領域裡面很多概念是到處通用的,只是以不同形式出現。以我的經驗來說,我去年暑假唸了一本書叫做 Ruby under a microscope,裡面有講到 Ruby 會在 runtime 被編譯成 bytecode,再利用 VM(Virtual Machine) 去執行。了解所謂 VM 的概念後,我就可以類推到其他東西上,像是 JRuby 其實就是把 Ruby 編譯成 JVM 的 bytecode 後丟給 JVM 執行,所以只要能跑 Java 的地方都可以跑 JRuby,那換到其他語言像 JPython,其實也是一樣的概念。

也就是說,你只需要瞭解一個概念,就可以知道很多東西背後的設計原理,因為大家都想解決一樣的問題。而你要怎麼理解這些大概念呢?就是要去鑽研一個東西,看到裡面的核心。例如 Rails developer 就可以試著從 ActiveRecord 瞭解 ORM 的設計;又或是從 Ruby 瞭解什麼是 dynamic type/ static type,兩者有什麼優缺點等等。只要先把一隻腳踩穩了,另外一隻腳要踩到 Python、踩到 Java,其實就會容易得多,因為許多共用的概念你都已經懂了。

Author

Stan Luo

I'm Stan, a junior web developer. I love writing ruby program and rails application.And I'm also looking forward making some contribution the ruby community.

comments powered by Disqus