0%

還沒有看過上篇的朋友可以點擊此處閱讀

給剛畢業或轉換跑道想投新創公司的人一些建議

這次面試幾乎所有公司走的流程都大同小異,基本上分成幾個部分,自我介紹、經歷分享、技術面試(純問問題 或 作業 或 白板題)、行為面試(團體面試 或 CEO 面試)、面試者提問。

自我介紹

可以事先準備 3~5 分鐘左右的自我介紹,內容可以包含簡述過去經歷、描述個人特質等等。個人特質的描述可以包含一些實例佐證,比如喜歡嘗試新事物可以用興趣廣泛當作驗證等等。

經歷分享

大部分面試過程中約有1/3時間會圍繞在過去的工作經驗或作品集,我這次面試有兩種型式會問到這方面,第一種是會問類似 你碰過最困難的問題是甚麼,第二種則是會挑履歷中面試官感興趣的部分提問,因此在履歷中盡量挑選有把握的經歷寫在上面,如果沒有工作經驗的話,可以放學校專案或 side project。side project 想不到做甚麼的話,可以用 line bot 當作題目(還可以省去寫前端的工)。

技術面試

初階職位以資料庫設計和 Ruby on Rails 的基礎語法為主,中高階職位則以系統架構設計為主 (也是我的弱項 QQ)。我在準備的時候是利用 Ruby on Rails 建立新專案,熟悉整個專案建置過程與 Rails 的語法,另外有刷 50 題左右 easy~medium 的 leetcode。

行為面試

這個階段我覺得最重要的就是誠實,不要編造虛假的故事,剩下就是看個人的人格特質有沒有符合公司文化。以下是我有印象被問過的行為面試問題

  • 做過最困難或最有成就感的專案
  • 未來1個月有甚麼計畫
  • 有甚麼興趣嗎?

面試者題問

建議可以事前準備一些問題,以下提供一些我有問的問題

  • 開發流程大致長甚麼樣子
  • 現在和預期的團隊規模
  • 公司未來3年的目標和願景
  • 產業現況和前景
  • 如果有幸加入貴公司,最初三個月會做甚麼事

其他事項

假設有順利拿到 offer 的話,企業主通常會希望在 1~2 周內可以拿到答覆,而整個面試流程大約會在2~3周內結束,因此可以盡量把想去的公司排在一起投履歷。

個人背景介紹

畢業於國立臺北科技大學電資學士班,在新創公司實習+全職經驗大約2年左右,工作內容以後端為主,除此之外前端、AWS、開發流程制定等也都有碰過。

主要語言使用 Ruby on Rails,個人小專案則是使用 Python。

LeetCode 大約刷了 50 題,難度介於 easy ~ medium 之間。

投遞時間是在 2021年年底~2022年年初,為疫情最嚴重的時候,因此很多面試都改採用線上視訊面試。

投遞大綱

此次目標職位是 初階~中階後端工程師。

  • 順立智慧 - 104 投遞, 婉拒二面
  • 五倍紅寶石 - CakeResume 投遞, offer get
  • GoSky AI - CakeResume 投遞, offer get
  • MaiCoin - 個人投遞, 一面後感謝信
  • 車麻吉 - 個人投遞, 二面後感謝信
  • NexTrek 匯雲數位 - hunter 投遞, offer get
  • SHOPLINE 商線科技 - CakeResume 投遞, 回電後婉拒

順立智慧

公司在內湖(西湖捷運站附近),非常難停車,如果是開車或騎車去的朋友建議可以早點到。

一面是實體面試,一開始就是基本的自我介紹,接著大約花了1/3的時間問履歷上一些過往經驗。

1/3的時間是技術相關問題,有印象的題目是

  • rails 中 join 和 includes 的差別
  • 費布納西數列
  • SQL 基本語法,像是 select 與 left join

面試的房間有白板,會直接在上面答題,如果遇到不會的題目也可以當場查詢資料。

剩下時間則是介紹公司業務與部門職責。

大約 3 天後收到二面邀約,但因為已經有其他 offer,因此婉拒二面。

五倍紅寶石

在投遞履歷前有一項作業,作業完成後透過 cake resume 投遞履歷,大約 1 天後收到實體面試邀請。

一面大約2小時,前半部分主要是針對作業的 code 做討論,有點像是 code review 的感覺,會問你為甚麼這邊要這樣寫,有沒有更好的寫法之類的。接著是聊我過去的經歷跟有沒有問題想問他們的。

作業本身並不難(我花最多時間的反而是在前端QAQ),可以在面試前自己對自己 code review 一次。

面試完後直接 offer get。

GoSky AI

透過 teamdoor 投遞履歷後,大約3天後收到線上面試邀請

一面為技術面試,由兩名後端一同面試,主要內容為 Ruby on Rails 基礎語法,有考一題白板題是要當場設計設計一個優惠券的 schema 與相關功能。面試完後大約 2 天收到第二次實體面試邀約。

二面為團體面試,由產品團隊各職能派一位代表進行(包含前端、後端、設計師、PM),主要問行為相關的問題,看面試者的個人特質是否與團隊文化和公司文化相符。

2天後收到 offer get。

MaiCoin

透過 email 直接投遞履歷,大概 3 天後收到第一次視訊面試邀請。

前半部分是聊過去的經歷,後面則是技術相關的問題,有一題白板題是數學相關的題目,請你寫一個 method 來達成。題目本身不難,但因為我太緊張,導致有些 edge case 沒有想到。

2天後收到感謝信並推薦另一個職位,但因為有拿到 offer 而婉拒。

車麻吉

透過 email 直接投遞履歷,大約2天後收到作業與第一次視訊面試邀請。

第一次面試主要是講解作業內容、招募流程、團隊目前狀況,接著有1周的時間可以寫作業,如果覺得時間不夠可以延期。作業總共有三題,1題跟資料庫設計有關,2題跟系統架構設計有關。

繳交作業後,大約3天收到第二次實體面試邀請,二面除了會針對作業內容進行討論外,也有額外再問其他技術相關的問題,大多都跟資料庫有關,剩下就是過往工作經歷和公司環境介紹。

2天後收到感謝信。

NexTrek 匯雲數位

透過獵頭投遞履歷,大約1、2天後邀約線上面試

一面是與 CEO 視訊面試,與其說是面試倒比較像是聊天,前半段是聊我過去的經歷,後半段則是 CEO 介紹公司的業務,並讓我提問關於公司營運相關的問題。

大約 2 天後收到二面邀請,二面是與 CTO 和 CEO 一同進行視訊面試,前半段一樣是聊過去的經驗(技術相關的比重比較多),後半段則是 CTO 出一些技術相關的題目來問,比要有印象的題目為

  • Block、Proc、Lambda 差別
  • 字串(String)跟符號(Symbol)的差別

題目比較偏向 Ruby 的細節知識,平常沒特別深入研究的話還真回答不出來。最後我也問了許多關於開發團隊相關的問題,例如目前的開發流程、預計團隊的規模等等。

2天後 offer get 。

SHOPLINE 商線科技

透過 cakeresume 投遞履歷,約 3 天後收到實體面試邀約。

蠻怪的是我投 backend software developer,但感覺被當作應徵 senior 。

面試一開始考了如何設計一個電商的系統架構,沒有特別準備加上經驗不足,所以答得不是很理想。後半部分一樣是聊我過去的實務經驗。

大約 3 天後,接到人資電話說開發部門目前想找經驗更豐富的人,但 QA 部門對我有興趣,邀請我進行二次線上面試。

二面 QA 部門就都沒有技術相關問題,前半部在聊我的經歷,後半則是說明該部門的職責及讓我提問。

大約 1 周後有收到人資電話,詢問我對該部門有沒有興趣,我回覆目前職涯規劃想以開發為主(不確定算不算 offer get 😂)

幣託

年前投遞履歷,年後接到人資的電話,因為已經接受 offer ,因此婉拒。

總結

大部分的公司在收到履歷後1周內會邀請面試,而面試結束後短的話三天內就會收到回覆,最晚一周內會收到,這次面試很幸運地沒有遇到無聲卡。

下篇是關於面試的一些心得建議,可以點擊此處閱讀

免費 SSL 憑證申請

Let’s Encrypt 是一個可以免費申請 SSL 憑證的機構
最簡單的做法是透過 Certbot 來替你的網站安裝憑證


以下範例用的是 Ubuntu 16.04 + Nginx

  1. 首先要先 SSH 進到你的 server 並擁有 root 權限
  2. 下載 Certbot 資源
1
2
3
4
5
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
  1. 安裝 Certbot
1
sudo apt-get install certbot python3-certbot-nginx
  1. 執行
1
sudo certbot --nginx
  1. 測試更新 bash script

因為 Let’s Encrypt 發行的憑證 90 天後就會過期,因此每1個半月就需要更新一次,而 Certbot 會幫你安裝一個自動更新的 bash script
通常安裝在其中一個這邊的位置

1
2
3
/etc/crontab/
/etc/cron.*/*
systemctl list-timers

檢查更新程式

1
sudo certbot renew --dry-run
  1. 驗證 SSL 安裝成功
    可以在 SSL checker 檢查有沒有安裝成功

想趁著做 Side Project 的同時順便練習一下文筆,因此就有了這系列的文章,主要是紀錄踩過的坑。
Side Project 想要使用 flask + postgresql,因此打算要在 windows 10 上安裝 docker,並透過 docker-compose 建立 postgresql 資料庫,而以下就是今天踩到的坑。

在 docker-compose 中利用 environment variable

1
${VARIABLE_NAME}

psql: FATAL: password authentication failed for user “postgres”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# docker-compose.yml
version: '3.8'

services:
db:
image: postgres
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data

volumes:

postgres-data:

在 docker container 裡建立的 postgresql 沒辦法連進去,兩個方法可以試試看

  1. 刪掉 docker volume 後重新跑一次

    有可能是因為在建立 container 時一樣用到舊 volume 資料,導致 docker-compose 或 docker file 上的設定沒有套用。

  2. 將對外的 port 從改成 5432 改成別的 5433:5432

    前面的數字代表 container 向外對應到 windows 上的 port,後面的數字則是 container 內的 port

    因為 5432 是 postgresql 預設的 port,所以假如在 windows 本機上也有裝 postgresql 的話,不管是透過 pgAdmin 或下 psql 指令連線都會連到 windows 本機上的 postgresql,而不是 docker container 裡的。

pipenv shell 中沒有辦法使用箭頭上跟下來輸入之前的指令

在 power shell 而不是 cmd 中執行 pipenv shell 就可以解決。

把一些常用的 hexo 指令記錄下來,以免每次都要重新查

  • 建立新文章

    1
    hexo new [layout] <title>
  • 產生 static file

    1
    hexo generate

    在 deploy 到 github 之前需要先打這行指令
    可以在後面接上 -d--deploy 就可以直接發布

    hexo generate -dhexo deploy -g 是一樣的

  • 在 local 開 server

    1
    hexo deploy -p 5000

    -p 指令 port

  • 列出所有路徑

    1
    hexo list <type>

    type 打 post 可以拿到所有發布的文章

  • 清理快取和產生的檔案

    1
    hexo clean

緣由

每次需要開發較大型的新功能時,往往需要一併重構或是想新架構,而一個人想出來的架構往往會有許多的盲點,因此就會需要畫簡易的類別圖。類別圖不但可以重新審視自己想的架構,更能加速與其他工程師討論的效率。有鑒於本人時常忘記類別圖各種相依關係的圖示,因此以這篇筆記來幫助我快速恢復記憶。

什麼是類別圖 class diagram?

類別圖是 UML 的一種,他透過一個系統中的物件、物件的屬性、物件擁有的方法和物件與物件之間的關係來描述其結構。

類別圖符號

類別圖的符號分為兩大類

  • 描述物件本身
  • 描述物件與物件的關係

物件 Object

總共分為三大格

  1. 物件名字
  2. 物件屬性
    • 前面為屬性名字
    • 冒號後面為屬性型別
  3. 物件方法
    • 前面為物件名字
    • 括號內為參數和參數型別
    • 冒號後面為回傳值型別
  • +代表公開屬性/函式 public attribute / method
    任何物件都可以存取和使用
  • -代表私有屬性/函式 private attribute / method
    只有該物件內部才可以存取和使用
  • #代表保護屬性/函式 protected attribute / method
    只有該物件和該物件繼承的子物件可以存取和使用

關係 Relation

  • Realization

    • A implement B , A 實作 B
    • B 為介面
  • Generalization

    • A extend B, A 繼承 B
    • B 為父類別
  • Dependency

    • A references B, A 使用 B
    • A 在參數或回傳時有用到 B
  • Association

    • A has-a B object, A 擁有 B
    • B 為 A 擁有的變數

Aggregation 和 Composition 為 Association 的一種特例

aggregation
  • Aggregation

    • A 是由 B 組合而成,且為弱關係
    • A 和 B 擁有自己的獨立的生命週期,B 可單獨存在
    • 舉例

      訂單 擁有 商品
      商品可以獨立存在

  • Composition

    • A 是由 B 組合而成,且為強關係
    • B 只要離開 A 便不具意義,無法單獨存在,且生命週期與 A 一樣
    • 舉例

      人 擁有 手、腳、頭
      手、腳、頭獨立存在時無意義

參考資料

以下紀錄以前使用 Ruby 查詢的一些小知識
可以利用 ctrl + f 快速搜尋

數字相關 Numeric

  • 除法
    整數 / 整數 = 整數
1
2
> 5 / 3
=> 1

但如果有任一數為小數,則結果為小數

1
2
> 5 / 3.0
=> 1.6666666666666667

如果想要整數互除得到小數可以使用 fdiv

1
2
> 5.fdiv(3)
=> 1.6666666666666667

如果想要得到分數,可以使用 quo,不過都要是整數

1
2
3
4
> 5.quo(3)
=> (5/3)
> 5.quo(3.0)
=> 1.6666666666666667

Refactor 之路

此系列文章是為了記錄 Refactor 公司遺留程式碼,一方面以後可以回過頭來檢討,一方面可以讓更多人一起討論。
主要會寫一些 design choice 以及架構設計的 UML 圖。

第三方API封裝 Third Party API Encapsulation

Service Diagram

Service 主要負責三件事

  • input validation (輸入驗證)
    validation 寫在 service 的好處是,如果未來 validation 有更動,就不需要到各個 adapter 修改
  • output format (輸出格式)
    統一不同介面的 API 回傳格式
    介面可按需求自行調整,主要是為了讓每支 API 有共通的操作介面
  • HTTP request encapsulation (封裝)
    封裝後可以隱藏實作細節,並重複使用