「在我電腦上可以跑」的終結者
你一定聽過這句話
「在我電腦上可以跑啊。」
這是工程師在回報 Bug 時最常說的一句話,也是讓 PM 和營運人員最頭痛的一句話。
你提了一個明確的問題:「為什麼昨天促銷頁面的倒數計時器壞了?」
工程師查完說:「奇怪,我這邊跑起來完全沒問題。可能是你們測試環境和正式環境的版本不同。」
然後,就沒有然後了。
這種情況不是因為工程師不負責,而是因為環境問題本來就很難重現、很難解釋。
為什麼環境問題這麼難搞?
想像一下,你要做一道客家炒米粉。你把食譜給朋友,他在家做,味道完全不一樣。
原因可能是:
- 他用的米粉品牌不同
- 他的瓦斯爐火力和你的電磁爐不同
- 他的醬油是日式的,你的是台式的
食譜一樣,結果卻不同——因為執行環境不一樣。
軟體的世界也是這樣。同一份程式碼,在工程師筆電、測試機、正式主機三個地方跑,背後的作業系統版本、語言版本、依賴套件……可能都不同。任何一個細微差距,都可能造成「在我電腦可以跑,上線就壞」。
貨櫃革命:一個改變世界的比喻
1956 年之前,全球貨運是一場噩夢。
每艘船、每個港口、每個貨車的規格都不同。一批從台灣出發的商品,到了美國港口要重新裝箱,換船,再重新裝卡車。每一次轉換都是人力、時間、風險。
然後,標準貨櫃出現了。
一個固定尺寸的金屬箱,船可以裝、卡車可以載、起重機可以吊。不管貨物是什麼,外面那個箱子是標準的,所有設備都能處理。
這不只是個方便的工具,這是一場革命:全球貿易量因此爆炸性成長。
**容器化(Containerization)**在軟體界做了完全一樣的事。
Docker:軟體界的標準貨櫃
Docker 讓工程師可以把一個程式,連同它需要的所有環境(語言版本、依賴套件、設定),打包成一個標準的「容器」。
這個容器:
| 特性 | 解釋 |
|---|---|
| 可攜帶 | 在工程師筆電跑得起來,就能在任何伺服器跑 |
| 可重複 | 每次啟動都是完全相同的環境,不會有「今天好明天壞」 |
| 隔離 | 不同容器之間不互相干擾,一個壞掉不影響其他人 |
| 輕量 | 比傳統虛擬機快很多,幾秒內就能啟動 |
身為 PM / 營運人員,你為什麼需要懂這個?
你不需要會寫 Dockerfile(那是工程師的事),但你需要聽懂工程師在說什麼,並且能夠問對問題。
懂了容器化,你可以:
- 理解「環境問題」為什麼會發生,不再覺得是工程師在推卸責任
- 問出好問題:「這個 Bug 是哪個環境的容器版本?測試環境和正式環境的映像檔一樣嗎?」
- 設計更好的工作流程:知道部署流程的每一步在做什麼,推動更快的修復速度
- 跟工程師協作更順暢:共用一套語彙,減少來回溝通的摩擦
本課程接下來的路
這門課不會教你寫程式,但你會學到:
- 映像檔、容器、倉庫是什麼(第 2 課)
- 如何看懂 Dockerfile 和部署設定(第 3 課)
- 部署相關的核心字彙(第 4 課)
- 從一個功能被合併到上線,完整發生了什麼(第 5 課)
讀完這門課,下次工程師說「容器重啟了,映像檔要重 build」,你會知道他在說什麼,也知道這意味著多少時間和風險。
練習題
AI 協作:學了這個,跟 AI 怎麼配合?
了解容器化概念,讓你能精準描述「環境問題」,AI 才能給出有用的排查建議,而不是泛泛而談。
你的人類優勢:
- 你知道這次上線前改了什麼業務邏輯,AI 無法從技術日誌中判斷業務背景
- 你能判斷這個 Bug 的商業影響程度,決定是否值得立即回滾
可以這樣跟 AI 說:
我們昨晚部署了新版本,促銷倒數計時器在正式環境壞了但測試環境正常。工程師說可能是容器環境問題。請幫我列出 PM 應該向工程師確認哪些問題,以便快速定位是哪個環節出了差錯。
挑戰任務
用自己的話解釋:為什麼「在我電腦上可以跑」這個問題很難解決?寫出一個你工作中可能遇到的類似情況。
貨櫃革命和容器化的共同點是什麼?用一句話說明。