足し算ではなく接着剤を作る: Next.jsの配備とRubyのdelegateが示す設計の本質

John Smith

Hatched by John Smith

Apr 21, 2026

1 min read

71%

0

便利さは、だいたい後から効く

「最初から全部入り」に見えるものほど、実は設計の自由を削ります。逆に、たったひとつの小さな機能が、ある日突然、全体の扱いやすさを決めることがあります。配備環境に静的アセットを載せられるようになることも、RubyでRailsの外にdelegateを持ち込めるようにすることも、一見すると地味です。しかしこの地味さこそが重要です。

本当に問うべきなのは、何が新しくできるかではありません。どこまでをフレームワークに預け、どこからを自分の言葉で書くのかです。現代の開発は、巨大な仕組みを丸ごと受け入れるか、何も使わずに頑張るか、という二択ではありません。その中間にある、必要最小限の接着剤をどう作るかが勝負になります。

Next.jsのフルスタック配備と、Rails外でのdelegate再実装は、同じ問題を別の場所で解いています。どちらも「本体を丸ごと持ち込む」のではなく、既存の道具を壊さずに、欲しい能力だけを抽出する試みです。ここには、これからのソフトウェア設計を考えるうえでかなり重要なヒントがあります。

優れた設計とは、機能を増やすことではなく、依存のしかたを洗練することだ。


フレームワークの価値は、機能の多さではなく移植可能性にある

多くの人はフレームワークを「便利な機能の集合」と見ます。もちろんそれは正しいのですが、より本質的には、フレームワークとは知恵の圧縮形式です。つまり、毎回同じ処理を書く代わりに、共通パターンを再利用できるようにする仕組みです。

ただし、この圧縮には副作用があります。便利なものほど、周辺環境との結びつきが強くなるのです。Railsらしさは、Railsの中では美徳です。しかし、Railsの外で同じ感覚を欲しくなった瞬間、その便利さは境界を超えた瞬間に負債にもなります。ActiveSupportをまるごと入れるのは簡単ですが、実際にはそれだけで依存関係、学習コスト、将来の移植性が変わってしまう。

同じ構図が、Next.jsのデプロイ先にもあります。アプリケーションをどこに置くかは、単なる運用の問題ではありません。そのアプリが持つ前提をどこまで受け入れてくれる環境かという問題です。静的アセットの扱いが整うと、サーバーと配信の境界は薄くなり、アプリはより少ない摩擦で動きます。ここで重要なのは「クラウドがすごい」という話ではなく、アプリケーションに必要な前提を、環境側がどこまで肩代わりしてくれるかです。

つまり、フレームワークや実行基盤を評価するときに見るべきなのは、派手な新機能ではなく、自然に使える最小単位がどこまで整っているかです。delegateのような小さな抽象化がそれを示すように、静的アセットのような基礎機能もまた、システム全体の「書きやすさ」を決めます。


本当に難しいのは、全部を持ち込むことではなく、必要な形だけを切り出すこと

delegateという仕組みの魅力は、機能そのものよりも、責務の置き場所を言語化できることにあります。あるオブジェクトに処理を任せつつ、呼び出し側の見通しを保てる。これは単なる省略記法ではありません。コードの中心に「この振る舞いは誰のものか」という問いを立てる装置です。

Railsの世界では、それが自然に使えます。けれどRailsの外では、同じような表現力を持つとは限りません。そこでActiveSupportを導入するか、自前で小さく作るか、という選択が生まれます。この選択の本質は、何を使うかではなく、どの粒度で世界を切り分けるかです。

Next.jsの配備も同様です。フルスタックなアプリを動かしたいとき、古い発想では「サーバー」「フロントエンド」「静的ファイル配信」を別々に考えがちでした。しかしWorkersの静的アセット機能があると、その境界が変わります。アプリの一部を静的に扱い、別の部分を動的に処理しながら、ひとつの運用モデルに収められる。ここで重要なのは、全てを統一することではなく、統一したいところだけを統一できることです。

この視点から見ると、良い設計とはしばしば「大きな抽象」を作ることではありません。むしろ、細かい境界をうまく扱うための小さな抽象を持つことです。delegateはその代表例です。静的アセット機能も、配備における同種の存在です。どちらも派手ではない。しかし、派手ではないからこそ、日々の摩擦を確実に減らします。

たとえば、倉庫を想像してください。すべての荷物を巨大な一室に押し込むのは簡単ですが、取り出すたびに混乱します。delegateは、荷物の管理を整理するラベルです。Workersの静的アセットは、よく使う荷物を玄関近くに置く棚です。どちらも「収納」を改善しているだけに見えますが、実際にはシステム全体の操作性を変えています。


接着剤としての抽象化: 余計な力を使わずにつなぐ

抽象化には二種類あります。ひとつは、複雑さを隠すための抽象化。もうひとつは、複雑さをつなぐための抽象化です。後者を、ここでは接着剤の抽象化と呼びたいと思います。

delegateはまさに接着剤です。オブジェクト指向の世界では、責務は分割されるべきですが、分割されすぎると逆に使いにくくなる。delegateは、分割と利用の間にある摩擦を最小化します。呼び出し側は単純な顔を保ちながら、裏では適切なオブジェクトへ処理を流せる。つまり、構造を深くしながら、表面を浅く保つための仕組みです。

Workersの静的アセット機能も、この接着剤の役割を果たします。フロントエンドの成果物を別サーバーに置くのではなく、実行環境に近いところで扱えるようにすることで、配備の流れがなめらかになる。これは単に速いとか新しいという話ではありません。開発時に頭の中で描いていた構造を、運用時にも崩さず保てることが本質です。

この観点は、設計の評価基準を変えます。優れた抽象化は、コードを短くするだけでは足りません。変更時の精神的コストを減らす必要があります。なぜなら、ソフトウェアの多くの失敗は、アルゴリズムの誤りではなく、境界が分かりにくいことから生まれるからです。

よい接着剤は、存在を意識させない。だが、ないと全体が崩れる。

その意味で、delegateのようなローカルな抽象化と、静的アセットのようなプラットフォーム側の抽象化は、役割が似ています。どちらも主役ではない。しかし、主役が安心して動ける舞台をつくります。


設計の核心は、機能追加ではなく境界設計だ

ここまでを一段引いて見ると、共通のテーマは明確です。ソフトウェアは、機能そのものよりも、機能がどこで成立するかによって質が決まる。この「どこで」が境界です。

境界設計がうまいと、次のようなことが起きます。

  1. 小さな改善が全体に効く
  2. 依存が増えても見通しが悪化しにくい
  3. フレームワークの力を借りながら、過剰に縛られない
  4. 後から別環境へ移したくなったときに、移植の足場が残る

これが重要なのは、現代の開発が「一度作れば終わり」ではないからです。配備先も、チーム構成も、ライブラリも、数か月単位で変わります。そんな世界では、最初の賢さよりも、後から戻って読んだときに意味が通ることが価値になります。

たとえば、Railsの世界でdelegateを使うのは簡単です。けれどあえてRails外で同じ考え方を持ち込むと、抽象化の輪郭が見えます。どこまでを標準に頼り、どこからを自分で持つか。どこまでを環境に任せ、どこからをアプリが担うか。この判断力こそ、スケールし続けるコードベースに必要なものです。

Next.jsの配備も、同じことをインフラの側から教えてくれます。静的アセットが自然に扱えると、アプリは「配信するもの」と「計算するもの」をより綺麗に分けられる。結果として、運用の複雑さが減るだけでなく、開発者の思考も整理されます。境界が明確なシステムは、変更に強いのです。


Key Takeaways

  • 便利さを足し算で考えない。 どの機能が増えるかではなく、どの境界が滑らかになるかを見る。
  • 抽象化は隠すためだけではない。 delegateのように、責務をつなぎ直すための抽象化を意識する。
  • フレームワークを丸ごと受け入れる前に、必要な能力だけ切り出せないか考える。 依存を増やす前に、接着剤で足りることが多い。
  • 配備や実行環境も設計の一部として扱う。 アプリの書きやすさは、コードだけでは決まらない。
  • 小さな摩擦を軽視しない。 1回の手間ではなく、毎日の手間が設計の良し悪しを決める。

まとめ: いい設計とは、世界を小さくすることではなく、境界を扱いやすくすること

私たちはしばしば、ソフトウェア設計を「より多くのことをできるようにする作業」だと考えます。しかし本当に価値があるのは、むしろ逆です。必要なことを、無理なく自然にできるようにすること。そのためには、機能の量よりも、責務の置き場所と接続の仕方を整える必要があります。

delegateは、オブジェクト間の責務を自然につなぐための小さな接着剤です。Workersの静的アセット機能は、アプリと配備環境の間を自然につなぐための大きな接着剤です。スケールは違っても、やっていることは同じです。どちらも、複雑さを削るのではなく、複雑さが暴れない形に整える

だから次に何かを選ぶときは、こう自問してみてください。これは本当に新しい力をくれるのか。それとも、既にある力を、もっと自然に使えるようにしてくれるだけなのか。その違いを見抜けるようになると、技術選定は単なる好みの比較ではなく、設計思想そのものになります。

そしてその瞬間、あなたは気づくはずです。優れたソフトウェアとは、巨大な仕組みを持つものではありません。必要なもの同士が、無理なくつながっているものなのだと。

Sources

← Back to Library

Hatch New Ideas with Glasp AI 🐣

Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)

Start Hatching 🐣