我已經能沿著系統思考,卻還不能沿著程式碼追問題

區分系統層級與程式層級的理解,說明能判斷責任與影響範圍,仍不代表能沿著程式碼追出完整實作。

上一篇寫到,我現在有些工程概念,已經不只是聽得懂。

新的需求出現時,我會主動拿它們來判斷風險、責任和影響範圍。

但這又帶出另一個問題:

我現在理解的,到底是系統怎麼組成,還是程式本身怎麼寫?

目前我比較確定,主要是前者。

我現在腦中已經有一張系統地圖

這個委託專案有前端、後端、文件處理服務和資料庫。

對我來說,它們現在已經不只是幾個技術名稱。

我大致知道:

前端負責使用者操作。

後端負責案件流程、權限和主要業務規則。

文件處理服務負責 Excel、Word、PDF、OCR 等工作。

資料最後會被保存到資料庫。

我也可以自己大致畫出一個功能怎麼在這些部分之間流動。

例如使用者上傳一份 PDF。

資料會先從前端送到後端。

後端先處理權限、案件狀態和其他規則。

如果需要解析文件,再呼叫文件處理服務。

處理結果最後再一路回到前端。

這種理解會直接影響我怎麼看問題。

我已經可以先把問題拆到不同系統部分

假設今天使用者上傳 PDF 之後,畫面顯示處理失敗。

我不一定知道真正的 bug 在哪裡,但我會先想到幾個可能方向。

可能是前端送資料出了問題。

可能是後端沒有正確往下處理。

也可能是文件處理服務失敗。

還有可能每一部分單獨看都正常,問題卻出在彼此交換資料的地方。

我可以先沿著這張系統地圖,把「功能壞了」拆成幾個可能的系統區域。

這和 Day 1 很不一樣。

當時結果不對,我幾乎只知道:

「它壞了。」

現在至少可以先問:

它可能壞在哪一層?

新的需求出現時也是一樣。

我會想到:

這次修改可能碰到哪些部分?

哪些責任需要一起維持?

前後端交換的資料會不會改?

是不是還牽涉另一個服務?

這些判斷不需要我先熟悉底下每一段程式碼。

它們來自我對整套系統責任和資料流的理解。

但這張地圖一進到程式碼裡,就會斷掉

這也是我目前最明顯的能力邊界。

我不是完全看不懂程式碼。

如果 Codex 已經指出一小段直接的條件判斷、function 或資料轉換,我通常可以大致理解它現在在做什麼。

但只要要從一個功能一路往下追,我很快就會失去方向。

還是以前面的 PDF 上傳為例。

我知道它大致會經過:

前端 → 後端 → 文件處理服務。

但如果現在真的打開後端 repo,要我自己找到 request 從哪裡進來、經過哪些 module 或 service、在哪裡呼叫文件處理服務,我目前追不下去。

我不知道應該從哪一個檔案開始。

也不知道 framework 裡這一層接下來通常會連到哪裡。

更沒有辦法單靠閱讀現有程式,把一個完整功能的實作路徑拼回來。

所以我現在可以沿著系統看問題。

但還不能沿著程式碼看問題。

看得懂一小段程式,不等於看得懂一個功能怎麼被做出來

這個差別以前我沒有特別分開。

因為單獨看到一小段熟悉的 JavaScript 或 TypeScript,我可能會覺得:

「這個我大概看得懂。」

但現在一個使用者看到的操作,背後可能跨過:

  • 前端
  • 後端
  • 資料庫
  • 另一個服務

所以就算看得懂其中一個 function,也不代表知道整個功能最後怎麼成立。

「我看得懂這十幾行在做什麼」,和「我知道這個功能是怎麼被整套程式一起做出來」,中間還有很大的距離。

我現在缺少的,不只是更多語法。

更大的缺口是:

我還沒有形成一種可以沿著 codebase 追出完整實作路徑的能力。

這讓 Day 1 的「改不動」多了一層新的比較

Day 1 時,整套網站對我來說幾乎都是黑盒。

我不知道有哪些主要部分。

也不知道一個問題可能落在哪裡。

現在底下的程式實作對我仍然很大程度是黑盒。

但黑盒外面,已經多了一張系統地圖。

我知道:

有哪些主要部分。

各自負責什麼。

資料和工作大致怎麼流動。

某些責任為什麼不能只放在其中一層。

新的需求可能影響哪些地方。

所以 Day 1 到現在的差別,不是:

以前不會改程式,現在會了。

而更接近:

以前既不知道程式怎麼寫,也看不見系統怎麼組;現在我還不能沿著程式碼理解完整實作,但已經能沿著系統理解它為什麼這樣組成。

目前我能確定的是:

我已經有一部分系統層級的理解,但程式層級的理解還很薄。

而這就留下下一個很直接的問題。

如果我還不能自己沿著程式碼確認完整實作,那 Codex 說「做完了」之後:

我到底憑什麼相信它真的做對了?