「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」の発表資料が素晴らしい #devsumi
デブサミ2014の発表資料を読んでいて、僕の中では「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」が一番心に残った。
ラフなメモ書き。
以下の発表資料の文章を引用している。
2014/02/14 デブサミ2014【14-A-6】Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所 #devsumiA - Togetterまとめ
【0】背景
この発表資料は、「Scalaを使ってWebサイトを構築、運営してみようとしているリーダーさん向け」。
ニコニコ動画のPHPソースがレガシー遺産という負債となっていた。
リファクタリングしたものの、抜本的な対策が必要と痛感。
そこで、ニコ生動画を書き直すニコ生2プロジェクトが発足した。
目的は、スケーラビリティ・フォールトトレランス・保守性・パフォーマンスの品質を担保すること。
チームは4人から始まった。
【1】Scala
Scalaの利点は、静的型付けを持ち、保守性も高そう。
そして、関数プログラミングによる並列処理も実装可能。
但し、PHPプログラマからScalaへ移る場合、アルゴリズムとデータ構造、関数型プログラミングの考え方などのサポートが必要。
社内で勉強会を開く、など。
【2】PlayFramework+ドメイン駆動開発
ドメイン駆動設計で、UI層→アプリケーション層→ドメイン層→インフラ層の4層構造というレイヤードアーキテクチャ。
ユビキタス言語を使ったドメインという業務知識の共有。
コアの蒸留、汎用サブドメインの分離によるモジュール化。
Play2/Scalaはドメイン駆動設計を実践するのにとても良いフレームワーク。
・CoCがきつくなく好き勝手フォルダが掘れる。
・マルチプロジェクト機能でサブモジュールの依存関係を作れ、レイヤー ドアーキテクチャの強制できる。ドメイン層、インフラ層はplayに依存しないただのjar。
・case classがエンティティと値オブジェクトの作成のコストを下げる。例えば、インフラ層ORMのマッピングクラスとドメイン層のエンティティを分けることなどが苦にならない。
・play2を捨てられるように開発することが可能。
僕の感想としては、この部分が一番なるほど、と感じた所。
ドメイン駆動設計では、ドメインが明確になるために、オブジェクト指向設計の長所を適用できる。
更に、ドメイン駆動設計は小規模リリースと相性の良い設計手法なので、新しいフレームワークの基盤の上に機能を少しずつ追加していく時に役立つだろう。
但し、ドメイン駆動設計は敷居が高い。
「リファクタリング」「UMLモデリングの本質」「アナリシスパターン」「エンタープライズ アプリケーションアーキテクチャパターン」の4冊を読んでおかないと、「ドメイン駆動設計」の凄さが分からない。
この点も僕も同感。
振り返ってみれば、僕も、Javaの勉強のために「リファクタリング」、オブジェクト指向設計の勉強のために「UMLモデリングの本質」「アナリシスパターン」、アーキテクチャ設計のために「エンタープライズ アプリケーションアーキテクチャパターン」を読んでいたから、「ドメイン駆動設計」に出てくるたいていのパターン名が何を意味していてどんな背景から生まれたのか、はすぐに分かった。
つまり、ドメイン駆動設計は、先人の設計手法の積み重ねの上にある。
ドメイン駆動設計をいち早く理解するには、下記のYouTube資料が良いらしい。
視聴してみると、確かに「何がドメインであり、何がドメインでないか」はよく分かるのでお勧め。
20110409_DevLOVE「Building Blocks」_都元ダイスケさん - YouTube
また、ScalaのWebフレームワークであるPlayフレームワークを使っている点も上手い。
Struts→Seasar、Spring→Wicket、Playへ発展した経緯を考えると、RailsのようなPlayフレームワークは、今後のJavaプログラマには必須のフレームワークになるだろう。
ScalaのWebアプリケーションフレームワーク「Play Framework」入門 ~(1)環境構築とスタートアップアプリの作成 (1/6):CodeZine
但し、Play2/Scalaの弱点として、下記が挙げられていた。
今後のPlay2/Scalaの改善点になるだろう。
1. sbtが遅すぎる。
→proxyを作ったり、良いマシンを使うぐらいしかない
2. Play2のscalaテンプレートが、コンパイル遅く、文法がデザイナー にやさしくない仕様。
→Groovyテンプレートで作成。 github/dwangoでフォークしたも のを公開中
3. テストで困るobjectとtraitと関数引数。
→specs2のmockitoの制約。objectのモック作れない、traitはmixin が必要、ジェネリクスパラメーターが付いた関数引数のメソッド を拡張できない。
【3】Scrumはリーダーを育てる
「自身のウォーターフォール開発とアジャイル開発のプロジェクトマネージャ経験」として、以下の苦い経験があった。
1. 過去4度のフォーターフォール開発と、大失敗の経験。
→要求が変更されてしまうと地獄。不確定要素に対応するためのバッファ重要。最後のしわ寄せは品質に。
2. 要件が確定できない、また、要求の優先順位が日々変わる場合、アジャイルとスクラムの考えが良い
→日々変わるチームの目標への柔軟な対応が必要なWeb開発
「Scrumはリーダーを育てるのにすばらしい手法である」理由は下記の通り。
・会議体が固定
・JIRA/GreenHopperなどのサポートツール
・書籍が充実している
・プランニングポーカーでの見積もりが、スクラムマスターを孤立させない
・全員が全ての帽子をかぶるので段階的にスクラムマスターにさせ ることが可能
この点は、すごく納得した。
開発チームを運営する役割であるプロジェクトリーダーには、アジャイル開発やWF型開発に限らず、最低限3つのスキルが必要だと思っている。
一つ目は、体制図。
つまり、案件に出てくる利害関係者の関係をグラフにまとめたもの。
普通は、プロジェクト立上げ時に真っ先に書くべきもの。パワポやVisioなどで書く。
WF型開発の大規模プロジェクトほど、利害関係者が多くなり、誰がどんな役割で動くべきか、をきちんと定義しないと、無駄なコミュニケーションばかり増えて、プロジェクトが進まなくなる。
Scrumの良い点は、アジャイルなスクラムチームには、プロダクトオーナー・スクラムマスター・チームの3つだけでロールが十分であると定義していること。
更には、「ニワトリとブタ」の話のように、スクラムチームに所属していない利害関係者から開発チームを守る仕組みが提供されていること。
これによって、体制図はとても簡単な構造になり、コミュニケーションを取りやすくなれる。
また、それぞれの役割が明確なので、Scrumのフレームワークに従って行動すればいい。
2つ目は、概要スケジュール。
つまり、タスクの詳細を書いたガントチャートではなく、各工程、各プロセスの前後関係を明確にしたPERT図。
普通は、プロジェクト立上げ時に、マイルストーンを意識しながら、どんな工程が必要かを洗い出し、各工程のInとOutをつなげて書くので、自然にPERT図になる。
この概要スケジュールを元に、概算で見積りし、詳細なスケジュールを落としこんでいく。
Scrumでは、大まかなリリース計画(ロードマップ)をプロダクトオーナーが決めて、それを実現するためにストーリーに分割してバックログへ優先順位ごとに並べる。
開発チームは、バックログのストーリーの順に従って開発していくだけでいい。
また、スプリントごとに出荷してデモするから、利害関係者も定期的にソフトウェアを評価して、ロードマップ通りに進んでいるかをチェックすることもできる。
3つ目は、コミュニケーション計画。
つまり、体制図に書かれた利害関係者といつどこでどんな会議をするのか、という会議体の構成図。
普通は、顧客との月次進捗定例、複数の開発チームリーダー同士の週次の課題管理定例、開発チーム内の毎日の朝会、などがコミュニケーション計画になるだろう。
これらの会議体がスムーズに運営されなければ、プロジェクトの障害や課題がスムーズにエスカレーションされず、納期が遅れたり、品質悪化の原因になる。
しかし、たいていは、会議の運営コストが大きすぎて、プロジェクトリーダーは常に会議の資料の準備に追われたり、1日が打合せだけで終わってしまう時も多い。
Scrumの良い点は、デイリースクラムという毎朝の15分の朝会が会議体として決まっていて、その会議だけで十分であること。
デイリースクラムで進捗を確認できるだけでなく、メンバーが抱える課題を早期に見つけ出すこともできる。
更に、スプリントの最後には、製品評価であるスプリントデモや、スプリントをふりかえるスプリントレビューがフレームワークとして準備されているので、定期的に直近のスプリントを評価し、改善策を考えるきっかけにもなる。
「スクラムマスターはScrumプロセスの守護神」という考え方は、この会議体のスムーズな運営によって支えられているわけだ。
発表資料では、上記以外にも、「スクラムマスターも常にプレーイングマネージャーであれるようにする」「ユーザの要求理解に時間をかける」「企画と相談する時は、重要度ではなく常に要件の優先度で議論する」「インフラチームや他チームとの共同作業は合流バッファを考える」など、プロマネがプロジェクト管理で気を付けるべき点について、たくさんの経験談が含まれていて、とても参考になった。
| 固定リンク
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
「モデリング」カテゴリの記事
- アーキテクチャ設計はベストプラクティスを参照するプロセスに過ぎないのか?~Software Processes are Software, Too(ソフトウェアプロセスもまたソフトウェアである)(2024.09.22)
- 「システム開発・刷新のためのデータモデル大全」を読み直した感想~親子頻出アンチパターンは初心者モデラーに多い(2024.08.31)
- 「システムアーキテクチャ構築の原理」の感想part2~非機能要件がシステムのアーキテクチャに影響を与える観点をプロセス化する(2024.05.06)
- 「システムアーキテクチャ構築の原理」の感想(2024.05.06)
- ソフトウェア工学の根本問題から最近のソフトウェア設計を考えてみる(2024.03.03)
「プロジェクトマネジメント」カテゴリの記事
- 「スクラムの拡張による組織づくり」のScrum@Scaleの感想(2024.03.31)
- ストラテジストとプロジェクトマネージャの役割の違いは何なのかpart2~プロセスのレイヤと達成目標のレイヤが異なる(2023.02.18)
- ストラテジストとプロジェクトマネージャの役割の違いは何なのかpart1~CSFはWBSみたいなものと捉える(2023.02.14)
- PM理論では課業志向の方が関係志向よりも生産性が高いことを主張しているのではないか(2023.01.22)
- 現代日本人の弱点はリーダーシップ不足と生産性が著しく低いこと、そしてリスク許容度が著しく低いことだ(2022.12.23)
「ソフトウェア工学」カテゴリの記事
- アーキテクチャ設計はベストプラクティスを参照するプロセスに過ぎないのか?~Software Processes are Software, Too(ソフトウェアプロセスもまたソフトウェアである)(2024.09.22)
- 「システムアーキテクチャ構築の原理」の感想part2~非機能要件がシステムのアーキテクチャに影響を与える観点をプロセス化する(2024.05.06)
- 「システムアーキテクチャ構築の原理」の感想(2024.05.06)
- ソフトウェア工学の根本問題から最近のソフトウェア設計を考えてみる(2024.03.03)
- マイクロサービス設計は従来のアーキテクチャ設計と何が違うのか(2024.01.02)
「Agile」カテゴリの記事
- 「システムアーキテクチャ構築の原理」の感想part2~非機能要件がシステムのアーキテクチャに影響を与える観点をプロセス化する(2024.05.06)
- 「スクラムの拡張による組織づくり」のScrum@Scaleの感想(2024.03.31)
- ソフトウェア工学の根本問題から最近のソフトウェア設計を考えてみる(2024.03.03)
- 「GitLabに学ぶ 世界最先端のリモート組織のつくりかた」の感想(2023.12.10)
- 概念モデリングや設計原則は進化しているのか(2023.10.21)
「パターン言語」カテゴリの記事
- アーキテクチャ設計はベストプラクティスを参照するプロセスに過ぎないのか?~Software Processes are Software, Too(ソフトウェアプロセスもまたソフトウェアである)(2024.09.22)
- パターンカタログよりもモンスターカタログの方が面白いね #jasstkansai(2023.06.24)
- XPエクストリームプログラミングは偉大だ~時代がその設計思想に追いついた(2022.11.16)
- 「大人の学びパターン・ランゲージ」の感想~知識と経験を行ったり来たりするタイミングを大切にする(2022.06.05)
- 知識は経験よりも大切か、経験は知識よりも勝るのか、SECIモデルは相互作用を語る(2022.04.26)
コメント