【Life】七年之癢–我的碼農之路

轉眼間,在IT界當碼農過了七個年頭,在紐西蘭也工作了一年多,覺得自己應該寫篇記錄來紀錄這七年的里程碑。除了幫助自己回憶,也相信過了幾年再回過頭來檢視這篇記錄時,能夠有對照組來做比較。

若有看過我之前寫的這篇文章,會知道我大學唸的是私立大學心理系。因為對程式有興趣,在大學時曾幫系學會架設簡單的HTML/Flash網站。雖然如此,在那時並沒有任何念頭要把寫程式當作是畢生志業,也沒有花時間去自學任何程式語言。

2007年大學雙學位畢業(畢業學分快要200,累死老娘),去了另外一間學校的心理所打混了兩年,2009年離開學校後到醫院、機構擔任社工、就服員。在機構工作的一年之間意識到自己完全不喜歡這份工作,每天上班都讓我痛苦難耐,知道自己絕對要轉換職業跑道,否則一定會瘋掉。但是要做什麼?通常知道自己『不』喜歡什麼會比喜歡什麼相對容易。現在知道自己不喜歡這份工作了,那之後的路呢?我不斷的反覆問著自己。那時身邊剛好有幾個好友在寫程式,他們知道我對IT業有興趣,不斷的鼓勵我做轉職嘗試。但是身為一個私立大學心理系的畢業生,想要憑著這樣的學歷找IT的工作是談何容易?因此當時做了一個影響往後人生且燒錢的決定:去補習並且拿到Java證照。(我絕對沒有要鼓吹大家去補習!)

去補習只是一個為了讓自己在短時間取得證照的手段之一,我也在補習的三個月中,奠定了Java的基礎。當然,一般人絕對可以透過完全自學(e.g:線上找資料、上線上課程)的方式來學習寫程式,所以我不鼓勵大家去補習。而為何那時會選Java?因為Java在當時是許多企業架站的首選語言,而且剛初啼試聲的Android也是使用Java API,我相信會Java就應該會有很多工作機會。

2010年春天,一邊工作一邊補習,六月時考到了Java SCJP證照,從那時開始找寫程式寫關工作。一開始面試處處碰壁,八月時好不容易遇到了一間小公司的老闆願意給我機會嘗試。結果每天被罵被電,晚上九點之後才下班,還只做了一個月就被老闆fire。我也還記得開始寫程式的第一個月,常常會不知道該從何下手,連for loop都不太會用,但是後來有一天就『突然』開竅了(真的是突然,沒騙你)。人生嘛,不如意之事十之八九,不可以就因此喪志。被第一間公司fire之後沒多久找到了另一間願意給我機會的公司,開始做Java EE web application方面的維護跟開發。那時候最流行的Java MVC framework是Struts + Spring + Hibernate,前端用JSP + Java servlet API。以前其實沒有所謂的前後端,寫程式都是前後端全包,也就是全端。而那時也花很多時間在Oracle Database和Postgresql上。

Java EE碰了半年多,之後轉做Android app開發。2011年四月到2012年八月,陸續開發了11種不同的Android apps,也考到了第二張Java進階證照SCWCD,但那時對大型系統還不是很有經驗。台灣很看重學歷,每次面試總是會被問以前是念心理系,為何現在會來寫程式(os: why not?),所以那時我決定報考不同學校的資訊研究所在職專班,嘗試把自己所缺的學歷補齊,而這也是影響往後人生的第二個重大決定。

考上交大後,2012年九月到竹科的某Z上市公司工作,在這間公司工作的第一年,大部分的時間在處理JVM integrated with embedded system的問題,然後有接觸一點Java OSGi,但幾乎一行程式都沒有寫過。只有為了demo,寫了一個簡單的Android app。這一年我的程式能力沒有一點進步,站在我的立場也可以說浪費了一年。

好不容易捱了一年轉了部門,在新部門總算是有寫程式的fu了。在這個部門工作的10個月,我首次有機會接觸到Java以外的語言(e.g: Python, Ruby, JS),但大部分時間還是寫Java。2013年是首次接觸AWS,因為當時要deploy程式到AWS,還花了點時間研究Chef來快速部署系統。雖然當時看起會的東西不少,但是除了Java,其實每個都不精。也因為課業很繁忙,根本無暇去精進coding能力。那時做的系統是雲端網路管理系統,要把用Java寫的OpenSource網管系統模組化後放上雲端,所以我在Z公司的這段期間玩了很多AWS的服務,也奠定了Linux操作的基礎。

2014年六月底為了完成碩士論文,丟了辭呈全心全意準備論文,九月按照計畫的畢業了。在研究所的兩年,學的東西其實跟工作內容沒什麼關聯。我覺得對工作比較有幫助的是加強了解決問題的能力以及英文閱讀和寫作的能力。

2014年十一月底重回職場進入一間外商軟體公司工作,這裡高手群集,而主管本身也是Java expert,我在這裡才真正學到什麼叫design pattern、TDD。在這裡也是我第一次重無到有做出一個系統,不像之前的公司是拿OpenSource來修改,架構限制很多就算了,還要很痛苦的看別人寫的code。我在這裡工作一年半,因為工作表現優異,期間被主管加薪了10%,可惜加薪沒多久就跟主管提了辭呈,準備來紐西蘭找工作(這又是另外一個故事了……)。

在這間公司工作時才知道Web application已經分成Frontend跟Backend,非常感嘆程式語言的世代更迭之快速,要逼迫自己不斷的學習。當時後端使用的Java Framework是Spring boot + JPA,前端使用Reactjs + Redux。我因為對Java比較熟悉,一直被分派做Backend的開發,但是其實一直對可以看到畫面的Frontend很有興趣,下班之後花了不少時間上Online learning course學習其他的程式語言。在當時也因個人興趣花了一些時間研究Python Django,發現Python的語言簡潔優美,而Django架站快速,一下子就可以架好一個簡單的網站,可惜工作中都沒有機會接觸。

2014年底因為對AWS和Linux系統有一定程度的瞭解,我架設了現在使用的blog在AWS上面,這即是bluebottle的開始。

大約從2013年開始,整個IT界開始興起cloud的概念。AWS、Google Clouds Platform、Azure等各個雲端供應商大放異彩,那時主管想把我們正在做的產品也雲端化,但是又不想花太多錢,便選擇了OpenStack來架設私有雲。個人並不看好OpenStack,雖然它是Open Source有很大的可塑性,但是離AWS的腳步還有很大一段的距離,且不知道要花多少時間才能夠追上,我相信很多企業還是會選擇AWS這種Commercial的公有雲。看好AWS的前景,我在2016年三月時考到了AWS Certified Developer。這時候自己的重心不僅是放在coding,還放在如何使用AWS。

前面提到念交大資工所是我人生中第二個重要的決定。因為如果我沒有念交大資工所補齊學歷,我沒有機會進入之前的公司工作(這要歸罪於台灣的變態學歷情節),我也沒有辦法申請紐西蘭的Silver Fern Practical Experience Work Visa。要能夠申請這個工作簽證,除了本身必須是Silver Fern Job Search Visa(已於2019年永久取消)的持有者,以Software Developer的工作來說,必須要符合1.有CS or EE相關學歷或2.五年的工作經驗。申請紐西蘭技術移民時,想要claim skilled employment的分數,也必須要符合這個條件。我若要claim五年的工作經驗不是不行,但整個流程會非常戎長麻煩。好在有資工碩士的學歷,免去掉這些狗屁倒灶的文件申請。Apart from this, the most important thing is… a secret. 😉

去年五月剛到紐西蘭時還沒有很忙,接了一個Android專案來練手。事隔將近四年沒有碰Android,Android已經從2.3變成6.0,API改到我都認不得了。這個拿來練手的專案除了要寫Android app,還要做Backend service (Java + Spring Boot) 來介接資料。我對Backend service非常熟悉,一下子就弄好了REST API,反倒是花了很久的時間在處理Android app的介面。

去年十月加入現在的Kiwi公司之後,很高興自己終於成為一個Fullstack developer。高興的重點當然不是因為職稱很炫,而是自己終於有機會參與Frontend的開發,而目前Frontend使用的framework是Angular4 + webpack,Coding language是Typescript。現在所參與的案子也是工作以來最龐大複雜的,整個專案有超過百人參與。而我也很高興我們的專案使用AWS,讓自己有機會繼續朝AWS的領域專精。

專案架構是使用Microservices,是我在台灣時從來沒有接觸過的。整個專案有超過百個Microservices同時運行,有些用Java & Groovy + Spring寫,有些用Node.js + TypeScript寫。雖然Microservices部屬快速,但只要有一個Microservice掛了,其他的Microservices也常常被受影響,debug也不是那麼容易,有時候覺得蠻煩人的。且Microservice架構需要有相當的人力來處理環境的問題,所以DevOps在專案中扮演了非常重要的角色。有時候我們不僅是要會寫code,也要懂得去處理跟AWS環境相關的問題。以後說不定我程式寫煩了,轉跑道去挑戰DevOps也不錯。

今年年初開始,自己在空閒時間練習網站的開發,並放到Github。這個網站的前端用Angular4,後端用Node.js + Express (TypeScript),用Gulp來build/compile。我相信這對某些高手來說是相當簡單,但這卻是自己第一個從前端寫到後端的網站(而且不是用Java!)。

現在還學到了很多以前沒有接觸過的技術,除了前面提到的Angular4、Microservices,對於部署Microservices不可或缺的工具還有Ansible、Kubernetes和Docker,這三個東西以前根本連聽都沒聽過。此外,因為專案很大,CI/CD pipeline也相當重要。我在前公司使用的是Jenkins,現在使用的是Bamboo,兩者各有千秋。使用Bamboo的好處是可以完全整合Jira和Bitbucket,讓專案追蹤、commit code、build code等步驟更加的方便。另外為了加速搜尋資料的速度,我們使用了Postgresql + Elastic Search,我才知道原來做資料搜尋除了傳統的Database之外還有其他更快速的搜尋方式。對於喜歡學習新東西的我來說,每天都有新東西可以學習,非常的充實。

題外話,跟同事工作了好幾個月才知道原來team leader是主導Open Source Ebean ORM的大頭頭,總是很熱心地教我很多東西,非常nice的kiwi。

結語

回頭看過去的七年,我從一個非資工本科出生的程式門外漢,到現在變成在紐西蘭工作的碼農,並不是我天資聰穎,而是因為我很努力,而且我總是對於學習新技術有興趣。我最討厭解Codility and LeetCode,也絕對不是程式大牛,但是我喜歡嘗試新的東西。

作為一個職業碼農,我最大的感想是,在這個職業一定要抱著一個學習進取的心,因為不管是web application或是mobile app,更新的速度實在是太快了。每天都不斷有推陳出新的技術,要保持腳步跟上才不會被淘汰。我每天有空會上Udemy or Lynda.com來充實工作中接觸不到的技術。我們很難預測未來三年的科技變化,但是一直不斷的充實自己準定不會錯。

(Visited 1,446 times, 1 visits today)