化解矛盾
想化解矛盾,可以考慮先將矛盾可視化並且檢查隱藏假設。
最近我在做前端開發時,遇到了一個設計上的矛盾,我想了兩個解法,但是,兩個解法我都不滿意。基於管理學,當矛盾發生的時候,拒絕快速地做兩選一,多花時間研究,很有機會可以因此找出新的見解。運氣相當好,真的有發現新的東西。
我遭遇的設計困難可參考上圖,這是一個會議 (conference) 的應用程式,前端有兩個不同的呈現方式,一個是列表呈現 (list view),一個是細節呈現 (details view)。上圖是講者的細節呈現。無論是哪一個呈現,都要讓參加者可以登記參加 (sign up),或是離開 (leave)。
按鈕的行為牽涉到了資料庫狀態的改變,所以無論是來自列表呈現的「參加」按鈕,或是來自細節呈現的「參加」按鈕,都會呼叫同一組後端的 API ,並且對資料庫做出寫入。
兩個矛盾的設計
我想了兩個設計,各有優缺點:
設計1,使用傳統的 SPA 方式來做:
特性:在 SPA 裡,對於後端 API 來講,它可以直接忽略了前端的呈現,因為那是前端需要處理的事情。後端 API 只負責傳回狀態,即使用者是否「參加/離開」成功。
缺點:當後端是傳回 json 到前端處理時,前端往往就得做複雜狀態管理。
設計2,使用 htmx:
特性:由於有兩種呈現,所以每一個後端的 API 都會被兩個來源呼叫,一個來源是列表呈現,另一個是細節呈現。而後端 API 被呼叫之後,會有四種可能性:
(參加者狀態改變, 返回新的列表呈現的html),(參加者狀態不改變, 返回舊的列表呈現的html),(參加者狀態改變, 返回新的細節呈現的html),(參加者狀態不改變, 返回舊的細節呈現的html)。缺點:這個作法讓所有的 html 都在後端生成,這就會導致後端的 API 變得相當複雜,因為資料庫的狀態改變與前端的畫面重繪,都必須在後端做完。
衝突解決圖
上圖出自約束理論 (theory of constraints) 的一種思考流程,稱之為『衝突解決圖』(conflict resolution diagram)。
約束理論是一套管理學方法論,可應用於企業管理。在約束理論裡,有個假設是,為什麼企業會難以自行改善自身的問題,通常是因為企業內的一些議題有衝突與矛盾。而『衝突解決圖』就是用來讓衝突與矛盾可視化。
在圖中,每一個箭號都是表現因果關系。 A 是理想中想要達成的目標,而 A 需要條件 B 與條件 C,而條件 B 需要前提條件 D,條件 C 需要前提條件 D' 。一旦 D 與 D' 兩者不能同時成立時,A 就難以達成。
下圖是維基百科上的例子,用經濟產量模型來舉例:
A:目標:降低每單位產品的生產成本。
B:降低每單位的機器的設置成本
C:降低每單位的運輸成本
D:要達成 B,所以必須大批量生產。
D':要達成 C,所以必須進行小批量生產。
如何化解矛盾?
根據 Goldratt 的看法,每一個因果關系裡都有隱藏的假設。如果我們去仔細驗檢因果關系,就有可能發現,隱藏的假設有可能有替代方案。比方說:為了降低單位成本,我們必須進行大批量生產,因為:
設定成本是固定的,無法降低。
正在安裝的機器是瓶頸,沒有閒置產能。
總之,將每一個因果關系的連結,都加以解釋之後,就有可能找到某個隱藏的假設有可能不成立,進而找出可以化解矛盾的解決方案。
矛盾的解決方案
仔細地檢驗困果關系,還有認真地查了 htmx 的文件,我發現,沒有把讀取跟寫入分開來討論這件事,就是造成矛盾的原因。
htmx 官方推薦的一種後端寫入 API 設計方式,是讓 API 傳回 http header 並且觸發事件,於是,因為資料庫狀態改變而引起的前端畫面重繪 (repaint) 可以在前端收到事件時再來處理。如此一來,就可以同時讓前端與後端都保持簡單。






