Rails World 2025: DHHが示す開発者の完全な自律性
Rails World 2025のオープニング基調講演で、David Heinemeier Hansson(DHH)は単なる新機能の発表を超えて、開発者がソフトウェア構築において簡潔さ、スピード、そして喜びを取り戻すための情熱的なマニフェストを提示した。Rails 8.1 betaの発表と共に、開発ワークフローの完全な所有を訴えた今回の講演は、Ruby on Railsの進化における画期的な瞬間となった。
📺 基調講演動画
動画リンク: Rails World 2025 Opening Keynote - David Heinemeier Hansson
Rails 8.1 beta: 開発者エンパワメントの新時代
哲学的転換点
Rails 8.1 betaは500名以上の貢献者による10ヶ月間の開発成果で、2,500以上のコミットが含まれている。DHHは「複雑性の商人」への批判と「CRUDモンキー」であることの恥を捨てるよう訴え、3つのローマ帝国にインスパイアされた原則を提唱した:
- Libertas(自由): フレームワークからOSまで全層の完全制御と透明なアクセス
- Proprietas(所有権): 外部のゲートキーパーなし、開発者が体験とスタックを定義
- Pietas(義務): オープンソースに貢献する責任
主要な新機能
Rails 8.1では以下の革新的機能が導入された:
- Local CI: クラウドランナーより高速なネイティブ継続的インテグレーション
- Active Job Continuations: 長時間実行ジョブの中断・再開機能
- ネイティブMarkdown支援: フレームワーク レベルでのMarkdown処理
- 構造化イベントレポート: 組み込みビジネスイベント追跡
- 外部依存関係の削減: データベースバック ソリューションの継続
Active Job Continuations: 中断可能な背景ジョブ
技術的実装
37signalsのDonal McBreenhが開発したActive Job Continuationsは、長時間実行背景ジョブを最後に完了したステップから再開する機能を提供する。Kamalデプロイメントの30秒シャットダウン制限に特に有効だ。
class ProcessImportJob < ApplicationJob
include ActiveJob::Continuable
def perform(import_id)
@import = Import.find(import_id)
# ブロック形式
step :initialize do
@import.initialize
end
# カーソル付きステップで再開可能な進捗
step :process do |step|
@import.records.find_each(start: step.cursor) do |record|
record.process
step.advance! from: record.id
end
end
# メソッド形式
step :finalize
end
private
def finalize
@import.finalize!
end
end
高度なカーソル管理
# 初期カーソル値の設定
step :iterate_items, start: 0 do |step|
items[step.cursor..].each do |item|
process(item)
step.set! step.cursor + 1
end
end
# 配列カーソルでネストしたレコード処理
step :process_nested_records, start: [0, 0] do |step|
Account.find_each(start: step.cursor[0]) do |account|
account.records.find_each(start: step.cursor[1]) do |record|
record.process
step.set! [account.id, record.id + 1]
end
step.set! [account.id + 1, 0]
end
end
実用的な使用例
- 大規模データインポート: 最後に処理したレコードから再開
- バッチ処理: デプロイ後の多段階ワークフロー継続
- コンテナデプロイメント: Kamalの30秒制限での優雅なシャットダウン
- 長時間計算: 集約的な操作中の進捗チェックポイント
- マルチテナント処理: データ損失なしでテナントごとの操作再開
Markdown Rendering: AIファーストの時代対応
Rails 8.1では「AIのリンガフランカ」としてのMarkdownのネイティブサポートが導入された。
コントローラでの使用
class Page
def to_markdown
body
end
end
class PagesController < ActionController::Base
def show
@page = Page.find(params[:id])
respond_to do |format|
format.html
format.md { render markdown: @page }
end
end
end
統合ポイント
-
ActionController: ネイティブ
render markdown:
サポート -
ビューテンプレート:
.html.md
ファイルサポート - テンプレートハンドラ: 拡張可能なMarkdown処理パイプライン
- レスポンス形式: ファーストクラスのMarkdown形式サポート
Local CI: 開発者の独立性を促進
実装例
Rails 8.1では config/ci.rb
でCI ワークフローを定義する新しい bin/ci
コマンドが含まれる:
CI.run do
step "Setup", "bin/setup --skip-server"
step "Style: Ruby", "bin/rubocop"
step "Security: Gem audit", "bin/bundler-audit"
step "Security: Importmap vulnerability audit", "bin/importmap audit"
step "Security: Brakeman code analysis", "bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error"
step "Tests: Rails", "bin/rails test"
step "Tests: Seeds", "env RAILS_ENV=test bin/rails db:seed:replant"
if success?
step "Signoff: All systems go. Ready for merge and deploy.", "gh signoff"
else
failure "Signoff: CI failed. Do not merge or deploy.", "Fix the issues and try again."
end
end
パフォーマンス比較
実例: HEYのテストスイート(30,000+アサーション)がFramework Desktop AMDで1分23秒で実行、クラウドCIでは10分以上かかる。
Action Text Lexxy: 次世代リッチテキストエディタ
Meta のLexicalフレームワーク上に構築された現代的なリッチテキストエディタで、Trixの制限を克服する:
主要機能
- リアルタイムコード構文ハイライト: エディタ内でのライブコード色分け
- ネイティブMarkdownサポート: 完全なMarkdownショートカットと貼り付け時自動フォーマット
- PDF/ビデオ添付プレビュー: エディタ内で直接プレビュー
-
セマンティックHTML: 適切なHTMLセマンティクス(段落が実際の
<p>
タグ) - 設定可能プロンプト: @メンションと複数読み込み戦略でのインタラクティブプロンプト
Action Textとの互換性
# Gemfile
gem 'lexxy', '~> 0.1.3.beta'
# フォームで - 既存のAction Textと同様
<%= form_with model: @post do |form| %>
<%= form.rich_text_area :content %>
<% end %>
# メンション/プロンプト用
<%= form.rich_text_area :body do %>
<lexxy-prompt trigger="@" name="mention">
<%= render partial: "people/prompt_item", collection: Person.all %>
</lexxy-prompt>
<% end %>
Beamer: SQLite レプリケーション革命
37signalsのKevin McConnellが開発したBeamerは、SQLiteデータベース専用の軽量レプリケーションツールで、単一サーバ デプロイメントの制限を克服する:
用途と応用
- マルチサーバスケーリング: SQLiteベースRailsアプリケーションの水平スケーリング
- 地理的分散: ユーザに近いローカル読み取りレプリカでの地理的分散アプリケーション
- エッジコンピューティング: グローバルにユーザ近くのマイクロデータセンター促進
Active Record Tenanting: マルチテナント簡素化
アーキテクチャー
物理分離アプローチ:
- 各テナントが独自のSQLiteデータベースファイル(例:
tenant_1.sqlite3
,tenant_2.sqlite3
) - 現在SQLiteのみ対応、他のデータベースへの拡張予定
- 行レベルマルチテナンシー(
acts_as_tenant
などのgemが使用)とは異なり、完全なデータベース分離を提供
設定と実装
# Gemfile
gem 'activerecord-tenanted'
# config/application.rb
config.active_record_tenanted.tenant_resolver = -> (request) {
Account.extract(request)
}
# テナント作成
def create_tenant
ApplicationRecord.create_tenant(tenant_name) do
@account = Account.create
@account.setup_basic_template
end
end
データ分離原則
- 保存時: テナントごと別ストアでのデータ永続化
- 転送時: 認証されたテナントユーザーのみへのデータ送信
- 実行時: 分離されたテナントコンテキスト内での全操作
Kamal Geo Proxy: グローバル配布の実現
技術アーキテクチャー
Kamal Geo ProxyはKamal Proxy(Kamal 2.0導入)を拡張し、マルチリージョンルーティングとRailsアプリケーションの地理的分散をサポートする:
# Geo proxy用の拡張Kamal設定
proxy:
ssl: true
host: app.example.com
geo_routing: true # 新機能
regions:
- name: us-east
hosts: [app-us-east.example.com]
- name: eu-west
hosts: [app-eu-west.example.com]
交通ルーティングロジック
- リクエスト傍受: Geo proxyが受信リクエスト受取
- 位置検出: ユーザの地理的位置特定
- 最適ルーティング: 最寄りの正常なデータセンターへ交通誘導
- フェイルオーバー処理: プライマリ失敗時の次善リージョンへの自動ルーティング
実用的応用
- レイテンシー最適化: ユーザが最寄りデータセンターからの応答取得
- データ主権: EU ユーザをEU サーバーへ、US ユーザをUS サーバーへルーティング
- 災害復旧: リージョン間の自動フェイルオーバー
Framework Laptop と Omarchy OS デモ
デモの概要
DHHは新しいFramework laptopにOmarchy OSを設定し、6分以内で完全なRailsアプリケーションを起動するライブデモを実施。従来の時間のかかる開発セットアップと彼の合理化されたアプローチの鮮明な対比を示した。
Omarchy OS の技術詳細
Omarchyとは:
- Arch LinuxとHyprlandタイリングウィンドウマネージャー上に構築された厳選されたLinuxディストリビューション
- DHHが「開発者環境がどうあるべきかのプラトニックな理想」と表現
- キーボードファーストエルゴノミクスを中心に設計された最大速度と効率性
- 「MacやWindowsでは見たことがない」現代的なターミナルベース インターフェース
技術仕様と機能:
- 柔軟性と制御のためのArch Linux基盤
- 包括的なすぐに使える設定のHyprland タイリングウィンドウマネージャー
- Neovim、Gitツール、Dockerデータベースを含む事前設定開発ツール
- Ruby バージョン管理のためのmise統合
- 生産性アプリケーション: Spotify、Chromium、Typora、Alacritty、LibreOffice、Zoom
DHHの「開発ワークフローの完全所有」哲学
現在の開発実践への批判
「複雑性の商人」:
- 「ベストプラクティス」を約束しながら実際には効率を奪う複雑なソリューションを販売する企業への批判
- パラドックス: これまで以上に高速なコンピュータ、より多くのオープンソース、より良いツールがあるにも関わらず、コード デプロイが遅くなり、チームの制御感が減っている
「CRUDモンキー」であることの恥:
- 「退屈な」CRUD作業をすることの恥が過剰エンジニアリングを推進していることを特定
- 彼のソリューション: 「退屈な」CRUD作業を上手に行うパワーと高潔さを受け入れる
- 不要なレイヤーを発明するのではなく、実際の問題をend-to-endで解決することに焦点
提案されたソリューションと哲学
エンドツーエンド所有権:
- 開発者はスタックの小さな「スライス」だけでなく、成果を所有すべき
- 完全に理解し、変更できるツールとプロセスに投資
- OSからWebサーバまで全てのレイヤーの制御を取り戻す
実用的実装:
- DHH自身のサーバーは月額$1,200のクラウドインスタンスの代わりに**$300のミニPC**で稼働
- 実際の価値を提供しないクラウド依存からの脱却
- 抽象化ではなく理解を促進するツールの使用
より広いビジョン
「ソフトウェア作成において喜び、スピード、エンドツーエンドパワーを取り戻そう」 - この引用がDHHの行動への呼びかけを要約している。
重要な哲学的ポイント:
- ソフトウェア開発は苛立たしく依存的ではなく、喜ばしく力を与えるものであるべき
- 開発者は小さな部分だけでなく、スタック全体を理解すべき
- 複雑さと間接化よりも簡潔さと直接性を重視すべき
- 目標は商業的ゲートキーパーへの依存ではなく、開発者の主体性と独立性
Rails開発者への実用的な影響とアクションアイテム
即座に試せること
Rails 8.1 beta の試行:
# Rails 8.1 beta のインストール
gem install rails --pre
# 新しいプロジェクトでLocal CI を試す
rails new my_app --main
cd my_app
bin/ci
Active Job Continuations の実装:
# 既存のRailsアプリケーションでも使用可能
# Gemfileに追加(Rails 8.1 betaが必要)
gem 'rails', '~> 8.1.0.beta1'
# 長時間実行ジョブの改善を検討
# 例: 大きなCSVインポート、画像処理バッチ、レポート生成
中期的な検討事項
アーキテクチャーの見直し:
- 現在のクラウド依存度評価
- SQLite + Kamal への移行可能性検討
- ローカル開発環境の最適化
開発ワークフローの改善:
- CI/CDパイプラインの速度測定
- ローカルCIの費用対効果分析
- チーム内での「複雑性の商人」依存度確認
長期的なビジョン
DHHの提案は単なる技術選択を超えて、開発者として、チームとして、どのような価値観で作業するかの根本的な問い直しを促している。
Rails World 2025でのメッセージは明確だ:ツールに振り回されるのではなく、ツールを所有し、理解し、喜びを持って使いこなそう。そして何より、実際の価値を生み出すソフトウェアを、シンプルに、高速に、確信を持って配信しよう。
まとめ:新しい開発パラダイムへの招待
Rails World 2025でのDHHの講演は、新しいツールを提示するだけでなく、**「ウェブ構築における喜びと主体性を取り戻す招待状」**として位置づけられた。開発者に対してスタックを所有し、高速で移動し、誇りを持てる作業を出荷することを奨励し、複雑性商人や依存関係を作る商業サービスに人質にされることなく開発を進めることを促した。
この包括的なアプローチは、Rails 8.1が単なるフレームワークアップデートではなく、Web開発における根本的な簡素化と所有権への呼びかけであることを示している。開発者コミュニティにとって、これらの新機能と哲学は、より効率的で喜ばしく、自律的な開発体験への道筋を提供している。
この記事は、Rails World 2025のDavid Heinemeier Hanssonによるオープニング基調講演の内容をまとめたものです。最新の情報については、公式ドキュメントとリポジトリを確認してください。
Discussion