
Googleでの14年間から得た21の教訓 — 2026年 第1週 ウェブ開発
Cross-cutting frontend topics, tooling, and DX Compiled for immediate developer deployment.


継続的ファジングの熱を生き延びるバグたち
p2の93%と対照的に、Moralesは2024年12月に29件の新たな脆弱性を発見しました。Popplerは60%のカバレッジを備えながら1クリックRCEを見逃しました。依存ライブラリのDjVuLibreがlibFuzzerで計測されておらずOSS-Fuzzのビルドに含まれていなかったにもかかわらず、Evince・Papersを通じて何百万ものUbuntuシステムにデフォルトインストールされていたためです。Exiv2はCVE-2025-26623などを見逃しましたが、研究者がデコード経路に集中してエンコード経路を軽視することが原因で、エンコードの脆弱性はサムネイル生成などのバックグラウンドワークフローで顕在化します。Moralesはコード準備・エッジカバレッジ(目標>90%)・コンテキスト感応カバレッジ(AFL++ CmpLogまたはN-Gramブランチカバレッジで目標>60%)・値カバレッジ(制御フローではなく変数の値域を追跡)・トリアージの5ステップワークフローを提案します。2 GB超の入力や10 ms超の実行時間を要するバグは現在のすべてのファザーを回避するため、静的解析や手動コードレビューが必要です。
私がいつも使っているChrome DevToolsの機能 — あなたも使うべき理由
LCP遅延・INP遅延・CLS原因のレイアウトシフト)を可視化し、「Dim 3rd parties」トグルで分析・広告のノイズを除去します。RecorderパネルはPuppeteerスクリプトやパフォーマンスプロファイルのシードとしてエクスポート可能な再現性のあるユーザーフローを記録します。最後に、chrome://inspectを介したAndroidリモートデバッグはデスクトップテストでは一切現れないCPU・メモリ制約を露わにします。良いフロントエンドテストの書き方:37のコツ
test()呼び出しに分けること、React Testing Libraryのクエリ優先順位(getByRole > getByLabelText > getByText > getByTestIdは最終手段)に従うこと、モジュールに新しいエクスポートが追加されたときのテスト破損を防ぐためvi.mock()全体よりvi.spyOn()を優先することが挙げられます。AIは子コンポーネントの動作を把握できないためオーバーモックになりやすいと明示的に指摘し、データフェッチと真の外部依存関係のみをモックして実際の実装をレンダリングするよう推奨します。具体的なアンチパターンも明確な結果とともに示されます。expect(x).toBeDefined()はnullが返されても通過し、大きなシリアライズされたDOMにtoMatchSnapshot()を使うと開発者が反射的にuを押してバグを通過させ、テスト内のif/else文はexpect()呼び出し自体をサイレントにスキップさせます。実践的な推奨事項として、単一ファイルにフィルタリングしたvitest --watchでほぼ即時フィードバックを得ること、日付・タイムアウト関連にvi.useFakeTimers()を使うこと、各テストに関連するプロパティのみを公開するcreateUser(overrides)フィクスチャヘルパーを活用することが挙げられます。
HTML Invoker CommandsでJavaScriptなしにダイアログを開閉する
<dialog>要素に残っていた唯一のJavaScript要件—ダイアログを開くこと—を2つの宣言的なボタン属性で排除します。commandFor="dialog-id"とcommand="show-modal"を持つボタンは、ブラウザのトップレイヤーに対象ダイアログをモーダルとして開き、バックドロップ処理・フォーカス管理・Escキーによる閉じ操作・アクセシビリティツリーの更新をすべてネイティブで処理します。ダイアログ内ボタンのcommand="close"属性は、従来の<form method="dialog">による回避策を置き換えます。このAPIは現在すべてのモダンブラウザでサポートされていますが、本番環境での使用可否は個別に評価が必要であり、必要な環境向けにKeith Cirkelによるポリフィルが提供されています。この小さなスクリプト削除でも実際の効果は明確です。パース・実行すべきJavaScriptが減り初期ロードが高速化され、スクリプトの配信が失敗しても宣言的マークアップは機能し続けます。この記事はHTML invoker commandsを、一般的なインタラクティブパターンをネイティブかつ宣言的に処理するというより広いプラットフォームトレンドの一部として位置づけています。
OLTP対OLAPと行/列ストレージのトレードオフ
Ben Dickenは、OLTP(オンライントランザクション処理)、OLAP(分析)、HTAP(ハイブリッド)という3つのデータベース区分を解説し、この分類の根拠となる物理ストレージのトレードオフを明快に説明します。MySQL、PostgreSQL、SQLiteといったOLTPシステムは行単位でデータを格納します。アプリケーションクエリは通常1行から複数カラムをまとめて取得し、ディスクは4〜16 KBページ単位で読み込まれるため、行全体を隣接配置することが効率的です。一方、ClickHouse、DuckDB、Google BigQuery、Amazon RedshiftといったOLAPシステムはカラム単位で格納し、数十億行からサインアップ日付の分布をスキャンする分析クエリが不要なカラムのI/Oを完全にスキップできます。カラム型ストレージは圧縮面でも有利で、10億件のサインアップ日付が約7,000種類の値しか持たない場合、ランレングス符号化で強力に圧縮でき、事前集計によってクエリ実行が高速化されます。SingleStoreのようなHTAPデータベースは両方を実現しようとしますが、大規模ではコンピュートの競合やデータ重複の課題が生じるため、OLTP・OLAPのパイプラインを分離するアーキテクチャの方が信頼性が高いままです。

私たちの2026年Web開発予測
SyntaxのホストWes BosとScott Tolinskiは約48分のこのエピソードで2026年の具体的な予測を展開します。Temporal APIはChrome stable(2026年1月)には搭載されるもののSafariは未対応のまま、いよいよクロスブラウザ対応が完成するとし、OxlintがBiomeを駆逐して主流のnon-Prettierリンターになると予測します。BiomeのプラグインはGritQLを必要とする一方、OxlintはRust製でもJavaScriptプラグインを受け入れ、ESLintスペック全体との互換を目標としている点が理由です。Lando Norrisのウェブサイトが火付け役となったWebGPU駆動の3D体験が主流化し、スクロールアニメーション・スクロールマーカー・CSS Anchor Positioning・popover・if文・カスタムCSS関数などのモダンCSSが実用的に広く使われ、UIフレームワークがJavaScriptポリフィルを完全に廃止できると見込みます。AIツーリング面では、企画・コーディング・Playwright駆動のブラウザテストを含むエンド・ツー・エンドのエージェント統合がリリース速度を大幅に向上させると予測しつつ、AIに完全委任する開発者はスキル低下のリスクを抱えると警告します。またTemporal.ioやIngestのようなdurable computeプラットフォームがキューの代替として主流化し、長時間実行関数内でawaitセマンティクスにより一時停止・再開可能なワークフローを実現すると予測します。
Googleでの14年間から得た21の教訓
Addy OsmaniはGoogleでの14年を21のキャリア原則に凝縮し、技術的卓越さより人・アライメント・曖昧さのナビゲートが成否を分けると主張します。優れたエンジニアはソリューションから逆算するのではなく、サポートチケットやユーザー観察を通じて問題を深く理解することから始めます。技術選択は限られた「イノベーション・トークン」予算として扱い、チームが本当に差別化できる領域にのみ投じるべきで、退屈な技術は障害モードが既知である分だけ安全です。パフォーマンス改善のほとんどは賢さの追加ではなく不要な処理の削除から生まれ、最速のコードは実行されないコードです。文書化・オンボーディング・横断調整といったグルーワークは、見えない形でこなすとキャリアに危険であり、技術議論で勝ち続けると会議の外で実行上の抵抗として積み上がります。学習は新たな選択肢を生むときに複利で成長し、キャリアを複利投資として扱うエンジニアが長期的に大きく前進します。

OLTP対OLAPと行/列ストレージのトレードオフ
Ben Dickenは、OLTP(オンライントランザクション処理)、OLAP(分析)、HTAP(ハイブリッド)という3つのデータベース区分を解説し、この分類の根拠となる物理ストレージのトレードオフを明快に説明します。MySQL、PostgreSQL、SQLiteといったOLTPシステムは行単位でデータを格納します。アプリケーションクエリは通常1行から複数カラムをまとめて取得し、ディスクは4〜16 KBページ単位で読み込まれるため、行全体を隣接配置することが効率的です。一方、ClickHouse、DuckDB、Google BigQuery、Amazon RedshiftといったOLAPシステムはカラム単位で格納し、数十億行からサインアップ日付の分布をスキャンする分析クエリが不要なカラムのI/Oを完全にスキップできます。カラム型ストレージは圧縮面でも有利で、10億件のサインアップ日付が約7,000種類の値しか持たない場合、ランレングス符号化で強力に圧縮でき、事前集計によってクエリ実行が高速化されます。SingleStoreのようなHTAPデータベースは両方を実現しようとしますが、大規模ではコンピュートの競合やデータ重複の課題が生じるため、OLTP・OLAPのパイプラインを分離するアーキテクチャの方が信頼性が高いままです。
私たちの2026年Web開発予測
SyntaxのホストWes BosとScott Tolinskiは約48分のこのエピソードで2026年の具体的な予測を展開します。Temporal APIはChrome stable(2026年1月)には搭載されるもののSafariは未対応のまま、いよいよクロスブラウザ対応が完成するとし、OxlintがBiomeを駆逐して主流のnon-Prettierリンターになると予測します。BiomeのプラグインはGritQLを必要とする一方、OxlintはRust製でもJavaScriptプラグインを受け入れ、ESLintスペック全体との互換を目標としている点が理由です。Lando Norrisのウェブサイトが火付け役となったWebGPU駆動の3D体験が主流化し、スクロールアニメーション・スクロールマーカー・CSS Anchor Positioning・popover・if文・カスタムCSS関数などのモダンCSSが実用的に広く使われ、UIフレームワークがJavaScriptポリフィルを完全に廃止できると見込みます。AIツーリング面では、企画・コーディング・Playwright駆動のブラウザテストを含むエンド・ツー・エンドのエージェント統合がリリース速度を大幅に向上させると予測しつつ、AIに完全委任する開発者はスキル低下のリスクを抱えると警告します。またTemporal.ioやIngestのようなdurable computeプラットフォームがキューの代替として主流化し、長時間実行関数内でawaitセマンティクスにより一時停止・再開可能なワークフローを実現すると予測します。
継続的ファジングの熱を生き延びるバグたち
GitHub Security LabのAntonio Moralesは、3つの具体的なケーススタディを通じて、OSS-Fuzzへの長期登録がセキュリティを保証しないことを実証します。7年間継続的にファジングされてきたGStreamerは、アクティブなファザーが2個・コードカバレッジは19%に過ぎず、OpenSSLの139ファザー・bzip2の93%と対照的に、Moralesは2024年12月に29件の新たな脆弱性を発見しました。Popplerは60%のカバレッジを備えながら1クリックRCEを見逃しました。依存ライブラリのDjVuLibreがlibFuzzerで計測されておらずOSS-Fuzzのビルドに含まれていなかったにもかかわらず、Evince・Papersを通じて何百万ものUbuntuシステムにデフォルトインストールされていたためです。Exiv2はCVE-2025-26623などを見逃しましたが、研究者がデコード経路に集中してエンコード経路を軽視することが原因で、エンコードの脆弱性はサムネイル生成などのバックグラウンドワークフローで顕在化します。Moralesはコード準備・エッジカバレッジ(目標>90%)・コンテキスト感応カバレッジ(AFL++ CmpLogまたはN-Gramブランチカバレッジで目標>60%)・値カバレッジ(制御フローではなく変数の値域を追跡)・トリアージの5ステップワークフローを提案します。2 GB超の入力や10 ms超の実行時間を要するバグは現在のすべてのファザーを回避するため、静的解析や手動コードレビューが必要です。
私がいつも使っているChrome DevToolsの機能 — あなたも使うべき理由
フロントエンド歴9年以上のソフトウェアアーキテクトKeerthana Krishnan(JS Conf Asia 2019、Performance.now() 2023登壇者)が、Chrome DevToolsの7つの機能を紹介し、デバッグを反応的から診断的なものへ転換します。Elementsパネルの「人」アイコンからアクセスするAccessibility Treeビューは、DOMツリーでは見えないアクセシブル名の欠落・誤ったARIAロール・誤適用のARIA属性を表面化します。Lighthouseタイムスパンは初期ページロードを超え、フォーム送信やダッシュボードナビゲーションといった認証済みインタラクションへ監査範囲を拡張し、パフォーマンス低下が潜む箇所を正確に捉えます。ワイルドカードで設定するネットワークリクエストのブロック機能は、サードパーティスクリプトの失敗・画像フォーマットのフォールバック欠如・「非重要」リソース削除時に実ユーザーフローが壊れるかを検証します。Performanceパネルのフレームチャートはボトルネック(LCP遅延・INP遅延・CLS原因のレイアウトシフト)を可視化し、「Dim 3rd parties」トグルで分析・広告のノイズを除去します。RecorderパネルはPuppeteerスクリプトやパフォーマンスプロファイルのシードとしてエクスポート可能な再現性のあるユーザーフローを記録します。最後に、chrome://inspectを介したAndroidリモートデバッグはデスクトップテストでは一切現れないCPU・メモリ制約を露わにします。
良いフロントエンドテストの書き方:37のコツ
この包括的なガイドは、テストが実装の詳細ではなくユーザー向けの振る舞いを検証すべきという論旨のもと、37のフロントエンドテスト原則を整理しています。主な構造的ルールとして、無関係なアサーションを別々のtest()呼び出しに分けること、React Testing Libraryのクエリ優先順位(getByRole > getByLabelText > getByText > getByTestIdは最終手段)に従うこと、モジュールに新しいエクスポートが追加されたときのテスト破損を防ぐためvi.mock()全体よりvi.spyOn()を優先することが挙げられます。AIは子コンポーネントの動作を把握できないためオーバーモックになりやすいと明示的に指摘し、データフェッチと真の外部依存関係のみをモックして実際の実装をレンダリングするよう推奨します。具体的なアンチパターンも明確な結果とともに示されます。expect(x).toBeDefined()はnullが返されても通過し、大きなシリアライズされたDOMにtoMatchSnapshot()を使うと開発者が反射的にuを押してバグを通過させ、テスト内のif/else文はexpect()呼び出し自体をサイレントにスキップさせます。実践的な推奨事項として、単一ファイルにフィルタリングしたvitest --watchでほぼ即時フィードバックを得ること、日付・タイムアウト関連にvi.useFakeTimers()を使うこと、各テストに関連するプロパティのみを公開するcreateUser(overrides)フィクスチャヘルパーを活用することが挙げられます。
HTML Invoker CommandsでJavaScriptなしにダイアログを開閉する
HTML Invoker Commands APIは、ネイティブ<dialog>要素に残っていた唯一のJavaScript要件—ダイアログを開くこと—を2つの宣言的なボタン属性で排除します。commandFor="dialog-id"とcommand="show-modal"を持つボタンは、ブラウザのトップレイヤーに対象ダイアログをモーダルとして開き、バックドロップ処理・フォーカス管理・Escキーによる閉じ操作・アクセシビリティツリーの更新をすべてネイティブで処理します。ダイアログ内ボタンのcommand="close"属性は、従来の<form method="dialog">による回避策を置き換えます。このAPIは現在すべてのモダンブラウザでサポートされていますが、本番環境での使用可否は個別に評価が必要であり、必要な環境向けにKeith Cirkelによるポリフィルが提供されています。この小さなスクリプト削除でも実際の効果は明確です。パース・実行すべきJavaScriptが減り初期ロードが高速化され、スクリプトの配信が失敗しても宣言的マークアップは機能し続けます。この記事はHTML invoker commandsを、一般的なインタラクティブパターンをネイティブかつ宣言的に処理するというより広いプラットフォームトレンドの一部として位置づけています。
年の変わり目らしい、キャリアと職人技の一週間でした。代表的な記事はAddy Osmaniの「21 Lessons From 14 Years at Google」です。伸びるエンジニアはコードだけでなく、人・政治・アラインメント・曖昧さへの向き合い方を身につけた人だ、という主張です。Syntaxの2026年予測エピソードがエコシステム視点の対になり、Ben DickenのOLTP対OLAP解説は行/列ストレージのトレードオフを視覚的に解きほぐして基礎を支えます。
テストとツールの軸がひときわ強い週でした。GitHub Security LabはOSS-Fuzzの1,300超プロジェクトで何年もの継続的ファジングを生き延びたバグがなぜ残るのかを解剖し、How To Test Frontendは半年後にも読めるテストのための実践的なコツを37個集め、Performance Calendarは日々の習慣にする価値のあるChrome DevTools機能でシーズンを締めくくりました。JavaScriptなしでHTML invoker commandsにより<dialog>を開閉する2分の記事は、今週最速の収穫です。
- キャリアのレバレッジはコード品質だけでなく、曖昧さとアラインメントへの対応力から生まれます。
- 継続的ファジングは保証ではありません。長くファジングされてきた依存関係も、監査する価値があると考えましょう。
- ダイアログにはHTML invoker commandsを採用しましょう。どのプロジェクトでもJavaScriptの配線作業がひとつ減ります。