2013年1月24日木曜日

1.4 3つの真実- アジャイルサムライを読んで考える


アジャイルサムライを読み進めながら、自分の業務と照らし合わせながら、落とし込み方を考えていきます。
チケット管理システム(RedmineやBacklog、tracなど)やCIツールとしてJenkinsを使っているので、その使い方と合わせながら考えて行きたいと思います。


  1. プロジェクトの開始時点にすべての要求を集めることは出来ない
  2. 集めたところで、要求はどれも必ずといっていいほど変わる
  3. やるべきことはいつだって、与えられた時間と資金よりも多い

プロジェクトの開始時点にすべての要求を集めることは出来ない

要求とは発見されるものであり、全てで揃うまで進めないと言うことではない


具体的には・・・


要件定義を完璧にしても必ず漏れが出る


実際に開発に入ってからそういえばあれって・・・なんてことはよくあることです。

集めたところで、要求はどれも必ずといっていいほど変わる


 変化とは恐れるものでも避けるものでもなく、起きるもの。



具体的には・・・


変化するものという気持ちでいれば、仕様変更もえーっと思うことがなくなります。
必要に応じて計画を変更していくようにします。
計画の変更をしないまま要求を受け入れようとするので避けたいと思ってしまうのかもしれませんが。。。

やるべきことはいつだって、与えられた時間と資金よりも多い


優先順位をつけて優先度の高いものからこなしていく

具体的には・・・


必ず必要な機能、開発中に見つかった不具合などまず対応すべき事項から「完了」にしていきます。


一度に全部を並行して進めようとすると、結局プロダクト的には何も進んでいない状態になってしまいます。
優先度の高いものから「完了」にしていくことで、動くソフトウェアを提供できるようになります。

1.3「完了」とは完了のことだ- アジャイルサムライを読んで考える

アジャイルサムライを読み進めながら、自分の業務と照らし合わせながら、落とし込み方を考えていきます。
チケット管理システム(RedmineやBacklog、tracなど)やCIツールとしてJenkinsを使っているので、その使い方と合わせながら考えて行きたいと思います。

第2回。

完了の定義


アジャイル開発でフィーチャーを届けるというのは、コードをリリース可能にするために必要な作業をすべて終えていることを意味します。
設計、コーディング、テスト全てが完了していることを意味しています。

蓋を開けてみるまで、リリース可能かどうか不明であれば、その作業は完了とはいえません。

具体的には・・・


チケット管理システムでチケットを管理しているのであれば、そのチケットの内容がリリースできる状態になっていなければ「完了」ではありません。

開発が終わった段階ではまだ「完了」とはいえません。この段階では開発者的には完了かもしれませんが、プロダクト的には完了ではありません。
レビュー・フィードバック、テストを行なってようやく「完了」に出来るようになります。
よくある、開発者の進捗90%問題は完了していません。せっかく作ったものを「完了」にするためにすぐにレビューやテストを実施する必要があります。


新品価格
¥2,730から
(2013/1/24 00:48時点)

まずは大事な6つのこと- アジャイルサムライを読んで考える

アジャイルサムライを読み進めながら、自分の業務と照らし合わせながら、落とし込み方を考えていきます。
チケット管理システム(RedmineやBacklog、tracなど)やCIツールとしてJenkinsを使っているので、その使い方と合わせながら考えて行きたいと思います。

まずは最初に気になったところから。 
アジャイルに取り組むために6つの大事なことがあるようです。



  1. 大きな問題は小さくする
  2. 本当に大事なことに集中して、それ以外のことは忘れる。
  3. ちゃんと動くソフトウェアを届ける
  4. フィードバックを求める
  5. 必要とあらば進路を変える
  6. 成果責任を果たす




 1.大きな問題は小さくする

アジャイルでは定期的に価値あるものをリリースすることが大事とされています。
そのためには1サイクルで終わるレベルに問題を小さくシンプルにする必要があります。

具体的には・・・


チケットの単位を最大数時間単位として、その粒度でチケットを作成する。

大規模プロジェクトだと難しいかもしれませんが、一定のサイクルでリリース可能なものを作り上げるには、なんとしてもその日のうちに終わる分量のチケットにする必要があると考えています。
そのためにはチケット作成時の粒度として最大で◯時間と決めてチケットを作る必要があります。
もちろん1機能が大きい(ように見える)場合もありますが、その場合は機能の中で満たすべき要件を洗い出して、処理の中身をステップに分けてそれに応じてチケットを分割します。
そうすることで、1機能丸々作り終えてから実は仕様と違ったと言った際のさし戻りが小さく出来ますし、少しずつレビューができるので、チェックする側も楽になりますし、開発する側も直ぐに修正ができるようになります。

2.本当に大事なことに集中して、それ以外のことは忘れる。

本当に大事なのは、動くソフトウェアを提供することであり、ドキュメントはあくまでもその補佐的な役割になります。

具体的には・・・


ソフトウェアをリリースできる状態にしておくことを一番に考える。

ドキュメントだけでなく、ムダを省く必要があります。ソフトウェアにバグが有ることがわかっているのであれば、新しい機能の開発はやめて、そのバグの修正に全力を尽くさなければいけません。

3.ちゃんと動くソフトウェアを届ける

お客さんに価値を届けるということは、常にテストされて動くことが担保された状態にしておく必要があります。テストだけは疎かにしてはいけません。

具体的には・・・


開発が終わったらすぐテストを行う。

プログラマの言う「開発がほぼ終わった」やチケットの進捗90%、は何も終わっていません。
プロジェクトマネージャーの視点で言えば、いや、プロダクトとして言えば、何も終わっていません。テストを行なってリリースできる状態になればようやく完了となります。

ここがプログラマとプロマネの意識の違いになるので、プログラマからプロマネになる時の難しい点でもあります。

チケット管理システムをプロダクトのためのツールとして使うのであれば、進捗は0か100かだけで事足ります。
リリースできるか出来ないか、それだけです。
Redmineには進捗のパーセンテージを登録できる機能がありますが、消しました。

開発が終わったらすぐにテストに入るのも重要です。あとでためてからやると、テストも大変になりますし、バグが出た時にどれが原因か分かりにくくなるので大変です。
開発が終わってテストまで終えてチケットを完了にしてから帰るのがベストですね。
テストが終わってないのは何も終わってないのと同じ!


4.フィードバックを求める

狙い通りに進んでいるのを確認するためにも定期的にお客さんにフィードバックを得よう。

具体的には・・・

見せられる状態になったらすぐに見せる。

せっかく定期的にお客さんに価値を届けているはずなのに 、全部が完成するまでフィードバックを得られない。それは定期的に価値を届けてないということになってしまうので、せっかく見せられる環境があるんだったらどんどん見せて意見をもらいましょう。
意見を全部吸い上げていたらスケジュールに間に合わない、というのであれば、やるもの・やらないものを決める交渉を行うことが必要です。

どちらかと言うと最後にまとめてフィードバックをもらって、DB構造から作り直しだよ・・・。デスマ確定。というケースのほうが多いんじゃないだろうか。このようにならないように、定期的に実際に動いているものを触ってみてもらって確認してもらう必要があります。
頑張ってモック作っても「これってエラーの処理とかは実際の画面遷移じゃないんでしょ?」と言われて結局触られないことが多いので、動くものを見せましょう。

5.必要とあらば進路を変える

計画を変える。現実を変えるんじゃない。

具体的には・・・


計画は変わるものだと認識する。

例えばYahoo APIを使った連携をする計画を立てていたとするが、開発中に有料APIになるアナウンスがあったにもかかわらず、そのまま何も考えずに突き進む前に、本当にそのAPIを使うのか、別に乗り換えるのかを考える必要があります。
計画はあくまでもその計画を立てた当時の計画であり、流動的に対応をしていく必要があります。

6.成果責任を果たす

質・スケジュール・期待・資金のコントロールを行う。

具体的には・・・

決められたスケジュール内でお客さんの期待するものをリリースする。






2013年1月12日土曜日

ファイルを作る順番に暗黙の制約がある | Play Framework2.0 ここがんばれ!

https://twitter.com/kamekoopa/status/288872473091526656
でもつぶやかれていますが、まさにそのとおりなんです。

僕の今までの開発スタイル

  1. 最初にルーティングを決める
  2. 次はControllerを作る
  3. 最後にViewを作る


以上。

ただざんねんながら、Play Frameworkではこの順で開発を進めようと思うと、途中のステップで止まることは許されません。

ルーティングを決める

routesにはURLのルーティングとそれに対応するメソッドを記述します。
となると、記述されるControllerとその中のメソッド( detail()とか)を作らないとコンパイルできません。

Controllerを作る

Controllerでは、最後に出力するviewをimportする必要があります。そのため、先にviewを作る必要が出てきます。

Viewを作る

じゃあ先にviewを作るか、ということで作り始めるとまずぶち当たるのが、引数の問題です。大体ModelやFormなどを渡すことが多いのですが、これらも先に定義されてないと渡しようがありません。
ああ、この画面に引き渡すModelなり何が必要になるか、Viewを元に考えることになるのか、とふと思うのです。

そしてViewが出来たらようやくControllerです。Viewを先にコンパイルしてないとEclipseで警告が出まくるので注意が必要です。
それにうっかりView側にこの引数も渡さないとだ、と思って引数を1つController側とView側とで追加すると、またEclipseでエラーに。同じViewを複数箇所で呼んでいるとホントは引数追加しなくちゃいけないのに、引数が足りない方はEclipseのエラーが出ず、追加した方はEclipseのエラーが出てしまうというちょっと開発の順番が悩ましいことに。。。

最初の設計が重要、ということですね。

2013年1月11日金曜日

Modelの中に色々かけてしまう | Play Framework2.0 ここんがんばれ!

ざっくりし過ぎていて駄目なタイトルではありますが、つまり私が言いたいのは
メソッド名の付け方に気をつけろ!ってことです。
後これは正直Play Frameworkとか関係ない気がします。

例えばユーザーのモデルに性別を追加したとします。

public string gender;

みたいなのを用意してここに
男性:M,女性:Fをデータとして入れるとしましょう。

DB的にはF,Mでいいですが、表示の際には男性、女性とか男、女とか表示をします。
その場合に

public string getGender(){
if(gender.equals("M")){
 return "男";
else{
 return "女";
}
}

みたいな感じに書いてしまったらもう駄目ですね。
テンプレート側で

user.gender

した時にデータの取得どっちでするの?的な厄介な問題になってしまうので、せめて
getGender()getGenderString()にでもしておく必要がありますね。