Prod parity 是「讓本機 runtime 跟線上環境逐項相同」的目標。它對齊的方向常跟開發者的直覺相反:要把環境凍結成線上那個特定的、通常偏舊的形狀,而非升到最新、最乾淨。凍結的目標是行為對齊、不是版本追新,這跟 Image Tag Pinning 用 tag 精確度落地凍結是同一件事的兩層。

概念位置

這條原則是個人 dotfile「環境可重現性」思想往 runtime 層的延伸:模組零:Dotfile 心智模型 教的是工作站可重現,parity 教的是 runtime 可重現。要凍結到多細見 Image Tag Pinning。實作見 對齊 prod 的 runtime container

對齊的是凍結環境,不是最新

接案 / 商用場景的 prod 通常是幾年前定版後就凍結的環境:PHP 7.2、MySQL 5.7、某個特定的 Debian 世代。這跟 rolling release 發行版(Arch)「永遠最新」的方向剛好相反。用你的 Arch 工作站直接當開發環境,等於在一個比線上新好幾代的環境寫 code,寫出來的成品可能用了線上沒有的語法、擴充或預設行為。

Parity 的意義就是把這個差距關掉:本機刻意退回線上那個舊形狀,讓「本機能跑」直接等於「線上能跑」。

要對齊哪些維度

Parity 不是只對齊語言版本號,是對齊會影響 runtime 行為的每一層:

  • 語言版本:PHP/Python/Node 的主版與 patch 版
  • 底層 OS 與 libc:Debian 世代、glibc vs musl(見 glibc 與 musl
  • 擴充/套件清單php -m 逐項相等,不是涵蓋
  • 服務版本:MySQL/Redis/nginx 的版本與關鍵設定(如 sql_mode、時區)
  • image 精確度:用凍結 tag 把以上全部釘死(見 image tag pinning

取得這些維度的權威來源是線上環境本身:php -mSELECT @@sql_modephpinfo() 抄回來,而不是憑印象填。

判讀訊號:什麼時候值得逐項對齊

Parity 是有成本的紀律,不是每個專案都要做到逐項。值得的訊號:app 有原生擴充、依賴 DB 嚴格模式行為、有時區 / locale / charset collation 邏輯(MySQL 的 collation,以及 macOS 開發 ↔ Linux 部署的檔名大小寫敏感度差異,都常在這裡咬人)、或 client 明確凍結某版環境。可放寬的訊號:app 無原生擴充、不碰 DB 嚴格模式與時區 / collation(純直譯、行為跟 OS 世代解耦),或你完全掌控 prod(自己的 VPS,想升就升)——這時本機可以直接用較新的 stable,行為分岔風險低。

把這個判斷轉成對非技術決策者的話(接案時常要向業主 / PM 說明值不值得投入):不對齊的代價是行為分岔只在線上才炸——本機測不出、上線才發現,變成緊急修加上客戶信任損耗;對齊的投入則是一次性建一個 parity runtime(通常幾小時到一天)。比較的是「一次性投入」對上「反覆的線上驚嚇與救火」,而不是純技術潔癖。

邊界

Parity 對齊的是「行為」,不是「連漏洞一起複製」。凍結舊環境意味著也繼承了它的已知漏洞與 EOL 稅(如 image tag pinning 提到的 base image mirror 退役)。Parity 讓你在本機重現線上問題,不代表線上該永遠停在舊版——它跟「該不該升級 prod」是兩個獨立決策。