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
Railsアンチパターン_suzuki_mar_zeals.pdf
Search
suzuki masayuki
May 29, 2020
Programming
1
190
Railsアンチパターン_suzuki_mar_zeals.pdf
suzuki masayuki
May 29, 2020
Tweet
Share
More Decks by suzuki masayuki
See All by suzuki masayuki
ドメイン駆動設計の考えをもとに競合優位性や アウトカムを得る
suzukimar
0
170
ドメイン駆動設計に挫折をしないで一歩目を歩く
suzukimar
0
120
変更につよいユニットテストの書き方.pdf
suzukimar
2
72
Railsでクリーンアーキテクチャを考えてきた
suzukimar
5
2.3k
ストーリーで学ぶモジュラーモノリス
suzukimar
7
1.5k
ちょうぜつ本の紹介 (クリーンアーキテクチャとパッケージ原則)
suzukimar
1
690
実装パターンとテストパターンの紹介と組み合わせ方
suzukimar
2
160
技術的負債に関する怖い話と解決策の実例
suzukimar
1
780
最新の技術だけではなく基本も大事にしよう
suzukimar
1
200
Other Decks in Programming
See All in Programming
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
120
sappoRo.R #12 初心者セッション
kosugitti
0
250
密集、ドキュメントのコロケーション with AWS Lambda
satoshi256kbyte
0
190
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
600
社内フレームワークとその依存性解決 / in-house framework and its dependency management
vvakame
1
560
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
560
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
790
Domain-Driven Transformation
hschwentner
2
1.9k
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
230
『GO』アプリ データ基盤のログ収集システムコスト削減
mot_techtalk
0
120
Ruby on cygwin 2025-02
fd0
0
150
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
The World Runs on Bad Software
bkeepers
PRO
67
11k
Unsuck your backbone
ammeep
669
57k
Automating Front-end Workflow
addyosmani
1368
200k
Faster Mobile Websites
deanohume
306
31k
Designing for Performance
lara
604
68k
Practical Orchestrator
shlominoach
186
10k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
410
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
440
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Rails Girls Zürich Keynote
gr2m
94
13k
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!!