MapleCheng

在浩瀚的網路世界中無限潛水欸少年郎!

0%

看起來像備註,其實是業務開關:我怎麼追一個欄位追到流程真相

最近我做了一件很技術主管日常、但也很容易讓人懷疑人生的事:追一個欄位。

不是追什麼超帥的演算法,也不是追效能瓶頸,就是一個欄位。一個看名字很普通、甚至有點像附屬資訊的欄位。乍看之下你會以為它只是資料表裡多放一個值,頂多拿來顯示、查詢、報表備用。結果真追下去才發現,事情完全不是這樣。

那一刻我又被提醒一次:在 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、例外流程全部追完,你才會看到它真正的地位。

說到底,系統最難懂的地方,從來不是那些名字很可怕的模組,而是那些名字看起來很普通、但其實偷偷掌控全局的小東西。

如果這篇能讓你下次少說一句「這欄位應該沒差吧」,那我這次追欄位追到快懷疑人生,至少也算值得了。