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
ノイジーネイバー問題を解決する 公平なキューイング
occhi
0
110
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
510
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
atmaCup #23でAIコーディングを活用した話
ml_bear
1
150
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
210
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
150
CSC307 Lecture 04
javiergs
PRO
0
660
CSC307 Lecture 09
javiergs
PRO
1
840
AgentCoreとHuman in the Loop
har1101
5
250
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
300
Featured
See All Featured
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
58
Large-scale JavaScript Application Architecture
addyosmani
515
110k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
RailsConf 2023
tenderlove
30
1.3k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Technical Leadership for Architectural Decision Making
baasie
2
250
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
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 終