“傳統(tǒng)本地軟件的數(shù)據(jù)只屬于一臺(tái)設(shè)備,云軟件的數(shù)據(jù)則被平臺(tái)當(dāng)作人質(zhì)扣押——我們是不是必須接受這種二選一的困局?”在近期一場(chǎng)本地優(yōu)先軟件會(huì)議上,開發(fā)者塞夫·金特爾用這樣一個(gè)詰問拉開了他的閉幕演講。他沒有給出一個(gè)妥協(xié)性的答案,而是提出了一條截然不同的路徑:讓所有應(yīng)用共用同一個(gè)數(shù)據(jù)層,各自獨(dú)立演化卻保持無縫兼容,就像在一套看不見的本地優(yōu)先操作系統(tǒng)里共同呼吸。
金特爾把這個(gè)設(shè)想的核心錨點(diǎn)押在了一種持久穩(wěn)固的模式格式上。在他看來,一個(gè)能穿越時(shí)間的格式,必須具備自描述能力,不需要借助外部說明書就能讓人讀懂自己;它還得是靜態(tài)類型的,能在打開文件的瞬間就確定字段的真面目;并且要在年復(fù)一年的版本更迭中守住兼容承諾,既不刪除尚不理解的外來數(shù)據(jù),又能高效支撐網(wǎng)絡(luò)同步與流式傳輸。他毫不客氣地評(píng)價(jià)說,JSON過于冗長(zhǎng)且類型松散,難以擔(dān)當(dāng)長(zhǎng)久保存數(shù)據(jù)的重任;Protocol Buffers 和 Cap’n Proto 則強(qiáng)迫各方預(yù)先共享模式,一旦失去那份外掛的說明書,數(shù)據(jù)就會(huì)變得無法解析。
![]()
為了破除這個(gè)依賴,金特爾設(shè)計(jì)了一種叫 schemaboi 的實(shí)驗(yàn)性方案,并用 Rust 語言把它變成了可以跑的原型。schemaboi 將模式信息直接嵌入每一個(gè)文件的頭部,讓任何工具都能當(dāng)場(chǎng)檢視、理解內(nèi)容,完全不需要額外分發(fā)一份獨(dú)立的模式文件。當(dāng)應(yīng)用打開一個(gè)文件時(shí),文件頭部的模式會(huì)與應(yīng)用內(nèi)部的模式發(fā)生合并:文件中存在的字段會(huì)被讀取,缺失的字段會(huì)被默認(rèn)值補(bǔ)全,而那些當(dāng)前版本還無法識(shí)別的字段則被原封不動(dòng)地保留下來,絕不會(huì)因?yàn)榘姹静灰恢戮捅淮直﹣G棄。
這套系統(tǒng)的類型骨架也頗為清晰。它既支持布爾、整數(shù)、浮點(diǎn)數(shù)這些標(biāo)量類型,也容納列表、映射等復(fù)合結(jié)構(gòu),并把結(jié)構(gòu)體和枚舉統(tǒng)一在同一個(gè)模型之下。在常見的模式設(shè)計(jì)中,結(jié)構(gòu)體是一組命名字段的集合,枚舉則是一組互斥的變體,而 schemaboi 將它們合二為一,使開發(fā)者在描述數(shù)據(jù)時(shí)擁有更細(xì)膩的彈性。更重要的是,這種保持未知字段的做法,相當(dāng)于在數(shù)據(jù)層面建立了一條“代際契約”——新版本可以添加線索,老版本可以留下空白,誰都不會(huì)毀掉對(duì)方的世界。
兼容性這件事,在金特爾那里被拆成了三個(gè)維度。向后兼容是大多數(shù)開發(fā)者熟悉的:用新版應(yīng)用打開舊文件,一切如舊。向前兼容則反了過來:用舊版應(yīng)用打開新文件時(shí),雖然新字段無法理解,但依然能完整保留,不至于崩潰或丟數(shù)據(jù)。而真正讓人眼前一亮的,是他提出的“側(cè)向兼容”——不同開發(fā)者完全可以在沒有中央?yún)f(xié)調(diào)的情況下,各自為數(shù)據(jù)增添字段,彼此互不干擾。實(shí)現(xiàn)它的關(guān)鍵,在于用全局唯一的字段標(biāo)識(shí)符替代傳統(tǒng)的遞增序號(hào)。遞增標(biāo)簽雖然簡(jiǎn)單,但在并行開發(fā)時(shí)極易沖突,就像兩個(gè)城市同時(shí)給新道路命名為“1號(hào)路”,而全局唯一標(biāo)識(shí)則相當(dāng)于給每條道路發(fā)了一個(gè)永遠(yuǎn)不會(huì)重復(fù)的身份證。
有了這些機(jī)制之后,模式該如何安全地生長(zhǎng)?金特爾給出了一張清晰的演變更動(dòng)清單。添加可選字段、引入新的枚舉變體,屬于綠色安全操作,舊版本可以輕松跳過,新版本則自如讀取。但一旦試圖把某個(gè)字段從可選改為必填、重新命名已有字段,或者改變字段的類型,就地雷密布。他特別提醒,這類激進(jìn)修改往往會(huì)讓舊數(shù)據(jù)無法通過校驗(yàn),迫使所有使用方同時(shí)升級(jí),而這種強(qiáng)行搬遷式的演化,正是他極力想避開的陷阱。他更推崇漸進(jìn)增強(qiáng)——每一次改動(dòng)都小巧、可逆、可累積,就像郵件協(xié)議從純文本演進(jìn)到多部件、再?gòu)亩嗖考L(zhǎng)出附件和排版樣式,或者像 HTTP 從1.0到1.1再到2與3,盡管底層傳輸翻天覆地,數(shù)據(jù)格式的語義卻始終保持著一種安靜的延續(xù)。
在金特爾眼中,郵件和 HTTP 的長(zhǎng)壽不是因?yàn)樗鼈円婚_始就被設(shè)計(jì)得完美,而是因?yàn)樗鼈冏裱艘粭l樸素的法則:新增勝于修改,擴(kuò)展勝于遷移。當(dāng)某個(gè)系統(tǒng)允許不同的參與者獨(dú)立疊加新特征,而不需要跪求一個(gè)中央權(quán)威來批準(zhǔn)字段編號(hào)時(shí),生態(tài)就自然具備了抗脆弱能力。schemaboi 所追求的正是在文件層面復(fù)制這種抗脆弱性——用自包含的模式降低協(xié)調(diào)成本,用保留未知字段來守護(hù)每一次不完全的相遇,用全局唯一標(biāo)識(shí)為分布式團(tuán)隊(duì)拆除同步鎖。
在演講的最后部分,金特爾轉(zhuǎn)向了實(shí)際應(yīng)用方面的考量。由于演講記錄在此處有所截?cái)啵覀儫o法獲悉具體的落地細(xì)節(jié),但從整場(chǎng)分享的脈絡(luò)來看,他顯然認(rèn)為格式的選擇不是一個(gè)純粹的技術(shù)偏好,而是一種關(guān)于控制權(quán)與協(xié)作效率的長(zhǎng)期博弈。當(dāng)越來越多應(yīng)用宣稱要“本地優(yōu)先”,數(shù)據(jù)格式能否像郵件的字段一樣安靜地演化,或許正是決定這股浪潮是曇花一現(xiàn)還是扎根生長(zhǎng)的隱秘分水嶺。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.