最近我做了一件很技術主管日常、但也很容易讓人懷疑人生的事:追一個欄位。
不是追什麼超帥的演算法,也不是追效能瓶頸,就是一個欄位。一個看名字很普通、甚至有點像附屬資訊的欄位。乍看之下你會以為它只是資料表裡多放一個值,頂多拿來顯示、查詢、報表備用。結果真追下去才發現,事情完全不是這樣。
那一刻我又被提醒一次:在 ERP 這種商業系統裡,最可怕的從來不是你看不懂的複雜模組,而是你以為自己看懂了,結果其實沒有。
很多工程師,包括以前的我,看到欄位時都會先做一個快速分類:
- 主鍵、外鍵,很重要
- 狀態欄位,很重要
- 金額、數量,很重要
- 幾個看起來像補充說明的欄位,大概沒那麼重要
問題是,商業系統根本不照這套邏輯長。
在真實世界裡,一個不起眼的欄位,可能控制的是:
- 計算基準
- 流程分支
- 前端顯示邏輯
- 最後一筆資料怎麼收尾
- 例外情境怎麼處理
也就是說,它不是 metadata,而是 business rule switch。
欄位名稱不等於欄位地位
這是我最近最有感的一句話。
我們很容易被欄位名稱誤導,尤其當命名不是特別直觀、歷史包袱又很重的時候。看起來像代碼表欄位、像補充欄位、像延伸欄位,不代表它真的只是陪襯。
大型商業系統常常是這樣演化出來的:
- 先有第一版流程
- 後來遇到新需求
- 不想大改架構,就先加一個欄位
- 再後來這個欄位被更多地方引用
- 最後它變成隱性樞紐,但名字還停留在最初那個樸素樣子
於是你今天看到它時,會產生一種錯覺:這應該不重要吧?
然後災難就開始了。
真正有效的追法,不是只查資料表
我以前遇到這種問題,第一反應通常是:
- 找 schema
- 看資料型別
- 搜欄位在哪些 SQL 出現
這些都沒錯,但老實說,只做到這一步通常不夠。
因為你查到的只是「它存在」,不是「它怎麼影響系統」。
後來我比較固定的追法,會像這樣:
flowchart TD
A[找到欄位定義] --> B[搜尋後端 DTO / API]
B --> C[搜尋 service / 計算邏輯]
C --> D[搜尋前端顯示與互動]
D --> E[比對不同值對流程的影響]
E --> F[還原真正的業務規則]
這個順序的重點是:不要停在資料層,要一路追到使用層。
因為很多欄位的意義,不是寫在註解裡,而是寫在 if else 裡。
這句話有點悲哀,但很真實。你想知道一個欄位在幹嘛,最準的地方往往不是文件,而是看它在什麼條件下改變了哪一個計算結果、切換了哪一個 UI 分支、影響了哪一個收尾邏輯。
商業規則最常藏在「最後一段例外處理」
我這幾年看 ERP、MES、流程系統,有一個很穩定的觀察:最關鍵的業務知識,常常不是藏在主流程,而是藏在最後那幾段「特殊情況處理」。
比如說:
- 最後一次分攤怎麼算
- 不足量怎麼補
- 多領料時怎麼扣
- 狀態已變更但資料未同步時,UI 怎麼呈現
這些地方在 code review 裡最容易被略過,因為大家看完前面主流程就覺得差不多懂了。但系統真正的性格,往往就在這裡。
你會發現,某個欄位之所以重要,不是因為它出現很多次,而是因為它一旦是某個值,整個計算基準就變了。
這種欄位超危險,因為它很像一顆小小的開關:
- 平常安靜地躺在資料裡
- 一碰到特定條件就影響結果
- 還不一定有人記得它存在
如果團隊對它沒有共同理解,後面就很容易出現這種場景:
- PM 以為那只是顯示欄位
- 工程師以為改名無所謂
- 前端以為只是選項文案
- 顧問以為只是設定值
結果每個人都只錯一點點,系統就一起歪掉。
技術主管該做的,是把隱性規格翻成團隊能理解的語言
我覺得這種時候,技術主管的價值不只是把答案找出來,而是把那個答案翻譯成團隊聽得懂的版本。
因為「這個欄位在某個 component 裡會影響某段 quantity allocation logic」這種說法,對很多非開發角色其實沒有幫助。真正有用的是你能不能把它講成:
- 這不是備註欄位
- 它控制的是哪一種計算基準
- 一旦設成某個值,整個分攤方式會切換
- 所以改它、忽略它、誤解它,最後影響的是實際結果
這種翻譯能力,比單純找到程式碼位置還重要。
因為在商業系統裡,最稀缺的從來不是「有人看得懂 code」,而是「有人能把 code 裡的規則轉譯成可協作的知識」。
文件真正該補的,不是欄位說明,而是決策說明
很多系統文件愛寫成這樣:
- Field A:型別 nvarchar(10)
- Field B:型別 decimal(18,6)
- Field C:是否啟用某模式
這種文件不是沒用,但坦白說,對排錯幫助有限。
如果一個欄位真的會改變流程,文件應該補的是:
- 它在哪些情境會被判斷
- 不同值代表什麼業務語意
- 會影響哪些後端計算
- 會連動哪些前端行為
- 哪些例外情況特別依賴它
也就是說,文件不是只寫「欄位是什麼」,而是寫「系統為什麼在意它」。
這件事我現在愈來愈有感。因為團隊擴大之後,很多誤會不是來自技術不夠,而是來自語意沒有被保存。欄位還在、程式還在、資料也都還在,但知道它真正用途的人可能已經不在了。
那時候,你就只能靠追 code 考古。
結語:別小看任何一個你覺得「應該只是順便」的欄位
這次追欄位的過程,讓我再次確定一件事:商業系統裡沒有真正無辜的欄位,只有你還沒追到它的影響範圍。
尤其在 ERP 這種活很多年、需求一路疊上去的系統裡,很多歷史決策都不會大聲寫在架構圖上。它們就靜靜躲在欄位值、條件判斷、例外處理、前端分支裡。
如果你最近也遇到某個欄位看起來很普通,但大家又反覆問它到底在幹嘛,我的建議很簡單:不要猜,不要只看資料表,也不要只問單一角色。一路從資料、API、計算、UI、例外流程全部追完,你才會看到它真正的地位。
說到底,系統最難懂的地方,從來不是那些名字很可怕的模組,而是那些名字看起來很普通、但其實偷偷掌控全局的小東西。
如果這篇能讓你下次少說一句「這欄位應該沒差吧」,那我這次追欄位追到快懷疑人生,至少也算值得了。