Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Web現場Meetup#3 Ruby on Rails: the Good Parts 2018
Search
urakawa
March 12, 2018
Programming
0
870
Web現場Meetup#3 Ruby on Rails: the Good Parts 2018
https://pixta-inc.connpass.com/event/80223/
にて発表した内容
urakawa
March 12, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
LLM Çağında Backend Olmak: 10 Milyon Prompt'u Milisaniyede Sorgulamak
selcukusta
0
150
re:Invent 2025 のイケてるサービスを紹介する
maroon1st
0
160
JETLS.jl ─ A New Language Server for Julia
abap34
2
470
2年のAppleウォレットパス開発の振り返り
muno92
PRO
0
180
Cap'n Webについて
yusukebe
0
160
.NET Conf 2025 の興味のあるセッ ションを復習した / dotnet conf 2025 quick recap for backend engineer
tomohisa
0
110
gunshi
kazupon
1
140
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
160
Grafana:建立系統全知視角的捷徑
blueswen
0
280
Basic Architectures
denyspoltorak
0
190
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
240
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
0
1.9k
Featured
See All Featured
Balancing Empowerment & Direction
lara
5
840
Getting science done with accelerated Python computing platforms
jacobtomlinson
1
94
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
220
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
58
41k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
75
Tell your own story through comics
letsgokoyo
1
780
Large-scale JavaScript Application Architecture
addyosmani
515
110k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
Transcript
Ruby on Rails: the Good Parts 2018 ピクスタ株式会社 プラットフォーム本部 開発部
エンジニア 大村 直人 (twitter: @urakawa) Web現場meetup #3
こんにちは!
みなさんはじめまして。ピクスタの大村です。 2016 年 12 月 ピクスタ(株) 入社 2017 年 6
月より現職(fotowa 担当)
fotowa のご紹介 写真を撮影したいユーザーと、登 録フォトグラファーをマッチング し、 人生のイベントや大切なひと時を プロの手でハイクオリティな写真 に残す 「出張撮影」プラットフォームサー ビスです。
https://fotowa.com
よろしく お願いします!
Ruby on Rails: the Good Parts 2018
Ruby on Rails: the Good Parts 2018
大きくなっていく Railsアプリケーションを 改善し続けるための取捨選択 〜fotowa の事例 2018〜
• Rails 5.1 / 5.2 の新機能の話 (Active Storage は早く使ってみたいですね) •
フロントエンド(JavaScript)の話 • 教育や組織論の話 話さないことリスト
年末にブログを書きました http://texta.pixta.jp/entry/2017/12/07/113000
https://qiita.com/urakawa/items/3d7777e6734cb5c15bd1
fotowa のサービス規模 • 月間撮影件数(最大実績) 1,800 over • 2017 年間撮影件数 YoY
+600% over • 総登録フォトグラファー 500 over オープンから2年が経ちました 一定の規模のビジネスになってきたが、 まだまだサービスとして成長・拡大が期待されるフェーズ
fotowa のプロジェクト規模 • プロダクトオーナー 1 • エンジニア 4 • デザイナー
3 • 運用・ビジネスサイド担当 5 + α オープンから2年が経ちました 一定の規模のビジネスになってきたが、 まだまだサービスとして成長・拡大が期待されるフェーズ
fotowa のシステム規模 • Ruby (バックエンドのアプリケーション) 8000行 • Ruby (テストコード) 4500行
• DB マイグレーションファイル 1000行 • ビューテンプレート 13000行 オープンから2年が経ちました 一定の規模のビジネスになってきたが、 まだまだサービスとして成長・拡大が期待されるフェーズ
fotowa 開発チームの課題 • ステージの変化 ◦ 早いリリースから、安定した運用と継続的な拡張へ • 拡大していく規模 • メンバーの入れ替わり
→ ノウハウの保持と規律の確保
Rails の生産性の意味 Rails Doctorine ( http://rubyonrails.org/doctrine/) より (邦訳 http://postd.cc/rails-doctrine/) ひとりで完結して統合システムを記述することができる。
→ 実装開始からサービス開始までの速度重視 *一人の時は、知識のばらつきが問題にならない It is this focus on empowering the individual that points to the integrated system. (統合システムに目を向けるのは、個人に能力を与えることに重点を置いているからで す。)
チームで書くコードの原則 • 書く時間よりも読む時間の方が長い • 一貫性を保とうとする姿勢 同じ気持ちで読み、そして書けるチームの生産性が高い ルール/ガイドラインに従う → 前提:ルール/ガイドラインを作る (ベストは2人目が入る前に)
ルール/ガイドラインの目的 天才(一人目)が書くコードをブラックボックスにしない
fotowa チームのガイドライン(抜粋)
大原則 • Rails のレールには乗る ◦ CoC (設定より規約) ◦ ActiveRecord ◦
コントローラの基本7アクション • 機能を「あるから使う」は NG ◦ DHH の気持ちになって適切な使い所を考える
大原則 • オブジェクト指向設計に真面目に取り組む ◦ カプセル化と継承とポリモーフィズム ◦ OOP デザインパターンを学ぶ ◦ データの流れを簡潔にする
• 読んでビジネス要件を理解できるコード
推奨 (1) composed_of http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html より ActiveRecord の属性をValueObjectとして表す
Value Object とは? 「シンプルで小型なオブジェクト」で int や string, datetime などを ラップして、意味と振る舞いを与える
推奨 (2) サブリソースのコントローラ http://postd.cc/how-dhh-organizes-his-rails-controllers/ より 一つのコントローラにアクションが大量にあると、 役割がわかりづらくなっていく
推奨 (3) イミュータブルデータモデル UPDATE を最小限にしてモデルの複雑性を下げる 「更新されるのはどこか?」を設計上明確にする
撮影案件周辺のER図抜粋
推奨 (4) 極小 Controller、大きめ Model 1. サブリソースのコントローラを積極利用(前述)で、 一つの Controller のコードで、最大130行
2. Model の責務を適切に分担するオブジェクト群を 用意する
None
推奨 (4-a) ViewObject ビューに関するロジックを ActiveRecord から分離する draper gem を利用して実装
推奨 (4-b) FormObject フォーム入力のデータをロジックに渡す処理を分離する
推奨 (4-c) FinderObject・QueryObject オブジェクトのライフサイクル(Read系)を分離する
推奨 (4-d) ServiceObject アプリケーションの都合を Controller / Model から分離する
非推奨 (1) before_action, after_action • 本当に共通処理ですか? • クラス変数の代入なんかしたら見通し悪くないですか? 「ログインしてなかったらログインフォームにリダイレクト」など、共 通のフィルタリングにのみ使う
Rails 3 までは、「before_filter」という名前だった
非推奨 (2) ActiveRecord コールバック • 非同期処理でも Observer パターンでもない • AやってBやって…って処理の流れを追えますか?
ビジネスとして必然性のある処理はコールバックに書かない 使っていい例: • アプリケーションログを出力 • キャッシュをクリア
非推奨 (3) ViewHelper, ActiveSupport::Concern かなり具体的で全体に影響する共通実装のみ 現在、 fotowa では helper 合計
120 行、concerns 合計 25行
非推奨 (4) accepts_nested_attributes_for 通常、複数オブジェクトをフォームで取り扱う場合、FormObject を利用した方が柔軟性が高い 「このクラス経由でしか、この関連にはアクセスしない」という場合 のみ使う 常に一つのかたまりとして扱う
使用例
非推奨 (5) メタプログラミング メタプログラミングをアプリケーション内部に持ち込まない (あっという間に読めなくなる) メタプログラミングの手法はライブラリに隠蔽し、アプリケーション はその成果としての DSL を利用する (DSL
の仕様については必ずドキュメントを残す)
fotowa アプリケーション内の唯一それっぽいコード
まとめ:取り組みの目的 ノウハウの保持と規律の確保 • 「チームのコード」と「自分のコード」を同一にする • 共有と共通理解をチームの生産性向上の糧とする • Rails や周辺の変化への対応をより簡単にする
None
ご静聴 ありがとう ございました!
Ruby on Rails: the Good Parts 2018 ピクスタ株式会社 プラットフォーム本部 開発部
エンジニア 大村 直人 (twitter: @urakawa) Web現場meetup #3 終