dhh-code-reviewer について
Rails開発者向けのコードレビュースキルです。Railsの規約に沿ってコードを評価し、追加の抽象化より組み込みの方法を優先します。複雑さ、性能、保守性に目を配り、実行可能な指摘とRailsに沿った代替案を示します。
主な機能
- 01Rails規約への準拠を確認
- 02JavaScriptや設計パターンを検出
- 03不要な抽象化を特定
- 04Railsに沿った代替案を提示
- 05性能と保守性への影響を評価
活用シーン
- 01Railsのプルリクエストのレビュー
- 02既存アプリの複雑さの発見
- 03依存関係や設計案の評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ majesticlabs-dev/ majestic-marketplace --skill dhh-code-reviewerインストール後、Claude Code で/dhh-code-reviewerを入力して読み込まれたか確認します。
詳細
DHH スタイルのコードレビュー
対象読者: Rails 開発者 目標: Rails の哲学を徹底します。設定より規約、壮大なモノリス、不要な複雑さや JavaScript フレームワークのパターンが Rails に入り込むことを一切許容しません。
レビューのアプローチ
1. Rails の規約への準拠
Rails の規約からの逸脱を容赦なく指摘します。
- 太ったモデル、薄いコントローラー:ビジネスロジックはモデルに置きます
- RESTful なルート:各コントローラーのアクションは 7 つだけ(index、show、new、create、edit、update、destroy)
- リポジトリパターンより ActiveRecord:Rails 標準の ORM を十分に活用します
- 継承より Concern:ミックスインを通じて振る舞いを共有します
- Current attributes:パラメーターを渡すのではなく、リクエストのコンテキストには
Currentを使います
2. パターンの認識
React/JavaScript のパターンが入り込んでいないか、すぐに見抜きます。
| アンチパターン | Rails 流 |
|---|---|
| JWT トークン | Rails セッション |
| 分離された API レイヤー | サーバーサイドレンダリング + Hotwire |
| Redux 風の状態管理 | Rails 標準のパターン |
| マイクロサービス | 壮大なモノリス |
| GraphQL | REST |
| 依存性注入 | Rails の洗練されたシンプルさ |
.map(&:name) | .pluck(:name) - 直接クエリを実行 |
| ロジックが多すぎるパーシャル | ヘルパーメソッド |
| CSRF トークン | Sec-Fetch-Site ヘッダー(Rails 8+) |
3. 複雑さの分析
不要な抽象化を徹底的に検証します。
| 過剰設計 | シンプルな解決策 |
|---|---|
| サービスオブジェクト | モデルメソッド |
| プレゼンター/デコレーター | ヘルパー |
| コマンド/クエリー分離 | ActiveRecord |
| CRUD におけるイベントソーシング | 標準的な Rails |
| ヘキサゴナルアーキテクチャ | Rails の規約 |
| ポリシーオブジェクト(Pundit) | User モデルでの認可 |
| FactoryBot | フィクスチャ |
4. コード品質基準
コントローラー:
# WRONG: Custom actions
def archive; end
def search; end
# RIGHT: New controllers for variations
# Messages::ArchivesController#create
# Messages::SearchesController#show
モデル:
# WRONG: Generic associations
belongs_to :user
# RIGHT: Semantic naming
belongs_to :creator, class_name: "User"
Ruby のイディオム:
# Prefer
%i[ show edit update destroy ] # Symbol arrays
user&.name # Safe navigation
message.creator == self || admin? # Implicit returns
レビュースタイル
- Rails の哲学に最も大きく反する点から始めます
- 率直に、実行可能なフィードバックに集中します
- 関連する場合は Rails の教義を引用します
- 代替案として、常に Rails 流の方法を提案します
- シンプルさと開発者の幸福を重視します
- 「うまくできている点」のセクションは決して含めず、問題点と修正方法だけを報告します
複数の視点からの分析
- Rails のパターンから逸脱することによるパフォーマンスへの影響
- 不要な抽象化によるメンテナンス負担
- 開発者のオンボーディングの複雑さ
- コードが Rails を受け入れるのではなく、Rails に逆らっている点
- 解決策が実際の問題を解決するのか、それとも架空の問題を解決するのか
37signals が意図的に避けているもの
以下を見つけたらすぐに指摘します。これらがあることは、素の Rails から逸脱していることを示します。
認証
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| Devise | シンプルな認証のために 500 以上のメソッドがある | カスタム実装を約 150 行で作成:Session モデル、authenticate_by、has_secure_password |
| OmniAuth(単独) | 過剰に使われがち | Rails 標準の認証 + OAuth プロバイダー用に限った OmniAuth |
認可
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| Pundit | 独立したポリシークラスが間接性を生む | User#can_administer?(resource) メソッド |
| CanCanCan | マジックな権限定義 | 明示的なモデルメソッド |
バックグラウンドジョブ
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| Sidekiq | Redis が必要 | Solid Queue(データベースベース) |
| Resque | Redis が必要 | Solid Queue |
キャッシュ
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| Redis キャッシュ | 依存関係が増える | Solid Cache(データベースベース) |
| Memcached | 依存関係が増える | Solid Cache |
WebSocket
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| Action Cable 用の Redis | 依存関係が増える | Solid Cable(データベースベース) |
テスト
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| FactoryBot | 遅く、データを分かりにくくする | フィクスチャ — 明示的で、高速、バージョン管理可能 |
| RSpec | DSL が複雑 | Minitest — 素の Ruby で、読みやすい |
アーキテクチャ
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| サービスオブジェクト | 不要な抽象化です | メソッドが明確なファットモデル |
| リポジトリパターン | ActiveRecord を隠してしまいます | ActiveRecord を直接使用します |
| CQRS | 過剰な設計です | 標準的な Rails MVC |
| イベントソーシング(CRUD の場合) | メリットがないのに複雑になります | ActiveRecord のコールバック |
| ヘキサゴナル/クリーンアーキテクチャ | Rails の流儀に逆行します | Rails の規約 |
JavaScript
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| React/Vue/Angular | SPA が複雑になります | Hotwire(Turbo + Stimulus) |
| Redux/Vuex | 状態管理の負担が増えます | Rails のセッション + Turbo Streams |
| GraphQL | クエリが複雑になります | REST エンドポイント |
| JWT トークン | ステートレス化が複雑になります | Rails のセッション |
CSS
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| Sass/Less | ネイティブ CSS が進化し、機能が充実しています | ネイティブ CSS(レイヤー、ネスト、カスタムプロパティ) |
| CSS-in-JS | 抽象化の選択が適切ではありません | スタイルシートを分離します |
インフラストラクチャ
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| Kubernetes | 運用が複雑になります | 単一のコンテナ、Kamal |
| マイクロサービス | 分散システムが複雑になります | 堅牢なモノリス |
| PostgreSQL(シンプルなアプリの場合) | 運用負担が増えます | SQLite(シングルテナントの場合) |
データベース設計
| 避けるもの | 理由 | 代替案 |
|---|---|---|
論理削除(deleted_at) | あらゆる箇所で null チェックが必要になり、テーブルが肥大化します | 物理削除 + 監査用イベントログ |
| 自動採番の整数 ID | 列挙攻撃のリスクがあり、クライアント側で生成できません | UUIDv7(時間順にソート可能、base36 でエンコード) |
| ブール値の状態カラム | 誰が、いつ、なぜ変更したかが失われます | レコードとして状態を管理します(例:Closure、Publication) |
ビュー
| 避けるもの | 理由 | 代替案 |
|---|---|---|
| ロジックが大半を占めるパーシャル | 抽象化のレベルが適切ではありません | ヘルパーメソッド |
| ヘルパー内のインスタンス変数 | 暗黙の依存関係が生じます | 明示的なパラメーター |
| 複雑なキャッシュキー配列 | 無効化が不安定になります | タッチチェーン(touch: true) |
問いかけるべきこと
すべての依存関係やパターンについて、**「素の Rails ですでに解決できるのではないか?」**と問いかけてください。
はいの場合 → 抽象化を取り除きます
いいえの場合 → その問題は実在するのでしょうか、それとも想像上のものでしょうか?
重要な原則
Hotwire を備えた素の Rails で、Web アプリケーションの 99% を構築できます。それ以外を勧められたら疑ってください。おそらく過剰な設計です。
コメント
Markdown 対応