寫給學弟妹的科普:後端工程師、軟體工程師(下篇)

Adrian Hsu
11 min readFeb 4, 2024

--

後端工程師有非常非常多種,並不只 Web Programming 課學過的 Back-end 而已。通常 軟體工程師 或 General Software Engineer 都在做 Back-end。事實上, Back-end 佔絕大多數,Front-end 少一些。

Web / iOS / Android 則是 Client Software Engineer,是廣義的 Front-end,技能點跟 Back-end 不同。

這是本系列的第二篇,第一篇請點此:

舉例:Life of a Web Request

當用戶在手機上點開 App,打開 IG / X 的動態時報,背後發生了什麼?

簡單來說,有一個 Request 會被 Front-end 接收,經過 REST API 送到 Back-end,然後 Back-end 做了非常非常多的事。在毫秒之間,回傳 Response 到 Front-end ,例如: 50 篇演算法猜你可能會喜歡的 Posts。

再次 revisit 這個舉例,拆解 Back-end 發生的黑魔法。基於《上篇》的知識,我們可以把這 Read Path 的 GET Request 的 Lifecycle 描述出來。

(我的舉例有參考 2023 Twitter 官方開源文章 Twitter’s Recommendation Algorithm,可做延伸閱讀)

第一階段:Receive Request

  1. iPhone 用戶做了一個 Pull-to-refresh(用戶刷新他的動態時報了!)
  2. Product Infra 的 Front-end 接到一個 Pull-to-refresh 的 Request
  3. 透過 Core Services 提供的 REST API / GraphQL,把 request 從 Front-end 的 request 轉譯成 Back-end 的 request
  4. 進入 Product Infra 的 Back-end。精確來說, Home Timeline 的 back-end Infra (Home Infra)。

第二階段: Retrieve Posts

  1. 這位 User 我們要讓他看到哪些內容?→ 要有朋友的貼文、朋友的朋友的貼文、還有廣告。
  2. 這位 User 我們需要去取他的 Metadata。Home Infra 去 Call Core Services 取得 User Metadata
  3. Home Infra 把這位 User 的 (ID + metadata) 丟去 Call ML Infra (retrieval) 的 ML Model從數千萬篇貼文中、取得前 2000 篇比較相關的 Post ID。
  4. 同時,Home Infra 去 Call Ads Infra 取得 50 篇廣告 Ad ID。

第三階段: Rank Posts

  1. 這 2000 篇 Post ID 我們需要取他們的 Metadata,才能做更精細的 Ranking。Home Infra 去 Call Core Services 取 Posts Metadata
  2. Home Infra 接著把 Posts 與 User 的 (ID + metadata) 再丟去 ML Infra (ranking) 的 ML Model 做排序,打分數。挑出前 200 最相關、最個人化的。
  3. Ads 也要取類似的 metadata、與類似的 ranking。

第四階段: Postprocessing

  1. Home Infra 需要 Call T & S Infra 做 filtering,還有套用 Home Infra 的商務邏輯,最後選 50 篇。
  2. Product Infra 的 Back-end,回傳 Response 到 Front-end,最後回傳 iOS。
  3. 結果:User 在他的 iOS 裝置上,動態時報刷新了 50 篇 Posts + Ads。

任務完成!這個例子其實就是 How Recommender System Works,業界通用的推薦系統都是這麼做的,各公司大同小異。

除此之外,還有許多有趣的:

  • ML Infra (retrieval) 與 ML Infra (ranking) 用來做 ML model serving/inference。這些 model 如何訓練的?Training 是先透過 Product Infra 搜集的 online/offline engagement data(例如:按 Like、留言)然後透過 Data Infra 的 data pipeline 寫入 Storage。最後才從 ML Infra 讀取資料、做 training。
  • 一個又一個 back-end microservice 如何溝通?是利用 Core Services 提供的 gRPC 之類的 IDL,定義 API,還有 low-level infra 的 Network 取 IP 交換封包。
  • 如果回傳的 Response 是空的,怎麼辦?我們透過 Data Infra 的 Online Monitoring Tools 可以查看 Success Rate, Latency, RPS 確認機器正常運作。或者也可以查 Data Infra 機器部署的 Logs 看有沒有 errors。如果壞得太嚴重、影響用戶的話,Command Center 的警報會響起,提醒 oncall 前來救火。
  • 想知道 ML Model 表現如何?透過 Biz Infra 可以跑 SQL 或者做圖表,或者 A/B testing 來判斷 Model 有無進步。

Back-end 工程師做什麼、需要什麼專業

大多專業領域在業界學最快也最好,但也有些在學校就該學好,例如 Media、Security 或 ML。每個組都是 Back-end,所以都要會相關的 REST API、部署 Server、版本控制等,與程式語言如 Java, C++, Go, Rust。工作幾年後,則比較像是楓之谷的轉職系統,根據不同領域越學越深。

Product Infra

Product Infra 尤其需要學怎麼做好 back-end 跟 Web/iOS/Android 的客戶端(Front-end)共同開發。著重產品的 product sense,透過千萬次的 A/B tests 讓自己的產品直覺越來越準。高速迭代、能被用戶直接看到、有成就感,但有較多冗雜商務邏輯。Ad Tech (or Digital Advertising) 要考量 Bid 與 Relevance 的權衡,有多個 利害關係人 如廣告商、買賣方、受眾、公司本身,多只能透過業界學習。

Product/Ads/T&S 都會需要 ML Modeling,這類職缺通常是開給 ML Engineer(同時要會 Back-end 與 ML)Media 則要多學習 video encoding/decoding/codec 相關。

ML Infra

ML Infra 以目標來說,可分為 ML Compute 及 ML Ops。ML Infra 要懂 ML Modeling,但更多是要熟悉整套 ML 的流程,深入理解 ML Engineer 的痛點、架好 Back-end 提升他們的效率。尤其 LLM 熱潮,有非常多的 open-source framework 與 SaaS tools 與時俱進。新手可從必修課 Kubernetes 與 Docker 下手。

ML Compute 技能點包括 ML framework (PyTorch/Jax/TensorFlow)、Distributed Training (Ray, Horovod, DeepSpeed, Megatron)、Computation Runtime (Ray,OpenAI 用的開源框架)、GPU programming (CUDA/Triton)、 vLLM (fast inference)。通常是讀越深越好,最好能讀懂底層的原始碼、了解運作原理,才能找到優化的空間。

ML Ops 技能點包括 Containerization (Docker)、Container Orchestrator (Kubernetes/kubeflow/kuberay)、Batch Job Scheduler (Volcano/Yunikorn)、Pipeline Orchestrator (AIrflow/Flyte/Dagster)。這領域特點是有非常多 operational 的事情,比如 orchestrator 掛了、network 斷了,突發狀況的應變能力非常重要。

推薦 Byron Hsu(做開源的 Flyte)與 Kai-Hsun Chen(做開源的 Ray,粉專 吃完免費午餐就下班)他們有此領域的豐富知識。推薦 Machine Learning Engineering Open Book、也推薦 Follow HuggingFace CEO,Clement Delangue on X。

Data Infra

數年前的 Data Infra,就像是現今的 ML Infra。當時因為大數據熱潮,很多相應 Data 公司興起。當年主要是競爭 Data Analytics,現在熱度降了一些,可是有不少投資在 Operational DB and Search 的趨勢。Data Infra 同樣是要學習對資料的敏銳度,了解 Data 用戶的痛點等等。

Data Infra 非常看重分散式系統、建立 ETL、Data Engineering 能力等。框架方面,Spark 是每個公司都會有,專做線上分析處理 (Online analytical processing) 通常用 Hive, Presto/Trino,線上交易處理 (Online transaction processing) 則是 Cassandra, HBase, MongoDB。Event Queue 則是 Kafka 為主流。推薦追蹤 莊偉赳的科技漫談 他教了我很多大數據的 insights。推薦參與開源社群 源來適你 是台灣與矽谷之間最即時、最好的開源社群,高手雲集。

Low-level Infra

Core Services 很注重分散式系統,作業系統,系統程式設計等基本功。Networking, Database, Security 都有相應的課可以在學校學到。

Database 建議從 Relational DB 開始學,學校一般也只教這個。從 Relational DB 後發展成 (1) NO SQL (KV DB, Column family DB) (2) Document Store (MongoDB) (3) GraphDB (Neo4j, TigerGraph) (4) New SQL (cockroachDB, YugabyteDB) 以及現在很紅的 (5) Vector DB (Zilliz, Pinecone, Qdrant)。如果想看看開源框架 source code,可以看 MySQL, PostgreSQL, SQLite,然後 NoSQL 如 Cassandra, VectorDB 如 Zilliz。想更認識 DB 可以看 CMU 這門 Andy Pavlo 的 Youtube 課程(謝謝 Ryan Fu 提供)

Cloud Computing

更重要的是,很多 late stage startups 更需要精通 AWS / GCP / 雲端整合的 Back-end 工程師,而不全靠公司自己造。例如:Business Analytics Infra 可以接 Tableu,或者 Online monitoring tools 接 Datadog、或 ML Training 在 AWS 完成。學習 Cloud Services 是非常有用的技能。

想說的話

想傳達一個概念:如果你基於不充足的產業知識做職涯規劃,很容易走冤枉路。現在對你最重要的是:

  1. 大量搜集 software 產業資訊,誠實面對自己、挖掘你有哪些 unknown unknowns,不要不懂裝懂
  2. 試著把每個事實先釐清,例如,能講出 FAAMG 後端工程師職務內容,明確枚舉各種職位的 expertise
  3. 如何釐清這些事實? (1) 跟真的在產業打滾過的學長姐聊天,比你大 3~5 歲、大 10 歲、20 歲的。還有 (2) 在 X / Twitter 與 LinkedIn 追蹤厲害工程師、參與對話,這些專家都在 Twitter 上面。我自己追蹤了不少 LLM 相關的,供參考(https://x.com/ahsu___/following)。
  4. 確定理解一致,然後才是挖掘自己熱情所在;最後才是職涯的選擇
  5. Ask the right questions、Solve the right problems,保持 open minded。
  6. 一時摸索不出也不必著急,持續 Sharpen problem solving skills,人生自有最好的安排

本篇文章的 Facebook 原文在此:Link

Follow me on X: https://x.com/ahsu___

--

--

Adrian Hsu

Software engineer at X/Twitter@SF working on Recommendation System. Also an entrepreneur, enjoys financial analysis and cognitive/social psychology.