サイトアイコンmaita tomoya dev io

Ruby

backend-languages

Ruby -- プログラマの幸福とRuby on Rails

はじめに

Rubyは1995年にまつもとゆきひろ(Matz)によって日本で開発されたプログラミング言語である。「プログラマの幸福」を最優先にした言語設計と、2004年に登場したRuby on Railsフレームワークにより、Web開発の歴史を大きく変えた。

本記事では、Rubyの言語哲学、Ruby on Railsの開発生産性、スタートアップでの採用理由、そして近年の市場動向を解説する。


Rubyの立ち位置

"プログラマの幸福"を追求する言語

Rubyの設計哲学は、機械ではなくプログラマの視点を最優先にすることである。

Matzの設計哲学:

"Ruby is designed to make programmers happy."
(Rubyはプログラマを幸せにするために設計された)

"Computers are not subtle, but people are."
(コンピュータは繊細ではないが、人間は繊細だ)

意味:
- コードは書く回数より読む回数の方が多い
- 人間にとって自然な構文を優先する
- 驚き最小の原則(Principle of Least Surprise)
# Rubyの「自然な」構文の例

# 英語のように読める条件文
puts "成人です" if age >= 18
puts "未成年です" unless age >= 18

# 繰り返しの自然な表現
5.times { puts "Hello" }
1.upto(10) { |n| puts n }

# 配列操作の直感的なメソッドチェーン
names = ["田中", "佐藤", "鈴木", "高橋"]
result = names
  .select { |name| name.length >= 2 }
  .map { |name| "#{name}さん" }
  .sort
  .join(", ")

# ブロック構文
[1, 2, 3, 4, 5].each do |number|
  puts number * 2
end

Ruby on Railsの衝撃

2004年にDavid Heinemeier Hansson(DHH)がRuby on Rails(以下Rails)を公開し、Web開発の常識を覆した。

Rails以前のWeb開発(2004年以前):
- データベース設計 --> 手動でSQLを書く
- ORMの設定 --> XMLで大量の設定ファイル
- ルーティング --> 手動で設定
- CRUD操作 --> 毎回手書き
- テスト --> フレームワークなし
--> 1つのCRUDアプリに数週間

Rails以降:
rails new myapp
rails generate scaffold Article title:string content:text
rails db:migrate
--> 1つのCRUDアプリが数分で完成

Rubyの強み

1. 圧倒的な開発速度

Railsの「Convention over Configuration」(設定より規約)と「DRY」(Don't Repeat Yourself)の原則により、最小限のコードで最大限の機能を実現できる。

MVPを構築するまでの時間(概算・相対比較):

Ruby on Rails     : ████ 1x(基準・最速レベル)
Django (Python)   : █████ 1.3x
Laravel (PHP)     : ██████ 1.5x
Express (Node.js) : ████████ 2x
Spring Boot (Java): ████████████ 3x
Gin (Go)          : ██████████████ 3.5x

* CRUD + 認証 + 管理画面 を含むMVP開発の概算
* Railsは「足場」が最も整っている

2. Convention over Configuration

# Railsの規約の例

# モデル名: Article(単数形、キャメルケース)
# テーブル名: articles(複数形、スネークケース)
# ファイル名: app/models/article.rb
# コントローラー: ArticlesController
# ビュー: app/views/articles/

# これだけでCRUD APIが完成
class Article < ApplicationRecord
  belongs_to :author, class_name: 'User'
  has_many :comments, dependent: :destroy
  has_many :taggings
  has_many :tags, through: :taggings

  validates :title, presence: true, length: { maximum: 200 }
  validates :content, presence: true

  scope :published, -> { where(published: true) }
  scope :recent, -> { order(created_at: :desc) }
end
Railsの規約による自動化:

+------------------+----------------------------------+
| 書くこと          | Railsが自動でやること              |
+------------------+----------------------------------+
| モデル名          | テーブル名を推測                   |
| has_many定義     | 外部キーを推測                    |
| コントローラー名   | ビューのディレクトリを推測           |
| マイグレーション   | SQLを自動生成                     |
| ルーティング       | RESTfulルートを自動生成            |
| フォーム          | CSRFトークンを自動付与             |
+------------------+----------------------------------+

3. ActiveRecord -- 直感的なORM

# ActiveRecordの強力なクエリインターフェース

# 基本的なCRUD
article = Article.create(title: "Ruby入門", content: "...")
article = Article.find(1)
article.update(title: "Ruby完全入門")
article.destroy

# メソッドチェーンによる柔軟なクエリ
articles = Article
  .published
  .where(author: current_user)
  .where("created_at > ?", 1.week.ago)
  .includes(:tags, :comments)
  .order(created_at: :desc)
  .page(params[:page])
  .per(20)

# N+1問題の解決
# includes で関連データを一括読み込み
articles = Article.includes(:author, :tags).all
articles.each do |article|
  puts article.author.name  # 追加クエリなし
  puts article.tags.map(&:name).join(", ")
end

# 集計クエリ
Article.group(:category).count
# => {"tech" => 42, "life" => 15, "news" => 28}

Article.where(published: true).average(:view_count)
# => 1234.5

4. Railsエコシステム(Gem)

主要なRuby Gem:

認証:
  devise          : 認証の標準(ログイン、登録、パスワードリセット)
  omniauth        : OAuth認証(Google、GitHub等)

認可:
  pundit          : ポリシーベースの認可
  cancancan       : 能力ベースの認可

API:
  grape           : REST API DSL
  graphql-ruby    : GraphQL実装

テスト:
  rspec           : BDDテストフレームワーク
  factory_bot     : テストデータ生成
  capybara        : ブラウザテスト

管理画面:
  activeadmin     : 管理画面自動生成
  rails_admin     : 管理画面

バックグラウンド処理:
  sidekiq         : ジョブキュー(Redis)
  delayed_job     : シンプルなジョブキュー

検索:
  ransack         : 検索クエリビルダー
  elasticsearch-rails : Elasticsearch統合

ページネーション:
  kaminari        : ページネーション
  pagy            : 高速ページネーション

5. テスト文化

Rubyコミュニティは、テスト駆動開発(TDD)の文化が非常に強い。

# RSpecによるテスト例
RSpec.describe Article, type: :model do
  describe 'バリデーション' do
    it 'タイトルが必須であること' do
      article = Article.new(title: nil)
      expect(article).not_to be_valid
      expect(article.errors[:title]).to include("can't be blank")
    end

    it 'タイトルが200文字以内であること' do
      article = Article.new(title: 'a' * 201)
      expect(article).not_to be_valid
    end
  end

  describe 'スコープ' do
    describe '.published' do
      it '公開済みの記事のみ返すこと' do
        published = create(:article, published: true)
        draft = create(:article, published: false)

        expect(Article.published).to include(published)
        expect(Article.published).not_to include(draft)
      end
    end
  end

  describe '#full_title' do
    it 'カテゴリ付きのタイトルを返すこと' do
      article = build(:article, title: 'Ruby入門', category: 'tech')
      expect(article.full_title).to eq('[tech] Ruby入門')
    end
  end
end

# リクエストスペック(API テスト)
RSpec.describe 'Articles API', type: :request do
  describe 'GET /api/articles' do
    it '記事一覧を返すこと' do
      create_list(:article, 3, published: true)

      get '/api/articles'

      expect(response).to have_http_status(:ok)
      expect(JSON.parse(response.body).length).to eq(3)
    end
  end
end

Rubyの弱み

1. 実行速度

RubyはインタプリタでありGILを持つため、実行速度は他の言語と比較して遅い。

実行速度比較(概算):

C/Rust   : █ 1x(基準)
Go       : ██ 1.5x
Java     : ██ 2x
Node.js  : ████ 5x
Python   : ██████████████ 50x
Ruby     : ████████████████ 60x

* CRubyの場合
* YJIT(Ruby 3.1+)で~30%高速化
* JRubyでJVM上での実行も可能

ただし、Web開発においてはデータベースアクセスやネットワーク通信がボトルネックになることが多く、言語自体の速度差は実用上問題にならないケースも多い。

2. 並行処理

CRubyにはGIL(Global Interpreter Lock)があり、真のマルチスレッド並行処理が制限される。

Rubyの並行処理オプション:

1. スレッド(GILの制約あり)
   - I/O待ちでは効果あり
   - CPU計算では効果なし

2. プロセス(Unicorn、Puma等)
   - マルチプロセスでGILを回避
   - メモリ消費が増大

3. Ractor(Ruby 3.0+、実験的)
   - GILの制約なしの並行処理
   - まだ制約が多い

4. Fiber + async(Ruby 3.0+)
   - 非同期I/O
   - async gemとの組み合わせ

比較:
Go     : goroutine(言語組み込み、100万並行OK)
Java   : Virtual Threads(JVM管理)
Ruby   : Ractor(実験的)+ プロセスフォーク
Node.js: イベントループ(シングルスレッド非同期)

3. 採用市場の縮小傾向

Ruby求人の推移(日本市場、概算的なトレンド):

2012-2015: ████████████████████████ 最盛期(スタートアップブーム)
2016-2018: ████████████████████ やや減少
2019-2021: ████████████████ 減少傾向
2022-2025: ██████████████ 安定(減少傾向は鈍化)

要因:
- Node.js/TypeScriptへの移行
- Goへの移行(マイクロサービス化)
- Pythonの台頭(AI/ML需要)
- ただし既存のRailsアプリの保守需要は依然として多い

4. メモリ消費

Rubyはオブジェクト指向を徹底しているため、全てがオブジェクトでありメモリ消費が多い。


Rails vs 他フレームワークの比較

開発速度の圧倒的優位性

同じ機能を持つWebアプリケーションの開発工数比較:

機能: CRUD + 認証 + 認可 + 管理画面 + API + テスト

Rails       : ████ 1週間
Django      : ██████ 1.5週間
Laravel     : ██████ 1.5週間
Express     : ████████████ 3週間
Spring Boot : ████████████████ 4週間

Railsが速い理由:
1. scaffold(CRUD自動生成)
2. devise(認証を数行で実装)
3. activeadmin(管理画面自動生成)
4. 豊富なGem(プラグイン)
5. Convention over Configuration

フレームワーク機能比較

機能RailsDjangoLaravelExpressSpring Boot
ORMActiveRecordDjango ORMEloquentなし(Prisma等)JPA/Hibernate
マイグレーション内蔵内蔵内蔵外部外部(Flyway等)
認証devise内蔵Sanctum外部(Passport等)Spring Security
管理画面activeadminDjango Adminなし(外部)なしなし
テスト内蔵内蔵内蔵外部JUnit
メールAction Mailer内蔵内蔵外部外部
ジョブキューActive JobCeleryQueue外部外部
WebSocketAction CableChannelsBroadcastingSocket.ioWebSocket
API ModeありDRFありデフォルトデフォルト

スタートアップでの採用理由(MVP最速)

なぜスタートアップがRailsを選ぶのか

スタートアップのライフサイクルとRails:

Phase 1: アイデア検証(0-3ヶ月)
  --> Rails: MVP最速。数日でプロトタイプ完成
  --> 他言語: MVPに数週間~数ヶ月

Phase 2: Product-Market Fit(3-12ヶ月)
  --> Rails: 高速な機能追加・変更。テスト文化で品質維持
  --> 他言語: 変更コストがRailsより高い

Phase 3: スケーリング(1-3年)
  --> Rails: パフォーマンス課題が顕在化する可能性
  --> 対策: キャッシュ、マイクロサービス分離、一部をGoに移行

Phase 4: 成熟期
  --> 多くの企業がRailsを維持しつつ、
      パフォーマンスクリティカルな部分のみ他言語に移行

Railsスタートアップの成功例

Railsで成長したスタートアップ:

+------------------+---------------------------+-----------------+
| 企業             | サービス                    | 現在の状況       |
+------------------+---------------------------+-----------------+
| GitHub           | ソースコードホスティング    | Rails維持       |
| Shopify          | ECプラットフォーム          | Rails維持       |
| Airbnb (初期)    | 宿泊マッチング             | 一部移行済      |
| Twitter (初期)   | SNS                       | Scalaに移行     |
| Cookpad          | レシピ共有                  | Rails維持       |
| Basecamp         | プロジェクト管理            | Rails維持(DHH)  |
| Hulu (初期)      | 動画配信                   | 一部移行済      |
+------------------+---------------------------+-----------------+

重要な事実:
- GitHubとShopifyは世界的な大規模サービスでありながら
  Railsを使い続けている
- "Railsはスケールしない"は必ずしも正しくない

採用企業例

GitHub

GitHubはRails創成期から一貫してRailsを使い続けている。世界最大のコードホスティングプラットフォームであり、「Railsはスケールする」ことの最大の証拠である。

Shopify

Shopifyは世界最大のECプラットフォームであり、Railsのモノリシック(大きな1つのアプリ)アーキテクチャを維持しながら大規模なトラフィックを処理している。Railsへの貢献も非常に多い。

Airbnb(初期)

Airbnbは初期にRailsで急速にMVPを構築し、Product-Market Fitを達成した。サービスの成長に伴い、バックエンドの一部をJavaやKotlinに移行している。

Cookpad

日本最大のレシピ共有サービスCookpadは、Railsのヘビーユーザーであり、Rubyコミュニティへの貢献も多い。

日本でRailsを採用している主な企業:

+------------------+---------------------------+
| 企業             | サービス                    |
+------------------+---------------------------+
| Cookpad          | レシピ共有                  |
| SmartHR          | 人事労務                   |
| freee            | 会計ソフト                  |
| Money Forward    | 家計簿・会計                |
| STORES           | EC/決済                    |
| Wantedly         | ビジネスSNS                |
| Qiita            | 技術情報共有               |
+------------------+---------------------------+

Rubyの最新動向

Ruby 3.x系の改善

Ruby 3.xの主な改善:

Ruby 3.0 (2020):
  - "Ruby 3x3"(Ruby 2の3倍速)目標
  - Ractor(並行処理)
  - Fiber Scheduler
  - 静的型解析(RBS、TypeProf)

Ruby 3.1 (2021):
  - YJIT(Yet Another JIT)
  - debug.gem(新デバッガー)

Ruby 3.2 (2022):
  - YJIT本番投入レベルに
  - WebAssemblyサポート(WASI)

Ruby 3.3 (2023):
  - YJIT更なる高速化
  - Prismパーサー

YJIT(ShopifyのJITコンパイラ):
  - Shopifyが開発
  - Ruby実行速度を~30%向上
  - 実運用で検証済み

Rails 7.xの特徴

# Rails 7の主要な変更点

# 1. Import Maps(JavaScript バンドラー不要)
# config/importmap.rb
pin "application", preload: true
pin "@hotwired/turbo-rails", to: "turbo.min.js"
pin "@hotwired/stimulus", to: "stimulus.min.js"

# 2. Hotwire(Turbo + Stimulus)
# HTML over the wire -- SPAなしでモダンなUI
# app/views/articles/create.turbo_stream.erb
<%= turbo_stream.prepend "articles" do %>
  <%= render @article %>
<% end %>

# 3. Active Record Encryption(暗号化)
class User < ApplicationRecord
  encrypts :email
  encrypts :phone_number, deterministic: true
end

パフォーマンス改善のアプローチ

Railsアプリのパフォーマンス改善戦略:

1. キャッシュ(最も効果的)
   - フラグメントキャッシュ
   - Russianドールキャッシュ
   - Redis/Memcached

2. データベース最適化
   - N+1クエリの解消(bullet gem)
   - インデックスの最適化
   - リードレプリカ

3. バックグラウンドジョブ
   - Sidekiq(Redis)
   - メール送信、画像処理等を非同期化

4. CDN活用
   - 静的アセットの配信

5. アーキテクチャ改善
   - パフォーマンスクリティカルな部分をGoに移行
   - マイクロサービス化

パフォーマンスの目安:
標準Rails    : ████ ~3,000 req/s
+キャッシュ  : ████████████ ~10,000 req/s
+YJIT       : ████████████████ ~14,000 req/s

まとめ

Rubyは「プログラマの幸福」を追求する言語であり、Ruby on Railsは今なおMVP開発において最速レベルの選択肢である。採用市場の縮小傾向はあるものの、GitHub、Shopify、Cookpadなどの大規模サービスが今もRailsを使い続けている事実は、Railsの実用性を証明している。

Ruby/Railsを選ぶべき判断基準:
[x] スタートアップのMVP開発
[x] 素早い機能開発・変更が必要
[x] CRUD中心のWebアプリケーション
[x] 少人数チームでの開発
[x] テスト文化を重視する
[x] 既存のRailsアプリの保守・拡張
[ ] パフォーマンスが最優先 --> Go/Rustを検討
[ ] AI/ML機能が中心 --> Pythonを検討
[ ] マイクロサービスを大規模に展開 --> Goを検討
[ ] リアルタイム通信が中心 --> Node.jsを検討

参考リンク