Redmine

2009/12/17

もう一つのAll In One Redmine

Redmine本家にもう一つのAll In One Redmine情報があったのでメモ。

【元ネタ】
Redmine Appliance | TurnKey Linux Virtual Appliance Library

VMを置いているらしい。
内容は下記の通り。

redmine 0.8.4 (upstream tarball)
git-core 1:1.5.4.3-1ubuntu2.1
bzr 1.3.1-1ubuntu0.1
subversion 1.4.6dfsg1-2ubuntu1.1
mercurial 0.9.5-3
apache2 2.2.8-1ubuntu0.11
mysql-server 5.0.51a-3ubuntu5.4
ruby 4.1
rubygems 1.3.5
rails 2.3.4
rake 0.8.7
passenger 2.2.5

GitやMercurialがVMにデフォルトでインストール済みなのがいい。
bzrまで使えるし。
しかし、RedmineやRuby関連はVersionが新しいものの、SVNやMercurialのバージョンはかなり古い。

同様にTracのVMもある。

Trac Appliance | TurnKey Linux Virtual Appliance Library

trac 0.11.1-2.1
trac-bzr 0.2+bzr45-1
trac-git 0.0.20080710-3
trac-mercurial 0.11.0.5dev~svnr7354-2
git-core 1:1.5.4.3-1ubuntu2.1
bzr 1.3.1-1ubuntu0.1
subversion 1.4.6dfsg1-2ubuntu1.1
mercurial 0.9.5-3
apache2 2.2.8-1ubuntu0.11

Tracで、GitやMercurial、bzrが使えるのは面白そう。

| | コメント (0) | トラックバック (0)

2009/12/09

RedmineのMSProjectプラグインその他

Redmineのプラグインを見つけたのでメモ。

【元ネタ】
Redmine MS Project インポートプラグイン開発記録 (2) - すえひろがりっっっっ!

r-labs - Redmine関連ツール集 - Redmine


MSProjectプラグインは、MSProjectで作ったWBSをRedmineへインポートできる。
プロマネにはありがたい機能。
CSVインポートとMSProjectのXMLインポートを使い分けてもいいかもしれない。

r-labs - Redmine関連ツール集 - Redmineを見ると、r-labs - Redmine Toolbar - RedmineというFireFoxのAddOnやiPhoneアプリもあるみたい。

rRedmine Toolbarは、登録したURLを修正できなかったり、入力するプロジェクト名がRedmineのプロジェクト名と一致していないとエラーになるなど、使い勝手は悪いけど、FireFoxから簡単にアクセスできるのは嬉しい。

こう見てくると、RedmineはRailsなのでプラグインも作りやすいみたいだね。

| | コメント (0) | トラックバック (0)

Redmineで要件管理、リスク管理ができるプラグイン

Redmine - Plugin List - Redmineを見ていたら、面白そうなプラグインがあったのでメモ。
#試していないのでメモ書き。

【1】Estimer Redmine - Estimer - Redmineは、Function Point・ユースケースポイント・Cocomo II の見積もりを計算できるらしい。
チケットにこれらの見積もりをアサインするのかな?
Function Point・ユースケースポイント・Cocomo IIの見積もりで使うモデルとチケットに同期が取れれば、チケットからモデル、そして見積もりの根拠まで追跡できる。

【2】RequMNGT Redmine - RequMNGT Redmine Wiki - Redmineはソフトウェア要求の管理や追跡やベースライン管理ができるらしい。
おそらくチケットに要求や要件を登録し、ベースラインをバージョンのように扱うものと思われる。
このプラグインが本当に機能するならば、要件管理もタスク管理も全てRedmineチケット上で操作すればいい。

【3】RiskMNGT Redmine - Risk MGNT Wiki - Redmineは、リスク管理とそのリスクの影響度合い、リスクから発生したインシデントを管理するらしい。
そもそもインシデント管理で重要な事は、顧客から大量に寄せられるあまり重要でない問合せは実は、少数の原因に落ち着くから、真の根本原因まで探る事にある。

つまり、ハインリッヒの法則 - Wikipediaが実は背後にある可能性がある。
このハインリッヒの法則は、1:29:300の法則とも言われていて、300件の些細なインシデントにつき1件の重大な事故が起きるというもの。

リスク管理は、重大な事故を起こさないように、その事故を発生させる要因を予防して、あらかじめ潰す事にある。

他にも、下記のプラグインが気になる。
やっぱり、ScrumのアイデアやPFのかんばんなどを実現するツールに興味が惹かれる。

Redmine - Backlogs plugin 0.0.1 (scrum/agile) - Redmine
Redmine - Redmine Blog Plugin - Redmine
Redmine - PluginKanban - Redmine
Redmine - PluginSchedules - Redmine
Redmine - Redmine Scrumdashboard plugin - Redmine
Redmine - PluginStuffToDo - Redmine
Redmine - Feature #443: Subtasking - Redmine

| | コメント (0) | トラックバック (0)

2009/12/06

特徴(Feature)、粗筋(Story)、脚本(Scenario)とチケットの関係

ユースケースとストーリーカードの関係、特徴(Feature)、粗筋(Story)、脚本(Scenario)とチケットの関係についてメモ。

【1】「システム要求、システム要件をどのように書くか?」はどのSW開発手法でもバラバラ。
オブジェクト指向分析(OOA)なら、ユースケース記述書のフォーマットに従って、システム要件や要求、フローを書いて、そこからモデリングしていく。

ユースケース記述書の書き方で一番優れていると思うのは、コーバーン著の「ユースケース実践ガイド―効果的なユースケースの書き方」。
ユースケースの書き方、観点のノウハウが詰まっている。
特に、ユースケースの観点を、アイコン(雲・凧・海水面・魚・貝)で表示して区別するのを推奨しているのは要注意。

ユースケース記述書のサンプルは下記を参考。

ユースケースについて

システムユースケース記述 [C02あんしん電話(高齢者] ユースケース ...

ユースケース番号:
ユースケース名:動詞句で記述する
主アクター:
従アクター:
事前条件:
成功時保証:
トリガー:
主シナリオ(メインフロー):
拡張シナリオ(代替フロー):
備考:

とはいえ、ユースケース記述書を最初からきちんと書ききるのは非常に難しい。

例えば、非機能要件を明示的に書く欄がないため漏れやすい。
又、代替フローの定義から大きな要件漏れが発生しやすい。
あるいは、ユースケース記述をIF文できちんと書こうとして、どんどん複雑化し、要件ではなくフローチャートを描いているに過ぎない場合もよく見受けられる。

【2】XPならストーリーカードに要件を書いて、タスクカードに作業を書く。
重要なことは、ストーリーは顧客が分かる観点で書くこと。
ストーリーカードは顧客が優先順位付けしたり、操作する重要なカードだから。

ストーリーカードのフォーマットは、下記が分かりやすい。

Article 626 at 00/07/17 16:48:01 From: hiranabe Subject: [XP-jp:00626] Virtual XP ストーリカード (1)

顧客ストーリカード
────────────────────────────────
番号 : 1
────────────────────────────────
日付 : 2000/7/17
────────────────────────────────
アクティビティ種別 : ■新規 □ 修正 □ 拡張
────────────────────────────────
優先度 : ユーザ 技術
────────────────────────────────
リスク:
────────────────────────────────
技術見積り:
────────────────────────────────
記述:
メーリングリスト(以下ML)のユーザが,ML のアドレスにメールを
送信すると,ML に所属するメンバ全員に,そのメールが配信され
る.配信されるメールの Subject は,[ML名:23] のような文字が
先頭に付加される(XP-jp のような仕様).ただし,そのメールに返
信した場合,[ML名:xxx]という文字は重複しないような配慮がなさ
れる.ML に属するメンバは,members というファイルに1行1名で
記述されている.メンバ以外から来たメールは,エラーとして差出
人に返す.
────────────────────────────────
備考:
後のストーリにて,メンバの追加,削除をメールにて行う方法が記
述されることを考慮にいれよ.また,特定のML のみをサポートす
るのではなく,設定によって ML 名,ML アドレス等は変更できること.
────────────────────────────────
タスク記録:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
日付 状態 ToDo コメント
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

上記のフォーマットは分かりやすいとはいえ、ユースケース記述書に比べると曖昧な部分が多く、要件漏れが発生しやすくなるかもしれない。

【3】Scrumのプロダクトバックログについて、下記の優れた解説記事がある。

特徴(Feature)、粗筋(Story)、脚本(Scenario) - masayangの日記(ピスト通勤他

[Agile]プロダクトバックログについて海外の例も踏まえ考えたこと | Ryuzee.com

以下、まとめてみる。

特徴(Feature)、粗筋(Story)、脚本(Scenario)を意識して区別することを推奨している。

特徴(Feature)は、顧客から見たシステムの特徴。
粗筋(Story)は、その特徴(Feature)を利用者が具体的に体験する過程を記述したもの。
脚本(Scenario)は、粗筋(Story)をより具体的に記述したもの。

Feature(特徴):カンファレンス運営原価管理

粗筋(Story):カンファレンス目標人数までの到達度を測定する
* (As a)カンファレンス主催者として
* (I want)カンファレンス申込状況の報告書を見たい
* (So that I can)これにより、申込目標人数までの到達度を知ることができる。

脚本(Scenario): 一人の登録が1%進捗と表示される場合
* (Given: 前提) 200人が目標人数の場合
* (When: 操作) 一人が申込登録すると
* (Then: 結果) 1%進捗と表示される

Feature(特徴)はシステムの機能。

粗筋(Story)は、XPならストーリーカード、Scrumならプロダクトバックログに相当し、これを見積もりや計画ゲームに使う。
上記の例の構造は下記と対応付ければ、非常に分かりやすい。
(As a)は主アクター。
(I want)は目的または要求。
(So that I can)はサービス、ユースケース名、又はユースケース概要。

脚本(Scenario)は、受入テストの根拠、つまり受入テストケース。
Given=受入テストケースの事前条件、When=受入テストケースのテスト手順、Then=受入テストケースの期待値のように対応付けることもできる。

上記をユースケース記述書の事前条件・ステップ・事後条件に該当できるように見えるが、そうするとユースケース数が受入テストケース数とほぼ同値になってしまって爆発してしまう。
脚本(Scenario)は受入テストケースとほぼ同値とみなし、ユースケース記述はもう一段抽象化した方が良いように思う。

上記がユースケース記述書やストーリーカードよりも優れていると思う点は、要求(変更理由)と要件(変更内容)を粗筋(Story)と脚本(Scenario)で区別していることだ。
特に、何故システムのこの機能が必要なのか、その目的や要求を表現する項目がある点に着目したい。
結局、目的や要求が曖昧な場合、何を実現すればいいのか、何度要件定義をやっても決まらないから。

【4】特徴(Feature)、粗筋(Story)、脚本(Scenario)をRedmineによるチケット駆動開発では、どのように表現できるか?

Feature(特徴)は、Redmineならチケットの属性である「カテゴリ」に相当するだろう。
カテゴリはシステムの機能であり、カテゴリ単位にチケットを分類しているからだ。

粗筋(Story)は、チケットのトラッカー(種類)を「ストーリーカード」で登録すればいい。
このストーリーカードを作業単位にチケットへ分割すれば、「タスクカード」になる。
ストーリーカードに見積もり工数・実績工数・作業期間も記入すれば、TiDD上で進捗管理できる。

脚本(Scenario)は、TestLinkの「受入テストケース」に相当するだろう。
この時、粗筋(Story)をTestLinkの「受入テストの要件」として登録すれば、要件管理ができるし、テストカバレッジや要件カバレッジをリアルタイムに出力できる。
つまり、ストーリーカード(粗筋(Story))を経由して、RedmineとTestLinkを紐付けることができるはず。

色々試してみたい。

| | コメント (0) | トラックバック (0)

TiDDを実践して気付いたことpart6~TiDDでAgile開発を実践して分かってきたこと

Redmineによるチケット駆動開発(TiDD)を実践して気付いたことをもう一度まとめてみる。

TiDDをAgile開発として運用するには、下記の運用ルールが最低限必要だと思う。

1・チケットをXPのタスクカードのように扱う
2・チケット集計結果をXPのタスクボードのように扱う
3・ロードマップをリリース計画のように扱い、小規模リリースを運用する

1によって、XPのタスクカードをTiDD上で実現できる。
更に、XPのストーリーカード、ScrumのバックログもBTSチケットで表現可能だから、Agile開発のタスクや要望は全て、TiDD上で実現できるはず。
また、チケットに構成管理情報を付与できるから、成果物の変更もチケットで追跡できる。

2によって、PFのかんばんをTiDD上で表現できる。
つまり、タスクの作業状態、イテレーションの進捗管理は全て、TiDD上でリアルタイムにモニタリングできる。
これを実現できるのも、チケットに進捗情報を付与できて、チケット集計を自動化できるおかげだ。

3によって、XPの小規模リリースを実現できる。
つまり、2~4週間のイテレーションで、小刻みに機能拡張してリリースを繰り返すことを制御できるようになる。
XPの計画ゲームは、どのバージョンにどの機能をリリースしていくか、というリリース計画の作業に落とし込める。
3の性質によって、TiDDはAgile開発プロセスを実装できるだけでなく、自然に繰り返し開発にもなる。

そして、Agile開発の最大の特徴である繰り返し開発の運用が難しい理由は、下記でまとめられると思う。

1・繰り返し開発はイテレーション管理が難しい
2・繰り返し開発において、インクリメンタル型開発と反復型開発を混同してる
3・繰り返し開発は並行開発でもあるため、並行開発の制御が難しい

1は、短いサイクルで頻繁にリリースを繰り返すために、各イテレーションのタスク管理が煩雑になるから。
本番リリースのタイミングはWF型開発よりも頻繁だから、たとえ小規模の改善であっても、開発チームに対するプレッシャーも大きい。
更に、リファクタリングや度重なる機能改善のため、ソース管理も難しくなる。

2は、繰り返し開発を使い分ける戦略を開発チームが持っていないことに尽きる。
Agile開発の基本は、リリースを最優先にするインクリメンタル型開発。
だからこそ、リリースする機能(スコープ)を制御することを重視する。

しかし、システム全体を少しずつ作り上げる反復型開発では、リリースのタイミングは随分後のため、度重なる仕様変更や手戻り作業を制御できず、スコープをどんどん膨らましてしまいがち。
むしろ、反復型開発は、テスト工程のように品質を作りこむ状況の方が扱いやすい。

3は、インクリメンタル型開発が実は並行開発でもあるという事実を理解していないことに尽きる。
一度リリースしたシステムはそれで終わりではなく、運用保守モードとして生き続ける。
更に、裏では次の新規開発を進めているから、2系統のコードラインを常時保守し続けている。
組込製品やパッケージ製品ファミリーの開発では、更にたくさんのコードラインを同時に保守し続けるため、品質管理が難しく、そのコストも大きい。

本番ブランチの障害修正は、裏で開発中のtrunkにも影響し、マージ作業が発生する。
そのタイミングを忘れずに管理していくのは、ツールによるサポートがなければ非常に煩雑になる。
それらを、TiDDはタスク管理でサポートするし、GitやMercurialはPullやPushでサポートする。

上記がTiDDでAgile開発を実践して分かってきたことだが、まだまだノウハウがあると思うので探っていきたい。

| | コメント (0) | トラックバック (0)

2009/12/04

TiDDを実践して気づいたことpart5~チケット管理システムとは

もう3年前の記事になるけど、参考になったのでメモ。

【元ネタ】
wikiとmantisを構築 業務をより効率的に - masahirorの気まま記録簿

Mantisは、BTSだけならばとても優秀なBTSだと思う。
しかし、Wikiが無く、SVNリポジトリと連携できない。
#但し、フックスクリプトを作ればSCMと連携可能だし、パッチを当てればWiki機能を追加できる。

RedmineやTracが従来のBTSと異なる特徴や利点は何なのか?
それを明確にできれば、チケット駆動開発(TiDD)が一体何をもたらしているのか、チケット駆動開発の何が画期的なのか、が分かるだろう。

BTSは単なるバグ追跡システムで、基本機能は、Web上でバグを障害報告票で追跡すること。
障害報告票をExcelからWeb化することによって、バグ修正と検証の作業がとてもスムーズになる。
更に、このワークフローがとてもスムーズな為、Mantisでも、障害報告票をSW開発のタスク管理に使うアイデアは従来から知られていた。
このやり方は、障害報告票をIssueと呼び変えて、Issue(課題・問題)でタスクを追跡することから、Issue Trackingとも言われる。

更に、BTS(Bug Tracking System)をSW開発のタスク管理へ拡張したシステムはITS(Issue Tracking System)と呼ばれている。
ITSの代表的な例は、Tracであり、RedmineやJiraだろう。

だが、Redmineの管理画面に「Ticket Tracking」「Time Tracking」という機能を知って、そもそもこれらの本質は何だろう?という疑問を持っている。

ITSを更に拡張したチケット駆動開発(TiDD)の代表的な機能を整理すると、下記と考えている。

1・チケットで全てのタスクを追跡できる
2・チケットで工数や作業期間を追跡できる
3・チケットでSCMリポジトリ配下の成果物の変更を追跡できる
4・Wikiで情報共有できる

1はいわゆるIssue Tracking。
チケットをバグだけでなく問合せも設計もリリース作業も何でも扱おうと言う発想で、チケットをタスク管理に使える。
チケットをXPのタスクカードのように扱えば、自然にアジャイル開発になる。

すると、チケットにトラッカー(チケットの種類)という概念が必然的に生まれて、トラッカー単位にワークフローが作られる。
Issue Trackingの概念を突き詰めると、ワークフローに行き着く。
バグ修正と問合せのワークフローは当然異なるからだ。
そして、このワークフローは自然にペアプロのように、2人以上の目を通して作業することになり、品質強化に役立つ。

2はいわゆるTime Tracking。
チケットの属性に、作業開始・終了日の予定と実績、見積もり工数と実績工数を付与すれば、進捗管理に使える。
Redmineが優れている点の一つは、Time Trackingを利用してガントチャートをデフォルト表示してくれることだ。
他に、カレンダー・ロードマップ・変更履歴・バーンダウンチャートなどいくらでも集計結果をカスタマイズして出力できる。

コストもチケットの属性に載せれば、EVMも可能だから、工事進行基準の発想を取り入れて、リアルタイムにコスト管理も可能になるだろう。
又、累積の実績工数と終了チケット数を時系列にカウントすれば、信頼度成長曲線を作成できるから、品質管理にも使える。

これらの結果を使って、管理者は意思決定の情報をいくらでも自動収集できる。

3はチケットに構成管理情報を付与すること。これがTicket Trackingだと考える。
チケットがExcelのバグ報告票やMSProjectのタスクとは異なる最大の特徴は、SCMリポジトリ配下の成果物と連携できるため、要件からソース、そしてビルドモジュールまでのトレーサビリティを保障する事だ。

この機能は、最終的には、チケットをナレッジデータベースにすること。
チケットにSW開発の全ての作業履歴、ノウハウ、試行錯誤の結果が残るから、全文検索できるようにすれば、運用保守でリバースエンジニアリングしやすくなる。
あるいは、テストでバグを発見した時、何故要件が漏れていたのか、を追跡できるインフラにもなりうる。
また、ソースに「障害管理NO.123でバグを直した」というコメントを書く必要が無く、チケットを参照すればよいから、ソースもより綺麗になる。

4は掲示板やフォーラムにも使える。
プログラミングのちょっとしたノウハウ、ふりかえりMTや会議の議事録などを共有するのにも使える。
但し、厳格にバージョン管理した方が良いもの、例えば、設計書などは、Wikiではなく、SCMで管理した方がよいだろうと思う。

ExcelやMSProjectによるプロジェクト管理がITSやチケット駆動開発に劣るのは、上記4個の機能全てを実現するには力不足だからだろう。
つまり、チケット駆動開発が必然的に生まれた理由は、昨今のSW開発が短納期・大規模化・複雑化しているため、手作業ではもはや管理できず、上記4個の機能をツールで補完する事を必要としているからだろう。

SW開発の作業は全て、チケットから始まるのだ。
まさにチケットファースト。
そろそろ、ITSと言うのではなく、チケット管理システム(Ticket Tracking System:TiTS)と呼びたいくらいだ。

| | コメント (0) | トラックバック (0)

2009/11/30

TiDDを実践して気づいたことpart4~TestLinkによるテスト戦略

チケット駆動開発にTestLinkを導入してテスト管理してみて、テスト戦略みたいなものをぼんやりと感じた。
以下メモ書き。

【元ネタ】
脱Excel! TestLinkでアジャイルにテストをする 4頁目- @IT自分戦略研究所

テスト手法の概念をTestLinkで説明する: プログラマの思索

TestLinkを運用して気付いたことpart8~みなしバグ、ブロッキングバグ、周辺テスト、そしてクリティカルパス: プログラマの思索

TestLinkを運用して気付いたことpart9~後追いテスト: プログラマの思索

TestLinkを運用して気付いたことpart4~TestLinkの概念を再考: プログラマの思索

TestLinkを運用して気付いたことpart5~TestLinkのテストケースの概念: プログラマの思索

TestLink・BTS・SVN・Hudsonの関連構造: プログラマの思索

【1】Redmineによるチケット駆動開発はとてもアジャイルに開発できるけれど、システムテストや受入テストの進捗管理はやりにくかった。
テスト工程の進捗管理は、テストケースの実施数・成功数・失敗数の予定・実績を比較することにあるけれど、Redmineチケットはテストケースと一致しないからだ。
だから、TestLinkを導入して一番良かったのは、テスト結果集計画面で、リアルタイムにテストの進捗を見れるようになった事であり、それから早期に是正対策を取るのが可能になった。

TestLinkがExcelなどの他のテスト管理ツールよりも良い点の一つは、Redmine・Trac・Mantisなどの既存のBTSと連携する機能がある事だ。
この機能によって、テストケースに失敗した場合、BTSチケットにバグの内容を書き込んで、バグ修正とバグ検証をペアプロのように作業できるようになる。

SW開発で最も難しい局面は、結合テスト(Integration Test)・システムテスト(System Test)・受入テスト(User Acceptance Test)などの各テスト工程で頻発するバグをいかに直していくか、にある。
バグ修正&検証フローは実はとても複雑なワークフローであるからだ。

脱Excel! TestLinkでアジャイルにテストをする 4頁目- @IT自分戦略研究所の「図4-4-4 TestLinkのバグ検証とRedmineのバグ修正の連携フロー 」に書いたように、バグは修正して終わりではなく、バグ修正内容を検証して、更に失敗したテストケースが成功した所までの作業を含む。
そして、この作業は、バグを発見し検証するテスター、バグを修正する開発者、リリース作業を行うライブラリアン、そして全てのプロセスを監視するプロジェクトリーダーの4人が関わるので、そのやり取りだけで忙殺されやすい。

従来は、この作業内容をExcelの障害報告書に記載して、紙ベースで管理し、各担当者が判子欄にサインして承認するというフローをやっていた。
だから、バグが1日10件も出るととても煩雑になり、バグ管理だけでプロジェクトリーダーが忙殺される時も多かった。

TestLink+Redmineの良い点は、この作業をチケット駆動開発と言うプロセス上で、バグ修正&検証のワークフローを明示した点にある。
更に、脱Excel! TestLinkでアジャイルにテストをする 4頁目- @IT自分戦略研究所の「図4-4-5 バグ修正に対するRedmineチケットの状態遷移図 」に書いたように、Redmineのデフォルトのワークフローではバグ検証の作業管理がやりにくいので、更にカスタマイズした。

これが本来のバグ修正なのだ、と気付いた瞬間が、TestLinkによるテスト戦略を感じた時の一つ。

【2】TestLinkのテストケースのステータスには「成功」「失敗」「未実施」以外に「ブロック」がある。
「ブロック」は事前条件を満足できないためテスト不能な状態を表す。
このブロックを初めて使いこなせて、テストにはバグ検証の限界があるのだと気付いた時が、TestLinkによるテスト戦略を感じた2番目の瞬間。

実際にテストしてみると、1個のテストケースが失敗すると、1個のバグが出て、後続のテストケースは全てブロックになる。
更に、バグに依存する機能のテストケースは、全て「みなしバグ」になり「失敗」になる。
また、バグの原因を追求すると、類似バグが出てくる為、更にバグが増えてくる。

ブロックやみなしバグの発生源は、ブロッキングバグと言われる。
まさに、テストどころか開発そのものをブロックしてしまう危険バグを指す。
テスト工程では、ブロッキングバグをいかに早く的確に潰すか、が鍵を握る。

実際は、1個のテストケースの失敗の影響はとても大きく、最低10個のテストケースが「失敗」又は「ブロック」になる時が多い。
つまり、「みなしバグ」や「ブロック」のテストケースはテストしても無意味なのだ。
以前は、「みなしバグ」や「ブロック」の発想がなく、とにかくテストしまくるものの、バグが出た為に再テストするテストケースが多発して、うまく制御できなかった。
だから、無駄にテスト工数を浪費して、肝心のバグ修正がおろそかになる場合も多かった。

そんな経験を経て、イテレーション単位にTestLinkのテスト計画を実施しながら、常にテストの失敗率に注目するようになった。
理由は、テストケースの失敗率がある上限を超えると、殆どのテストケースがブロック又はみなしバグで失敗の状態になってしまい、もはやテストしても無意味になる状態があるからだ。
僕の経験では、失敗率が10%を超えるともはやテストしても無意味で、ブロッキングバグを修正するよりも、最初から単体テストをやり直す方が早いように感じてしまう。

【3】TestLinkのテスト結果はビルドという概念で管理される。
ビルドはビルド番号を指すと教えてもらった時、ビルドでイテレーションを管理すればいいのだ、と気付いた瞬間が、TestLinkによるテスト戦略を感じた3番目の瞬間。

ビルドの利点は、同じテストケースを回帰テストで管理しやすくなる事。
また、ビルドのテストケースが全て完了したら、ビルド番号を振り直せば、ビルドモジュールの履歴に書かれたチケットNoからバグチケットを探す事ができる。

アジャイル開発にTestLinkを組み込む場合は、TestLinkのテスト計画をイテレーションと見なして、反復型テストを行えばいい。
すると、テストケースを作ってテスト計画を立てた時点で、テスト期間が短すぎたり、テスターや開発者が少なすぎたり、テストケースがそもそも多すぎる場合、実は納期までにテストが終わらない事実が判明する時がある。
原因は、テストと言うスコープを制御できていないのだ。

2~4週間のイテレーションにテスト計画を押し込めるには、2種類の戦略がある。
一つは、イテレーション内で開発とテストの両方を行い、テスト完了後にリリースするインクリメンタル型開発。
もう一つは、開発のイテレーションが完了後、せいぜい数百の単位でテストケースを分割したイテレーションを順次テストしていく反復型テスト。

普通のシステム開発では数千~数万のテストケースに膨れ上がる為、おそらく反復型テストが基本戦略になるだろう。
イテレーションとテスト計画を同一視することで、テストのスコープを制御しやすくしているのだ。

更に、後追いテストや五月雨式テストというテスト戦略も出てくる。
後追いテストは、テスト完了後からリリース直前までに優先度が低いテストケースや未実施のテストケースを後を応用に実施する事。
五月雨式テストは、仕様追加が頻繁な場合、仕様が決まって開発が終了次第、すぐにテストして、五月雨式に開発&テストしていく事。

後追いテストも五月雨式テストも、十分すぎる品質よりもスケジュールを重視する昨今のビジネスを反映していると言える。
ほどほどの品質をまずは確保した後で、リリースを優先し、品質を作りこむテスト戦略。

プロジェクトリーダーは、インクリメンタル型開発・反復型テスト・後追いテスト・五月雨式テスト等のテスト戦略を意識的に使い分ければ、SW開発で最も難しいテスト工程をコントロールしやすくなるだろう。

| | コメント (0) | トラックバック (0)

EclipseからRedmineへ接続するRedmine-Mylyn Connector

EclipseからRedmineへ接続するMylynプラグインの使い方が書かれている記事があったのでメモ。

【元ネタ】
Redmine-Mylyn Connector | shibomb

Redmine-Mylyn Connector | Get Redmine-Mylyn Connector at SourceForge.net

SourceForge.net: Installation - redmin-mylyncon

最初は、Redmine本家にあるRedmine - HowTo Mylynを参考にしたが、うまく動作しなかった。

Redmine-Mylyn Connector | Get Redmine-Mylyn Connector at SourceForge.netならば、サーバー側とクライアント側の両方に設定すればMylynを使えるようになる、とのこと。
Mylynの画面を見ると、使いやすそうなGUIみたい。

| | コメント (0) | トラックバック (0)

2009/11/29

TiDDを実践して気付いたことpart3~繰り返し開発の戦略

Redmineでチケット駆動開発を実践して改めて、アジャイル開発は繰り返し開発であると認識した。
Redmine、Trac、Mantisでチケット駆動開発を経験してみて、繰り返し開発の戦略やコツがあるのがぼんやりと分かってきた。
ロジカルに言い尽くせないけれど、以下メモ書き。

【元ネタ】
変更要求に対する選択肢: プログラマの思索

Subversionコードラインのライフサイクル: プログラマの思索

チケット単位に並行開発する事例: プログラマの思索

裏プロセスは並行プロセス: プログラマの思索

チケット駆動開発のモチーフ: プログラマの思索

チケット駆動開発のFAQ: プログラマの思索

【再考】TiDDのプラクティス集: プログラマの思索

ツールが開発プロセスを改善する: プログラマの思索

TiDDを実践して気づいたことpart2~これがアジャイルだ!と気付いた瞬間: プログラマの思索

【1】チケット駆動開発では、タスクを全てチケットに書き起こし、それらチケットをリリース計画に基づいて各バージョンへアサインし、順次リリースしていく。
つまり、XPの小規模リリースとは、2~4週間という短期間でリリースを繰り返す繰り返し開発である。

繰り返し開発(スパイラルモデル)には、インクリメンタル型と反復型の2種類があるのは既に知られている。
インクリメンタル型は、各繰り返し(イテレーション)でどの機能を実現するかを決め、それを1回の繰り返しでリリースする。
反復型は、各繰り返し(イテレーション)でシステム全体の機能を少しずつ作っていき、何度も繰り返して完成させる。

RUPが反復型開発であるのに対し、XPやScrumのようなアジャイル開発は、基本はインクリメンタル型開発だ。
顧客価値を重視する開発スタイルだから、顧客へ早めにリリースすることを優先する。
つまり、XPの小規模リリースとは、小刻みに機能拡張しながらリリースしていくインクリメンタル型開発スタイルを指している。

インクリメンタル型開発の利点は、機能というスコープが小さいのでスコープを制御しやすい点にある。
リリースが最終ゴールだから、スコープが揺れていてはリリースできないからだ。

逆に反復型開発は、スコープを制御しづらい弱点があるように思う。
例えば、工程ごとの繰り返し開発の途中で、度重なる仕様変更を取り込んでしまい、スコープを制御できずに破綻してしまう時は多くないだろうか?

しかし、反復型開発では、システム全体の機能を何度も繰り返しながら作り上げるため、スコープさえ制御できていれば、品質を向上させるために使える。

【2】Redmineでチケット駆動開発を実践すると、自然にインクリメンタル型開発になったけれど、それだけでは品質には不安があった。
だから、TestLinkを導入して、システムテストや受入テストの工程を別のイテレーションで実施し、色んな観点のテストやバグ修正を行って、品質向上を図った。
すると、このイテレーションは、反復型開発に似ているのに気付いた。

つまり、リリースできる品質まで持ってきたが、更なる検証で品質を向上させたい場合、インクリメンタル型開発から反復型開発にチェンジして、複数回のイテレーションでテストを実施する手法だ。
これによって、TestLinkのテスト計画をRedmineのバージョンに見立てて順次テストしていく反復型開発がやりやすくなった。

【3】反復型開発を使う場面は他にもある。
特に、複数のサブチームによる大規模開発、ソフトウェア開発チームとハードウェアチームが連携する組み込み製品開発などが相当するだろう。

例えば、組み込み製品開発では、SWチームは、HWチームから提供されるハードウェアを元に、HWチームの開発サイクルよりも短いイテレーションで順次開発してみる。
理由は、早めにハードウェアとソフトウェアを結合して動作させながら確認したいからだ。

すると、この場合、HWチームの1イテレーションに対し、SWチームは複数のイテレーションをこなしていることになる。
つまり、イテレーションの入れ子構造で反復型開発を行っている。

反復型開発のもう一つの利点は、イテレーションの入れ子構造によって、開発のスケールアップがやりやすい点もあるだろう。

【4】インクリメンタル型開発が難しい理由は、並行開発になってしまう点にあると思う。

例えば、イテレーションで実装した機能をリリースしたら、そのシステムは顧客の前で動き続けるが、裏では開発チームが次のイテレーションの機能を実装し始める。
そして、次のイテレーションの機能をリリースしたら、前のイテレーションのシステムは廃止して、裏で次の次のイテレーションの開発を始める。
つまり、自然に、本番運用と新規開発の2種類のコードラインを常時保守せざるをえないのだ。

但し、並行開発に対する一つの回答は、メインラインモデルという構成管理手法で既に知られている。
つまり、trunkというメインラインからリリースする時は、ブランチを派生させ、常にtrunkが最新の安定した機能となるようにコードラインを保守する手法。

メインラインモデルの手法は、いくつかのバリエーションがある。
おそらく最もよく使われる手法はタスクブランチだ。
例えば、現在、Ver3.0へ向けて開発中で、その次のリリース予定のバージョンは4.0である時に、突然の仕様追加に対応しなくてはならなくなった場合、Ver3.1のタスクブランチを定めて、Ver3.0→Ver3.1→Ver4.0の順にリリースしていくという開発スタイル。
このタスクブランチの手法によって、品質を維持しながら、納期とスコープ、工数のバランスを取ることができる。

チケット駆動開発では分散バージョン管理を使って、更にトピックブランチという開発スタイルも選択できる。
つまり、チケットごとにトピックブランチをローカルに作って開発し、最後にtrunkへプッシュする開発スタイル。
これはタスクブランチを各チケットへ更に分化した場合に相当する。
GitやMercurialを使っていれば、おそらくスムーズに運用できるだろう。


チケット駆動開発による小規模リリースは、インクリメンタル型でも反復型でもどちらの繰り返し開発も運用可能だ。
繰り返し開発では、インクリメンタル型と反復型を故意に使い分ける戦略が重要ではないだろうか?
また、アジャイル開発が難しい理由は、インクリメンタル型と反復型を使い分けるノウハウがなかなか見当たらず、実践しにくい点にあるのではないだろうか?

| | コメント (0) | トラックバック (0)

2009/11/28

C#からRedmineにアクセスする方法

C#からRedmineにアクセスする記事があったのでメモ。

【元ネタ】
.NETからRedmineへアクセスするライブラリを試してみた

Redmine Client

Redmine ClientはDLLであり、下記のAPIが使えるらしい。

Library:

* Using Redmine's web interface, thus not circumventing it's security
* Log-in to Redmine
* Get list of projects
* Get list of issues for selected project
* Get list of activities
* Get list of trackers
* Get list of users
* Get list of statuses
* Get list of priorities
* Get list of versions
* Get recent project activity
* Create new issues
* Report time spent on an issue

Client application:

* Measure time spent working
* Report time to Redmine
* Create new issues in Redmine

クライアントから、作業時間計測・実績時間報告・チケット登録ができるのは面白い。
RedmineのWebUIからRedmineを操作できるらしいから、RESTfulっぽい。
C#のRedmineクライアントを作る人は試してみてはどうだろうか?

| | コメント (0) | トラックバック (0)

より以前の記事一覧