從 2010 年底開始當工程師到現在,不知不覺也過了十年。回想起來在過程當中,有些事情我覺得很幸運地做對了些什麼。它們都是些看起來簡單的道理,但做起來有一點眉角。在這篇文章裡,我把這些記錄下來跟大家分享,讓這份幸運的果實可以傳遞出去!🤗🤗🤗

Photo by Joey Kyber from Pexels

設定目標,動態的那種

想像你在買早餐的時候,老闆突然問你說:「帥哥,現在在你的工作上,你的目標是什麼呢?」你會怎麼回答呢?

回顧過去,我認為「要隨時可以回答這個問題」這個要求,是我在很多地方學習成長的開始。當然,每個人對於「設定目標」的想像都不同(畢竟它太像新年新希望了),這邊把我自己的版本,和它怎麼幫助我的分享給大家。

在工作一年,原先的團隊以結束收場之後,我的目標是:成為一個獨當一面的工程師。在面臨生死存亡的團隊下工作,是一個充滿壓力但很棒的學習。當時我們努地想找尋各種存活下 …


Photo by Craig Adderley from Pexels

Six and half years ago, I joined Codementor as a full-stack developer. I was the seventh team member of the company, located in a co-working space, Garage Plus. Years after, I’m about to graduate from the team as the Director of Engineering, with tons of great memories, experiences, and friendships. In this post, I’m going to share my gratitude and learnings over the beautiful journey.

The Overall Diff


Jazz Tree, beautiful but irrelevant photo. Photo Credit: https://unsplash.com/photos/GfAqbDrCoio

Recently I read the book “Functional Thinking” by Neal Ford. I found it interesting and decided to sort out my thoughts in this post. This post is by no means a book review nor a TLDR. Most of the contents are based on my own experiences and understanding.

About Me

I’m “trained” with imperative programming and Object-Oriented style. But as a programmer feeling at home with Ruby and JavaScript, I am kind of familiar with the “elements” of functional programming. I know “function as a first-class citizen,” curry, compose, declarative programming, and how they work in real-world battlefields such as React and…


Is there any secret of making the team stronger?

Starting from 2014, the Arc(then Codementor) team grows from then one-person to a thirty-ish one. Although thirty is far from a large number, intending to move as fast as possible as a team, we’ve been facing different kinds of challenges at each stage. In hindsight, we didn’t come up with the standard ways of making decisions in the first place. Instead, the ideas emerge and shape themselves when we work, communicate, and struggle together.

After reviewing and sorting out our ways of doing things, in this post, we are going to…


一直以來, Codementor/ Arc 總是依賴著 data 來幫我們發現/驗証各種假設。 這陣子我們使用 data 的方式漸漸有了改變。 Application 的變動、各個不同 team 流程的調整、再乘上各種人為犯錯的可能, 即使 data 的量並不多,但各種變動帶來不預期的錯誤卻越來越多。 在這篇文章裡面,我們想把我們切入問題的方式,評估的方式跟選擇的策略跟大家分享, 希望可以對於在 data 這個領域要 “登大人” 的團隊們有所幫助。

從前從前

打從我們的產品上線的第一天開始,我們總是在用各種 data 幫我們發現、驗証各種事情。 這些 data 的來源,主要分成:

  • 我們各個 application DB 放的 data
  • 外部 tracking tool 收下來的 data
  • 有些流程會把 dat …


大約在半年多前,Codementor/Arc 正式採用了自動化的 end to end (e2e) test。在這段時間之內,我們細心的呵護它,從技術上到流程上,都做了無數次的調整(也還正在進行中)。而它也沒讓我們失望,從小到記不起來的 issue 到大的首頁不能登入的 bug 都幫我們抓到過。

現在回想起來,從一開始的導入到後續的維護,有蠻多波折來回的。在內部的需求彈性很大,同時外部有多種選擇的時候,要做出決定其實是不容易的事情。我們也感受到有時候”怎麼做決定”比”這次做出什麼決定”更重要,因為如果 “做決定的方法” 本身可以隨著時間被檢討精煉,往後做不同類型的決定的時候也許可以更精準有效率。

在這篇文章裡,我們試圖把一些”做決定的過程”整理出來跟大家分享,希望大家之後如果遇到類似的狀況,可以因此 …


(這篇文章是由 YanghsingIan 共同完成)

大約在去年底,Codementor 正式在 production 的產品上使用 GraphQL。但其實在幾年前 GraphQL 剛問世不久後,我們評估的結果是暫時不考慮的。在這篇文章裡面,我們想和大家分享這中間的轉折。也就是關於在選擇它的時候,我們面對的取捨和導入的方法。

  • 取捨:在什麼情境下使用這樣子的技術對我們來說會是一個”划算”的選擇呢?
  • 導入的方法:如果要用的話,要怎麼和現有的技術優雅地整合呢?

下面會一一介紹:

  • 我們認知的 GraphQL 是什麼:一些最基本的介紹,目的是為了給這篇文章足夠的情境。
  • 為什麼一開始沒有使用呢?
  • 那現在是為了什麼來用呢?
  • Back-end 導入的方法和原因
  • Front-end 導入的方法和原因

根據 GraphQL 的官網:

Gra …


團隊進步真的有什麼”秘訣”嗎?

從一開始到現在,Codementor 的團隊從一個人成長到目前的近三十人。雖然說以絕對值來說並不是什麼太了不起的數字,但是以支撐產品快速前進為前題,過程當中各個階段都隨時會出現不同的挑戰。現在回頭看,其實大部份的事情我們並不是一開始就有一個明確的想法或方向,而是透過團隊成員們的相處,自然而然地收斂成為大家共同的中心思想

在這篇文章裡面,我們把一些作法整理歸納,和大家分享一些關於讓團隊往前進這件事情,我們嘗試過的方法和背後的概念。對我們來說,有一個很重要的概念是:這一切的流程都是動態的。因為外在的條件不斷在改變,也許現在覺得很棒的作法,下個月就開始令人困擾。所以永遠不會有”最好”的作法,而是要時時刻刻回過頭來檢視自己,看有沒有可以改進的地方。

在開始之前

現在回想起來,在解決 …


前陣子 Codementor 的 web 在 server side rendering 的時候出現惹 memory leak。 在大家的努力之下總算圓滿解決。 雖然後最後找到的點並不是什麼高深的學問, 但覺得整體發現問題和解決問題的流程應該還是可以記錄一下和大家分享。

Codementor 目前大多數的服務都是 host 在 Heroku 上面。架構上是前後端分離的, 也就是說分成了 API server 們,還有前端的 Single Page App (SPA) 們。 但因為我們需要大量的SEO,所以大多數的 web app 同時也會處理 server-side-rendering(SSR)。 也就是說,即使是前端的 SPAs,也會有相對應的 NodeJS server 來處理 SSR …


Legacy Code 應該是所有軟體工程師們心中共同的痛,幾乎可以和 wtf 畫上等號惹。 除了程式維護上的困難之外,對於工程師們的開心指數也是有著可觀的傷害力。 但是 legacy code 的問題這麼常見,也代表著它是一種很容易發生的現象。 所以在想著怎麼避免產生legacy code 的同時,學習如何與它和平共處,甚至發展出友誼(?)也是很重要的一環。

在這篇文章裡面我想分享在遇見 legacy code 的時候,如何面對它、處理它、放下它。

Legacy Code 的定義

在討論 Legacy Code 的一切之前,必須先為它下個定義。在 wiki 上面的定義是:

Legacy code is source code that relates to a no-longer supported or manufact …

Love coding, making sense of things, solving complex problems with elegant solutions.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store