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
Railsアンチパターン_suzuki_mar_zeals.pdf
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
suzuki masayuki
May 29, 2020
Programming
330
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Railsアンチパターン_suzuki_mar_zeals.pdf
suzuki masayuki
May 29, 2020
More Decks by suzuki masayuki
See All by suzuki masayuki
AIでの開発を楽にするために もう1つAIを使う
suzukimar
0
50
なぜ書き込みDBと 読み取りDBを分けるのか?
suzukimar
0
270
緊張をしちゃう人用_のLTのやりかた
suzukimar
1
150
UseCaseクラスを使って FatControllerやFatModelにしない
suzukimar
3
760
ChatGPT にいる 9人の生成AIロールとの日常
suzukimar
1
460
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
580
バイブコーディング_TDD.pdf
suzukimar
0
240
RailsでCQRS/ESをやってみたきづき
suzukimar
2
2.5k
ドメイン駆動設計の考えをもとに競合優位性や アウトカムを得る
suzukimar
0
310
Other Decks in Programming
See All in Programming
flutter_test のその先へ — Flutter アプリの LLM 機能に「評価」という品質保証を
kosukesaigusa
0
110
Event is what happens
moro
2
1.9k
R8 の設定見直しでアプリサイズ削減
andpad
0
230
ActionController meets Protocol Buffers
sorah
1
750
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
270
Next.js: The final boss of Web Performance
guaca
0
360
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
6k
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.2k
contenteditable と日本語入力に向き合う
colorful12
0
230
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
310
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
260
パスワード再設定メールのURLについて知っておこう
uyuki234
0
200
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
2
740
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
ラッコキーワード サービス紹介資料
rakko
5
5.5M
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
290
Six Lessons from altMBA
skipperchong
29
4.5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The Language of Interfaces
destraynor
162
27k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Docker and Python
trallard
47
4.2k
Discover your Explorer Soul
emna__ayadi
2
1.3k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Transcript
ZealsのRailsチームで抱えていた問題と対策したこと アンチパターンとその解決策 テクノロジー開発部 鈴木将之 (suzuki_mar)
• 自己紹介 • 今回話す目的 • アンチパターンと解決策 • まとめ Agenda
自己紹介
- StudyPlus - iOSアプリエンジニア - フリーランス - Zealsも社員ではなく、業 務委託 -
Rails, Ruby - OOP XP(TDD など) DDD Rails プロジェクト コードオーナー suzuki_mar :suzuki-mar :suzuki_mar : :suzuki_mar
今回話す目的
ZealsのRails プロジェクトで、アーキテクチャレベルでの リファクタをしてきました そのリファクタしてきた中で特に自分が重要だと思った内 容を説明します LTを聞いた人が関わっているプロジェクトのアーキテク チャを考えるきっかけにしてもらえたら幸いです 今回話す目的
Railsプロジェクトは、去年末ぐらいからアンチパ ターンに書いてあるよなリファクタを適宜していっ た 現在は、RailsでDDDを上手に活かす方法を模索中 今のRailsプロジェクトの状況
アンチパターンの説明に以下のプロジェクトを使用します プロジェクトの種類:TODOアプリ 実装している機能:Taskの作成、削除、編集 Taskを完了する Taskの予定の調整 Model Task Log TaskGroup
User Schedule サンプルプロジェクトの説明
1. Serviceクラスの名前を抽象的にする 2. 開発者だけでモデリングする 3. concernの乱用 4. 属人的なコードレビュー 説明するアンチパターン
アンチパターン1 Serviceクラスの名前を抽象的にする
サービスにしたい処理 Taskを作成するときに、TaskGroupなどの複数のレ コードをまとめて作成する そのクラス名をTaskServiceにしてしまう Serviceクラスの名前を抽象的にする アンチパターンの例
TaskServiceだと問題になってしまう箇所 • クラス名からなにをするServiceなのかがわかり づらい • 抽象的なので、どんどんサービスを加えてしま う ◦ その結果、クラスが肥大化してしまい、ゴッ ドクラスになってしまう
Serviceクラスの名前を抽象的にする アンチパターンになってしまう説明
名前を具体的にする:TaskCreatorなどにする • クラス名からタスクを作成するということが簡 単にわかる • 具体的なので、当初考えいていたサービスの責 務以外を加えない ◦ TaskCreatorに、Taskを削除するサービスを 追加することは不自然となる
Serviceクラスの名前を抽象的にする アンチパターンの改善案
アンチパターン2 開発者だけでモデリングする
プロダクトオーナーなどに意見を聞かずにRDBを設 計する RDBを設計した内容をモデリングとして扱ってしま う 開発者だけでモデリングする アンチパターンの例
エンジニアとプロダクトオーナーが話すときに、翻 訳が必要 プロダクトオーナー”Todoを完了したときに、Userのステータス を変更してほしい “ エンジニア “Taskを完了したときにUserのステータスを変更すればいいんで すね” (TodoはTaskと翻訳している) 開発者だけでモデリングする
アンチパターンになってしまう理由
先程の例のような言葉を翻訳する必要が出てく ほっておくと後々大きな問題になってしまう • 新しいエンジニアがチームに加入したとき ◦ 翻訳内容を覚えてもらう必要がある • 仕様などの複雑な会話をするとき ◦ 翻訳して話していくのがコストがかかってしまう
開発者だけでモデリングする アンチパターンになってしまう理由
先に、プロダクトオーナーなどの関係者と、モデル 名などの名前を決める 先程の例だとTaskにするのか、Todoにするのか その名前をもとに、RDBの設計やクラス設計をする 詳しくは、ユビキタス言語を参照 開発者だけでモデリングする アンチパターンの解決策
• ユビキタス言語をきめたあとも、ユビキタス言 語を使用するように保守をする ◦ コードレビューなどをする • ユーザーが別の名前を使用しているるとき ◦ プロダクトオーナーと相談をして、名前を変 更するかきめる
開発者だけでモデリングする アンチパターンの解決策
• RDBのテーブル名やカラム名を変更できなく なってしまう • 名前を変更するときに、変更するコストが莫大 になってしまう ◦ 技術的負債になってしまう • 別のサービスにも影響してしまう
◦ マイクロサービスの場合 開発者だけでモデリングする 放置すると
アンチパターン3 concernの乱用
委譲するコードを書くのがめんどくさいので、 concernを使用する Taskを完了したときと、Scheduleを変更したとき にメールを送信する処理を共通化するために concernを使用する concernの乱用 アンチパターンの例
処理をどこに定義してあるのかがわからりづらい concernでnotifyメソッドを定義する task.notify とかける だが、Taskを見ただけでは、notifyがどこに定義しているの かがわからない 修正するときに、コード検索をするなど手間が必要になり技 術的負債になっていs舞う concernの乱用 アンチパターンになってしまう例
処理を委譲する 共通にしたい場合は、Serviceクラスなどに定義す る コード例 Notify.send(task) そうすれば、コード例のようにどこに実装している のかがわかる concernの乱用 アンチパターンの解決策
concernを使用する場合は、concernを使用する以 外に選択肢がないのかを考える 処理を共通化したいだけなら、サービスクラスを作 成する concernの乱用 アンチパターンの解決策
アンチパターン4 属人的なコードレビュー
コードレビューで判断する項目がないので、レビュ アーが各自で判断して、RequestChangeやApprove をする 属人的なコードレビュー アンチパターンの例
Aさんは小さいところ(NITS)でも、RequestChangeにする Bさんは、テストコードを書いていないとかの、確実に RequestChangeにするべきところでも、Approveしている コードレビューで担保したいところを守れていなかったり、 必須じゃないところでも変更してしまう 属人的なコードレビュー アンチパターンになってしまう例
コードレビュー時にMustなところを、GitHubのPRのテンプ レートに書く(PULL_REQUEST_TEMPLATE.md) レビューイ(レビューしてもらう人)は、PRを出す前に自分で チェックをする レビュアーは、Mustなところをチェックして、対応していな かったらRequestChangeにする 属人的なコードレビュー アンチパターンの解決策
• ユニットテストを書いているか • N+1がないか • クラス設計が適切か ◦ Serviceにするべき処理をModelに書いていないか • APIドキュメントを書いているか
属人的なコードレビュー チェックするべき例
チェック項目は、あくまでもリストアップしたもの リストアップに含まれていないけど、マージしたらまずいも のはあるので、そのときはコメントする 必要であれば、RequestChangeにする あまりにも頻繁に発生するものや、今後絶対にマージ指定は いけないものは、チェック項目に追加していく 属人的なコードレビュー チェック項目じゃないけどコメントしたい場合
自動化できるところは自動化する CIなどで、チェックを自動化できるところはチェックを自動 化する仕組みづくりをする bulletなどのGemも積極的に利用する 人間が確認するところは、目視で確認する クラス設計などは目視で確認したほうが確実 属人的なコードレビュー 補足
まとめ
まとめ • Serviceクラスは具体的な名前をつける • プロダクトオーナーなどと一緒にモデリングする • concernを使用しないで共通化できる方法を考える • コードレビューで確実にチェックする場所は、PRの Templateに定義する
まとめ 今回のアンチパターンはZealsのRailsプロジェクトで対応したアン チパターンです プロジェクトによっては、今回説明したアンチパターンでも問題 ないケースもあります みなさんのプロジェクトでもアンチパターンとなっていそうな部 分を共有していただきたいです
LET'S START NEXT INDUSTRIAL REVOLUTION WITH OUR FLYING SHUTTLE
アピールポイント • ChatBotの広告(チャットコマース)という新しいドメインモデリングができます • 社内のユーザーが多く使用している広告管理画面を作成するので、フィードバック をもらえやすいです ◦ サービス自体は、日本のChatBot広告システムとして、エンタープライズ市場 NO1なので、大きなクライアントにも使用してもらっている •
RailsでDDDをうまく使っていく方法を模索できる ◦ DDDの勉強会や設計共有会を頻繁にしている ◦ DDD歴が長いアドバイザーからRailsのDDDについて教えてもらえる
Thank you!!