バージョニングの失敗

版付け

[26] 版付け (バージョン付け (versioning) , バージョニング) とは、データメタデータとして仕様や実装のバージョンの情報を付与し、それによって処理モードを変えることをいいます。

版付けの失敗例

[36] バージョニングは色々な形で技術に歪みをもたらします。

[17] MIMEMIME-Version: 頭欄を導入しましたが、 非 MIME メッセージとの区別には次第に用いられなくなり、 また新規バージョンも互換性が失われる懸念から導入されずにいます。

[20] SOAP は元々広く実装された SOAP 1.1 とそれを数年かけて W3C で標準化した SOAP 1.2 があり、両者非互換でした。 SOAP 1.2 によって SOAP 1.1 が置き換えられることはなく、どちらも使われました。 SOAP を下位層とする各種 WS-* 仕様群は、どちらの版にも対応しなければなりませんでした。

[21] XML 1.1XML 1.0 の「整形式」の定義を変更することとなったため、 新しい版番号が与えられました。各種の XML応用は個別に XML 1.0XML 1.1 の両方に対応することが迫られました。しかし結局 XML 1.1 は普及しませんでした。 そこで XML 1.0 の第5版で XML 1.1 の変更の一部が取り込まれ、 「整形式」の定義が変わったのに版番号は 1.0 のままとなりましたw

(しかし XML 1.1 も廃止されておらず、 XML 1.0 第4版以前、XML 1.1XML 1.0 第5版 (以降) の3種類の混ざった混沌だけが残りましたw)

version 疑似属性の取り扱いは幾度も非互換変更が行われ、 将来のバージョンの変更を予測して現在のバージョンのうちにバージョン切り替えメカニズムを設計することの難しさを示しました。 最終的には version 擬似属性の値が 1.11.2 であっても XML 1.0 第5版 (以降) とみなすことになりました。

[33] XLink 1.0xlink:type 属性を必須としていましたが、 現実には省略されることも多く、必須とする強い理由も無いとして、 省略可能に変更されました。この際、技術的な変更が加わっているため、 XLink 1.1 に改番されました。 改訂と同時期には、 XLink 1.0 を引用しながら、 XLink 1.1 が制定中で省略可能になる予定だとして必須にしていない仕様書も出版されたりしました。 XLink 1.1 の制定後も、それまで XLink 1.0 を引用していた仕様書のすべてが改版されたわけではなく、 そうした古い仕様書に基づく技術で xlink:href 属性が必須なのかどうかは不明確です。 また、 XLink 1.0XLink 1.1 のどちらが文書で使われているかは区別できませんから、 実装は両方の挙動に同時に対応することができません。 つまり現実の要求に近づけるための新版制定だったはずなのに、かえって相互運用性に不安を残す結果となっています。

[27] HTMLCSSDOCTYPEスイッチにより90年代の実装の延長にある奇癖モードと2000年前後の標準仕様に基づく標準モード (現在の無奇癖モード) で処理を分岐させる手法を00年代初頭に取り入れましたが、 00年代後半には既に実装コスト、学習コスト、標準化コストがかかるだけの失敗だったと考えられるようになっています。

00年代末には IE8 が同様の異なる仕組みである文書モード (X-UA-Compatible:) を導入しましたが、10年代前半の IE11 はこれを非推奨としていて、 Edge では放棄されました。

加えて CSS では標準化の過程にある実験的な機能を vendor prefix によって区別して実装開始する手法を取り入れましたが、結局は最終的な標準版とその過程の vendor prefix 版を恒久的に (他の vendor も) 実装しなければならないことになり (Compatibility Standard)、バージョンを区別して最終版以外は切り捨てるとの目論見は破綻しました。

つまり標準化して実施しても単一ベンダーで独自に実施しても、 全体レベルでも機能レベルでも、バージョニングは失敗しています。

[60] CSS2/CSS 2.1/CSS 2.2/CSS3 のカオスな状況のように、 CSS仕様書バージョニングの面でも失敗しています。

[28] XHTML2XHTML1 と非互換なことから異なる名前空間を採用し、 事実上のバージョニングを行っていました。しかし XHTML1 への機能追加の要求が強まり、徐々に新機能を XHTML1 へとバックポートしていきました。 その流れは最終的に XHTML2 プロジェクト全体を崩壊させるに至りました。

[29] XPathXSLT は 2.0 で大きな非互換変更を行い、 version を指定することで動作モードを切り替えるようにしましたが、 Webブラウザーを含む多くの実装が 2.0 の実装を嫌がり、普及の障壁となりました。

これはセカンドシステム症候群の例とも言えそうです。

[37] XFormsXML EventsXFrames は、 HTML の一部機能を改良することを目指したものでしたが、 互換性が一切無く異なる名前空間を採用していました。 XHTML2 と共に HTML の新バージョンとして置き換えることを狙っていましたが、 誰も使いたがりませんでした。

これはセカンドシステム症候群の典型例でもあります。

[30] JavaScriptlanguage 属性MIME型でバージョンの区別ができることになっていましたが、 Webブラウザーの実装も著者側の利用も正しく行えず、 次第にその意味するところが曖昧になっていきました。 最終的にはバージョンの区別はすべて無視されるようになりました。

[35] DOM特徴という形でアプリケーション実装の版を判定できる仕組みを用意していましたが、 有効に機能しませんでした。

[38] RSSAtom は、色々なバージョンが乱立しました。 各バージョンは互換性が全くなかったり、一見互換性がありそうだったり色々でした。 (各項を参照。) 実世界では、バージョンが正確に使い分けられず、 他のバージョンの機能が混在させて用いられたりしました。 バージョン番号だけを新しいバージョンに書き換えてそれ以外は旧バージョンのままのフィードもあったりします。 結局すべてのバージョンが混在したどの仕様書でも説明されていないものが現実に用いられているものであり、 相互運用性に大きな課題を抱えています。

[34] TLS 1.3 では、バージョン欄が... (というかすぐに廃止予定だった SSL 2.0 が十数年間削除できなかった時点で...)

[54] HTTPプロトコルの版で将来の版と HTTP/1.x を区別することを企図していましたが、 実際の HTTP/2 はそれを実質的に利用せず、 ALPN で切り替えています。 将来のバージョンがどのような設計を選択するかの予測は的中するとは限らず、 現在のバージョンに組み込んだバージョン切り替え機構が実際に採用されるかどうかは、 その時までわからないのです。

版付けの失敗理由

[39] こうした実例から、失敗の理由は次のように整理できそうです。

  • [40] 複数のバージョンが混在する時、どう処理するべきかが仕様書に明記されないことが多い。 仕様書はいずれかのバージョンのみを規定することが多いので、 バージョン間の相互作用は規定から漏れがちである。
  • [41] バージョン間の相互作用が規定されたとしても、 旧バージョン時代に新バージョンを予測するのは困難で、 曖昧な規定になりやすい。しかも旧バージョン時代の実装による新バージョンの扱い (仕様書通りに実装されるとも限らない。) が新バージョン制定時の制約になってしまう。
  • [42] 新バージョンが制定されると旧バージョンの仕様書は放置されることがほとんどである。 ところが現実世界では旧バージョンも残ることが多い。 新バージョンの仕様書で解決されている問題が旧バージョンの仕様書で未解決の場合、 実装と仕様書が乖離するか、色々な実装が混在してしまう。
  • [43] 新バージョンで多くの課題を解決しようとして旧バージョンとかけ離れたものを作ってしまうが、 実装者や著者は現状より少し良くなったものを求めているだけでしかない。 新バージョンが出るたびに全部作り直したくはない。
  • [44] ほとんど同じ機能の複数のバージョンの実装をメンテナンスし続けるのはつらい。 旧バージョンの仕様であってもバグ修正などは続けなければならないから、 バージョンが変わるたびにメンテナンスコストがどんどん増えていく。
  • [45] 仕様書の開発スケジュールと実装のリリース時期が一致していない。 「仕様書バージョンαの実装」は実際にはあまり無く、 「仕様書バージョンαのp % + 仕様書バージョンβの新機能の q % の実装」 のような形になるので、仕様書の機能単位のバージョニングと整合しない。

[65] ソフトウェアの版の使い方を誤った失敗事例:

[66] 版番号の比較の失敗事案: version sniffing, 年問題

比較的うまく移行できた例

Web API におけるバージョニング

[48] Web APIの悪い設計を参照。

プロファイルとスキーマとバージョニング

[49] XML名前空間カメレオン名前空間の失敗も参照。

版番号の命名規則

版番号

プロトコル

版番号

その他の事例

[64] OpenType

メモ

[1] David Baron's weblog: March 2007 (2007-03-26 09:31:27 +09:00 版) http://dbaron.org/log/2007-03#e20070325a (名無しさん 2007-03-26 00:33:42 +00:00)

[2] Re: Doctypes and the dialects of HTML 5 (Henri Sivonen 著, 2007-03-25 18:16:51 +09:00 版) http://lists.w3.org/Archives/Public/public-html/2007JanMar/0433 (名無しさん 2007-03-26 10:16:32 +00:00)

[3] Re: Doctypes and the dialects of HTML 5 (Henri Sivonen 著, 2007-03-25 18:16:51 +09:00 版) http://lists.w3.org/Archives/Public/public-html/2007JanMar/0433 (名無しさん 2007-03-26 10:17:07 +00:00)

[4] XForms document versioning (Mark Birbeck 著, 2007-04-05 01:02:12 +09:00 版) http://lists.w3.org/Archives/Public/www-forms/2007Apr/0006.html

Versioning ここに極まれり的な提案でつね。 (名無しさん)

[5] IRC logs: w3c / #html-wg / 20070404 (2007-04-06 23:18:21 +09:00 版) http://krijnhoetmer.nl/irc-logs/html-wg/20070404#l-1997

そりゃぁこういう冗談もいいたくなってくるわ。

言語札は本当に版付けが必要な気がするがw

(名無しさん)

[6] David Baron's weblog: April 2007 (2007-04-07 22:16:48 +09:00 版) http://dbaron.org/log/2007-04#e20070405a (名無しさん 2007-04-07 13:19:03 +00:00)

[7] Versioning and html[5] (Chris Wilson 著, 2007-04-13 01:40:07 +09:00 版) http://lists.w3.org/Archives/Public/public-html/2007Apr/0612.html (名無しさん 2007-04-14 05:57:29 +00:00)

[8] Sam Ruby: Form Follows Function (2007-04-16 20:51:51 +09:00 版) http://www.intertwingly.net/blog/2007/04/16/Form-Follows-Function (名無しさん 2007-04-17 00:29:21 +00:00)

[9] Version information (was Re: HTML5 vs HTML6) (L. David Baron 著, 2007-04-06 09:27:21 +09:00 版) http://lists.w3.org/Archives/Public/public-html/2007Apr/0279.html (名無しさん)

[10] Technical Architecture Group -- 16 Apr 2007 (2007-04-17 02:29:18 +09:00 版) http://www.w3.org/2001/tag/2007/04/16-minutes.html

[11] crisp's blog » Blog Archive » HTML5: Microsoft and the opt-in catch (2007-04-23 09:43:54 +09:00 版) http://therealcrisp.xs4all.nl/blog/2007/04/22/html5-microsoft-and-the-opt-in-catch/ (名無しさん 2007-04-23 00:50:52 +00:00)

[12] HTML and version mechanisms - W3C QA Weblog (2007-05-01 12:13:23 +09:00 版) http://www.w3.org/QA/2007/05/html_and_version_mechanisms.html (名無しさん 2007-05-02 01:25:30 +00:00)

[13] Version information (was Re: HTML5 vs HTML6) (L. David Baron 著, 2007-04-06 09:27:21 +09:00 版) http://lists.w3.org/Archives/Public/public-html/2007Apr/0279 (名無しさん)

[14] Todd Ditchendorf’s Blog. XML, Cocoa, JavaScript, Java. » Blog Archive » IE 8 and standards support confusion (2007-07-01 22:38:08 +09:00 版) http://www.ditchnet.org/wp/2007/05/05/ie-8-and-standards-support-confusion/ (名無しさん 2007-07-01 13:40:16 +00:00)

[15] Ajaxian » IE 8: Opt-in for standards compliance (2007-07-01 22:37:58 +09:00 版) http://ajaxian.com/archives/ie-8-opt-in-for-standards-compliance (名無しさん 2007-07-01 13:41:17 +00:00)

[16] Re: [validator] the @profile at-rule (fantasai 著, 版) http://lists.w3.org/Archives/Public/www-style/2008Oct/0007.html

[67] Versioning and HTML, , https://www.w3.org/2001/tag/doc/versioning-html.html

[18] [whatwg] HTML6 Doctype ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-December/029349.html

[19]

  <rewriteURI uriStartString="http://www.oasis-open.org/docbook/xml/4.5/"
    rewritePrefix="file:///usr/share/sgml/docbook/xml-dtd-4.4-1.0-30.1/"/>

DTD が無いと言われた。4.4まではローカルにあったけど、4.5は無かった。カタログでローカル・ファイル・システムに写像されていて、ファイルが無いからエラーになっていたらしい。当該部分を削除したら、今度はネットワーク経由で実体を取りにいこうとしているとエラーになった。馬鹿か。何のために URL を使っているんだ。というわけで 4.5 のURLを 4.4 に書き換えたら動いた。なんのためのバージョンなんだ。実に馬鹿らしい。

[22] IE9ヤバイ。IE9の文字間隔・互換モード・DOCTYPE宣言について ( 版) http://freesoft.tvbok.com/tips/net_tips/ie9_doctype.html

[23] IRC logs: freenode / #whatwg / 20140108 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20140108

[24] You don't need API version 2 - yohei's diary ( ( 版)) http://yohei.hatenablog.com/entry/2014/03/12/001707

[25] Internationalization Tag Set (ITS) Version 2.0 ( ( 版)) http://www.w3.org/TR/its20/#usage-in-legacy-html

[31] How are REST APIs versioned? | Lexical Scope ( 版) http://www.lexicalscope.com/blog/2012/03/12/how-are-rest-apis-versioned/

[32] PowerShell の ps1 ファイルは 何故 1なのか - tech.guitarrapc.cóm ( 版) http://tech.guitarrapc.com/entry/2013/09/06/220944

[46] Re: Update the Editor's Draft Specification Page (Ilya Grigorik著, ) https://lists.w3.org/Archives/Public/public-web-perf/2017Feb/0007.html

[47] Re: Add ability to specify the version of used CSP (Bil Corry著, ) https://lists.w3.org/Archives/Public/public-webappsec/2017Mar/0009.html

[50] Re: Add ability to specify the version of used CSP (Mike West著, ) https://lists.w3.org/Archives/Public/public-webappsec/2017Mar/0025.html

[51] XSL Transformations (XSLT) Version 3.0 () https://www.w3.org/TR/2017/PR-xslt-30-20170418/

XSLT 3.0 requires support for XPath 3.0 augmented by a selection of features from XPath 3.1 which are described in 21 Maps and 22 Processing JSON Data. XSLT 3.0 in addition allows a processor to support the whole of XPath 3.1, in which case it must do so as described in 27.7 XPath 3.1 Feature.

[52] つまり世の中には「XPath 3.0」、「XPath 3.0 と追加機能」、「XPath 3.1」 の3種類の XPath3 があって、後2者が XSLT 3.0 で使えるということだ。 2つが使えるというか、どちらでもいい (= どちらかは実際使ってみないとわからない)。破綻してるだろこれ。

[53] RFC 8170 - Planning for Protocol Adoption and Subsequent Transitions () https://tools.ietf.org/html/rfc8170

[55] CSP, not CSP2. (mikewest著, ) https://github.com/w3c/webappsec-clear-site-data/commit/32b5d4dd706bcb000000a5d4e07c6097340246bb

[56] Do not version the ECMAScript spec used (TimothyGu著, ) https://github.com/heycam/webidl/commit/a7d3949ad05272a9a9053f8f224e11502f179436

[57] Re: !important: css versioning, and a semantic shift (Florian Rivoal著, ) https://lists.w3.org/Archives/Public/www-style/2018Jan/0061.html

[58] versioning を主張する人は後を絶たないのなんでだろうなあ。リセット信仰のバリエーションなのかなあ。

[59] RFC 6709 - Design Considerations for Protocol Extensions () https://tools.ietf.org/html/rfc6709#section-4.1

[61] Chromeが6週間毎にTLSバージョン番号を変更していくかもしれない - ASnoKaze blog () https://asnokaze.hatenablog.com/entry/2018/06/14/023800

[62] Versioning · Issue #17 · tc39/proposal-built-in-modules · GitHub, https://github.com/tc39/proposal-built-in-modules/issues/17

[63] rfc3920, https://datatracker.ietf.org/doc/html/rfc3920#section-4.4.1