恣意的な判断で、これは5日ぐらい、という判断をするのではなく、判断の基準となる過去のデータを調べて予測すること。その参考とする過去のデータってなんなのよ?という詳しい説明は本書でなされている。範囲での見積りシングルポイントで5ヶ月です、というような見積りをするのではなく、7ヶ月から+-2ヶ月です。いうような範囲で見積りを出すようにし、プロジェクトの進行とともにその範囲が狭まっていくようにする。それぞれの見積りごとに正確性の割合を出すと良い。5ヶ月でリリースできる確立は15%ですが9ヶ月でリリースできる確立は90%です、のような感じ。上記のほかにも、ステークホルダーにどのように見積りを認めさせるのか、など交渉のヒントにも言及されている。本書を読むといくつかのすぐに使える技法を学ぶことは可能だが、だからと言って翌日からすぐに正確な見積りができるようになるわけではない。いうのも、基本的に正確な見積りを行うようになるには組織全体として取り組む必要があるので、中長期的な視野にたってそのことを煮詰めていく必要がある(過去のデータを収集するあたりなどとくに)。正確な見積りのためには開発者個々人の見積りに対する高い意識も必要とされるので、そういうのを根付かせるための材料として本書を使うこともできるなと感じた。--------------------以下、本書を読んでいないと意味不明だと思うけれど、自分的メモ用に気になった公式をいくつか抜粋。最良ケースと最悪ケースの見積りを考えるようにする。何も言わないと開発者は大体最良ケースに近い一点見積りを行う。書籍2011年7月2日土曜日LambdaExpressionで動的な検索条件を作る最近の仕事で固定の検索条件ではなく動的に検索条件を作りたいという仕様があり、それもあってExpression周りをいじくりまわしていて楽しかったので解説する。今回のサンプルコードはこちらからダウンロードできる。Treeと戯れる必要がある。Treeに変換してくれる拡張関数群が公開されているので、文字列をいじくるのを苦にしなければかなり簡単に動的な検索条件を作成することが可能だ。Entityだとそうはいかないのでちょっと込み入ったことをしなくてはならない。動的検索条件と言っても、すべての検索条件がAnd条件であるならば、単純にWhereメソッドを下記のように順々に呼び出していけばよいだろう。);※今回の解説の仕様として、等号などのオペレーターや対象プロパティは事前に決まっていてどの条件を組み合わせるかのみ動的に設定できる、という設定とする。Treeをいじる必要があるのでその解説は次回以降行う、かもしれない。Or検索が間に入ってくると話が変わってくる。前述の方法ではWhereメソッド間はAnd条件になるので動的なOr検索を行うことはできない。いうわけで、LambdaExpressionの登場だ。こいつを上手に使ってやると下記のような条件を簡単に動的に組み立てることができる。c.Name.EndsWith("城"));今回使用するモデルは下記。First4.1に全部任せている。}}前述の各条件を表すLambdaExpressionは下記になる。c.Name.EndsWith("城");このままでは各LambdaExpressionはばらばらなので一つにまとめる必要がある。その際に注意が必要なのだが、LambdaExpressionを統合するには同一の引数を使用するように変更してやらなければならない。上記の定義を見てもらえば分かると思うけれど、各LambdaExpressionにはcという引数が定義されている。Tree的にはcondition1のcとcondition2、condition3のcはまったくの別物なので、こいつらを一つにまとめる必要がある。そんな面倒なことを行う際に便利なクラスがC#4.0から提供されている。それがExpressionVisitorクラスだ。このクラスの使いどころは次のような場合だ。Expressionには多種多様なタイプが用意されている。toステートメントを表すGoToExpression、ループを表すLoopExpression、メンバーアクセスを表すMemberExpressionなどなど数十種類に及ぶ。今回は引数をいじくる必要があるのでParameterExpressionが対象になる。Treeを順々にたどっていって任意のExpressionを探すのは骨が折れる。そんなときはExpressionVisitorクラスを使用する。使い方はExpressionVisitorクラスを継承し、自分が気になるタイプのExpressionを引数としているメソッドをオーバーライドするだけだ。今回はParameterExpressionをいじくるのでVisitParameterがオーバーライドするメソッドになる。}}ParameterVisitorクラスは変更元の引数コレクションと変更先の引数コレクションを保持し、ParameterExpressionが見つかるたびに、その見つかった引数(上記で言うところのnode)が変更元の引数と同一かをチェックし、同一であれば、変更先の引数を返却している。Treeは差し替えられている。変更元の引数の数と、変更先の引数の数が異なる場合はアボンするということなので注意が必要だ。ParameterVisitorクラスのコンストラクタにそれようのチェックコードを入れるのも良いだろう。実際にParameterVisitorクラスの使用方法は下記になる。}}各メソッドともに、まずはVisitメソッドを呼び出し、二個目の引数のLambdaExpressionの引数を一個目の引数のLambdaExpressionの引数で差し替えている。その後にAndAlso、またはOrElseを呼び出しExpressionの統合を行っている。Helperクラスの使い方は下記になる。condition3);そうしてできたLambdaExpressionをWhereメソッドに渡してやれば下記と同等の記述になる。query.Where(condition);かなり冗長になるけれど、上記の方法以外にも下記のようにWhereメソッドを呼び出すこともできる。query.Provider.CreateQuery<Castle>(resultExp);今回の例では下のほうの呼び出し方をする必要はまったくないけれど、オペレーターやプロパティも含めてすべてを動的で行う場合などで、Anyやら何やらを動的に呼び出す必要がある場合は、最後に解説したような呼び出し方をしなければならない。Japanウェブアプリ、デスクトップアプリ、モバイルアプリ、ゲームなどを開発しています。