2026/06/26

越髒越好讀:QR Code 為什麼毀掉三成仍能 1 秒讀對?

一個被油漬、雨水、皺褶毀掉三成的方塊,如何在手機的 1 秒裡吐出完全正確的網址?

2024 年某個週六下午,臺北市民生東路巷子裡的便利商店,林小姐把便當塞進塑膠袋。袋面上印著一塊 3 公分見方的 QR Code——被炸雞油漬覆蓋一角,又被雨水浸得微微起皺。她掏出手機、相機自動對焦、嗶一聲,瀏覽器在 1 秒內吐出正確的發票網址。

整個過程沒有任何延誤耽擱——就像打開水龍頭就期待水流出來。30 年前多數人是用鍵盤把網址一個字一個字敲進瀏覽器,不允許打錯、不接受同義網址混淆。眼前這個被油漬與皺褶覆蓋的小方塊,反而能在最髒的擷取方式下,吐出 100% 正確的字串。

然而,這 1 秒並非孤立的工程奇蹟。它是 60 年接力的一個切片——1960 年代的軍事數學、1990 年代的日本工廠、和一群在不同國度、不同時代解著不同題目的工程師,最後在一塊 3 公分的方塊上交會。科學史上不少看起來毫不相干的發明,其實是同一條工程的後代——在不同學科的割裂處看出連結,幾乎是跨領域洞見的全部再現。

髒污的 QR Code 仍能準確傳遞訊息
圖、髒污的 QR Code 仍能準確傳遞訊息

汙損的方塊

方塊自己顯示不了網址。它要靠三件事疊在一起:手機鏡頭的影像擷取、影像辨識演算法、以及藏在黑白色塊背後的那套錯誤修正代碼。手機鏡頭邊緣飄著油霧、指紋壓在玻璃上、手在微微抖動——每一個變數都在跟方塊作對。QR Code 的設計,把這三件事層層疊起來,讓最不可控的擷取方式——拍照——也能跑出比鍵盤更可靠的結果。

直覺上,這違反常理。

QR Code 把 30% 的面積預先「犧牲」給冗餘資料。在最高容錯等級(H 級)下,整個方塊可以被髒污、刮傷、遮擋到失去 30% 的資料面積,手機仍然能在 1 秒內讀出完全正確的網址。髒了 30% 還能讀對?那不就是宣稱一本被撕掉三分之一的書,內文仍能完整還原?

但那套代碼確實做到了。

這個 1 秒的瞬間,背後藏著 1960 年代的軍事數學、1990 年代的日本工廠、和一群工程師在「該不該容忍破壞」這個問題上做出的反直覺選擇。容錯不是某個時代的行銷話術——它是一門有具體代數、具體規格、具體發明人的工程學科。

QR Code 從來不是為了完美而生,而是為了「在不完美中依然正確」而生。

要回答這個問題,得把時間往回撥 64 年。

容錯的代數

1960 年初夏,麻省理工學院林肯實驗室(MIT Lincoln Lab)的兩位數學家 Irving S. Reed 與 Gustave Solomon,面對一個冷戰時期才會出現的難題:太空中的軍事衛星正在高速傳回訊號,但訊號穿越電離層時被雜訊污染——每一個位元都可能從 0 變成 1、從 1 變成 0。他們需要一套辦法,讓接收端在被污染的訊息裡,仍然能還原出原本要傳的內容。

Reed 與 Solomon 想出一招:把要傳送的訊息看成一個多項式上的若干點。只要在原本的點之外再多算幾個點傳出去,接收端就能用多項式內插(polynomial interpolation)把被雜訊弄丟的點補回來——補的點越多,能容忍的雜訊就越多。

他們在 1960 年發表的論文中主張:當通道雜訊無法被消除時,工程師的任務是設計一組代數結構,使接收端能在統計意義的限制下,把被污染的訊息還原為原始內容。

這段話在當時讀起來像密碼學的純理論。但 34 年後,它會變成塑膠袋上那塊被油漬覆蓋的方塊的心臟。

Reed 與 Solomon 設計的代數碼,被後世命名為 Reed-Solomon codes。它在 1960 年代先被綁進軍事衛星通訊;1980 年代,Philips 與 Sony 把它交錯編織進 CD 光碟的錯誤修正層;1990 年代,數位電視廣播把它塞進訊號衰減的對抗公式;到了 1994 年,一個日本工程師把它放進了全世界最普及的二維條碼——QR Code。

QR Code 利用冗餘確保資訊能精準傳遞息
圖、QR Code 利用冗餘確保資訊能精準傳遞

從衛星到塑膠袋,這條 34 年接力,沒有人事先規劃過。1960 年坐在 MIT 林肯實驗室草稿紙上的兩位數學家,無法預見自己的多項式內插有一天會出現在便利商店的便當袋上。科學的長程繼承,常常是這樣——上一代解決了某個時代的難題,下一代在某個完全不同的場域裡撿起這把鑰匙,發現它剛好開得了眼前的鎖。

產線上的方塊

1992 年冬天,日本愛知縣刈谷市的 DENSO WAVE 總部,35 歲的工程師原昌宏(Masahiro Hara)盯著一份生產線報表。豐田的「高混合低產量」產線正面臨瓶頸:每台汽車要在多個工位被讀取十幾個一維條碼,每個條碼只能記十幾個數字,印在一張容易被機油弄髒的貼紙上。

原昌宏後來回憶:「一維條碼容量太小,掃描器每讀錯一次,整台汽車的零件追溯紀錄就要人工補登。」更麻煩的是,那些條碼貼紙被貼在沾滿切削油的引擎蓋上,被工人沾了手汗的指尖反覆摸過——紙面摸起來油膩、滑手,指紋的紋路一圈一圈壓在油漬裡。

原昌宏必須在半年內交出一個能容納數倍資訊、卻仍能在油污與磨損中讀對的二維條碼。否則 DENSO 在豐田供應鏈的合約將在 1993 年春天終止。

原昌宏的解法有三個設計。第一,把條碼從「線」變成「正方形」——這樣資料密度可以從一維的幾十個字元,躍升到二維的幾千個字元。第二,在正方形的左上、左下、右上三個角,固定放上三個比內部方塊大七倍的「定位方塊」(finder pattern)——掃描器在任何角度、任何方向看到方塊,都能瞬間辨識這是一個 QR Code,並校正自己的方向。第三,把 Reed 與 Solomon 1960 年發明的代數碼,直接塞進 QR Code 的糾錯層——方塊被撕掉一角,被油漬糊掉一塊,代數碼會從剩下的碎片裡把原網址推回來。

原昌宏在多次公開演講與訪談中,把「方塊被毀掉」當作預設情境來談;他反覆強調:設計的目標從一開始就是「髒了也要讀對」。

1994 年,DENSO WAVE 對外公布 QR Code 規格。更讓人意外的是,這家公司主動放棄了專利權利金,開放 QR Code 成為全球免費標準。原昌宏在公開場合談到這個決定時表示,他的初衷是讓 QR Code 成為全球通用標準——若收費,這項技術就無法普及。

這個決定,讓 QR Code 在 2010 年代搭上智慧型手機與行動支付爆發的順風車,變成了全世界最普及的條碼——從中國的支付寶到歐洲的疫苗護照,從臺灣的發票到非洲的藥品追溯,每一塊方塊背後,都跑著 1960 年的代數碼。

越髒越聰明

QR Code 工程師做了三個違反直覺的設計選擇,每一個都把「容納破壞」放在「預防破壞」之前。

第一個選擇:把資料冗餘 30%。QR Code 有 4 級容錯——M 級(7%)、L 級(15%)、Q 級(25%)、H 級(30%)。在最高級 H 下,整個方塊可以被毀掉三成,手機仍能讀出原始網址。這份冗餘不是行銷話術,而是 Reed-Solomon 代數碼的直接產物:每一塊資料在編碼階段就被切成多個碼字(codeword),每個碼字都帶著多項式內插所需的備援資訊。當掃描器偵測到某塊區域被遮擋,它就用周圍的碼字反推被遮擋的內容——就像從部分算式推回整個解題過程。

第二個選擇:用 8 種遮罩(mask)演算法,避開大面積的黑塊或白塊。如果 QR Code 的黑色模組剛好集中在一塊,掃描器會把這塊誤判為「定位方塊」;如果白色模組集中在一塊,又會被誤判為「靜默區」。8 種遮罩模式,是工程師用排列組合把所有可能的視覺干擾都列舉出來,然後在編碼階段讓 QR Code 自動選擇「最不會被掃描器誤判」的那個版本。原昌宏在 DENSO 的技術文件裡寫:「我們不是在設計『看得見的條碼』,我們是在設計『掃描器最不會誤判的條碼』。」

第三個選擇:讓使用方在編碼時根據情境預先選定容錯率。在光線充足的便利商店,H 級的 30% 冗餘是浪費——使用方寧可多塞一些資料;在油污嚴重的工廠,M 級的 7% 冗餘不夠用——使用方寧可少塞一些資料但保證讀對。使用方在生成條碼時就能依使用環境選好容錯率——中央常見的品牌 logo 嵌入就是這個原理:只要 logo 不超過資料區的 30%,H 級容錯依然能完整還原。

不過,這裡藏著一個常被誤會的問題:容錯不是妥協,也不是工程師偷懶的藉口。與其追求完美的讀取感知,不如設計容錯——這是容錯還是妥協?QR Code 工程師從一開始就選擇了前者。他們不是追求在完美環境下讀對,而是追求在不完美環境下依然讀對。這是一個程度問題,不是本質問題:失敗不是二元的「讀對或讀錯」,而是一條從「完美」到「三成毀損仍能還原」的連續光譜——工程師只在這條光譜上挑了一個足夠好的工作點。

直覺上,「越髒越容易讀錯」是常識。但 QR Code 工程師的選擇是:設計一個能容忍破壞的系統,比預防破壞更聰明。原因很簡單——現實世界無法預防所有髒污。一張貼紙會被工人反覆摸過,一個塑膠袋會被油漬覆蓋,一片牆壁會被雨水浸濕。與其試圖讓方塊永遠保持乾淨,不如從一開始就把「髒」當作設計前提。

這是 QR Code 工程哲學的核心,也是它能在全世界普及的原因——它承認世界是髒的,然後在髒的世界裡,依然讀對。

60 年的接力

Reed-Solomon 代數碼從 1960 年代的軍事衛星出發,在不同的時代、不同的硬體、不同的需求下,被不同世代的工程師反覆放進新設備。

1980 年代,Philips 與 Sony 為 CD 光碟設計錯誤修正時,把 Reed-Solomon 的交叉交錯版本(Cross-Interleaved Reed-Solomon Coding, CIRC)嵌進 CD 唱盤。CD 表面只要被刮傷幾毫米,CD 唱盤的雷射頭跳過刮痕時會發出細碎的嗒嗒聲,音樂卻依然完整播出。旅行者二號至今仍用 Reed-Solomon 把外太陽系行星的照片傳回地球——這套代碼像一條隱形的工程血脈,悄悄流過 60 年的人類科技史。

Claude Shannon 在 1948 年的《通訊的數學理論》(A Mathematical Theory of Communication)裡,為這條工程血脈提供數學基礎。在任何有雜訊的通道裡,可靠通訊的唯一辦法是「用冗餘換正確率」。一句話定錨。Shannon 寫道:「冗餘是對抗雜訊的代價。」

Shannon 這句話的工程版——冗餘換正確率——在生物世界有對應版本。達爾文在《物種起源》用「自然選擇」四個字寫下它:基因複製允許錯誤,整個物種靠變異存活——DNA 靠雙股互補與修復機制容許一定程度的複製錯誤,本質上就是生物版的容錯系統。

語言學家也發現自然語言普遍帶有冗餘:「我我我想」這種贅述,即使聽錯了,也不會誤判對方的意思;「張三張三」這種重複呼叫,在嘈雜的派對裡仍能讓人辨識出是叫自己。

Indeed,這條工程血脈最後找到了一個意外的同類——心理歷史學。艾西莫夫筆下的「基地」,靠統計模型預測整個銀河帝國的興衰。它對個體行為的放棄,正是它對集體走向的把握;QR Code 對個別掃描錯誤的容忍,正如心理史對個體不可預測的容忍——兩者設計的都是對錯誤的容忍度。

To be sure,這些例子分布在生物、語言、科幻、工程四個看似無關的領域,但它們指向同一條原理:容錯不是某個時代的工程技巧,而是這顆星球上所有複雜系統存活下來的共通策略——從 DNA 的雙股互補到語言的贅述,從基地的統計確定性到 QR Code 的油漬讀對。

Reed 與 Solomon 1960 年坐在 MIT 林肯實驗室的草稿紙上時,他們不知道自己的代數碼會走過 CD、太空探測器、QR Code;他們也不知道,自己解決的「衛星通訊」問題,其實是人類用工程模仿自然、用代數模擬演化的一個小小切片。

60 年接力,從冷戰到便利商店。

1 秒的接力

當林小姐掏出手機,對準塑膠袋上那塊被油漬覆蓋的方塊。1 秒後瀏覽器吐出正確網址——這 1 秒裡跑著的,是一條從 1960 年到 2024 年的工程接力。

1960 年的冷戰代數,1992 年的日本工廠,2024 年的便利商店塑膠袋——三個時代、三個場景、三群來自不同國家的工程師,最後在那塊 3 公分見方的方塊上交會。

Irving S. Reed 於 2012 年逝世;在他生前最後幾年的多次訪談與演講中,他反覆對自己代數碼被應用於 QR Code 與日常消費產品表達驚喜。他曾說過大意如此的話:自己當年只是解決了一個衛星通訊的問題,沒想到會在便利商店的塑膠袋上看見它——數學會自己找到它該去的地方,從冷戰實驗室一路走到全世界最日常的角落。

1960 年坐在 MIT 林肯實驗室草稿紙上的兩位數學家,無法預見 1960 年代的代數會在 1994 年走進日本工廠,更無法預見它會在 2024 年走進臺北巷弄裡的塑膠袋。然而,這恰恰是科學最動人之處——個別天才解決了某個時代的難題,下一代在完全不同的場域裡撿起這把鑰匙,沒有人能預見鎖在哪裡。

QR Code 並非一人一時的發明。它是 60 年接力、跨越國防、學術、商業三個世界之後,落到每個人口袋裡的代數。容錯不是某個時代的工程技巧,而是這顆星球上所有複雜系統存活下來的共通策略——從 DNA 的複製到語言的冗餘,從 CD 的刮傷修復到 QR Code 的油漬讀對。

下次再掏出手機、對準那塊被油漬覆蓋的小方塊時——那 1 秒裡,60 年的代數碼正在接力。

沒有留言:

張貼留言