みんなのウェディング 松久です。
みんなのウェディングでは、常にサービスを改善するために、新しい機能を加えたり、既存の機能を変更したりします。しかし、実際にその機能を公開してみると、想定していた数字の変化が起きなかったり、思わぬところに影響が発生したりすることもあります。
そこで、みんなのウェディングではプロトタイピングを行える仕組みを取り入れてサービス改善を進めるようにしました。
Motorhead
プロトタイピングは、既存の機能を提供しつつも一部の機能を特定の人にだけ公開する仕組みです。このような仕組みを実現するために、Motorhead という Ruby の gem を利用しています。Motorhead の説明には下記のように書かれています。
Motorhead is a prototyping framework for Rails. It’s something akin to “feature toggle”. It can be used for “A/B testing” as well. But essentially, the main purpose of this framework is to provide a way to rapidly and safely deliver new features to the production environment.
- Ruby on Rails のためのプロトタイピングフレームワークである
- 安全に、迅速に本番環境に限定した新しい機能を提供することができる
Motorhead は、Rails::Engine の仕組みを利用しています。テスト公開したい機能を1つのディレクトリにまとめることができ、他のコードと競合することなく公開することができます。 また、Motorhead が提供するジェネレーターにより、迅速にプロトタイピングのための環境を用意することができます。
Motorhead を使ってみる
Motorhead 実際に使ってみるまでの流れを追ってみます。今回のサンプルでは、1/2 のユーザに機能を提供します。
Rails アプリケーションを作る
rails new motorhead_app
Gemfile の設定
Gemfile に下記の内容を追記します。
gem 'motorhead', require: ['motorhead', 'motorhead/road_crew']
Gemfile に追記後に bundle install
します
scaffold
scaffold でサンプルを作ります。書籍(book)と著者(author)について用意します
rails generate scaffold Book name:string price:integer description:text
rails generate scaffold Author name:string description:text
rails generate model BookAuthor book_id:integer author_id:integer
rails generate motorhead
- motorhead を利用して試したい機能を提供する Rails::Engine の雛形を作ります
- helper や、assets なども準備されます
rails generate motorhead new_books
engine.rb を設定
- 限定条件は、engine.rb に記載することができます
- 今回は、1/2 の確率で機能を提供するようにします
require 'motorhead/engine'
module NewBooks
class Engine < ::Rails::Engine
include Motorhead::Engine
active_if { rand(2).odd? }
end
end
routes.rb の設定
http://localhost:3000/books にアクセスしたら、Motorhead の Controller を使うように routes.rb を設定します
NewBooks::Engine.routes.draw do
resources 'books', only: %w(index)
end
controller の設定
- 置き換える Controller を用意します
include Motorhead::Controller
を記載します- scaffold で用意した BooksController を継承します
- 用意した
NewBooks
という Rails::Engine の Controller になるので、名前空間を指定します
- 用意した Controller に試したい機能の処理を書きます。
super
を書かない場合だと全て新規に処理を書くことができます
class NewBooks::BooksController < ::BooksController
include Motorhead::Controller
def index
super
@authors = Author.all
end
end
view の設定
- motorhead で作った app/engines/new_books/app/views にviewを設置します
- app/engines/new_books/app/assets/stylesheets にある CSSファイルを読み込みます
- renderでは、app/views にあるファイルを読み込みます
テンプレートファイル
- layouts は
app/views/layouts/application.html.erb
が使われます
<%= stylesheet_link_tag "new_books/application", media: "all" %>
<%= render 'books/title' %>
ファイルツリー
出来上がったファイルツリーは下記のようになっています。
└── app
└── engines
└── new_books
├── app
│ ├── assets
│ │ ├── images
│ │ │ └── new_books
│ │ ├── javascripts
│ │ │ └── new_books
│ │ │ └── application.js
│ │ └── stylesheets
│ │ └── new_books
│ │ └── application.css
│ ├── controllers
│ │ └── new_books
│ │ └── books_controller.rb
│ ├── helpers
│ │ └── new_books
│ │ └── application_helper.rb
│ ├── mailers
│ ├── models
│ └── views
│ ├── layouts
│ │ └── new_books
│ │ └── application.html.erb
│ └── new_books
│ └── books
│ └── index.html.erb
├── config
│ └── routes.rb
├── lib
│ ├── new_books
│ │ ├── engine.rb
│ │ └── version.rb
│ └── new_books.rb
└── new_books.gemspec
プロトタイピングのための処理を削除する
プロトタイピングを行える仕組みがないと、あちこちにプロトタイピングのための処理を書くことになります。このようにして作ると、不要になったコードを削除するのも大変です。また、不要になったテンプレートファイルや画像ファイルが残っているとリポジトリも大きくなっていきます。
Motorhead では、先ほどのサンプルでいうと、app/engines/new_books
にプロトタイピングのために必要になったファイルが1つのディレクトリにまとまります。ディレクトリを削除すればプロトタイピングのためのコードやファイルは削除できます。
まとめ
プロトタイピングは、サービス改善のために行った新機能や機能改善を作ってから確認する方法の一つです。
プロトタイピングを行える仕組みを準備しておくことで、すでに提供している機能について影響をあたえずに、一つ一つ確かめてサービスの改善を行うことができます。
みんなのウェディングは、サービスの改善に真摯に取り組みたいソフトウェアエンジニア、UXデザイナーを募集中です。興味のある方は、Wantedlyからご連絡ください。