履歷 v2

個人資料

  • 姓名:施俊羽
  • 學歷:淡江大學資工系四年級

技能

軟體開發相關

  • Python
    • 網頁框架: Flask
  • Javascript (node.js)
    • 網頁框架: Express.js, Feathers.js
  • 資料庫
    • MySQL
  • K-V Store (做 cache 用)
    • Redis

Server, Infrastructure 相關

  • CentOS / Ubuntu (現在使用 Ubuntu 居多,因大多使用 Docker 部署)
  • 各式伺服器架設
    • Web Server (Apache / Nginx)
    • Mail Server (Postfix) - 含 SPF Record、DKIM、DMARC 之設定
    • DNS Server (bind)
    • VPN Server (PPTP / OpenVPN)
  • Docker
    • 3 年左右經驗
    • 曾經把多個 Application 包裝成 Docker image
  • Cloud Service
    • 在目前的公司全套使用 AWS 架設,tech stack 於下方詳述。

經歷

MyProGuide

網站開發

最早使用 Django 撰寫,但在前幾位開發者沒有留下文件,架構又不是很好的情況下,決定整個重寫,耗時約半年。我們先將前端整個使用 Angular 重寫,改採用前後端分離的架構,並將 Django 內需要使用的功能製作成 API 供前端呼叫。前端重寫初版完成(約兩個月)後,便開始進行後端重寫,重寫過程中新功能一在新後端完成並測試 OK,便將資料轉移到新後端,前端改呼叫新的 API,使用者 migrate 到新的系統完全自動化。

新的網站採用 Feathers.js 框架撰寫,起初大量採用框架本身的功能與 pattern 進行開發,但後來漸漸覺得會因為框架而綁手綁腳,在閱讀了 無瑕的程式碼:整潔的軟體設計與架構篇 以後,對於書中所提到的一些對於架構的想法覺得很好,便漸漸的改成完全自行實作模組中的每個部分,僅在接口的部分撰寫符合框架介面的接口,減少對框架的依賴。

同時我也開始加上了單元測試,目前全系統約有近 300 個單元測試,執行一次的時間在 20 秒以內,執行時也不需依賴實際的資料庫 (皆有做 mock 等測試替身),讓現在新功能改動後的測試時間從原先人工測試一輪要一兩個小時,到現在只要花不到一分鐘執行單元測試,再輔以人工探索測試尋找問題即可。

在新模組的架構不斷演化的同時,舊的模組我也有時間就進行重構,最近已將網站的一項核心功能重構完成,補上了完整的單元測試,同時也加上了快取機制,讓速度有了顯著的提升。 因應 Node.js 的新版本已經將 async / await 的新功能放入 LTS 版,現在新的 code 也全部導入使用 async / await 撰寫,舊的 code 約半數也已經改成 async / await 的寫法。

基礎建設

我們的全套系統目前都架設於 AWS 上,詳細所用到的服務是:

  • API Server 架設於 ECS 上,使用兩台 EC2 分散負載
  • 資料庫使用 RDS 上的 MySQL,並啟用 Multi-AZ 以增加可用性
  • 資料儲存使用 S3,並使用 Cloudfront 加速
  • Cache 使用 ElastiCache 上的 Redis
  • Email 服務使用 SES
  • 前端的 Angular 專案也存放在 S3 內,並透過 Cloudfront 提供服務,不需另外透過 nginx 等 web server
  • 縮圖使用一套名為 imgproxy 的開源軟體 (GitHub link),其可以在網址內傳入寬高與裁切等參數,自動進行縮圖,同樣部署於 ECS 上,使用 Cloudfront 進行快取,便可以在速度、節省空間利用與預算上取得平衡
  • 每個服務之間都有在 VPC 內切開網段與 security group,並設置白名單,只有允許的對象之間(ex: ECSMySQL)才可通訊
  • 使用 CodePipeline,在原始碼被 push 到 GitHub 時即被自動建置與部署。前端使用 Codebuild 搭配已包裝成 docker image 的建置環境,建置完以後複製到 S3 即完成部署。後端一樣使用 Codebuild 將原始碼建立成 docker image,接著呼叫 ECS 部署 script 進行部署。

工作流程

我們採用的是 scrum 的方式,使用 Jira 進行專案管理,sprint 週期為一週。

在每週的 sprint planning 會議上我們會決定接下來一週所要完成的目標與進度,每天早上我們也會做 stand up meeting 來確認大家在工作的順序上有無錯誤,或是有沒有遇到問題等。

自行接案

在得到正職工作以前,我也和同學與朋友接了幾個工作,簡述如下:

  • 淡江大學資工系計中
    • 我們目前提供上課時所需的 Web Server 環境(LAMP 架構)和個人專屬的 Docker container,裡面可執行一般的 Linux 程式,可作為學生練習 Linux 使用,平時有 3 400 個 container 同時上線。
    • 因為我們希望每人能有自己的網頁空間與網址,因此我們使用 nginx 作為 reversed proxy ,sshpiper 做 SSH 的 reversed proxy (username based),並使用 consul + consul template + registrator 的搭配,將所有上線的 container 都註冊到 consul 去,並由 consul template 動態更新伺服器設定檔,達到全自動化部署的效果。
    • 這裡有架構圖可以參考
    • 因為在新創很忙,平時實在沒什麼時間維護,後面的維護和更新主要都交給 YC 大大了 <(_ _)>
  • 淡江大學 策略遠見研究中心 網站後端 (大二)
    • 使用 Node.js + Express 撰寫,只有 API 的網站後端,因為前端採全動態載入,因此前後端分開來開發。
    • 資料庫使用 MySQL,因為我的 SQL 還不是很熟,因此使用 Sequlize.js 這個 ORM library
    • 採用每個功能一個模組,模組內使用 MVC 架構,主程式再將各個模組掛上的架構。
    • 使用者的部分採用 Passport.js,此 library 支援多種驗證方式,除了基本的帳號密碼登入,未來還可加入如 Facebook / Google 帳號登入等支援
    • 內附 Dockerfile,讓第一次參與 / 使用本專案的人,可以快速的將程式執行起來。
  • 車牌辨識系統 (大三)
    • 因為這個是老師接的產學合作案,所以沒有辦法提供 Source code 做參考
    • 和老師一起做的產學合作案子,老師負責底層的辨識引擎開發,我負責上層的API串接,還有串接廠商的設備
    • 使用 Raspberry Pi 3 做為主機,當然效能不足時也可改用一般 x86 主機執行;使用 Python3 做開發。
    • 固定車位辨識流程:定時監視輸入檔案資料夾有無新檔案,有則將檔案傳給辨識用的 thread 進行辨識,辨識後的字串交由 Regular expression 過濾一次,確認沒有問題以後輸出。
    • 出入口辨識流程:使用 Arduino 接收來車訊號,收到以後使用 Pi Camera 拍攝車輛照片,辨識以後將結果分別透過 TCP Socket 送到廠商的 Server 與網路芳鄰共享資料夾
    • 除了辨識部分使用 4 個 thread 以榨出 CPU 最多效能以外,其他各功能(監視資料夾、拍攝照片、送出辨識結果)皆各使用一個 thread,thread 之間以 Queue 溝通,並使用 threading.Lock 確保不會造成 race condition。
  • Web Server 代管 (大學以來一直都有)
    • 我曾與朋友合接過幾個網頁製作案子,內容多半是採用 Drupal、Joomla 等內容管理系統 + 現成模板製作網站,再加上後續的網站維護 / 主機代管服務。
    • 我使用的主機是 Linode 的 VPS,目前主力機器是是在新的 Tokyo 2 Datacenter 的 Linode 2048 (2GB RAM) 方案的 VPS
    • 目前完全使用 Docker 將所有 Web Server 容器化,因此該主機上同時執行了兩個 Apache (分別使用 PHP 5.6 / PHP 7.1,因部分程式有相容性問題),前面使用 Nginx 做 Reversed proxy,並使用開源的 MariaDB 作為後端儲存。

Side Project

一些自己做的小玩具

  • 抱枕套發售資訊 RSS Feed
    • 算是個人興趣的小專案,因為蠻喜歡這類周邊商品,但是討論去上大家會發的消息其實算少數,因此找了一個資訊量頗大的情報網站,替他寫了爬蟲,將爬下來的資料做成 RSS,方便訂閱與閱讀。
    • 爬蟲使用 Python 開發,Server 用的是 node.js + express。

個人作品集

Github: https://github.com/tom19960222
Docker Hub : https://hub.docker.com/u/tom19960222/

聯絡資料