プロトタイピングの仕組みを用意して確認しながらサービスを改善する

みんなのウェディング 松久です。

みんなのウェディングでは、常にサービスを改善するために、新しい機能を加えたり、既存の機能を変更したりします。しかし、実際にその機能を公開してみると、想定していた数字の変化が起きなかったり、思わぬところに影響が発生したりすることもあります。

そこで、みんなのウェディングではプロトタイピングを行える仕組みを取り入れてサービス改善を進めるようにしました。

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からご連絡ください。