少於 1 分鐘閱讀

一場攝影比賽,一堆藏在細節裡的規則

醫院今年 40 週年院慶,辦了一場攝影比賽。同仁組收到 29 件投稿,社會組 23 件,五位評審要分別替兩組照片打分數。

任務交到我手上的時候,聽起來輕輕鬆鬆——找幾位評審、發幾張照片、算一算分數、公布名次。我心裡也是這麼想的,直到我坐下來,把整件事在腦子裡認真跑過一遍。


同分機率

麻煩是一層一層冒出來的。

評審之間不能知道彼此是誰,免得互相參考、互相影響——那要怎麼設計登入方式,才不會讓某位評審不小心瞄到別人的帳號?投稿者的任何資訊也不能讓評審看到,「這是誰拍的」這種念頭一旦浮現在評審腦中,評分就不可能純粹——那資料庫裡的備註欄位,要怎麼確保它永遠不會被任何一支 API 不小心吐出來?每一項評分標準——構圖、主題、創意——權重不同,加權總分要怎麼算才公平、才禁得起質疑?

我在紙上寫下這些問題,越寫越安靜。最後一個問題冒出來的時候,我停下筆:如果兩張照片算出來的分數一模一樣呢?名次要並列,還是要有一套讓人心服口服的規則去分出高下?

用 Excel 表單湊合著算,或許能跑得完。但我幾乎可以想像比賽結果公布那天,有人皺著眉頭問一句:「這個排名到底是怎麼來的?」而我答不出一個站得住腳的答案。

那一刻我告訴自己:這次我想做的,不是一個能用的東西,而是一個經得起檢驗的東西。

這次,先寫SDD規格書

我沒有馬上打開編輯器。

我先開了一份空白文件,把整件事,一條一條寫成規格書。

角色有哪些、每個角色能做什麼不能做什麼、資料表怎麼設計、API 要怎麼隔離評審跟評審之間的視角、加權總分的公式、例外狀況要怎麼處理——一條一條列下去,像是在替一棟還沒動工的房子,先把每一根樑柱畫進藍圖裡。不是因為這次比較有時間,而是這次牽涉到的是同事的作品、評審的公正性、比賽結果的公信力。這種東西一旦砸了,沒有「重新上傳一次」這種退路可以走。

規格寫好,我把它交給 Claude Code,看著終端機一行一行吐出程式碼。兩天內,系統的骨架跟核心功能就成形了:管理後台、評審登入、評分頁面、成績總表、CSV 匯出、資料庫備份——我對著規格書,一項一項勾掉,心裡踏實了不少。

但規格書裡有一條,我的游標在上面停了很久,遲遲沒有動手寫死。

同分機率:一個藏在心裡的疑問

那一行字是這樣寫的:「排名依加權平均分數由高到低排序,同分時排名並列。」

我自己打下這句話的時候,心裡就有一種說不上來的不踏實。評分是 1 到 10 分的整數,五位評審各打一次,加權平均再取到小數點——直覺告訴我,同分應該是少數的意外,頂多寫一句「同分重評」就打發過去了,誰會那麼剛好,五個人打出來的分數,加權平均完全一樣?

但那個念頭沒有散去,反而在我心裡越滾越大聲:真的是這樣嗎?如果同分其實不是少數意外,而是常態呢?如果「並列名次」最後變成一半以上的照片,全都掛在同一個名次上,那這場比賽的排名,還有什麼意義?

我盯著螢幕,手指停在鍵盤上方,沒有繼續往下寫規格。

直覺這種東西,我不敢信。我決定不要用它來回答這個問題——跑一次模擬看看,數字會告訴我答案。

模擬結果出爐的那一刻

我另外開了一個檔案,寫了一個小程式。分別針對同仁組 29 件、社會組 23 件,模擬五位評審打分數的情境,跑了兩種假設:一種是評審完全隨機打分,另一種是評審打分習慣比較集中——多數落在 6 到 9 分之間,比較貼近真實世界評審下手的手感。

我按下執行,螢幕安靜了一兩秒。

數字跳出來的時候,我盯著螢幕愣住了。

情境 同仁組(29 件)同分機率 社會組(23 件)同分機率
評審完全隨機打分 96.1% 86.3%
評審打分習慣集中(多數落在 6-9 分) 100.0% 99.1%

不是「偶爾會同分」。是幾乎必然會同分。

而且評審打分越集中——也就是越貼近真實比賽裡評審手鬆、大家都給高分的情況——同分機率反而衝到接近 100%。我原本以為自己在處理的是一個邊緣案例,一個規格書裡順手寫一句「並列」就能打發的小地方。跑完模擬才知道,這其實是這整套系統最核心的問題。如果沒有一套破同分規則,這場比賽有極高的機率,會用一句「並列」草草結束——五位評審熬夜認真評分的心血,最後被同一個分數,埋在一起。

我把椅子往後推了一點,重新看著那張表格。這不是我可以隨便寫死一句話就交代過去的地方了。

破同分規則:三層比較

有了這兩個數字,破同分規則就不再是憑感覺硬湊的邏輯,而是有明確目標要解決的設計。

我又坐回螢幕前,開始想:加權總分算出來的那個平均值,到底漏掉了什麼?

漏掉的,是「有沒有評審真心覺得這張照片很突出」這件事。一張被多位評審打了 9、10 分的照片,跟一張所有評審都給 7 分、平均起來剛好一樣的照片,理應不是同一個等級——但加權平均會把它們看成完全相同的東西。

於是規則就這樣定下來了。當兩張照片的加權總分完全相同時,系統依序比較:

  1. ≥9 分評審人數——哪張照片拿到比較多評審給出的高度肯定,由多到少排。
  2. 如果還是相同,再比單一評審給過的最高分,由高到低排。

要三個條件都完全一致,才會真正並列名次。寫完這段邏輯,重新跑一次模擬——同分機率終於從 96%、100% 這種嚇人的數字,掉回一個合理的範圍。破同分規則,其實是在把加權平均分數看不見的訊號,重新找回來。

三天,系統上線

從第一次落筆寫規格書,到系統實際部署上線,前後大概三天。五個角色的權限隔離、匿名性、破同分規則,每一項都經不起「先求有再求好」,值得花這三天,把規格跟邏輯都想清楚。

部署到既有的 VPS 上那天,我其實做好了心理準備,以為會跟主機上原本就在跑的網站打一場架。結果比想像中順利——核心程式先跑起來,只綁在本機的連接埠上,等網域生效了才接上反向代理跟 HTTPS,中間沒有動到任何一個原本就在運作的站台。

系統正式上線那天晚上,我打開後台,看著評分一筆一筆即時跳出來——五位評審各自在自己的畫面裡,看不到彼此,也看不到投稿者是誰,安安靜靜地替 52 張照片打著分數。而在那些分數背後,有一組規則正安靜地等著:一旦同分發生,就把該分出的高下,不動聲色地分出來。

我看著螢幕,沒有什麼戲劇性的瞬間,只是心裡某個地方,慢慢地、安靜地放鬆下來——那是一種把一開始只是直覺懷疑的問題,真的算出數字、找到答案的踏實感。

更新時間: