Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Web現場Meetup#3 Ruby on Rails: the Good Parts 2018
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
urakawa
March 12, 2018
Programming
900
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Web現場Meetup#3 Ruby on Rails: the Good Parts 2018
https://pixta-inc.connpass.com/event/80223/
にて発表した内容
urakawa
March 12, 2018
Other Decks in Programming
See All in Programming
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
290
すこし踏み込む CancellationToken
htkym
2
1.7k
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
920
AmebaブログはKMPから卒業します
kmars0605
0
190
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
460
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
4
3.5k
残高管理から台帳サービスへの進化
artoy
1
200
Agents on Rails - Rails at Scale 2026
irinanazarova
0
560
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
Next.js: The final boss of Web Performance
guaca
0
250
ジョジョの世界をXRで再現する
mofurune
0
160
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
Are puppies a ranking factor?
jonoalderson
2
4.1k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Embracing the Ebb and Flow
colly
88
5.2k
4 Signs Your Business is Dying
shpigford
187
23k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Crafting Experiences
bethany
1
380
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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 終