我是如何在高中畢業成為一位軟體工程師?

關於工作前的準備與工作後的養成

--

從辦公室看出去的內湖塞車畫面

繼上次在梅竹黑客松的小型分享後,決定好好寫篇文章,將這段提早啟程的工程師人生撰寫下來,也希望能給將要畢業的高中生、想轉職工程師的挑戰者一些幫助!

這篇文章適合誰

  • 高中要畢業,準備踏入資工領域,然後想先做大事的你
  • 想要轉職工程師,正在探詢方向的你
  • 正是一位 CS 學生,想看看我的工程師養成學的你
  • 有閒,也願意一同分享,自己跳級打怪故事的你
  • 純粹路過,想看看這段故事的你

你是怎麼在高中畢業成為一位工程師啊?

這句話基本上是每位遇見我,得知我同時是一位資工系學生,也是正在軟體界開發的工程師時,會先拋出的疑惑。

老實說,我也很意外,因為這並不是一開始所預想的計畫。

而當我嘗試細數這些歲月,慢慢從 Junior 升為 Senior ,並正讓自己邁向 System Architect 的過程中,回頭看當年高中畢業時的衝動,我反而覺得「高中畢業躍升工程師」只是這段歷史中的一個事件,反而工作前的準備工作後的養成才是最重要的。

我發現,如果沒有工作前的一些前置準備,我將無法有充足的知識與能力承擔起工程師的職位,也沒有管道。而若沒有工作後的個人持續養成,我則很容易被有實力的後進與快速迭代的技術中被淘汰掉。

也因此,以下我將和大家分別談談我的一些準備與養成,希望帶給讀者們一些幫助。

獲得工作前的準備

有一種做不到,是自己覺得做不到~

基礎的英文閱讀能力

英文,我想基本上是踏入軟體開發界的標準配備。但是並不需要到強大的聽說讀寫能力,像在考 IETLS 或 TOFEL 一樣,除非要去美國工作 XD。基本上有基礎的閱讀能力就完勝了。

在後續工作歲月中,每當發現一個新的開發概念,或在查技術文、Bug 時,首先映入眼簾的通常都是英文。在工程開發界中,文件 ( Document ) 通常在你嘗試調用某個機構提供的服務,或想用某個開源專案時,必定需要閱讀的篇章,而這些通常都是英文。

舉個工程師時常發生的故事作為例子:今天你在開發某個 feature ,看到爆出了 Bug ,頭腦想一想發現找不到解決方案,於是你將 Bug 貼到 Google 上查查,發現看到 Stack Overflow (一個問問題的網站) 有人解決過,點進去後發現滿滿的英文。

如我過去想查某個技術怎麼用時,都希望找到繁體中文的解說。而很快就會發現繁體中文找不到,就會看看簡體中文的解說。而很快就會發現簡體中文找不到了,就會需要看英文文章,看久後以後自然都只看英文了~

工作前很會寫程式嗎?並沒有

首先要先強調,我在工作前的寫程式能力,並不精熟。而硬生生學寫 Code也太無聊了,所以我通常都找有趣的範例當開端,順勢學得一門知識。

最早是從國二開始,想在暑假期間找個目標達成,就去書店隨意買了一本 C# 基礎入門,照著書中的範例做了一個紅綠燈,看到程式跑起來就很開心。

之後高中創辦資訊社後,隨著老師 C++ 的教材慢慢學,但也是學的很淺,連 Linked List 、 OOP (物件導向) 都不清楚,也沒有參與過競技程式、比賽的訓練。

畢業前夕,和國文科秀雯老師合作一個科技跨域的教案,「用程式進行紅樓夢文本分析」,因為題材有趣,我順勢補足了很多自然語言學習的知識,我也意外和白先勇作家有了一次餐敘。

儘管程式背景能力不充足,慶幸入職的第一個專案是前端,使用簡單好學(High-Level Language)的 Javascript 與 Vue.js 框架,我憑藉著所擁有的開發能力,並隨著在多年的 Google 查資料、看各種文章,及系上更專業的訓練後,慢慢補足了專案開發的實力。

「老闆,來點寇汀吧」是我對前端感興趣的開始,也許你也可以看看:

而在 Codecademy、Udemy、 Hahow 線上課程盛行的現代,精熟一個易入手的 Javascript、Python 語言不再是件難事,能做到的事也足夠支撐你成為 Junior Engineer 了,也建議大家可以嘗試看看。

參與社群

參與社群,幾乎是主導了我近期人生的軸線。不論是參與別人主辦的社群,或是自營了幾個黑客松社群,我皆在過程中遇見了人脈、接觸到了大神、學得了近期開發潮流。

我在高中時期,首次接觸了科技社群 Hackathon Taiwan,而當時的我近乎零基礎。抱著一股衝勁,我還是參與了一場黑客松,聆聽著一場場完全聽不懂的技術短講,並試著和大神工程師互動、交流,找出自己之後能回頭自學的道路。

接著,我持續抱著不怕死的個性,將我所見所聞的黑客松社群,帶回我的高中學校,創辦了專屬全台高中生參與 Hackathon Taiwan Junior 。我也因此和當時 Hackathon Taiwan 的社群前輩有更多交流與討論,這個鏈結也促成了後續我首份工作的誕生。

工作這麼多年後,我還是能時常在社群裡和別人的互動交談中,討論到很多技術面的開發與進展,也促使我體認到自己還不足,並找出能持續精進的空間。同時,我也在自營的梅竹黑客松中,試圖轉型並實踐我所想像的科技價值,也期望讓更多不同層面、背景的人,能有不同的角度切入黑客文化的精神,讓科技得以締造出更多附加價值。

而社群所醞釀的價值仍不僅於此。筆者撰寫時下,全台正面臨口罩分配數位化的議題。這次由數位政委唐鳳,所引領的公私協力、開源開發的精神,讓民間的公民科技社群也投入很多開發能量,進行口罩的數位追蹤。

簡言之,參加社群只有好處,沒有壞處。

人格特質

這些年在社群界與大學中,遇見了許多非學習體制內、跳級的工程師與大神,發現這些人都有些共存的人格特質,譬如:

  1. 好強,對自己要求高,且需要用成就感維生
  2. 敢做夢也敢挑戰,而且實踐度很高(重要!)
  3. 懂的時常評估自我能力與資源,並持續精進

能成為一位有成就的人,基本上是每個人願望。不過有願望後,會付出行動的人,通常都會少 50 % 。而付諸行動後,得以達成最終目標,往往只剩個位數 %。我認為實踐力,是上述的道路能否成功的最大因素。找出適合自己的方向,並擁有高度實踐力,是肯定會成功的,因為我遇到太多強大的工程師是非傳統體制的。

我的第一個專案: giloo 紀實影音

獲得工作後的養成

保持學習的心,不然就要被淘汰了

Keep Learning : 技術的快速迭代

加入過產品工程開發的人,大部分應該都相當熟悉 Scrum,對於產品進展的快速迭代應不陌生。

我在工程開發的這幾年,也發現了技術的迭代不容忽視。以下便是一個鮮明的例子:

上述所說的這些,最想強調的便是工程師的學習是永無止盡的。當我們嘗試坐穩某個技術與稱霸,停止學習的那一刻,我們就是等待被淘汰的人。

而我認為,保持吸收新知的習慣,特別是英文文章,是追上開發世代最有效率的方式,這也是我上篇所述英文的重要性。

基礎學科的建立:Algorithm、Data Structure、Operating System

我認為,成為一個工程師並不困難,但成為一個好的工程師比較困難。

而 CS 界的三大主科: 演算法(Algorithm)、資料結構(Data Structure)、作業系統 (Operating System) ,是從普通工程師邁向專業工程師的基本配備。

筆者剛開始工作時,一個主科都沒學過所寫出的 Code,到後期全部主科都學過後的 Code ,長得樣子是完全不一樣的。

而若筆者是從 Javascript、Python 入手的工作,或許會隨著公司業務需求或升級 Senior Engineer,開始需要對部分服務做性能調教,這時就會開始思考轉向 Golang 或 Rust 等語言。而尤其撰寫上述語言時,沒有基本 Operating System 概念肯定是會處處碰壁的。

受惠小公司:我得以學很廣,並決定深入一個研究

工程師最快練功的方式,應屬直接投入一個專案。因為各式各樣的開發進程 Deadline 、與別跟薪水過不去的心態,會促使自己更快掌握技術,完成開發。

而能參與到這麼多不同類型的開發,仍然起因於我待在新創圈中,所以能在短時間學得很多開發經驗。

受惠於新創公司,開發任務並未分配的很清晰,我在入職的半年後轉型到後端領域,以 Node.js 繼續做商業邏輯的開發。從 Authroization 到 Authentication ,參與過 Line Bot 、Streaming 、Payment System 、 E-Commerce 的調教與重構。也在不同專案中調用、學習了不同 Database ,從 SQL 到 noSQL (Graph Model \ Tree Model) 之類的。

遵守 T 型人才的法則,不但要讓自己實作經驗很廣,還要有一門特別精深。我在工作兩年後,我重新投入了 microservice 開發,並回頭學習 Kubernetes,後者也成為了我大學最終專題的研究。(也因此,這也是先工作所帶給我的益處,因為我能以個人職涯為導向,更加確定自己想研究的項目。)

但小型新創仍有它無法完善的壞處,而關於小公司與大公司的好與壞,下面這篇好文值得大家讀一讀:

常見的 Q & A

這些年很多人問我一些問題,以下是我嘗試整理的資訊:

  1. 一個未接受過專業資工訓練的學生,如何踏入工程師行列?

這個問題我會先拆成方向資源來談,而不同的方向會需要調用不同資源。

方向是指,你想先用最易入手的方式,成為工程師嗎?

如果是,以前端開發為優先選項,學習 Javascript,並找一個前端框架(如 Vue.js)精熟,你很快就能成為一位 Junior Engineer 了,也有空間跨足後端。(不過是最初階的,光是前端就分有好前端與壞前端,還是需要後續的持續養成)

如果不是,你想走入資料科學、人工智慧、機器學習等專業領域,我認為就不是這麼容易下手,可能需要透過大學開出的 Mooc 、線上專業課程,或一個完整的資工系訓練基礎學科後,才有機會。

而資源是指,你要透過哪些資源培訓自己,達成目標。參與科技社群、撰寫 Side Project 、加入實習、Review 開源專案的 Source Code ,都是很重要的資源,也務必貼切自己的職涯方向。

2. 學業與工作之間,是否可以兼顧?

以我從高中畢業的暑假開始工作,至今已經 2 年半了,並其中參與了一年梅竹黑客松總召的經驗來看,懂的利用時間,並能和公司做有效溝通,不但不會有衝突,反而會有加乘效益,因為能更加知道自己要修什麼課、專題要研究什麼,如上方所述。

以上就是我試著回顧提早工作的工程師旅程,想與大家分享的個人經驗。如果讀者有任何想法,也歡迎在底下留言跟我分享,也希望我的文章能給讀者們一些幫助!

--

--

岷錡/Mencher
曼徹的矽谷旅記 Mencher’s Travelogue

Googler. UC Berkeley EECS Master Student. System Architect & Backend Engineer. President of 7th Mei-chu Hackathon, founder of Hackathon Taiwan Junior.