Chapter 17

行為面試、CTO 對談與反問

技術實力讓你進入最後幾關,但決定錄取的往往是:你能不能把過去的經驗講得具體、可信、有深度,能不能用英文清楚溝通,以及你對技術有沒有自己的觀點。本章整理 Appier 的面試流程、履歷與自我介紹、STAR 方法、「最自豪的專案」深挖、25+ 題行為題庫、英文面試、CTO 技術觀點對談、反問清單與面試當天 checklist。

預估閱讀 70 分鐘

Appier 面試流程與每關重點 高頻

資料來源說明

以下流程依網路分享(面試心得、論壇、求職平台評論)整理,可能隨時間、職位與團隊調整。實習與正職、不同團隊的關卡數可能不同,請以 HR 實際通知為準,並在第一關直接詢問「後續有哪幾關、各關形式與時長」。

flowchart LR A["HR 電話 / 視訊初談"] --> B["團隊技術面試
履歷深挖 30–45 分鐘
+ coding / 系統設計"] B --> C["VP of Engineering
行為面試 + 英文能力"] C --> D["CTO 對談
對技術的看法"] D --> E["(有時) CEO 對談"] E --> F["Offer / 結果通知"]
關卡形式(依分享)他們想確認什麼你的準備重點
HR 初談電話或視訊,約 20–30 分鐘動機、基本背景、可工作時間(實習每週天數、可持續多久)、期望待遇、英文基本溝通1 分鐘自我介紹、為什麼 Appier、可實習的時間安排要明確;順便問清楚後續流程
團隊技術面試1–2 位工程師;履歷深挖 30–45 分鐘 + coding(LeetCode easy–medium、字串/hash map/graph 題、SQL)或系統設計你履歷上寫的東西是不是真的懂、技術深度、解題與溝通過程、程式碼品質履歷上每一個關鍵字都要能被追問三層;最自豪的專案準備架構圖;coding 用「釐清 → 例子 → 暴力 → 優化 → 寫碼 → 測試 → 複雜度」框架
VP of Engineering行為面試,部分或全程英文工作方式、團隊合作、面對失敗與壓力、學習能力、溝通能力、文化契合準備 6–8 個 STAR 故事並能用英文講;練習用英文解釋一個技術專案
CTO 對談較開放的對話你對技術的熱情與觀點、思考深度、是否持續學習、長期潛力準備對 AI/LLM、技術選型、技術債、架構演進等議題的看法,有立場也有取捨
CEO(有時)簡短對談價值觀、企圖心、與公司方向的契合了解 Appier 產品與使命(AI 驅動的行銷與廣告),說出你想在這裡成長的理由
面試官想聽到什麼

許多候選人分享:大部分時間都在討論過去的經驗與「你最自豪的專案」。這代表面試官重視的是「你實際做過什麼、做得多深、怎麼思考」,而不是背誦。準備的優先順序:(1) 最自豪專案的深度與追問、(2) 履歷上每一行都能講出細節、(3) 6–8 個 STAR 故事、(4) 英文表達、(5) 技術觀點。

Appier 情境

Appier 的業務是 AI 驅動的 AdTech 與 MarTech:CrossX(程式化廣告)、AIQUA(行銷自動化)、AIXON(受眾分析)、AIDEAL(電商個人化推薦)等。共同的工程挑戰是高 QPS、低延遲、海量事件資料與 ML 模型上線。你的故事若能連結到「效能、規模、可靠性、資料處理、可觀測性」,會比單純的 CRUD 功能更有說服力。

履歷準備:後端實習履歷怎麼寫 高頻 基礎

履歷是技術面試的「題目卷」——面試官 30–45 分鐘的深挖幾乎都從你的履歷出發。寫上去的每一個技術名詞,都要準備好被問「為什麼用它、它怎麼運作、遇到什麼問題」。

結構(一頁為原則)

  1. Header:姓名、Email、電話、GitHub、LinkedIn、(可選)個人網站。
  2. Summary(可選,2 行):例如「Backend-focused CS student experienced in Python/Go services, PostgreSQL and Redis; built an event-tracking service handling 2k RPS in load tests.」
  3. Education:學校、科系、預計畢業時間、(可選)相關課程:作業系統、計算機網路、資料庫、分散式系統。
  4. Experience:實習、研究助理、接案、社團技術職。
  5. Projects:2–3 個最能代表後端能力的專案,各 2–4 個 bullet。
  6. Skills:分類列出,只寫你能被追問的。可分「熟練 / 使用過」。

Bullet 寫法:動詞 + 做了什麼 + 怎麼做 + 量化結果

弱的寫法強的寫法
負責後端 API 開發Designed and implemented 12 REST endpoints in FastAPI for a course-registration system serving 3,000 students; added Redis caching that cut p95 latency from 480ms to 90ms.
使用 Docker 部署Containerized 4 services with multi-stage Dockerfiles (image size 1.1GB → 180MB) and set up GitHub Actions CI running 200+ tests on every PR.
優化資料庫Diagnosed slow report queries with EXPLAIN ANALYZE; added composite index and rewrote N+1 queries, reducing nightly job runtime from 40 min to 6 min.
寫爬蟲Built an async crawler (asyncio + aiohttp) with rate limiting and retry/backoff, collecting 1.2M pages/day with less than 0.5% failure rate.
  • 量化:延遲(p95/p99)、吞吐(RPS、每天處理筆數)、成本、時間節省、錯誤率、使用者數、測試覆蓋率、image 大小。沒有正式 production 數字時,可用壓測數字並誠實標註(in load tests)。
  • 強動詞:Designed, Implemented, Optimized, Reduced, Migrated, Automated, Diagnosed, Scaled。
  • 凸顯職缺關鍵字:Linux、REST API、SQL/NoSQL、Redis、Docker、CI/CD、profiling、testing、observability——但必須是真的做過。
  • 每個數字都要能解釋怎麼量的:「p95 從 480ms 降到 90ms」→ 面試官會問「怎麼量?在什麼負載下?瓶頸在哪?」
常見陷阱

(1)Skills 列了 15 種技術,被問到 Kafka 卻只「看過教學」——寧可少寫。(2)只寫「參與」「協助」看不出你的貢獻,團隊專案要明確寫你負責的部分。(3)數字誇大,被追問時前後矛盾,比沒有數字更糟。(4)中英文履歷混雜、格式不一致。建議準備英文履歷,因為 Appier 是跨國團隊。

GitHub 與 side project 建議:做一個小型事件追蹤服務

如果缺乏實習經驗,最有效的補強是一個貼近 Appier 業務、能展示後端完整能力的 side project。建議題目:小型事件追蹤(event tracking)服務——模擬客戶端 SDK 回報大量 JSON 事件、後端收集並產生統計報表(這也正是網路分享中出現過的系統設計題)。

flowchart LR SDK["JS / Python SDK
批次 + 重試"] -->|"POST /v1/events (gzip JSON)"| API["Ingest API
FastAPI / Go"] API -->|"驗證、加時間戳、去重 key"| Q[("Redis Stream / Kafka")] Q --> W["Consumer workers
批次寫入"] W --> PG[("PostgreSQL / ClickHouse
原始事件 + 分鐘聚合")] W --> R[("Redis
即時計數 / HyperLogLog UV")] PG --> Rep["Report API
GET /v1/reports"] R --> Rep API -.-> M["Prometheus + Grafana
QPS / p99 / lag"] W -.-> M

專案清單(每一項都是面試可以深挖的話題):

  • API 設計:批次上報、schema 驗證、idempotency key(event_id 去重)、限流、回傳 202 Accepted。
  • 非同步處理:Redis Streams 或 Kafka,consumer group、at-least-once 語意與冪等寫入。
  • 儲存與查詢:原始事件表 + 預聚合表,索引設計,UV 用 HyperLogLog。
  • 效能:用 k6 / Locust 壓測,記錄 RPS 與 p99,用 py-spy / pprof 找瓶頸並優化,寫進 README(前後對比)。
  • 工程品質:pytest(單元 + 整合用 testcontainers / compose)、GitHub Actions CI、multi-stage Dockerfile、docker compose 一鍵啟動、K8s manifests(可選)。
  • 可觀測性:結構化 log、Prometheus metrics、健康檢查端點、graceful shutdown。
  • README:架構圖、設計決策與取捨、壓測結果、已知限制與下一步。面試官很可能只看 README 兩分鐘。
# 範例:事件收集 API 的核心(展示批次、驗證、去重、非同步寫入的思路)
from datetime import datetime, timezone
from typing import Any
from uuid import UUID

import redis.asyncio as redis
from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel, Field

app = FastAPI()
r = redis.from_url("redis://localhost:6379/0")

class Event(BaseModel):
    event_id: UUID                       # client 產生,用於去重(重試不會重複計數)
    app_id: str = Field(min_length=1, max_length=64)
    name: str = Field(max_length=64)
    user_id: str | None = None
    ts: datetime
    props: dict[str, Any] = {}

class Batch(BaseModel):
    events: list[Event] = Field(min_length=1, max_length=500)

@app.post("/v1/events", status_code=status.HTTP_202_ACCEPTED)
async def ingest(batch: Batch) -> dict[str, int]:
    now = datetime.now(timezone.utc)
    accepted = 0
    async with r.pipeline(transaction=False) as pipe:
        for e in batch.events:
            # SET NX 做 24 小時去重窗口;重送的 event_id 會回傳 None
            pipe.set(f"dedup:{e.event_id}", 1, nx=True, ex=86400)
        results = await pipe.execute()
        for e, is_new in zip(batch.events, results):
            if is_new:
                pipe.xadd("events", {"data": e.model_dump_json(), "recv_ts": now.isoformat()},
                          maxlen=1_000_000, approximate=True)
                accepted += 1
        await pipe.execute()             # 第二輪:只把新事件寫入 stream,由 consumer 批次落地 DB
    # 取捨(面試好題材):若第二輪失敗,事件已被標記為「見過」卻沒寫入 → 會遺失。
    # 改進方向:用 Lua script 讓「SET NX + XADD」原子化,或把去重移到 consumer 端以 DB unique key 處理。
    return {"accepted": accepted, "duplicates": len(batch.events) - accepted}
實戰提示

Side project 的價值不在功能多,而在「你能講出取捨」:為什麼用 Redis Streams 而不是直接寫 DB?去重窗口為什麼是 24 小時?資料量變成上億筆時哪裡會先壞?這些答案本身就是面試素材,也直接對應第 13 章系統設計與第 12 章大數據。

自我介紹範本:中文與英文、1 分鐘與 3 分鐘 高頻

自我介紹的目的不是背履歷,而是引導面試官接下來想問的方向。結構:我是誰 → 我做過最相關的事(1–2 個亮點 + 數字)→ 我為什麼在這裡(為什麼 Appier / 這個職位)。結尾留一個「鉤子」讓面試官想追問你最有把握的專案。

中文 1 分鐘版(約 250–300 字)

您好,我是王小明,目前是 XX 大學資訊工程系三年級。我主要專注在後端開發,熟悉 Python 和 Go,平常在 Linux 上開發與部署服務。

我最近完成的一個專案是事件追蹤服務:模擬客戶端 SDK 批次回報 JSON 事件,後端用 FastAPI 收集、Redis Streams 做非同步緩衝,再批次寫入 PostgreSQL 產生統計報表。過程中我用 py-spy 找到 JSON 序列化與逐筆寫入是瓶頸,改成批次寫入和 orjson 之後,壓測吞吐量從大約 800 提升到 3,000 RPS,p99 延遲壓在 50 毫秒以內。

我之所以應徵 Appier 的後端實習,是因為 Appier 的廣告與行銷產品需要在高流量下兼顧低延遲和大量資料處理,這正是我最想深入的方向。我每週可以實習三天、至少持續一年。謝謝。

中文 3 分鐘版的擴充方式

  • 背景(30 秒):為什麼走後端——例如「修作業系統和網路課時發現自己喜歡理解系統底層怎麼運作」。
  • 亮點一(60 秒):最自豪的專案,講問題、你的角色、關鍵技術決策、量化結果。
  • 亮點二(45 秒):團隊合作或實習經驗,展示協作、code review、處理線上問題。
  • 學習方式(20 秒):例如「最近在讀 Designing Data-Intensive Applications,把書中的 log-structured storage 概念對照到我專案中的 Redis Streams」。
  • 為什麼 Appier + 可投入時間(25 秒)。

English 1-minute version

Hi, I'm Ming Wang, a third-year Computer Science student at XX University. I focus on backend development, mainly in Python and Go, and I'm comfortable building and deploying services on Linux.

The project I'm most proud of is an event-tracking service. Client SDKs send batched JSON events, and my backend ingests them with FastAPI, buffers them in Redis Streams, and writes them to PostgreSQL in batches to generate reports. When I load-tested it, I used py-spy to find that per-row inserts and JSON serialization were the bottlenecks. After switching to batch writes and a faster JSON library, throughput went from about 800 to 3,000 requests per second, with p99 latency under 50 milliseconds.

I'm applying to Appier because your products have to handle high traffic, low latency and massive data at the same time — exactly the kind of problems I want to get better at. I can work three days a week for at least a year. Thank you.

English 3-minute version(骨架)

1. Who I am (20s)
   "I'm ..., a ... student. I got into backend engineering when I took the OS course
    and realized I enjoy understanding what happens under the hood."

2. Highlight #1 – technical depth (70s)
   "The project I'm most proud of is ... The problem was ... I was responsible for ...
    The key decision was choosing X over Y because ... The result was ... (numbers)."

3. Highlight #2 – teamwork / real users (50s)
   "During my internship at ..., I worked with two other engineers on ...
    One challenge was ... I handled it by ... I learned ..."

4. How I learn (20s)
   "Recently I've been reading ... and applying it to ..."

5. Why this role (20s)
   "I'm excited about Appier because ... I can commit ... days a week for ... months."
實戰提示

錄音練習,計時並控制在 60–75 秒。不要逐字背誦(聽起來像念稿),而是記住「骨架 + 數字」。英文版準備好之後,挑 3–4 個你可能卡住的專有名詞(例如「去重」deduplication、「壓測」load testing、「瓶頸」bottleneck、「吞吐量」throughput)先練熟。

STAR / STAR-L 回答方法 高頻 基礎

行為題(「說一次你……的經驗」)的潛台詞是:過去的行為是未來行為最好的預測。面試官要的是一個具體、真實、有你個人行動的故事,而不是「我通常會……」的空泛原則。

S — Situation(10–15%)
背景:什麼專案、什麼時間點、團隊規模、為什麼重要。一兩句就好。
T — Task(10%)
你的責任或目標是什麼,困難點在哪。
A — Action(50–60%)
你做了什麼(用「我」不是「我們」)、為什麼這樣做、考慮過哪些選項。這是重點,要有技術細節與決策理由。
R — Result(15%)
量化結果、影響、別人的回饋。結果不好也可以,誠實說明。
L — Learning(10%)
學到什麼、之後怎麼應用、如果重來會怎麼做。這一步是區分「做過」與「反思過」的關鍵,Appier 這種重視學習能力的公司特別看重。
flowchart LR S["Situation
背景一兩句"] --> T["Task
我的目標/難點"] T --> A["Action
我做了什麼、為什麼
(佔一半以上)"] A --> R["Result
量化結果"] R --> L["Learning
學到什麼/下次怎麼做"]

建立你的故事庫(6–8 個故事對應多種題型)

不要每題準備一個故事,而是準備 6–8 個「多用途」故事,每個故事可以從不同角度切入不同題目:

故事可回答的題型
① 最自豪的技術專案(效能優化)最自豪專案、技術挑戰、主動性、學習新技術
② 線上 bug / 事故處理壓力、失敗、責任感、debug 能力
③ 和隊友技術意見不合衝突、說服他人、團隊合作、接受回饋
④ 進度落後、deadline 很趕時間管理、優先順序、溝通、取捨
⑤ 短時間學會新技術學習能力、自學、適應變化
⑥ 一次真正的失敗失敗、反思、成長
⑦ 主動改善流程(例如加 CI、寫工具)主動性、影響力、owner 精神
⑧ 幫助他人 / 被幫助團隊合作、mentoring、溝通

完整 STAR-L 範例:「說一次你解決困難技術問題的經驗」

S:大三暑假我在一家電商新創實習,負責商品搜尋 API。行銷活動期間,API 的 p99 延遲從平常約 200ms 飆到 2 秒以上,客服開始收到抱怨。

T:主管請我在兩天內找出原因並改善,因為下週還有另一波活動。

A:我先看 Grafana,發現延遲升高和 DB 連線池等待時間同步上升,但 DB CPU 只有 40%,所以懷疑不是 DB 算不動而是連線不夠或查詢被阻塞。我用 py-spy 對線上一個 Pod 做 sampling,發現大部分時間卡在等連線;再看 PostgreSQL 的 pg_stat_activity,有大量相同的查詢在跑——是熱門商品的分類頁每次請求都重新計算。我提出兩個方案:加大連線池(快但治標,還可能把 DB 壓垮),或者對分類結果加 Redis 快取並用 singleflight 防止快取失效時大量請求同時回源。我和 mentor 討論後選了後者,加上 60 秒 TTL 與隨機 jitter 避免同時過期,並寫了壓測腳本驗證。

R:在模擬活動流量的壓測中,p99 降到 150ms,DB QPS 下降約 70%。第二波活動期間沒有再出現延遲告警。

L:我學到先用數據縮小範圍,而不是憑直覺改程式;也意識到「加大連線池」這種直覺解法可能把問題轉移到 DB。之後我在新功能上線前都會先問:「熱點流量來的時候,哪裡會先撐不住?」

常見陷阱

(1)只講「我們」,聽不出你個人的貢獻。(2)Situation 講太久,Action 一句帶過。(3)沒有結果或沒有數字。(4)故事太完美,聽起來不真實——適度說出當時的不確定與錯誤判斷反而更可信。(5)把錯誤歸咎於別人。(6)準備的故事被追問兩層就露餡——每個故事都要能回答「為什麼不用另一個方法?」「如果重來會怎麼做?」

「最自豪的專案」深挖準備法 高頻 深入

這是 Appier 面試中被分享最多次的題目,而且通常不是一題,而是一連串 20–40 分鐘的追問,可能從架構一路問到某一行程式碼為什麼這樣寫、資料量放大 100 倍會怎樣。你要準備的是一份「專案檔案」:

  1. 一句話描述:「這是一個 ___,解決 ___ 的問題,給 ___ 使用。」
  2. 架構圖:能在白板或共享螢幕上 1 分鐘畫出:client、API、queue、worker、DB、cache、外部服務,以及資料流向。標註你負責的部分。
  3. 規模與數字:使用者數、QPS、資料量、延遲、團隊人數、開發時間。沒有的就說壓測數字或估算,並說明怎麼得來。
  4. 技術選型理由:每個元件「為什麼選它、考慮過什麼替代方案、取捨是什麼」。例如為什麼 PostgreSQL 不是 MongoDB、為什麼 Redis Streams 不是 Kafka。
  5. 最難的問題:1–2 個具體的技術難題,描述症狀 → 排查過程 → 根因 → 解法 → 驗證。這是最能展現深度的部分。
  6. 量化成果:前後對比。
  7. 如果重做會怎麼改:展示反思與成長。例如「一開始沒有做冪等,後來重試造成重複資料;重做的話第一天就設計 idempotency key」。
  8. 擴展性思考:流量 ×10、×100 時哪裡會先壞?怎麼改?
  9. 可靠性與維運:怎麼測試、怎麼部署、怎麼監控、出過什麼事故。
flowchart TD P["最自豪的專案"] --> W["What: 解決什麼問題"] P --> H["How: 架構 + 技術選型"] P --> D["Deep dive: 最難的技術問題"] P --> N["Numbers: 量化成果"] P --> S["Scale: 放大 100 倍會怎樣"] P --> R["Reflection: 重做會怎麼改"] H --> H1["為什麼選 X 不選 Y"] D --> D1["症狀 → 排查 → 根因 → 解法 → 驗證"] S --> S1["瓶頸在哪: DB / 網路 / CPU / 單點"]

面試官可能的 20 個追問(請逐一寫下答案)

  1. 這個專案要解決什麼問題?誰在用?沒有它的時候大家怎麼做?
  2. 請畫出整體架構,資料怎麼流動?
  3. 你個人負責哪些部分?哪些是別人做的?
  4. 為什麼選這個語言 / 框架?如果用 Go(或 Java)會有什麼不同?
  5. 為什麼選這個資料庫?schema 怎麼設計?有哪些索引?為什麼?
  6. 最慢的查詢 / API 是哪一個?為什麼慢?你怎麼知道的?
  7. 遇到最難的 bug 是什麼?花了多久?怎麼找到根因的?
  8. 效能數字是怎麼量的?在什麼負載、什麼機器規格下?p50 和 p99 差多少?
  9. 如果流量變成 100 倍,哪裡會先撐不住?你會怎麼改?
  10. 如果資料量到上億筆,現在的設計還行嗎?(Appier 真的問過類似問題)
  11. 服務掛掉時會發生什麼?資料會不會遺失或重複?怎麼保證?
  12. 有做快取嗎?快取失效、一致性怎麼處理?
  13. 並行(concurrency)怎麼處理?有沒有 race condition?
  14. 怎麼測試?測試覆蓋哪些情境?有整合測試嗎?
  15. 怎麼部署?怎麼回滾?有 CI/CD 嗎?
  16. 怎麼監控?出問題你怎麼知道?
  17. 安全性:認證、授權、輸入驗證、secret 管理怎麼做?
  18. 如果重做一次,你會改什麼?
  19. 過程中和隊友有過什麼分歧?怎麼解決的?
  20. 從這個專案學到最重要的一件事是什麼?
實戰提示

對每個追問,準備「一句話結論 + 一個具體細節 + 一個取捨」。遇到沒想過的問題,不要硬掰,可以說:「這部分我當時沒有做,但如果要做,我會先……,因為……」——面試官在看的是你的思考方式。被問到你不懂的細節時,誠實說不知道,再提出你會怎麼查,遠比亂答好。

面試官想聽到什麼

深挖的目的是確認三件事:(1) 真的是你做的(細節講得出來)、(2) 你知道為什麼(不只會用,還知道原理與替代方案)、(3) 你能延伸思考(規模放大、失敗情境、重做改進)。答題時主動帶出取捨與數字,就能把對話引導到你最有把握的地方。

常見行為題題庫(28 題,含回答框架) 高頻

每題附「考察重點」與「回答要點」。用你的故事庫套入 STAR-L,不要背誦範文。

團隊合作與衝突

1. 說一次你和隊友意見不合的經驗,最後怎麼解決?

考察:溝通、同理、以事實決策、不執著於贏。要點:選技術分歧(例如 SQL vs NoSQL、要不要重構)而非人身衝突;說明你先理解對方的考量(他在意什麼?時程?風險?)、用資料或小型實驗(POC、benchmark)讓討論回到事實、必要時找第三方(mentor)協助決策、最後無論採用誰的方案都全力執行(disagree and commit)。結尾說明學到的事,例如「先問對方最在意的限制是什麼」。

2. 你曾經和一個難以合作的人共事嗎?

考察:成熟度、不抱怨。要點:描述行為而非批評人格(「他常常在最後一刻才 push 程式碼」),說明你如何主動了解原因(可能他同時有其他任務)、提出具體的協作方式(拆小 PR、每日同步 10 分鐘),結果改善了什麼。避免把自己塑造成受害者。

3. 描述一次你幫助團隊成員成功的經驗。

要點:例如幫同學 debug、寫文件讓新成員快速上手、做 code review 時提出建設性意見。強調你如何「教他釣魚」(解釋原理、分享排查方法)而不是直接幫他做完,以及對團隊的影響。

4. 你在團隊中通常扮演什麼角色?

要點:誠實描述(例如「技術上深挖的人」或「把模糊需求整理清楚的人」),舉一個例子佐證,並補充你也能視需要調整角色。避免說「我什麼角色都可以」這種沒資訊量的答案。

5. 你收到過最有用的 code review 意見是什麼?你怎麼回應批評?

考察:可教性(coachability),對實習生非常重要。要點:具體的意見(例如「這段在高並發下有 race condition」「錯誤被吞掉了」),你如何理解並修正、之後如何內化成習慣(例如寫 checklist)。表現出把回饋視為學習機會,而不是防衛。

6. 如果你認為主管或資深工程師的決定是錯的,你會怎麼做?

要點:先確認自己理解完整脈絡(可能有你不知道的限制),私下用資料與具體風險表達疑慮、提出替代方案;如果決定仍維持,就全力執行並持續觀察指標,必要時用事實再討論。展現尊重與勇於表達的平衡。

失敗、壓力與責任

7. 說一次你失敗的經驗。

考察:自我覺察、誠實、成長。要點:選真正的失敗(不是「我太追求完美」),清楚承認自己的責任、描述造成的影響、採取的補救、學到的教訓與之後的具體改變(例如「之後所有 migration 都先在 staging 用 production 規模資料演練」)。失敗不要太致命也不要太輕微。

8. 你犯過最大的技術錯誤是什麼?

要點:例如誤刪資料、部署壞版本、忘了加索引造成慢查詢。重點在:發現後的第一時間做了什麼(止血、通知)、根因分析、你推動的預防措施(測試、review checklist、自動化檢查)。展現 ownership 與 blameless 的事後檢討精神。

9. 描述一次你在很大壓力下工作的經驗。

要點:deadline 或線上事故。說明你如何保持冷靜:拆解問題、排優先順序、及早溝通風險、尋求協助;結果如何;之後如何避免同樣的壓力(例如更早估時、預留 buffer)。

10. 說一次你處理線上事故(production incident)的經驗。

要點:時間線(何時發現、如何發現)、先止血(rollback、降級、擴容)再找根因、溝通(通知相關人)、事後 postmortem 與 action items。若沒有 production 經驗,可用課程專案或 side project 部署的事故,誠實說明規模。

11. 你曾經沒有達成承諾或 deadline 嗎?

要點:承認,說明原因(低估複雜度、需求變動)、你何時發現、何時告知利害關係人(越早越好)、提出了什麼替代方案(縮小範圍、分階段交付)、之後的估時方式如何改進。

學習能力與自學

12. 說一次你在短時間內學會新技術的經驗。

要點:學習方法要具體——先看官方文件與架構概念、做最小可行範例、讀原始碼或規格、找真實問題練習、向有經驗的人請教。說明多久達到什麼程度、產出了什麼。Appier 技術棧廣(Python、Go、K8s、大數據),學習速度是實習生最重要的評估項目之一。

13. 你讀過什麼原文技術書?學到什麼?(Appier 真的問過)

考察:自主學習習慣、英文閱讀能力、能否把知識連結到實務。要點:只講你真的讀過(至少讀過大部分章節)的書,準備好被追問內容。說出 1–2 個具體概念並連到你的專案。推薦(依後端相關性):Designing Data-Intensive Applications(Martin Kleppmann;複製、分割、交易、一致性、串流處理)、Computer Systems: A Programmer's Perspective、Operating Systems: Three Easy Pieces(免費線上)、Fluent Python、The Go Programming Language、Site Reliability Engineering(Google,免費線上)、System Design Interview(Alex Xu)、Clean Code / A Philosophy of Software Design。範例:「我讀 DDIA 時對 Chapter 11 的 stream processing 印象最深,它讓我理解為什麼我的事件服務需要冪等寫入——因為 at-least-once 傳遞下重複是必然的。」

14. 你平常怎麼跟上新技術?最近在關注什麼?

要點:具體來源(官方 blog、工程部落格如 Cloudflare/Uber/Netflix tech blog、Hacker News、論文、Podcast、開源專案的 release notes),以及你「做了什麼」而不只是「看了什麼」(例如讀完後寫 POC、寫筆記、在讀書會分享)。說一個最近關注的技術並講出你的看法(例如 uv 為何快、eBPF 如何用於觀測、LLM 推論服務的批次化)。

15. 你遇到不會的問題時,怎麼找答案?什麼時候會求助?

要點:先自己查(文件、原始碼、log、複現最小案例),設定時間盒(例如卡 30–60 分鐘沒進展就問),求助時帶著「我嘗試了什麼、我的假設、具體卡在哪」。展現獨立又不浪費團隊時間的平衡——這正是 mentor 最在意的實習生特質。

主動性與 ownership

16. 說一次你主動做了超出職責範圍的事。

要點:例如發現大家手動部署很容易出錯,主動寫了 CI pipeline;發現測試很慢,主動平行化;寫了內部工具。說明你如何發現問題、如何取得同意(不是自作主張)、影響(節省多少時間、減少多少錯誤)。職缺本身就寫「開發輔助開發/監控的工具」,這類故事非常對味。

17. 你曾經改善過一個流程或系統嗎?

要點:before/after 數字、你用什麼方法衡量、如何推動他人採用。

18. 描述一次需求很模糊的任務,你怎麼處理?

要點:主動釐清(問使用者是誰、成功的定義、限制條件)、寫出假設並與需求方確認、先做最小版本取得回饋、迭代。避免「自己猜一個方向做到底」。

19. 你做過最有影響力的事是什麼?

要點:影響力 = 受益的人數 × 改善程度。可以是技術上的,也可以是幫社團或團隊建立流程。量化。

時間管理與優先順序

20. 你的進度落後了,你會怎麼做?

要點:及早發現(每天對照計畫)、分析原因、立即告知 mentor/主管並帶著方案(縮小範圍、調整優先順序、尋求協助、延後非核心部分),而不是默默加班到最後一刻才說。舉實例。

21. 同時有多個任務,你怎麼決定優先順序?

要點:依影響與緊急程度(例如 Eisenhower matrix)、依賴關係(誰在等我)、和主管對齊優先順序而不是自己決定;線上問題優先於新功能。舉例說明一次取捨。

22. 你怎麼平衡學業和實習?(實習生必考)

要點:具體的時間安排(哪幾天全天實習、課表已安排好)、過去同時兼顧多件事的實績、遇到期中期末時的溝通計畫(提前告知、調整工作日而非消失)。展現可靠性。

23. 如果你發現一個 bug 但它不在你的任務範圍內,你會怎麼做?

要點:評估嚴重性;嚴重就立刻通報負責人或在頻道提出;不嚴重就開 issue 記錄、附上重現步驟;若團隊同意且自己有餘力可以順手修。不會假裝沒看到,也不會未經溝通就大改別人的程式碼。

動機與自我認識

24. 你最大的優點和缺點是什麼?

要點:優點要有故事佐證(例如「追根究底」→ 那次 debug 的故事)。缺點要真實、與工作相關但非致命,並說明你正在怎麼改善,例如「我以前傾向自己埋頭解決太久才求助,現在我設定 45 分鐘時間盒」。避免「我太認真」這種假缺點。

25. 為什麼想當後端工程師?

要點:連結到具體經驗(例如第一次看到自己的服務在壓測下崩潰、再一步步優化的成就感),以及你喜歡的後端面向(可靠性、規模、效能、資料)。詳見下方範本。

26. 你希望在實習中學到什麼?

要點:具體而且和 Appier 相關:在真實高流量環境中做效能調校、學習 production 等級的可觀測性與部署、理解 AdTech 系統如何在毫秒級延遲下做決策、學習 code review 與團隊協作。同時表達你能貢獻什麼。

27. 你期待什麼樣的主管或團隊文化?

要點:誠實但正向:重視回饋、願意讓新人承擔實際任務、鼓勵提問與分享。避免列出聽起來像抱怨上一份工作的條件。

28. 除了技術,你有什麼讓你與眾不同的地方?

要點:例如社團領導、教學經驗(助教)、跨領域背景(統計、設計)、競賽、開源貢獻、語言能力。說明它如何讓你成為更好的工程師或隊友。

29. 你有其他公司的面試或 offer 嗎?

要點:誠實但不需透露細節:「有在進行幾個後端相關的面試,但 Appier 是我的首選之一,因為……」。如果有時間壓力(其他 offer 有期限),可以禮貌告知,請對方協助了解時程。

英文面試準備 高頻 進階

依網路分享,VP of Engineering 那一關會確認英文能力。目標不是講得像母語人士,而是能清楚、有結構地表達技術內容,聽不懂時能有效澄清。面試官通常更在意溝通的有效性而非文法完美。

常用句型

情境句型
開場 / 爭取思考時間"That's a great question. Let me think about it for a second." / "Let me take a moment to organize my thoughts."
結構化回答"There are three main points. First, ... Second, ... Finally, ..." / "Let me start with the context, then walk you through what I did."
描述情境"At the time, our team was working on ..." / "The main challenge was that ..."
描述行動"I was responsible for ..." / "I decided to ... because ..." / "I considered X, but I went with Y since ..."
描述結果"As a result, latency dropped from ... to ..." / "This reduced the error rate by about 60 percent."
反思"Looking back, I would have ..." / "The biggest lesson for me was ..."
談取捨"The trade-off here is ..." / "It depends on ... If ..., I'd choose ...; otherwise ..."
表達不確定"I'm not 100% sure, but my understanding is ..." / "I haven't worked with that directly, but I'd approach it by ..."
表達不同意(禮貌)"I see your point. One concern I have is ..." / "That's a fair approach. Another option might be ..."

聽不懂時如何澄清(非常重要)

  • "Sorry, could you repeat the question?" / "Could you say that again a bit more slowly?"
  • "Just to make sure I understand correctly — are you asking about X or Y?"(重述問題是最好的策略,同時確認範圍)
  • "When you say 'scale', do you mean more users, more data, or more regions?"
  • "Could you give me an example of what you mean?"
  • 不懂某個字:「Sorry, I'm not familiar with the term '...'. Could you explain it?」——比猜錯然後答非所問好得多。

如何用英文解釋技術

  1. 先講結論 / 一句話定義:"A message queue lets services communicate asynchronously."
  2. 再講為什麼需要:"Without it, if the downstream service is slow, the upstream service has to wait."
  3. 舉例:"In my project, the API puts events into Redis Streams, and workers write them to the database in batches."
  4. 取捨:"The downside is added complexity and eventual consistency."

技術字彙要能自然說出:latency / throughput、bottleneck、trade-off、scalability、availability、consistency、idempotent、retry with exponential backoff、race condition、deadlock、cache invalidation、index、query plan、sharding、replication、load balancer、rollback、deployment pipeline、on-call、postmortem、root cause。

英文範例回答

Tell me about a time you had a conflict with a teammate.

"In my database course project, a teammate and I disagreed on whether to use MongoDB or PostgreSQL. He preferred MongoDB because it felt faster to start with, while I was worried because our data had clear relationships — students, courses and enrollments — and we needed transactions for registration. Instead of arguing in general terms, I suggested we each spend two hours building a small prototype of the enrollment flow. When we compared them, the PostgreSQL version handled the 'course is full' case correctly with a transaction, while the MongoDB version needed extra logic to avoid over-enrollment. He agreed to go with PostgreSQL, and I made sure to use JSONB columns for the flexible fields he cared about. The lesson I took away was that a quick experiment often resolves a disagreement faster than a debate, and that it's important to address the other person's real concern."

What's the project you are most proud of?

"The project I'm most proud of is an event-tracking service I built to learn how analytics systems work. Client SDKs send batches of JSON events, and the goal was to ingest them reliably and generate hourly reports. I designed it as three parts: a stateless FastAPI ingestion API, Redis Streams as a buffer, and workers that write to PostgreSQL in batches. The hardest part was performance. My first version could only handle about 800 requests per second. I profiled it with py-spy and found that row-by-row inserts and JSON parsing were the bottlenecks, so I switched to batched COPY inserts and a faster JSON library. That got it to around 3,000 requests per second with p99 latency under 50 milliseconds. If I did it again, I'd design for idempotency from day one — I added event-ID deduplication later, after I noticed retries were creating duplicates."

Why do you want to join Appier?

"Two reasons. First, the engineering problems: Appier's advertising and marketing products have to make decisions in milliseconds while processing huge amounts of event data, which combines the things I enjoy most — performance, scalability and data. Second, AI is at the core of the products, not an add-on, so as a backend engineer I'd get to see how models are served and integrated in production. As an intern, I'm hoping to learn how a production-scale system is built and operated, and I believe my experience in profiling and building data pipelines can help me contribute quickly."

Tell me about a time you failed.

"During my internship, I ran a database migration that added an index to a large table without testing it on production-sized data. It locked the table for several minutes, and some API requests timed out. I immediately told my mentor, we cancelled the migration, and the service recovered. Afterward, I learned to use CREATE INDEX CONCURRENTLY in PostgreSQL and wrote a checklist for migrations, including testing on a staging copy with realistic data. Since then, none of my migrations has caused an incident. The biggest lesson was that operations that are instant on small data can behave completely differently at scale."

實戰提示

練習方法:(1) 把 6–8 個 STAR 故事寫成英文骨架(不是全文),(2) 每天錄音講 2 個故事,回放時檢查是否有結構、時態是否用過去式、是否講太快,(3) 找朋友用英文模擬面試並突然打斷追問。說話慢一點、句子短一點,反而更清楚。

CTO 技術觀點對談 進階 深入

依網路分享,CTO 關卡會聊「你對技術的看法」。這不是考試,沒有標準答案;CTO 想看到的是:你有沒有自己的觀點、觀點背後有沒有理由、是否理解取捨、是否持續思考與學習。一個好的觀點回答結構:立場 → 理由(2–3 點)→ 反面考量 / 何時不成立 → 我自己的實踐。

常見陷阱

(1)沒有立場(「都有優缺點」然後就沒了)。(2)立場絕對化(「microservices 一定比較好」)。(3)用流行語堆砌但講不出具體例子。(4)批評 Appier 可能正在使用的技術而不了解其脈絡。(5)把對談當成考試,緊張背答案——試著像同事討論一樣自然,也可以反問 CTO 的看法。

主題一:AI / LLM 對軟體開發的影響

範例觀點:我認為 LLM 會大幅提高「寫出程式碼」的速度,但工程師的價值會更集中在定義問題、系統設計、驗證正確性與為結果負責。

理由:(1) 我自己用 AI 工具寫樣板程式碼、測試、查 API 的效率明顯提升;(2) 但它產生的程式碼在邊界條件、並行、安全性上常有細微錯誤,如果我不理解底層原理就無法發現——所以基礎(OS、網路、資料庫)反而更重要;(3) 程式碼產出變便宜後,瓶頸會轉移到 review、測試、可觀測性與架構決策。

反面考量:過度依賴可能讓新人跳過理解的過程;生成的程式碼也有授權與資安風險(例如把 secret 貼進 prompt)。

連結 Appier:對 Appier 這種 AI-first 公司,LLM 也是產品的一部分。後端面臨新的工程問題:推論延遲與成本(batching、快取、模型路由)、如何評估輸出品質、如何把非確定性的模型輸出安全地整合進確定性的系統。

我的實踐:我把 AI 當成 pair programmer,但每段產出的程式碼都要能自己解釋,並一定寫測試。

主題二:如何做技術選型

範例觀點:技術選型的核心是「以問題與限制為出發點,而非以技術為出發點」。我會考慮:(1) 需求特性(讀寫比、一致性要求、延遲、資料量成長);(2) 團隊熟悉度與招募難度;(3) 生態與社群成熟度、維運成本(託管服務 vs 自建);(4) 可逆性——可逆的決定快速做,不可逆的(資料庫、主要語言)慎重做並寫 ADR(Architecture Decision Record);(5) 先用「無聊的技術」(boring technology),把創新額度花在真正的差異化上。例子:我在專案中選 PostgreSQL 而非 MongoDB,因為資料有明確關聯且需要交易,JSONB 也能滿足部分彈性需求。

主題三:技術債

範例觀點:技術債不全是壞事,它像財務槓桿——有意識地借(為了搶時間上市)並且有計畫地還,是合理的商業決策;危險的是無意識、不被記錄、利息不斷累積的債。管理方式:(1) 讓它可見(issue tracker 標記、記錄利息:每次改這塊要多花多少時間);(2) 用「童子軍規則」——每次經過都清一點;(3) 和功能開發綁在一起還,例如要改某模組時順便重構;(4) 以事故與開發速度的數據說服產品方分配時間。我會舉例:某專案缺測試導致每次改動都戰戰兢兢,我先為最常改的模組補 characterization tests,再重構。

主題四:Monolith vs Microservices

範例觀點:我傾向「先 modular monolith,在有明確理由時再拆」。微服務的好處是獨立部署、獨立擴展、技術異質、故障隔離、組織上的團隊自治(Conway's Law);代價是分散式系統的複雜度:網路失敗、資料一致性、分散式追蹤、部署與版本相容、維運成本。拆分的好理由:不同元件的擴展需求差異極大(例如 bidder 需要上百個副本、後台管理只需兩個)、不同的發布節奏與團隊歸屬、需要故障隔離。不好的理由:「大家都在用」。對 AdTech 而言,延遲敏感的熱路徑(bidding)通常值得獨立出來並嚴格控制依賴,避免一次 bid 要串接太多次網路呼叫。

主題五:Python vs Go

範例觀點:兩者是互補的。Python 開發速度快、資料與 ML 生態無可取代,適合資料處理、ML pipeline、內部工具、I/O bound 的 API;但 GIL(3.13 起有實驗性 free-threaded 版本,生態仍在跟進)與直譯執行使它在 CPU 密集與極低延遲場景較弱。Go 有 goroutine 與 channel 的簡潔並行模型、編譯成單一靜態 binary、記憶體佔用小、啟動快、GC 延遲低,適合高並發網路服務、基礎設施工具(Docker、K8s 都是 Go 寫的)。在廣告平台中,我會預期延遲敏感、高 QPS 的服務(如 bidder、tracking endpoint)用 Go 或 JVM 語言,資料科學與模型訓練用 Python,兩者透過 gRPC 或訊息佇列整合。選擇時也要看團隊既有能力與維運工具鏈。

主題六:你最近關注的技術

準備 1–2 個你真的有動手玩過的技術,講出:它解決什麼問題、原理大概是什麼、你試用的心得、適用與不適用的場景。可選方向(挑你有興趣的):

  • uv / Ruff:用 Rust 重寫 Python 工具鏈,為什麼快(平行下載、全域快取與硬連結、Rust 實作),對 CI 時間與 Docker build 的影響。
  • eBPF:在 kernel 安全地執行程式,用於觀測(不改程式碼就能看到 syscall、網路延遲)、網路(Cilium)與安全。
  • LLM serving:continuous batching、KV cache、量化如何影響延遲與成本(vLLM 等)。
  • OpenTelemetry:統一 traces/metrics/logs 的標準,如何避免廠商鎖定。
  • Python free-threading(PEP 703):移除 GIL 的意義與挑戰(C extension 相容、單執行緒效能)。
  • 資料湖表格式(Apache Iceberg / Delta Lake):在 S3 上提供 ACID、schema evolution、time travel。

其他可能主題與一句話方向

主題準備方向
你心目中的好程式碼是什麼?可讀性優先(程式碼被讀的次數遠多於寫)、正確且可測試、簡單勝過聰明、錯誤處理明確
測試要寫多少?測試金字塔、以風險決定、覆蓋率是指標而非目標、重要的是對行為與邊界有信心
如何看待 on-call 與可靠性?"You build it, you run it"、SLO 與錯誤預算、blameless postmortem
雲端 vs 自建機房彈性與速度 vs 成本與控制;規模大且穩定時自建可能更省(例如大量穩定運算),混合架構常見
你覺得工程師最重要的能力?拆解問題、學習能力、溝通;搭配一個例子
開源的看法使用與回饋、授權意識、你的貢獻經驗(就算是修文件)
面試官想聽到什麼

CTO 在評估「長期潛力」:你是否好奇、是否會主動思考「為什麼」、能否在不確定中做出有理由的判斷、是否謙虛且願意更新觀點。可以在對談尾聲反問:「您認為未來幾年對 Appier 工程團隊最大的技術挑戰是什麼?」把單向面試變成雙向討論。

「為什麼 Appier」「為什麼後端」「職涯規劃」 高頻

為什麼 Appier?

好答案 = 對公司的具體理解 + 與你的興趣/經驗的連結 + 你想在這裡獲得與貢獻什麼。避免「因為是知名新創 / 待遇好 / 離家近」。

「我想加入 Appier 有三個原因。第一是工程問題本身:程式化廣告需要在大約 100 毫秒內完成出價決策,同時每天處理大量的事件資料,這結合了我最感興趣的效能、規模和資料處理。第二是 AI 是產品核心:從受眾分析、推薦到出價,模型的價值最終要靠後端系統穩定、低延遲地交付,我想學習 ML 系統在 production 中如何被整合與維運。第三是公司的國際化:Appier 從台灣出發、在日本上市、服務亞太多個市場,我想在跨國團隊中用英文協作,接觸多區域部署的系統。我之前做的事件追蹤專案讓我初步體會到資料量放大後的挑戰,希望能在真實規模下深入學習,也能用我在 profiling 和資料管線上的經驗做出貢獻。」

為什麼選擇後端?

「我喜歡後端是因為它的問題常常是『看不見但影響所有人』的:一個慢查詢、一個沒處理好的重試,在流量放大時就會變成事故。我第一次對後端產生興趣,是在修作業系統課時用 strace 追一個 Python 程式為什麼卡住,發現是 DNS 查詢沒有 timeout,那種從現象一路追到根因的過程讓我很著迷。後來在專案中做壓測與 profiling,把吞吐量提升好幾倍,讓我確定想在『可靠、可擴展的系統』這個方向深耕。AdTech 對延遲和規模的要求是極致的,是磨練這些能力最好的環境之一。」

職涯規劃(3–5 年)

「短期(實習期間)我希望能快速上手團隊的技術棧,獨立完成有實際使用者的功能,並學會 production 級的測試、部署和監控。中期(1–3 年)希望成為能負責一個服務從設計到維運的後端工程師,特別在效能調校和分散式資料處理上建立專長。長期希望能在架構層面做決策,並帶領新人。我認為 Appier 這種同時有高流量線上服務和大規模資料平台的環境,是實現這條路徑的好地方。」

實戰提示

面試前一定要做的功課:瀏覽 Appier 官網的產品頁、工程部落格或技術分享(若有)、近期新聞(新產品、併購、財報重點),並準備一個「我注意到……,好奇……」的問題,例如對某個產品功能背後的技術好奇。不要捏造你不確定的公司細節。

實習生的特別關注點 基礎

實習生面試和正職不同:面試官不期待你什麼都會,而是在評估「投資你是否值得」——你能不能穩定投入、學得快、不需要一直被盯、未來能否轉正。

關注點他們在擔心什麼你要主動給出的訊號
時間投入(依職缺常見要求:每週 2–4 天、至少 6 個月)花時間 onboarding 後人就走了;每週來的天數太少,無法接續工作清楚說明每週可來幾天、哪幾天、可持續到何時;學期中與考試期間的安排;暑假能否增加天數
可靠性會不會不告而別、deadline 沒達成也不講舉出過去守承諾的例子;說明你會主動回報進度與風險
學習能力技術棧學不起來「短時間學會新技術」的故事、讀過的書、side project
獨立性與求助平衡一直問 / 卡住不問描述你的時間盒與求助方式
轉正潛力是否值得長期培養表達對轉正的興趣,並問「實習生轉正的評估標準是什麼」
溝通(含英文)能否參與團隊會議、寫清楚的 PR 說明英文自我介紹與專案說明流暢
常見陷阱

時間投入這題不要含糊(「應該可以吧」),也不要過度承諾(說每週 4 天但課表根本排不開)。面試前把下學期課表排好,誠實回答。如果有交換學生、畢業、服役等時程,要主動提出,讓對方評估。

Coding 面試溝通框架與白板技巧 高頻

Coding 面試評分的不只是答案對不對,還包含溝通、問題拆解、程式碼品質、測試意識。即使最後沒寫完,清楚的思考過程也能拿到不錯的評價;反之,沉默寫出正確答案的人可能被評為「難以合作」。

flowchart LR A["1 釐清題意
輸入/輸出/限制/邊界"] --> B["2 舉例
一般 + 邊界案例"] B --> C["3 暴力解
說出複雜度"] C --> D["4 優化
找重複計算/資料結構"] D --> E["5 寫碼
邊寫邊說"] E --> F["6 測試
手動跑例子 + 邊界"] F --> G["7 複雜度
時間/空間 + 追問延伸"]
  1. 釐清(1–3 分鐘):輸入範圍與大小?可能為空嗎?有重複嗎?要原地修改嗎?回傳什麼?例如 Valid Parentheses:只有三種括號嗎?空字串算 valid 嗎?
  2. 舉例:自己寫 2–3 個例子,包括邊界(空、單一元素、全部相同、極大值),並和面試官確認預期輸出。
  3. 暴力解:先說出直覺解法與複雜度——「最直接的做法是……,時間 O(n²)」,讓面試官知道你至少有解。
  4. 優化:說出瓶頸在哪、可以用什麼資料結構(hash map、stack、heap、two pointers、sliding window、DP)改善。得到面試官點頭再寫。
  5. 寫碼:有意義的變數名、小函式、邊寫邊說明「這裡我在做什麼」。不確定的 API 直接說「我假設有一個……函式」。
  6. 測試:寫完主動用例子逐行跑一次(dry run),檢查邊界與 off-by-one;能執行的平台就實際跑。
  7. 複雜度與延伸:講時間與空間複雜度,並預想追問(資料大到放不進記憶體?要串流處理?要並行?)。
# 示範:LeetCode 678 Valid Parenthesis String(含 '*',Appier 曾出過)
# 邊寫邊講的思路(中括號內是你要說出口的話):
# [釐清] '*' 可以當 '('、')' 或空字串;只有 '('、')'、'*' 三種字元;空字串為 True。
# [暴力] 每個 '*' 三種選擇 -> O(3^k),太慢。
# [優化] 維護「尚未配對的 '(' 數量」可能的範圍 [lo, hi]:
#        '(' -> lo+1, hi+1;')' -> lo-1, hi-1;'*' -> lo-1(當 ')'), hi+1(當 '(')
#        hi < 0 代表即使把所有 '*' 當 '(' 也不夠 -> False;lo 不能小於 0(截斷)
#        最後 lo == 0 代表存在一種選法讓括號恰好配對。

def check_valid_string(s: str) -> bool:
    lo = hi = 0
    for ch in s:
        if ch == "(":
            lo += 1
            hi += 1
        elif ch == ")":
            lo -= 1
            hi -= 1
        else:  # '*'
            lo -= 1
            hi += 1
        if hi < 0:
            return False
        lo = max(lo, 0)
    return lo == 0

# [測試] 主動跑邊界案例
assert check_valid_string("") is True
assert check_valid_string("(*)") is True
assert check_valid_string("(*))") is True
assert check_valid_string(")(") is False
assert check_valid_string("((*") is False
# [複雜度] 時間 O(n)、空間 O(1)。也可以說出替代解:兩個 stack 存索引,O(n) 空間。

白板與線上平台溝通技巧

  • 先講思路再寫碼,面試官可以在你走錯方向時提早提示;把提示當成合作而非扣分。
  • 卡住時說出來:「我現在卡在如何處理重複元素,我在想是不是可以用 set……」,沉默是最糟的。
  • 畫圖:樹、圖、指標移動、DP 表格,畫出來能幫你也幫面試官理解。
  • 程式碼可讀性:避免 a、tmp2 這種變數;適度抽出 helper function。
  • 時間分配(45 分鐘題):釐清與設計約 10 分鐘、寫碼約 20 分鐘、測試與討論約 10 分鐘,留時間給追問。
  • 追問模式:Appier 曾有「graph DFS → backtracking → 能否用 DP 優化」、「能否把遞迴改掉」這種逐步加深,答完一題要準備好被往下推。
面試官想聽到什麼

「我先確認一下題意……我舉幾個例子……最直覺的是 O(n²)……瓶頸在重複查找,可以用 hash map 降到 O(n)……我開始寫……我用剛才的例子跑一次……時間 O(n)、空間 O(n),如果資料大到放不進記憶體,可以……」——這段口語化流程本身就是評分項目。更多題型見第 16 章。

反問清單 高頻

「你有什麼問題想問我們嗎?」不是客套——好的問題展現你的興趣、思考深度與對職位的認真程度,同時幫你判斷這份工作是否適合你。原則:依面試官角色調整問題、問你真的想知道的、避免問官網查得到的事、第一輪不先問薪資福利(交給 HR 關卡)。每關準備 2–3 個,視時間挑。

問工程師(團隊面試)

  1. 能分享一下團隊一天或一週的工作節奏嗎?例如站會、規劃、code review 的流程?
  2. 團隊的技術棧是什麼?Python 和 Go 各用在哪些地方?
  3. Code review 文化是怎樣的?一個 PR 通常多久被 review?有什麼團隊共識或規範?
  4. 最近一次讓你印象深刻的線上事故或技術挑戰是什麼?怎麼解決的?
  5. 你覺得在這個團隊工作最有收穫的地方是什麼?最有挑戰的呢?
  6. 測試與部署流程是怎樣的?從 merge 到上線大概多久?
  7. 有 on-call 嗎?實習生會參與嗎?

問 Hiring Manager / 主管

  1. 這個實習職位前三個月,您期望我完成什麼樣的事情?怎樣算是表現優秀?
  2. Intern 的 onboarding 是怎麼安排的?會有固定的 mentor 嗎?
  3. 實習生通常會負責什麼樣的任務?會直接參與 production 的服務嗎?
  4. 團隊目前最大的技術挑戰是什麼?
  5. 實習生轉正的機制與評估標準是什麼?過去轉正的比例或案例?
  6. 團隊如何給實習生回饋?多久一次?
  7. 您對我今天的表現有沒有什麼建議,或是覺得我哪方面需要加強?(展現可教性;有些面試官不方便回答,不強求)

問 VP of Engineering

  1. 工程組織目前是怎麼劃分的?各團隊之間如何協作?
  2. 未來一年工程團隊最重要的目標或方向是什麼?
  3. 您如何看待工程師的成長路徑?技術路線與管理路線是怎麼設計的?
  4. 跨國團隊(台灣、日本、新加坡等)之間的協作方式?英文的使用情境多嗎?
  5. 工程團隊如何平衡新功能開發與技術債、可靠性?
  6. 您認為在 Appier 表現最好的工程師有什麼共同特質?

問 CTO

  1. 您認為未來幾年對 Appier 技術上最大的挑戰或機會是什麼?
  2. 生成式 AI / LLM 如何影響 Appier 的產品方向與工程團隊的工作方式?
  3. Appier 在技術選型上有什麼原則?例如自建 vs 雲端服務、語言選擇?
  4. AI 研究成果如何轉化成 production 系統?研究與工程團隊怎麼協作?
  5. 您當初創業 / 加入時最重要的技術決策是什麼?現在回頭看會怎麼做?
  6. 您希望新進工程師帶來什麼樣的特質?
避免的問題

「公司是做什麼的?」(沒做功課)、「可以遠端嗎 / 加班多嗎?」在技術關卡第一個問(容易被解讀為只在意福利,適合交給 HR 或在 offer 階段問)、「我錄取了嗎?」、只有「沒有問題」。

面試當天 Checklist、面試後 Follow-up 與 Offer 考量 基礎

前一天與當天

線上面試設備

  • 網路穩定(盡量有線),準備手機熱點作為備援
  • 耳機麥克風事先測試,關閉通知與其他程式
  • 鏡頭在視線高度、光線打在臉上、背景整潔
  • 提前 10 分鐘進入會議連結,確認 Google Meet / Zoom / Teams 可用
  • 筆電接電源;準備水;紙筆(畫圖、記問題)
  • 預存面試官姓名、聯絡方式,斷線時可立刻聯繫

Coding 平台與工具

  • 確認平台(CoderPad、HackerRank、Codility、Google Docs 或共享螢幕 IDE)及可用語言
  • 在沒有 autocomplete 的環境練習過(Google Docs 型)
  • 熟悉 Python 常用 API:collections.Counter、defaultdict、deque、heapq、bisect、切片、sorted(key=...)
  • 準備一個空白畫布工具(Excalidraw、白板)以便系統設計畫圖
  • 共享螢幕前關閉私人分頁與通知

內容準備

  • 履歷印出或開在旁邊,每一行都複習過
  • 最自豪專案的架構圖(可先畫好備用)
  • 6–8 個 STAR 故事的關鍵字小抄
  • 中英文自我介紹各練 3 次
  • 每一關的反問清單
  • Appier 產品與近期新聞重點

當下的心態與技巧

  • 不懂就問、先釐清再作答
  • 講結論先,細節後
  • 不知道就誠實說,再說你會怎麼查
  • 被指出錯誤時感謝並修正,不要辯解
  • 保持微笑與眼神接觸(看鏡頭)
  • 每關結束後立刻記下被問的題目與自己的表現

面試後 Follow-up

  • 24 小時內寄感謝信(中文或英文皆可,依面試語言):感謝時間、提及一個具體討論的話題、重申興趣。簡短即可。
  • 補充回答:如果面試中有題目沒答好,事後想到更好的解法,可以在感謝信中簡短補充(例如附上改進的程式碼思路),展現積極態度,但不要長篇大論。
  • 詢問進度:若超過 HR 告知的時間未收到消息,可禮貌來信詢問。
  • 復盤:記錄每關的問題、答得好的與不好的,無論結果如何都是下次的養分。
Subject: Thank you – Backend Development Intern interview

Hi [Name],

Thank you for taking the time to speak with me today. I really enjoyed our
discussion about how the bidding service handles traffic spikes — it made me
even more excited about the problems your team is solving.

After our conversation, I thought more about the question on merging user
attributes at the scale of hundreds of millions of records. Beyond the hash-map
approach I described, I would partition both datasets by user_id and merge each
partition independently (or use a sort-merge join in Spark), so memory usage
stays bounded.

Thanks again, and I look forward to hearing from you.

Best regards,
[Your Name]

Offer 考量

面向要問清楚的事
工作內容所屬團隊、實際負責的服務、mentor 是誰
時間與彈性每週天數、工時、是否可遠端/混合、考試期間的彈性
薪資時薪或月薪、計算方式、加班規定、勞健保
轉正轉正機制、評估時點與標準、轉正後的職級
學習資源教育訓練、技術分享、讀書會、雲端資源使用
設備與環境電腦、權限、辦公地點
實戰提示

實習選擇的優先順序建議:能學到什麼(mentor 品質、任務是否碰到真實系統) > 轉正機會 > 薪資。若同時有多個 offer,可禮貌告知對方你的決定期限,請求合理的考慮時間;不要用其他 offer 不實地施壓。

面試自測題

以下每題請先自己用 STAR-L 或觀點結構口頭回答(計時 2 分鐘),再對照參考大綱。

請用 1 分鐘介紹你自己。(中文與英文各一次)

大綱:我是誰(學校、科系、年級、後端方向、主要語言)→ 最相關亮點 1 個(問題、你的做法、量化結果,例如吞吐量 800→3,000 RPS)→ 為什麼 Appier 與這個職位(高 QPS、低延遲、資料、AI 產品)→ 可投入時間。結尾留下讓面試官想追問的鉤子。控制在 60–75 秒,不逐字背誦。

你最自豪的專案是什麼?請畫出架構並說明。

大綱:一句話描述 → 架構圖(標出你負責的部分)→ 規模數字 → 1–2 個技術選型與理由(含替代方案)→ 最難的問題(症狀 → 排查 → 根因 → 解法 → 驗證)→ 量化成果 → 如果重做會改什麼 → 放大 100 倍時的瓶頸。準備好 20 個追問的答案(見本章清單)。

如果你的專案資料量變成上億筆,現在的設計哪裡會出問題?

大綱:先估算(上億筆 × 每筆大小 = 數十 GB 到 TB),指出單機記憶體放不下、單一 DB 寫入瓶頸、全表掃描報表變慢、索引維護成本。改進:依 user_id/時間分區(partition)、批次寫入、預聚合、冷熱分層到物件儲存、分散式處理(Spark 的 sort-merge / hash 分區合併)、近似演算法(HyperLogLog)。強調「先量測再優化」並提及取捨。可連到第 12 章。

說一次你和隊友意見不合的經驗。

大綱:S:專案與分歧點(技術層面)。T:需要在期限內做出決定。A:先理解對方的關切、提出以資料或 POC 驗證、必要時請 mentor 協助、決定後全力執行並吸納對方的合理考量。R:結果與團隊關係。L:「快速實驗勝過辯論」「先問對方最在意的限制」。避免貶低對方。

說一次你失敗的經驗,你學到了什麼?

大綱:選真實、有影響但可挽回的失敗(例如 migration 鎖表造成 timeout)。承擔責任、說明立即的補救(通知、回滾)、根因、推動的預防措施(checklist、staging 演練、CREATE INDEX CONCURRENTLY),以及之後沒有再犯的證據。語氣誠懇、不找藉口。

你讀過什麼原文技術書?印象最深的概念是什麼?

大綱:只說真的讀過的。書名 + 為什麼讀 + 1–2 個具體概念 + 如何應用到你的專案。例:DDIA 的「at-least-once 下必須冪等」→ 在事件服務加入 event_id 去重。準備好被追問該概念的細節(例如 exactly-once 是否可能、如何實作)。

你如何在短時間學會一個新技術?舉例說明。

大綱:情境(為何需要學、期限)→ 方法(官方文件建立心智模型 → 最小可行範例 → 用在真實問題 → 讀原始碼或規格解答疑惑 → 請教有經驗者)→ 產出與時間 → 學習方法的反思。強調「做出東西」而不只是「看過」。

你的進度落後了,而 deadline 是明天,你會怎麼做?

大綱:立刻評估剩餘工作與風險 → 馬上告知 mentor/主管(不要等到最後)→ 提出選項:縮小範圍先交付核心功能、延後非關鍵部分、請求協助 → 執行並保持更新 → 事後檢討估時方式。用一個真實例子支撐。

你怎麼看 AI / LLM 對軟體工程師的影響?

大綱:立場:提升寫碼速度,價值轉向問題定義、系統設計、驗證與負責。理由:個人使用經驗、生成程式碼在邊界/並行/安全上的錯誤需要基礎知識才能發現、瓶頸轉移到 review 與測試。反面:新人可能跳過理解、資安與授權風險。連結 Appier:LLM 作為產品的一部分帶來推論延遲、成本、評估與整合的工程問題。個人實踐:每段 AI 產出都要能解釋並有測試。

Monolith 與 microservices 你會怎麼選?

大綱:先 modular monolith,有明確理由再拆。微服務好處:獨立部署與擴展、故障隔離、團隊自治;代價:網路失敗、分散式一致性、追蹤與維運成本。好的拆分理由:擴展需求差異極大(bidder vs 後台)、不同發布節奏或團隊、需要故障隔離。舉 AdTech 熱路徑需嚴控依賴與網路跳數的例子。

Python 和 Go 你會怎麼選?

大綱:互補而非取代。Python:開發快、資料與 ML 生態、適合 I/O bound API 與工具;限制:GIL(free-threaded 版本仍在演進)、CPU 密集與極低延遲較弱。Go:goroutine 並行模型、靜態 binary、低記憶體、快速啟動、適合高並發網路服務與基礎設施。結論依場景與團隊能力決定,並舉 bidder(Go)+ 模型訓練(Python)的分工例子。

為什麼想加入 Appier?為什麼是後端?

大綱:Appier:(1) 工程問題(RTB 約 100ms 內決策、海量事件資料)、(2) AI 是產品核心(模型要靠後端穩定交付)、(3) 國際化團隊。後端:喜歡「看不見但影響所有人」的問題,用一個從現象追到根因的個人故事支撐。最後連到你能貢獻的經驗與想學的東西。

你每週可以實習幾天?可以持續多久?之後有轉正意願嗎?

大綱:給明確數字(例如每週三天:週二、四、五全天,可持續到明年六月以後,暑假可全職),說明課表已安排、考試期間會提前溝通調整;表達對轉正的興趣並反問評估標準。展現可靠與長期投入。

描述一次你主動改善流程或做工具的經驗。

大綱:發現問題(例如手動部署易錯、測試跑 20 分鐘)→ 量化痛點 → 取得同意 → 實作(CI pipeline、平行化測試、監控 dashboard、CLI 工具)→ 推廣採用 → 量化成果(時間節省、錯誤減少)。連到職缺「開發輔助開發/監控的工具」。

你遇到卡住的問題時,什麼時候會求助?怎麼求助?

大綱:先自行排查(文件、log、最小重現、原始碼),設定時間盒(例如 45–60 分鐘無進展就問),求助時提供「目標、已嘗試的方法、目前假設、具體卡點、相關 log」。例子:一次透過清楚的提問讓 mentor 五分鐘內指出問題。展現獨立與效率的平衡。

Tell me about a challenging bug you fixed. (English)

Outline: "The symptom was ... (e.g., p99 latency spiked only under load). I started by checking metrics and found ... I formed a hypothesis that ..., and verified it with py-spy / logs / a minimal reproduction. The root cause turned out to be ... I fixed it by ..., and confirmed with a load test that ... improved from ... to .... Afterward I added a test / alert so it wouldn't happen again. What I learned is to narrow down with data before changing code." 注意使用過去式、用 "I" 描述個人行動、包含數字。

你有什麼問題想問我們?(請針對工程師、主管、VP、CTO 各準備兩題)

大綱:工程師:code review 文化、最近的技術挑戰、部署流程。主管:前三個月的期待與優秀的定義、onboarding 與 mentor、轉正標準。VP:工程組織與跨國協作、工程師成長路徑。CTO:未來幾年最大的技術挑戰、LLM 對產品與工程的影響、研究到 production 的流程。避免官網查得到或只關於福利的問題。

你最大的缺點是什麼?

大綱:真實、與工作相關但不致命的缺點 + 具體例子 + 正在採取的改善行動與成效。例:「以前傾向自己埋頭解決太久才求助,曾因此延誤一次交付;現在我設定時間盒,並在每日同步時主動說明卡點,最近一個專案的交付都準時。」避免假缺點。