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
310
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
23
なぜ書き込みDBと 読み取りDBを分けるのか?
suzukimar
0
240
緊張をしちゃう人用_のLTのやりかた
suzukimar
1
110
UseCaseクラスを使って FatControllerやFatModelにしない
suzukimar
3
680
ChatGPT にいる 9人の生成AIロールとの日常
suzukimar
1
450
CQRS/ESのクラスとシステムフロー ~ RailsでフルスクラッチでCQRSESを組んで みたことから得た学び~
suzukimar
0
510
バイブコーディング_TDD.pdf
suzukimar
0
220
RailsでCQRS/ESをやってみたきづき
suzukimar
2
2.4k
ドメイン駆動設計の考えをもとに競合優位性や アウトカムを得る
suzukimar
0
290
Other Decks in Programming
See All in Programming
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
350
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
280
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
450
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
2
210
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1.1k
数百円から始めるRuby電子工作
tarosay
0
120
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
140
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.5k
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
180
Claude Team Plan導入・ガイド
tk3fftk
0
250
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
200
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
So, you think you're a good person
axbom
PRO
2
2.1k
Claude Code のすすめ
schroneko
67
230k
Design in an AI World
tapps
1
270
The Mindset for Success: Future Career Progression
greggifford
PRO
0
430
The Cost Of JavaScript in 2023
addyosmani
55
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Skip the Path - Find Your Career Trail
mkilby
1
170
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
190
The Art of Programming - Codeland 2020
erikaheidi
57
14k
BBQ
matthewcrist
89
10k
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!!