ある程度大きな規模の実際に動くサンプルを呈示する
- 現実のプロジェクトの即した複雑性
- 外部コンポーネントを含む (swing, XMPP)
- イベントドリブン、マルチスレッド、分散環境
- 現実味のあるストーリー
- 「下した決定が間違っていたことが後になって判明したせいで引き返さねばならなくなった」
- 往々にして発生するが、放置しておくと、後になって高い代償を払うことになる
- きわめてインクリメンタルな開発
- テストによって保護された継続的な(小さく安全な)リファクタリング
- 常に動くシステム
概要:
- 開発に入るまでのストーリー
- 実装するアプリケーションの概要や要件、用語の定義等を行う
- とっかかりとなるフィーチャ一覧もここで呈示
オークションの競り落としを自動で行うアプリケーションの構築を依頼された。
- オークションスナイパー を作成することに決定
- オンラインオークションを監視し、逆指値に達するまでは、自動で入札を行う
- バイヤー集団(依頼者)は、何を構築すべきかを明確にする上で、手を貸してくれることに合意
混乱を避けるために、まず用語定義(合意)が必要になった。
- 商品: 一意に定め、購入することができるもの
- 入札者: 商品を購入したいと思っている人または組織
- 入札: 入札者が商品に対しての所定の代金を払うという声明
- 現在価格: 商品に対して行われた、現在もっとも高額な入札
- 逆指値: 入札者が商品に対して払える最高金額
- オークション: 商品に対する入札を管理するプロセス
- オークションハウス: オークションを開催する団体
要件をリストアップしたが、一度に全てを作るのは無理そうだった。
- まずは、基本的な機能を備えたアプリケーションを作ということで合意
- 一旦、そのようなアプリケーションができあがれば、後からより良いものにしていくことも可能
調査の結果、オークションのオンラインシステムに関して、以下のことが判明
- 競売は商品ごとに行われる => 特定の競売は商品IDに紐付けて参照することに
- スナイパーアプリケーションは購入した商品の管理はする必要がない => 他のシステムが担当
オークションスナイパーの要件
- Java Swingアプリケーション
- ユーザは一度に複数の商品を入札可能
- 対象の各商品に対して、IDと逆指値、現在価格、ステータスを表示
- バイヤーはユーザーインターフェースを通じて、対象商品を追加可能
- オークションハウスから来るイベントに応じて、表示内容は変化
- ラフバージョンのイメージ: 図9-1
サザベー(オークションハウス)のオンラインシステム
- やりとりにはXMPP(jabber)を使用
- 図9-2: オンラインシステム上での、バイヤーとオークションハウスの関係
- 競売の進行に合わせて、コマンドとイベントを送りあう
コマンドとイベント:
-
入札者は コマンド を送信する
- 参加コマンド: オークション参加時に送信。XMPPメッセージの送り手=入札者。チャットセッションの名称で商品を特定。
- 入札コマンド: 入札を行う時に価格を送信。
-
オークションは イベント を送信する
- 価格イベント: 現在受理されている価格(+ 入札者および次の最低増額分)を報告するイベント
- 新しい入札者が参加した場合、その入札者に送信
- 新しい入札が受理された場合、全ての入札者に送信
- 終了イベント: オークション終了を報告するイベント
- 価格イベント: 現在受理されている価格(+ 入札者および次の最低増額分)を報告するイベント
図9-3: 入札者の振る舞いのステートマシン
- 参加 => 入札(ループ) => 終了 => 落札 or 落札失敗
- 第18章まで逆指値は無視
- 各メッセージ(イベント or コマンド)は、単一行で表現され、 "{キー}: {値};" の繰り返し (本書の例を参照)
- 対象商品はログイン名で識別
- ID12793の商品を入札したいなら「オークション-12793」というユーザとチャットを開始する
このように小さなアプリケーションでさえ、一度に作るには大きすぎる。
- 完成までに歩むことになるであろうステップを、おおまかに理解する必要がある
- インクリメンタルな開発では、機能をスライスし、一度に少しずつ構築できるようにすることが重要
- スライスは、
- いつ完成したかをチームがわかるように、意味を持ち、具体的でなければならない
- ひとつの概念に集中し、すぐに完成できるよう十分小さいものでなければならない
- メリット:
- 一貫した小さな塊に分割することで、開発のリスクが管理可能になる
- 進捗に対する具体的なフィードバックを定期的に得られるので、ドメインや扱う技術についてより多くのことをチームが理解したときに、計画を調整することが可能
- スライスは、
さしあたりやるべきことは、
- スナイパーアプリケーションのためのインクリメンタルな開発ステップを一通り明らかにする
- 最初に作るべきものは構築できる最小のフィーチャ => 「動くスケルトン」(P.36)
- Swing,XMPPおよびアプリケーションを最短距離で通り抜けるスケルトン
- 各コンポーネントをつなぎ合わせられることを示せれば十分
- 後に続くステップはそれぞれ、既にあるアプリケーションに対して複雑さを一要素ずつつけ加える
結果として出てきたフィーチャ一覧:
- 商品ひとつ: 参加し、入札せずに落札に失敗する
- コアとなる基盤をまとめる立ち上げ用。第10章で扱う
- 商品ひとつ: 参加し、入札し、落札に失敗する
- 基本的な疎通に入札を追加する
- 商品ひとつ: 参加し、入札し、落札する
- 落札者を識別する。ユーザーインターフェースに価格の詳細表示を追加する
- 複数の商品を扱う
- ユーザインタフェースから商品を追加する
- 逆指値で入札をやめる
ユーザインターフェースの優先度は逆指値よりも高く設定。
より複雑なシナリオは、上記のフィーチャ一覧の実装が終わってから。
- これは、現実的なアーキテクチャではない
- これは、アジャイルな計画づくりではない
- これは、現実的なユーザビリティ設計ではない