この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2018年11月)

2018年11月19日

Webの健全性を守る主役は果たして誰なのか
初回投稿日時: 2018年11月19日04時09分19秒
最終更新日時: 2018年11月19日21時49分43秒
カテゴリ: 雑談
SNS: (list)

前々から書かなきゃと思っていたことを書こうと思います。なんでこんな大仰な記事のタイトルなのか。中二病? そうかもしれません。でも多分当事者の方々はおそらく自分達の持っている社会的な重要性を自覚されていない、そう思っているので書くことにしました。

ブラウザ界隈を長く観察している人ならご存知かと思いますが、Mozillaが非営利(実際には私含め、スタッフのために金を稼いではいますが、それはさておき)でブラウザを開発し続けているのはWebのユーザのためです。ですが、そういった錦の御旗を掲げているMozillaも含め、私は特定のブラウザベンダが、もしくは全てのブラウザベンダの関係がその主役とは思っていません。私は、Webの健全性を守るキープレーヤーはWebアプリ・Webサイトの開発者の方々だと思っています。

各ブラウザベンダはそれぞれに思うところがあってブラウザという、とてつもなく複雑怪奇で開発費用のかかるアプリを開発し続けています。ですので、例え大義名分を掲げている非営利団体のMozillaと言えども全ての立場の人達に対して、完全に中立とは言えないと思っています。細かい話は異論が多々出てくるでしょうし、この記事の本題とは関係無いので割愛します。昔はより多様性のあったブラウザも、Prestoエンジンを搭載したOperaの開発が終了したことは非常に不幸なことで、これ以上のブラウザベンダは撤退してはいけない状況だと思います。もちろん、ブラウザベンダが好き好んでこれ以上、開発を終了したりすることは無いと思いたいです。後述しますが、この多様性は技術的に非常に重要です。しかし、主役とは言えないと思います。

では、逆に、Webにとって最も主導権を握るべき存在であるユーザが主役かと言うと、それも違うと思います。もちろん、ユーザは特定のブラウザに集中することでこの業界の力関係を強制的に変化させてしまう最終的な決定権はあります。しかし、Webが社会の重要なインフラのひとつとなった今、そのブラウザの実用性は重要で、たとえブラウザそれぞれのクオリティが同等に近かったとしても、一部の有用なWebサービスで不具合のあるブラウザはユーザにとって「使える」ブラウザではありません。

そう、どのブラウザも、Web開発者が使えるようにアプリを書いてくれない限り、使い物にならないのです。そういう理由で私はWebの開発者の方々が主役だと思っています。

現在、MozillaのブラウザであるFirefoxシリーズのシェアは残念ながら低く、Web開発者の方々に「FirefoxのユーザのためにこのバグにWebアプリ・サイト側で対応してください」とはとても言えない状況なのは確かです。ただ、私がIE一強時代からChrome一強時代の今に至るまで、Web標準に関わってきて確かなのは、特定のブラウザにおいて問題の起きているサイトの大半は、ブラウザのバグのために動かないわけではありません。問題が起きているパターンの大半は以下の二つのうちのどちらかです。

  • どの標準仕様でも定義されていないブラウザ毎の実装に依存する部分を大きなシェアを持つブラウザの挙動にあわせて書いてしまっている
  • 最大シェアのブラウザの非標準の動作にあわせて書いてしまっている

このどちらも、シェアの少ないブラウザベンダだけではなく、大きなシェアを握っているブラウザのベンダにとっても非常に迷惑な話だったりします。

まず前者は、二つのケースがあり得ます。

一つ目は、大きなシェアのブラウザの挙動が理にかなっている場合です。このケースにMozillaが出会った場合、その挙動を標準仕様に入れる努力を行い、そして、その動作に合わせるようにします。ですので、ある意味、問題が起きているパターンの中で、一番ブラウザベンダ側で解決しやすいケースです。

もう一つのケースは大変です。大きなシェアを持つブラウザの挙動が理にかなっていない場合です。これは主に、そのブラウザのバグによるものであることが多いです。この場合、基本的には仕様にあるべき動作で定義されるように働きかけ、なおかつ、シェアの大きいブラウザ側に挙動の変更を依頼するしかありません。なぜなら他者のバグを意図的に再現するのは非常に困難であり、なおかつ、長い目で見た場合に誰も幸せになれないからです(仕様拡張の際に無理が出てきたり、新たに学習する人にとって意味不明な挙動だったり、真似をする側のブラウザが完全には真似できなかったり)。

次に二つ目の項目のように、非標準の挙動に合わせてしまっている場合、基本的には大きなシェアを持つブラウザのベンダに挙動を修正してもらうしかありません。もちろん、例外はあり、非標準とされながらもそちらの動作の方が有用である場合は標準仕様の修正という方向で話が進むこともあります。ただ、その可能性はもちろん低めです。なぜなら、こちらも、単純にそのブラウザのバグによることが多いためです。

つまり、Web開発者の方にとって、標準仕様で定義されていない、もしくは、標準仕様から外れた挙動に依存したコードを書くことは、ブラウザ側の意図的な変更によってプロダクトが壊れる可能があることを意味します。ですので、綺麗事を抜きにしてもWeb開発者の方は標準仕様にのっとったアプリのみを書くべきであると言えます。

翻って昨今のWeb標準仕様の幅広さ、複雑さ、さらに、Web開発者の方々が習得しないといけないそれ以外の知識の量から考えて、Web標準仕様を把握しつくしてアプリを開発するのは不可能とも思います。ブラウザ開発者も自分の担当している部分以外は基本的には把握できていないというのが実情だと思います。それぐらいにWebはプラットフォームとして大きく、複雑に成長しています。

では、Web開発者の方々が標準仕様に沿ったアプリを書くことは不可能なのでしょうか? 私はそうは思いません。なぜなら、幸いにも今現在、ChromeのBlink、SafariのWebKit、FirefoxのGecko、EdgeのEdgeHTMLと四つのブラウザエンジンが現存しているからです。これらの多様性はよくWeb開発者の方々に煙たがられます。もちろん、テスト工数の増加につながるのは確かなので同じエンジニアとして分かります。ですが、この多様性のおかげで、挙動の違うところはいずれかのブラウザのバグを意味している、もしくは、挙動の違うところは標準仕様で定義されていないのいずれかであると簡単に推測できます。

つまり、いずれかのブラウザで挙動の違うところを発見した場合は標準仕様を調査し、仕様にあわせてWebアプリのコードを書き、feature detectionやUA stringを用いて、シェアに関係無く、おかしい挙動をしているブラウザのみ、特別なコードで処理するようにすれば、ブラウザ側でのバグ修正に対応しやすくなります(うまく書けばブラウザ側のバグ修正後に自動的に標準仕様に従った動作の方を走らせられるでしょう)。

そういった理由で私は今、あらためて、Webアプリ、Webサイトの開発者のみなさんに、標準仕様を大切にしてくださいと言いたいです

ちなみに、最大シェアのブラウザの挙動にあわせたサイトがどれだけリスキーかという事案をひとつだけ紹介しておきましょう。

Firefox (Gecko)は、Selectioncontenteditableを指定した要素内にJavascriptから移動させてもフォーカスを移動させていませんでした。これがいくつかのWebアプリがFirefoxでのみ動かないという「バグ」の原因となっていました。そこで私たちはこの「バグ」を修正することに決定し、実際に修正しました。なぜならChrome (Blink)はフォーカスを移動させていたためです。しかし、ここで予想外のトラブルが起きました。なんと、Chrome (Blink)の開発者がその実装コードをシンプルにするために、より、単純なFirefox (Gecko)の動作にあわせようとしたのです! 幸い、Mozillaはその動きに気付き、Mozilla側にバグ報告されていたWebアプリ・サイトが壊れることをGoogle側に伝え、惨事は未然に食い止められました。

この件におけるこの挙動は標準仕様では定義されていませんでした。なぜなら、フォーカスに関わる挙動というのは、各ブラウザの下で動いてるOSのマナーによって決定されるべきものなので標準化すべきではない事項だからです。ですのでこの一件は、標準仕様に無い、特定のブラウザの動作に依存したコードを書いていると、ブラウザ側の変更により壊れていたかもしれない一例と言えるでしょう。

もし、全てのWeb開発者の皆さんがWeb標準では定義されていないこと、Web標準から外れたバグに依存したコードを書かないこと、この二つを完璧に守ってくれたとしたら、これは全てのブラウザベンダにとってとてもありがたいことなのです。

まず、シェアの少ないブラウザベンダからすると、自分達のブラウザのバグを報告され次第修正していけば、より良いものになっていきます。これは非常にシンプルにブラウザ間の互換性を高めていけるので助かります。

逆に、シェアの大きなブラウザベンダからすると、自分達のブラウザのバグ修正が、既存のWebアプリ・サイトを壊す可能性が、シェアが大きければ大きいほど高くなります。そのため、バグの修正に「思い切り」が必要になります。逆に言うと、そのブラウザベンダが真摯な姿勢ではない場合、バグは修正されず放置され、どんどん歴史的経緯による不思議な動作が醸し出されていき、昔のIEのようになっていくでしょう。

私が長年この業界で様々な他社・他者様とやりとりしてきてよく言われることがあります。「御社のブラウザはシェアが大きくないので対応する価値が無いんです」と。私もブラウザという世界でも有数の巨大アプリを開発している身なので費用対効果等の観点からそれは非常によく分かります。心の底から賛成します。

しかし、一方で、私は「Firefoxのために便宜を図ってくれ」とは一度も言ったことがありません。私の意図は、『(Firefoxをサポートする気がない場合、)Firefoxのバグはバグとして放置しておいてくれれば、バグ報告を元に順次ブラウザ側で修正していくのでそこまでやる必要は無い、でも、シェアの大きなブラウザの動作に依存したコードは書かないでくれ』ということです。

ここのところを誤解せずにクオリティの高いWebアプリ・サイトを作っていっていただけると、ブラウザの開発者としては非常に助かります。なぜなら、私たちがブラウザ側のバグを修正することによって壊れるサイトが無くなるからです。そして、それは、シェアに関係なく、ユーザがブラウザを選択できることを意味するのです

最後にひとつだけ。

今でも、Web開発者の方々から未だにIEに対応しないといけない案件に対する愚痴を見かけます。しかし、その原因を作ったのはIEの開発者以上に、当時のWeb開発者が、最大シェアのブラウザである「IEでだけ動けば問題無いでしょ」という姿勢でWebアプリ・サイトを開発してきたためであることは若い人にも知っておいていただきたいと思います。そうやってシェアが大きくなりすぎたIEに依存し、使い続けるユーザが居るのは道理です。

そして注意すべきは、まさに今、同じ事を多くのWeb開発者の方が、デスクトップ向けではChromeに対して、モバイル向けではSafariに対して、している真っ最中なのです。

関連するかもしれないエントリ

関連するかもしれないエントリを発見できませんでしたが、無いとは限りません。