---
# System prepended metadata

title: 第一次聽到 Protocol Buffers？我來告訴你這個神奇的打包工具

---

# 第一次聽到 Protocol Buffers？我來告訴你這個神奇的打包工具

![困惑的開發者](https://hackmd.io/_uploads/HyGgey5Yeg.jpg)

說實話，我第一次看到 `.proto` 這個檔案副檔名時，心裡是滿滿的問號。那時候剛進公司，同事們在討論系統架構時總是提到 "protobuf這個"、"protobuf那個"，我只能尷尬地點點頭，假裝自己知道他們在說什麼。

你是不是也有類似的經驗？聽過 Protocol Buffers 這個名詞，但不太確定它到底是什麼？沒關係，我們都是這樣過來的。今天我想用最白話的方式，跟你分享這個讓我從困惑到驚艷的資料格式。

## 先從一個生活化的比喻開始

想像一下，你要寄一份重要文件給朋友。你有兩種打包方式：

第一種是用透明塑膠袋，任何人都能看到裡面裝了什麼，重量輕，但體積比較大。這就像我們熟悉的 JSON 格式 - 直觀易讀，但佔用的空間相對較大。

第二種是用真空壓縮袋，把所有空氣都擠出來，體積變得超級小，重量更輕，但需要特殊工具才能打開看內容。這就是 Protocol Buffers 的概念。

![包裝比較](https://hackmd.io/_uploads/H1OJeJ5Ygg.jpg)

Protocol Buffers（大家都叫它 Protobuf）就是 Google 開發的一種"打包"資料的方式。它可以把你的資料壓縮得更小、傳輸更快，但代價是需要事先定義好資料的"樣板"。

## 為什麼我們需要這種打包方式？

剛開始我也很納悶，JSON 不是挺好用的嗎？為什麼還要搞這麼複雜？

後來在一個專案中，我們的系統每秒要處理上萬筆資料傳輸，JSON 格式的資料量實在太大，網路頻寬快被吃光了。主管建議改用 Protocol Buffers，結果你猜怎麼著？資料大小縮減了將近 70%，傳輸速度快了好幾倍！

這就是為什麼 Google、Netflix、Uber 這些大公司都在用它。當你的系統需要：

- 處理大量資料
- 快速網路傳輸  
- 多個程式語言之間溝通
- 確保資料格式的一致性

Protocol Buffers 就是你的最佳選擇。

## 讓我們看看它長什麼樣子

假設我們要處理員工資料，用 Protocol Buffers 的話，你需要先寫一個 `.proto` 檔案：

```proto
syntax = "proto3";

message Employee {
  string name = 1;
  int32 age = 2;
  string email = 3;
  repeated string skills = 4;
}
```

看起來是不是有點像程式語言的結構定義？沒錯！這就是 Protocol Buffers 的"樣板"。每個欄位都有：

- **類型**（string、int32 等）
- **名稱**（name、age 等）
- **編號**（1、2、3、4）

這些編號超級重要！它們就像是地址標籤，即使之後你修改了欄位名稱，只要編號不變，舊的程式還是能正常讀取資料。這就是所謂的"向後相容"。

## 實際使用起來是什麼感覺？

當我第一次真正使用 Protocol Buffers 時，整個過程讓我印象深刻：

**第一步**：寫好 `.proto` 檔案（就像上面那樣）

**第二步**：用 Protocol Buffers 的編譯器把它轉換成你使用的程式語言。比如你用 Python，它就會幫你生成 Python 程式碼；用 Java 就生成 Java 程式碼。

**第三步**：在你的程式裡使用這些生成的程式碼，就像使用一般的類別一樣。

```python
# 建立一個員工物件
employee = Employee()
employee.name = "張小明"
employee.age = 28
employee.email = "ming@example.com"
employee.skills.append("Python")
employee.skills.append("JavaScript")

# 把資料"打包"成二進制格式
binary_data = employee.SerializeToString()

# 之後可以"解包"回來
new_employee = Employee()
new_employee.ParseFromString(binary_data)
print(new_employee.name)  # 輸出：張小明
```

有趣的是，這個 `binary_data` 看起來就像是一堆亂碼，但它包含了所有必要的資訊，而且體積超級小。

## 跟 JSON 比起來，差別在哪裡？

讓我們實際比較一下。同樣的員工資料：

**JSON 格式**（67 bytes）：
```json
{
  "name": "張小明",
  "age": 28,
  "email": "ming@example.com",
  "skills": ["Python", "JavaScript"]
}
```

**Protocol Buffers 格式**（約 45 bytes）：
```
[看起來像亂碼的二進制資料]
```

你看，同樣的資料，Protocol Buffers 就是比較小。當資料量越大，這個差異就越明顯。有測試顯示，在某些情況下，Protocol Buffers 可以比 JSON 小 80% 以上！

除了大小優勢，處理速度也快很多。我在一個專案中實際測試過，解析相同資料量時，Protocol Buffers 比 JSON 快了大約 3-5 倍。

## 不過，它也有缺點

我必須誠實地說，Protocol Buffers 不是萬能的：

**學習門檻**：你需要先學會寫 `.proto` 檔案，還要設定編譯環境。對新手來說可能有點複雜。

**可讀性**：二進制格式人類看不懂，除錯時比較麻煩。你不能像 JSON 一樣直接用文字編輯器打開看內容。

**靈活性**：資料結構必須事先定義好。如果你需要經常修改資料格式，JSON 可能更適合。

**生態系統**：雖然支援很多程式語言，但在某些特定環境下，相關工具和文檔可能不如 JSON 豐富。

## 什麼時候該考慮使用它？

經過幾年的使用經驗，我覺得在這些情況下，Protocol Buffers 真的很棒：

**微服務架構**：當你的系統有很多小服務需要互相溝通時，Protocol Buffers 配合 gRPC 是絕佳組合。

**行動應用**：網路流量珍貴，更小的資料量意味著更快的載入速度和更少的流量費用。

**大數據處理**：當你每天處理數百萬筆資料時，節省的空間和時間會很可觀。

**多語言團隊**：如果你的團隊使用不同的程式語言，Protocol Buffers 可以確保大家使用相同的資料格式。

## 給新手的實用建議

如果你想開始學習 Protocol Buffers，我建議這樣做：

**從簡單開始**：不要一開始就想著複雜的應用場景。先寫個簡單的 `.proto` 檔案，定義幾個基本欄位，體驗整個流程。

**多練習語法**：Protocol Buffers 的語法其實不複雜，但有一些細節需要注意。比如欄位編號不能重複、不能隨意更改等。

**搭配 gRPC 學習**：Protocol Buffers 經常和 gRPC 一起使用，建議可以一起學習，會更有實戰感。

**準備除錯工具**：安裝一些能顯示 protobuf 內容的工具，像是 `protoc` 的文字輸出功能，或是一些 IDE 插件。

**關注版本管理**：學會如何安全地修改 `.proto` 檔案，這在實際工作中非常重要。

## 我的學習路線建議

**第一階段**（1-2 週）：
- 安裝 Protocol Buffers 編譯器
- 學會基本的 `.proto` 語法
- 寫幾個簡單的範例，體驗序列化和反序列化

**第二階段**（2-3 週）：
- 學習更複雜的資料類型（嵌套訊息、列表等）
- 了解向後相容的規則
- 嘗試在真實專案中使用

**第三階段**（進階）：
- 學習 gRPC 的使用
- 了解性能優化技巧
- 研究大型專案中的實踐經驗

## 最後的話

回想起來，Protocol Buffers 真的改變了我對資料傳輸的認知。從一開始的困惑，到後來在專案中實際感受到它帶來的效能提升，這個過程讓我體會到選對工具的重要性。

當然，它不是銀彈，也不是適合所有場景的解決方案。但當你真正需要處理大量資料、追求極致效能時，Protocol Buffers 絕對值得你投入時間學習。

現在的你可能還在猶豫要不要學習這個看似複雜的技術。我的建議是：不用想太多，先動手試試看。下載 Protocol Buffers，寫個簡單的 `.proto` 檔案，感受一下這個神奇的打包工具。

說不定幾週後，你也會像我一樣，在團隊討論中自信地說出："這裡用 protobuf 會比較好喔！"

記住，每個現在看起來很厲害的開發者，都曾經是第一次聽到 Protocol Buffers 的新手。你已經踏出了第一步，接下來就是持續學習和實踐。

祝你學習順利！

---

## 相關資源

- [Protocol Buffers 官方文檔](https://protobuf.dev/)
- [Protocol Buffers GitHub](https://github.com/protocolbuffers/protobuf)  
- [gRPC 官方網站](https://grpc.io/)
- [線上 protobuf 編譯器](https://protogen.marcgravell.com/)

*本文基於個人實戰經驗和公開資料整理，如有任何問題歡迎交流討論。*