I Would Prefer Not To.

He is (maybe) ydah.

Codex for Open Source に採択されました

少し前に、Codex for Open Source に採択されました。

採択自体は以前に決まっていたのですが、これまで ChatGPT Plus プランを契約していたため、その契約が終了するまでは Codex for Open Source の特典を適用できない状態でした。

そして今日、Plus プランの契約が終了し、ようやく Codex for Open Source への切り替えが完了しました。 ということで、あらためてこのことを書いておこうと思います。

Codex for Open Source は OpenAI による OSS メンテナー向けの支援プログラムです。 公式ページによると、APIクレジット、Codex を含む ChatGPT Pro の6か月分、Codex Security への条件付きアクセスなどが提供されるとのことです。

developers.openai.com

これまでも Plus プランを契約していましたが、今回 Codex for Open Source に切り替わったことで、より多くのリソースを割ける環境が整いました。 こうしたツールの利用環境を提供していただけるのは非常にありがたいです。

もちろん、OSS に限らずソフトウェア開発における判断は現時点ではまだ最終的には人間が行うものだと思っています。 どの変更を受け入れるのか、どの互換性を守るのか、どのタイミングで何をリリースするのか。 そこにはプロジェクトごとの文脈があります。 なので、すべてを任せるというよりは、OSS 開発を続けていくための作業を支えてくれる相棒として使っていこうと思っています。

OpenAI のこのような取り組みに心から感謝します。

RubyKaigi 2026に登壇します

2026年4月22日(水)から24日(金)まで北海道函館市で開催されるRubyKaigi 2026に登壇します。

rubykaigi.org

今回は 「Liberating Ruby's Parser from Lexer Hacks」 というタイトルのお話をします。

rubykaigi.org

会期初日の2026年4月22日(水) 11:30-12:00、Large Hallでの発表です。発表は英語で行う予定です。

Rubyの文法は、ぱっと見たときの印象よりもずっと文脈に強く依存しています。* が掛け算なのかsplatなのかrest parameterなのか、{ がHashなのかblockなのか、といった判断は長いあいだ parse.ylex_state によって支えられてきました。

lex_state はRubyの構文解析を成立させてきた重要な仕組みですが、一方でなぜそのトークンになるのかを見えづらくしていました。今回の発表では、Lramaに実装しているPSLR(1): Pseudo-Scannerless Minimal LR(1)というアプローチを通じて、この lex_state が担ってきたものを分解していく話をします。

発表内容についてざっくりお伝えすると、Rubyの構文にある曖昧さをひとつの大きな問題として扱うのではなく、パーサーの状態を見れば解けるもの、LALRの都合で隠れているもの、字句解析と構文解析の境界にあるもの、LALRの状態マージによって生まれるもの、そしてsemanticの情報がないと解けないもの、というように層に分けて解きほぐしていきます。

lex_state をなくすこと自体が目的というよりは、それによってRubyの文法の問題がどのような形をしているのかが見えるようになった、という話になると思います。RubyのパーサーやLramaに興味がある方はもちろん、プログラミング言語の構文が実装の中でどのように扱われているのかに興味がある方にも楽しんでいただける内容になるのでないかと思っています。

RubyKaigi 2024では、Lramaに文法を拡張することで parse.y のメンテナンス性を上げていく話をしました。RubyKaigi 2025では、Rubyの文法構造を分解し、再構成することで parse.y を理解しやすくしていく話をしました。今回は、parse.y の中にある"不透明な箱"に隠されたもう一つの文法のようなものを解きほぐしていく話をします。

Lramaと僕たちが見た夢は、parse.y に崩壊をもたらす悪夢なのか、それともRubyの文法に新しい秩序をもたらす力となるのか。

それでは、函館でRubyKaigiしましょう。

Gemfileと依存Gemの状態を点検するgemxrayを作った

Gemfileと依存Gemの状態を点検する gemxray というGemを作りました。

github.com

RubyやRailsのアプリケーションを長く運用していると、Gemfileには少しずつ依存が増えていきます。 もちろん、それぞれの依存には追加された当時の理由があります。しかし、機能追加やリファクタリング、RubyやRailsのバージョンアップを重ねていくうちに、今も本当に必要なのか判断しづらいgemが残っていることがあります。

たとえば、以前は直接使っていたけれど今は参照されていないgemや、他のgemの依存としてすでに入っているgem、RubyやRails本体に含まれるようになって不要になったgemなどです。 また、依存しているgemのライセンスがプロジェクトのポリシーに合っているか、ソースリポジトリがアーカイブされていてメンテナンスが止まっていないか、といったことも継続的に見ていく必要があります。

こうした依存の状態は、すぐに大きな問題になるとは限りません。 しかし、Gemfileが大きくなるほど、不要な依存の見直し、ライセンス確認、メンテナンス状況の把握、脆弱性対応の範囲も広がっていきます。

そこで、GemfileやGemfile.lockに含まれる依存を複数の観点から点検するCLIとしてgemxrayを作りました。

gemxrayとは

gemxrayは、RubyプロジェクトのGemfileと依存関係を解析して、削除できる可能性のあるgem、ライセンスポリシーに合っていないgem、アーカイブされている依存などを見つけるCLIです。

大きくは以下のことができます。

  • 使われていなさそうなgemを検出する
  • 他のgemの依存としてすでに入っていそうなgemを検出する
  • RubyやRailsのバージョンによって不要になっていそうなgemを検出する
  • 許可していないライセンスやライセンス不明のgemを検出する
  • GitHub上でアーカイブされている依存を検出する

Gemfileから依存を消す判断は、最終的には人間が行うべきだと思っています。 また、ライセンスやメンテナンス状況についても、プロジェクトや組織ごとに判断基準が異なります。 gemxrayは自動で正解を決めるためのものというより、レビューすべき依存を機械的に集めて、依存関係の整理やコンプライアンス確認を始めやすくするための道具です。

インストール

インストールは通常のgemと同じです。 プロジェクトの開発用ツールとして入れる場合は、以下のように追加できます。

bundle add gemxray --group development

グローバルにインストールして使うこともできます。

gem install gemxray

プロジェクトに設定ファイルを作成する場合は、まず init を実行します。

bundle exec gemxray init

これで .gemxray.yml が作成されます。

まずscanする

基本的な使い方は scan です。

bundle exec gemxray scan

gemxray は、コマンドを指定しなかった場合も scan として動作します。 scan はGemfileと依存関係を解析して結果を表示するだけで、ファイルの変更は行いません。

CIやスクリプトで扱いやすいように、JSONやYAMLで出力することもできます。

bundle exec gemxray scan --format json
bundle exec gemxray scan --format yaml

また、CIで使う場合は --ci--fail-on を指定することで、指定したseverity以上の検出結果がある場合に終了ステータスを 1 にできます。

bundle exec gemxray scan --format json --ci --fail-on danger

これによって、たとえば「dangerに分類される依存が増えたらCIで気づけるようにする」といった使い方ができます。

5つのanalyzer

gemxrayは、Gemfileと依存関係に対して5つの観点から解析を行います。

unused

unused は、プロジェクト内で使われていなさそうなgemを検出します。

具体的には、require、定数参照、gemspecの依存、Railsのautoloadの兆候などを見て、Gemfileに書かれているgemが使われているかを判断します。 もちろんRubyでは動的に定数を参照したり、文字列から require したりすることもできるため、完全に判定できるわけではありません。

そのため、これは「消してよいgemを断定する」というより、「今も必要か確認する価値のあるgemを見つける」ためのanalyzerです。

redundant

redundant は、他のトップレベルのgemが依存としてすでに持っているgemを検出します。

たとえばGemfileに直接書かれているgemが、実は別のgemの依存として Gemfile.lock にも含まれている場合、その直接依存は冗長かもしれません。 ただし、直接依存として明示しておくこと自体に意味がある場合もあります。

たとえば、そのgemのAPIをアプリケーションコードから直接使っている場合や、依存の意図をGemfile上に残しておきたい場合です。 そのため、ここも機械的に削除するというより、依存の持ち方を見直すきっかけにするためのものです。

version

version は、利用しているRubyやRailsのバージョンによって、すでにカバーされている可能性があるgemを検出します。

Rubyにはdefault gemやbundled gemがあります。また、Railsのバージョンアップによって、以前はGemfileに書いていたものが不要になることもあります。 こうした「昔は必要だったが、今はRubyやRails側で提供されているかもしれないもの」を見つけるためのanalyzerです。

バージョンアップを重ねてきたアプリケーションでは、この手の依存が残っていることがあります。 人間がGemfileを眺めていても見落としやすいところなので、機械的に候補を出せると便利だと思っています。

license

license は、GemfileやGemfile.lockから把握できる依存gemのライセンスを確認します。

.gemxray.yml には許可するライセンスの一覧を設定できます。 許可リストに含まれていないライセンスや、ライセンス情報が取得できないgemを検出できます。

license:
  enabled: true
  allowed:
    - MIT
    - Apache-2.0
    - BSD-2-Clause
    - BSD-3-Clause
    - ISC
    - Ruby
  deny_unknown: false

ライセンスの情報は、ローカルにインストールされているgemspecを見て、必要に応じてRubyGems APIも参照します。 deny_unknowntrue にすると、ライセンス不明のgemを danger として扱えます。

使いどころとしては、以下のようなケースを想定しています。

  • プロジェクトで利用可能なライセンスを制限したいとき
  • 新しいgemを追加した際に、ライセンス違反がないかCIで確認したいとき
  • 企業のコンプライアンス要件に合わせて、依存gemのライセンスを継続的に管理したいとき

たとえば、MITとApache-2.0のみを許可するようなポリシーを設定しておけば、新しいgemを追加したときに、意図せず許可していないライセンスのgemが入っていないかを確認できます。

archive

archive は、依存しているRubyGemのGitHubリポジトリがアーカイブされているかを確認します。

アーカイブされている依存が即座に悪いというわけではありません。 しかし、メンテナンスが止まっている可能性を知っておくことは、依存管理の上で重要です。

GitHub APIを使うため、必要に応じて GITHUB_TOKEN を設定できます。 また、gemのメタデータから正しいGitHubリポジトリを推定できない場合に備えて、手動でgem名とリポジトリの対応を設定することもできます。

archive:
  enabled: true
  github_token_env: GITHUB_TOKEN
  overrides:
    some_gem: owner/repo

使いどころとしては、以下のようなケースを想定しています。

  • 依存gemのメンテナンスが止まっていないか確認したいとき
  • アーカイブ済みのgemに依存し続けるリスクを把握したいとき
  • 代替gemへの移行を検討するきっかけを早めに得たいとき

アーカイブ済みのgemに依存し続けると、将来的にセキュリティパッチが出なかったり、新しいRubyやRailsへの追従が難しくなったりする可能性があります。 そのため、すぐに置き換えるかどうかは別として、依存のリスクを把握するための情報として扱えます。

severity

gemxrayの検出結果には infowarningdanger の3つのseverityがあります。

  • danger: 削除候補として信頼度が高いもの、ライセンス違反、設定によってはライセンス不明のもの
  • warning: 削除できる可能性があるもの、アーカイブされたリポジトリ、ライセンス不明のもの
  • info: 補足的なヒントや信頼度の低い検出結果

--severity を指定すると、指定したseverity以上の結果だけを表示できます。

bundle exec gemxray scan --severity warning

clean --auto-fix で自動削除の対象になるのは danger のみです。 warninginfo は自動削除されません。

このあたりは意図的に保守的にしています。 Gemfileの整理は便利である一方で、誤って必要な依存を消してしまうとアプリケーションの動作に影響します。 また、ライセンス違反やアーカイブ済みリポジトリの検出は、必ずしも「削除すればよい」という話ではありません。 そのため、自動化できるところは自動化しつつ、レビューすべきところはレビューに残すという方針にしています。

Gemfileを整理する

検出結果を見て、実際にGemfileを整理したい場合は clean を使います。

bundle exec gemxray clean

clean は、scan と同じ解析を行った上で、検出されたgemごとに削除するかどうかを確認します。 y または yes を入力した場合のみ削除され、それ以外はスキップされます。

まず変更内容を確認したい場合は、--dry-run を使います。

bundle exec gemxray clean --dry-run

実際にはGemfileを書き換えず、削除候補と差分のプレビューだけを表示します。 また、削除するのではなくコメントとして残したい場合は --comment を使えます。

bundle exec gemxray clean --dry-run --comment

実際にGemfileを書き換える場合には、保存前に Gemfile.bak が作成されます。 また、--bundle を指定すると、編集後に bundle install を実行できます。

Pull Requestを作る

gemxrayには、検出からPull Request作成まで行う pr コマンドもあります。

bundle exec gemxray pr

pr は、解析結果をもとにGemfileを編集し、新しいブランチを作成してコミットし、GitHubにPull Requestを作成します。 内部的にはまず gh pr create を試し、gh が使えない場合は GH_TOKEN または GITHUB_TOKEN を使ってGitHub API経由でPRを作成します。

1つのPRにまとめることもできますし、--per-gem を指定するとgemごとにPRを作成できます。

bundle exec gemxray pr --per-gem --no-bundle

依存の整理は、1つずつ小さくレビューできる方が安心な場合があります。 とくに大きなRailsアプリケーションでは、gemごとにCIを通しながら確認した方が進めやすいこともあると思います。 そのような場合に --per-gem が使えます。

ライセンス一覧を出す

削除候補の検出とは別に、Gemfileに含まれるgemのライセンス一覧を出す licenses コマンドもあります。

bundle exec gemxray licenses

これにより、gem名、バージョン、ライセンスを一覧できます。 こちらも --format json--format yaml を指定できるため、CIや社内の確認フローに組み込みやすいと思います。

bundle exec gemxray licenses --format json

設定

設定ファイルは .gemxray.yml です。 設定は、組み込みのデフォルト、.gemxray.yml、CLIオプションの順に適用されます。

たとえば、以下のように設定できます。

version: 1

ci: false
ci_fail_on: warning

whitelist:
  - bootsnap
  - tzinfo-data

scan_dirs:
  - engines/billing/app
  - engines/billing/lib

redundant_depth: 2

overrides:
  puma:
    severity: ignore

github:
  base_branch: main
  labels:
    - dependencies
    - cleanup
  reviewers: []
  per_gem: false
  bundle_install: true

license:
  enabled: true
  allowed:
    - MIT
    - Apache-2.0
    - BSD-2-Clause
    - BSD-3-Clause
    - ISC
    - Ruby
  deny_unknown: false

archive:
  enabled: true
  github_token_env: GITHUB_TOKEN

whitelist には、解析対象から外したいgemを設定できます。 scan_dirs には、標準の探索対象に加えて見に行きたいディレクトリを追加できます。 overrides では、gemごとにseverityを上書きしたり、ignore にして検出結果から外したりできます。

実際のプロジェクトでは、機械的な検出だけでは判断しづらい依存が必ず出てくると思います。 そのため、チームやプロジェクトごとの判断を設定ファイルに残せるようにしています。

おわりに

gemxrayは、GemfileとGemfile.lockの依存を機械的に眺めて、削除できる可能性があるもの、ライセンスポリシーに合っていないもの、メンテナンス状況を確認した方がよいものを見つけるためのCLIです。

Gemfileの整理は、地味ですがプロジェクトを長く運用していく上では大切な作業だと思っています。 不要な依存を減らすことは、アップデートの見通しを良くします。 同時に、ライセンス確認やメンテナンス状況の把握を継続的に行うことは、プロジェクトを安全に運用していく上で重要です。

一方で、依存の削除やライセンスの判断、アーカイブ済みリポジトリへの対応は雑にやると危険です。 だからこそ、候補を集めるところは機械に任せつつ、最終的な判断は人間がレビューできる形にするのが良いのではないかと思っています。

まだ改善できるところは多いですが、Gemfileの整理や依存gemの点検を始めるきっかけとして使ってもらえると嬉しいです。

引き続き、少しずつ改善していきたいと思います。

RubyConf Austria 2026のProgram Committeeに就任しました

2026年5月にオーストリアのウィーンで開催されるRubyConf Austria 2026のProgram Committeeに就任しました。

rubyconf.at

RubyConf Austriaは、オーストリアで開催されるRubyコミュニティのカンファレンスです。2026年5月29日から31日の3日間、ウィーンで開催される予定です。

公式のWebページを眺めているとすでに何名かのSpeakerが掲載されているのですが、Speakerだけではなく "& Performers" と書かれており、Wiener Sängerknaben や Piano/Klavierといった肩書の方々がいらっしゃいます。音楽の都ウィーンならではのカンファレンスだと感じます。こうした、その場所でしか体験できないことがあるカンファレンスはとても魅力的ですね。

会場はMuTh theatreで、ウィーンでもっとも近代的なコンサートホールの1つだそうです。Augarten公園という公園の隣にある、400席の素敵な劇場とのことで、会場の写真を見ましたがとてもカッコいい箱でいいですね。

muth.at

今回、私はProgram Committeeの一員として、カンファレンスのプログラム選定に携わることになりました。Program Committeeは、提出されたプロポーザルを審査し、カンファレンスで発表されるトークやワークショップを選定する役割を担います。

私にとって、海外のRubyカンファレンスのProgram Committeeに参加するのははじめての経験です。これまで地域Ruby会議でのプロポーザル選考は経験がありますが、国際的なカンファレンスでの選考に関わるのははじめてでとても新鮮な気持ちです。

なお、RubyConf AustriaのTeamについてはLPでも公開されています。

rubyconf.at

プロポーザルの選考を通じて、世界中のRubyistがどのようなトピックに関心を持ち、どのような課題に取り組んでいるのかを知ることができるのは、とても楽しみです。

RubyConf Austria 2026のプロポーザルは現在鋭意レビュー中で、最終的なプログラムの発表はもう少し先になる予定です。

声をかけてくれた Muhamed(@m_isabegovic)に感謝するとともに、Program Committeeとして、素晴らしいカンファレンスを作り上げるために尽力していきたいと思います。

技術書典19 か05で新刊「Rubyでつくってまなぶ 正規表現エンジン」を頒布します

今週末から開催される技術書典19で、新刊「Rubyでつくってまなぶ 正規表現エンジン」を頒布します。オフラインでも参加するので2025/11/16(日)は池袋・サンシャインシティ 展示ホールD(文化会館ビル2F)にいます。

techbookfest.org

電子版(PDF)は2025/11/15(土)からこちらで購入できるようになる予定です。

techbookfest.org

本書の内容

B5で122ページの書籍ということで、実装しながら学ぶのにちょうどよいボリュームになっているかなと思っています。「Rubyでつくってまなぶ 正規表現エンジン」というタイトルにあるように、一冊まるまる正規表現エンジンの実装を通して、その内部動作を学ぶ書籍です。

目次からわかるように、完全一致から始めて、選択、繰り返しといった機能を段階的に追加していく構成になっています。最終的にはわずか500行程度のコードで、実用的なDFA正規表現エンジンが完成します。

本書では主に以下の内容を扱います。

  • シンプルな完全一致エンジンから始めて、段階的に機能を追加していく("完全一致"〜"リテラル文字の連結")
  • 選択やグループ化といった正規表現の基本機能を実装する("選択(|)の実装"、"グループ化")
  • NFAとDFAという2つのオートマトンを実装し、その違いを体感する("NFAの導入"、"DFAへの変換")
  • 繰り返しや量指定子など、正規表現の重要な機能を追加する("繰り返し(*)"、"その他の繰り返し(+, ?)")

正規表現に関する本や記事は数多くありますが、その多くは「使い方」に焦点を当てています。本書はそれとは異なり、正規表現エンジンの「作り方」と「動作原理」に焦点を当てました。オートマトン理論という一見難しそうなテーマも、実際に動くコードとして実装することで自然に理解できるよう心がけています。

また、本書の大きな特徴として、各章の終わりには必ずその時点で動作する正規表現エンジンが完成する点があります。最初はたった数行の完全一致エンジンから始めて、少しずつ機能を追加していくため、挫折することなく最後まで実装を進められます。すべての機能をテストファーストで実装するため、確実に動作するエンジンを作り上げることができます。

普段何気なく使っている正規表現が、どのような仕組みで動いているのか。その謎を、一緒にコードを書きながら解き明かしてみませんか。

おわりに

技術書典への参加は初参加です。また、一人で参加する予定なのでお声がけいただけると、非常に嬉しいです。#rubyfriends もしましょう!

では、当日会場でお会いしましょう。

北陸Ruby会議01に登壇します

2025年12月6日(土)に石川県金沢市で開催される北陸Ruby会議01に登壇します。

regional.rubykaigi.org

今回は 「計算機科学をRubyと歩む 〜DFA正規表現エンジンをつくる〜」 というタイトルで、15分の発表枠をいただきました。

正規表現は、私たちが普段何気なく使っています。例えば、テキストエディターの検索や置換、grepなどのコマンドラインツールで広く利用されています。しかし、その内部で何が起こっているのかを理解しているという方は多くないのではないでしょうか。

本発表では、DFA(Deterministic Finite Automaton、決定性有限オートマトン)を用いた正規表現エンジンの実装を通じて、正規表現の仕組みを掘り下げていこうと思います。 発表内容の概要は公式サイトに掲載されているので、ぜひご覧ください。

わたしたちRubyistにとってRubyは、計算機科学の理論を学ぶ際に特に強力な相棒になります。本発表ではDFA正規表現エンジンの実装を通じて、Rubyがどのようにして複雑なアルゴリズムを理解しやすくし、学習プロセスを支援するのかという観点でもお話ができればと考えています。それがこのトークにおける「みんなの Ruby の使い方」というテーマへのアンサーだと思っています。

今回の北陸Ruby会議01では勤務先から@pndcatも本編登壇します。Public APIを安定して運用するためのリクエスト制限の失敗への対応とそこから得られた学びの話とのことで楽しみです。

さて、北陸Ruby会議01の申込みは既に始まっています。申込ページを見ていると残席数が少なくなってきているようです。 (残席数はスピーカー、スタッフ、スポンサーの未登録込みの数字とのことです) ご参加を検討されている方は、お早めの申し込みが良いと思います。

hokurikurb.doorkeeper.jp

また、懇親会の参加募集も始まっているようです。私も懇親会に参加予定なので、沢山懇親していきましょう。

hokurikurb.doorkeeper.jp

それでは12月に金沢の石川県立図書館でお会いしましょう!¡Nos vemos!

「ソフトウェア設計の結合バランス 持続可能な成長を支えるモジュール化の原則」の翻訳原稿レビューに参加しました

「ソフトウェア設計の結合バランス 持続可能な成長を支えるモジュール化の原則」の翻訳原稿レビューに参加しました。 本書は、本日2025年10月17日発売です。

book.impress.co.jp

本書は、2024年10月に出版されたVlad Khononov著『Balancing Coupling in Software Design: Universal Design Principles for Architecting Modular Software Systems』(Addison-Wesley Professional)の全訳です。ソフトウェアアーキテクチャにおける「結合 (coupling)」という根本的な概念を、体系的かつ実践的に解説した書籍です。結合とは、システムの構成要素間の依存関係や相互作用の度合いを指し、ソフトウェア設計の品質を左右するもっとも重要な要素のひとつです。

本書はIII部構成になっています。

第I部は結合の基本概念を確立します。結合とは何か、システムの複雑性とどう関係するのか、そしてモジュラリティがなぜ重要なのかを論じます。Cynefinフレームワークで問題を分類する方法や、相互作用の数を定量的に分析する手法を学び、David L. Parnasの情報隠蔽Dijkstraの階層化といった古典的概念を現代の文脈で理解するという流れになっています。

印象的だったのは、一般的な「結合は低くすべき」という通念に対して、著者が「結合のバランスを取る」という視点を提示している点です。結合をゼロにすることは不可能であり、むしろ適切な結合を選択することが重要だという主張は、実務での判断に大きな示唆を与えてくれます。

第II部は単一システム内部の結合を扱います。1960年代から続く6段階の結合分類(Content、Common、External、Control、Stamp、Data Coupling)とConnascence(共生性)という精緻な分析手法を学びます。さらにDomain-Driven Designの観点から、Core、Supporting、Generic Subdomainごとに異なる結合戦略を取るべきことを示し、ビジネス価値に応じた設計判断の重要性を論じます。

とくに結合の「距離」という概念が印象的でした。同じ強度の結合でも、それが文 (statement)レベル、メソッドレベル、オブジェクトレベル、サービスレベルのどこに存在するかによって、変更のコストが大きく異なります。距離が遠いほど変更コストが高くなるという原則は、マイクロサービスアーキテクチャの設計においてとくに重要なのだなと感じました。

第III部は分散システムとマイクロサービスアーキテクチャを扱います。結合を定量的に測定する数式を提示し、システムの成長に伴う複雑性の超線形的増加という避けられない問題と、それをモジュール化で管理する方法を示します。レガシーシステムの段階的モダナイゼーション、境界内での結合管理など、実践的なトピックを網羅します。

システムの成長に伴う複雑性の増加パターンについての説明が腹落ちしました。機能は線形に増加し、知識は劣線形 (サブリニア) に増加する一方、複雑性は超線形 (スーパーリニア) に増加するという法則は、なぜ大規模システムが扱いにくくなるのかを明確に説明しています。

結合というテーマを、ここまで深く、体系的に、そして実践的に扱った書籍は他に類を見ません。「結合を最小化する」という単純な原則から、「適切な結合を選択する」という成熟した視点への転換を促してくれる本書は、ソフトウェア設計の思考を一段階引き上げてくれる貴重なリソースです。 本書は、中堅以上のソフトウェアエンジニア、とくにアーキテクチャに関心のある開発者やアーキテクトにとって、必読の一冊だと感じました。

この書籍を日本語で読めるようにしてくださった島田さん、本当にありがとうございました。 またこのような素晴らしい書籍の発売に際して、翻訳レビューとして微力ながらも貢献できたことを大変嬉しく思います。