« 2010年12月 | トップページ | 2011年2月 »

2011年1月

2011/01/31

時代はハードからソフトへ静かに移りつつある

独自フォーマットにこだわって時代から乗り遅れてしまうという指摘を見かけたのでメモ。
ラフなメモ書き。

【元ネタ】
Software is Beautiful:第5回 独自フォーマット戦略の終焉|gihyo.jp … 技術評論社

Life is beautiful: コラム「独自フォーマット戦略の終焉」

XMDFの不幸:さびしい標準 : EBook2.0 Forum

ガラパゴスは日本語WPの栄光を見るか ? EBook2.0 Magazine

上記の記事では、電子書籍フォーマットの業界標準は既にepubでほぼ確定しているのに、日本ではXMDFを推進しようとしている動きを痛烈に批判している。
過去の歴史を思い出しても、インターネットの普及のおかげで、Flash・ActiveXからCSS3・HTML5・SVGへ静かに移りつつある。
彼らの発想は製造業であって、ソフトウェアでいかに価値を上げていくか、という視点が欠けている。

時代の流れは、デバイス(ハード)の資産価値がどんどん落ちる傾向にある。

例えば、3Dテレビが流行するというニュースが一時期流れていたが、今は誰も買わない。
30万円以上するけれど、じきに高機能になってもっと安価になると誰もが予測しているからだ。
ノートPCもスマートフォンも携帯電話も、他の家電製品も、そして自動車もじきにもっと高機能になってもっと安くなるはず。
所有してもすぐに資産価値は激減してしまう。
減価償却のスピードが以前よりも遥かに激しい。

むしろiPhone・iPadのように、デバイスに自分の好きなアプリを入れたり、自分の好きな音楽を聞いたり、自分の好きな写真を見たり、自分の好きなゲームで遊んだりする方が楽しい。
デバイス上の豊かなアプリが、デバイスの価値を高めている。
丁度、SaaSのように、たくさん所有するよりも長期間利用できる方がはるかに価値が高まっている。
つまり、自由に使えるお金よりも自由にできる時間が、デバイスやアプリの販売に制約をかけている。

デバイスの販売よりもソフトウェアのサービスでいかに収益を上げるのか?
多分、ビジネスのあり方が製造業からソフトウェア産業に静かに移りつつあるのだろうと思う。

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

Redmineのチケットをコマンドラインで扱う「redcuine」

REST APIを生かしてRedmineを操作するツールが公開されていたのでメモ。

【元ネタ】
Redmineのチケットをコマンドラインで扱う「redcuine」 - I am Cruby!

多分、Ver1.1以降の環境が必須なようで、僕の環境は古かったので動作しなかった。
でも、このコマンドラインツールは面白い。
一人チケット駆動開発なら、こういうツールで十分だろう。
逐一ブラウザに問い合せるのが面倒なら、コマンドラインで叩く方が楽だし。

個人的には、Redmine REST APIは大きな可能性を秘めていると思っている。
何故なら、外部ツールがRedmineから好きな情報を取得・更新できることによって、Redmineを中核としたプロジェクト管理サーバーを構築できるだろうから。
つまり、テスト管理、品質管理、進捗管理、コスト管理など各種ツールがRedmineから必要な情報を取得して取り込んだり、連携することによって、ソフトウェア開発のERPをOSSのツール群で実現できる可能性を秘めているからだ。

Redmineをソフトウェア開発のERPへ実現すれば、開発者主体のAgileな開発チーム自身でプロジェクト管理ができるようになり、自己組織化がもっと進むはずだ。
プログラミングや設計ができない能無しのマネージャは不要。

プロジェクト管理ソフトウェア: プログラマの思索

RedmineのRESTful APIを使う: プログラマの思索

チケット駆動開発はソフトウェア開発のERPを目指す: プログラマの思索

BTSをBusiness Intelligenceとして使う: プログラマの思索

Redmineも更に進化しているようで、既にVer1.1.1がリリースされている。
進化の速度が早すぎて付いていけてないが、今後どうのように進化していくのか、注目していく。

Redmine - Redmine 1.1.1 released - Redmine

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

2011/01/30

Mantisの記事

Mantisの記事を見つけたのでメモ。
僕のBlogの記事を参考にしているそうです。

【元ネタ】
Mantisについてのメモ - watawata日記

Mantisの使い方: プログラマの思索

TracやMantisによるチケット駆動開発の運用方法: プログラマの思索

Mantisのチケット集計機能にある最大放置日数と平均完了日数: プログラマの思索

Togetter - 「Mantisメモ」

MantisはおそらくTracやRedmineよりも使っている開発チームは実際は多いと思うけれども、ネット上に情報がないのが残念。
Redmine、Trac、Mantisを使ってみて、3種類のBTS共に、下記の4つのルールによるチケット駆動開発の運用は可能だと経験している。

(1)Issue Tracking Systemとして拡張して、チケットをXPのタスクカードのように扱う
(2)SVNコミット時にチケットにSVNリビジョンを紐づける
(3)チケット集計結果をかんばんのように扱う
(4)ロードマップをリリース計画のように扱って、小規模リリースを実現する

僕自身はRedmineに愛着があるのでRedmineが一番好きだけれど、TracでもMantisでもTiDDを実践するのは問題ない。
但し、3種類のBTSはそれぞれ癖があり、その特徴を生かすのが重要と思っているので、又どこかでまとめたい。

Twitter / @ngmy: Mantisは検索結果をグループ化して表示できないというのが結構致命的。チケットを俯瞰しにくい。」というTwitterもありますが、Mantisのフィルター機能を使えば、検索条件を保持できます。
丁度、RedmineやTracのクエリのような機能なので、便利です。

改善要求の検索


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

スローテストとTDD

XP祭り関西2011で井芹さんのTDDの話を聞きながら、改めてTDDの奥深さを実感した。
そして、僕が常日頃感じているスローテストについても考えてみた。
以下メモ書き。

【元ネタ】
DevLOVE-CI「たとえ世界が終ろうとも、僕はビルドをケイゾクする。」へ行ってきた - 虎塚

第3回 社外常駐で学んだアジャイル開発 | Think IT

[Agile][資料公開]DevLOVE Test Dayでお話しました #devlove | Ryuzee.com

DevLOVE Test Day に行ってきました #devlove - かおるんダイアリー (id:kaorun55)

JaSST2001参加 - a SE diary

スローテストとは「テスト・コードが多すぎて、すべて実行するのに時間がかかる」という問題。
TDDをちゃんとやっていくと、動くシステムのLOCよりもテストコードのLOCが10倍ぐらい増える。
すると、コミットする度にビルドすると時間がかかりすぎるし、夜間ビルドですら終わらなくなる。
ビルドが遅くなるということは、製品化する時間が長くなるということなので、Agileでないし、開発者もCIを実施してくれなくなる。

井芹さんにスローテストについて質問したら、DBにアクセスする部分をモック化したり、並行ビルドしてみたり、テスト環境を仮想化したり、色々やり方はありますよ、と聞いた。
僕はスローテストの問題は、まだまだ改善の余地があると思っている。

井芹さんの講演では、TDDでも可読性や保守性を高めるためにリファクタリングは必要であるという主張がずっと根底に流れていた。
テスト技法の解説書として、秋山さんの「ソフトウェアテスト技法ドリル―テスト設計の考え方と実際」や「はじめて学ぶソフトウェアのテスト技法」が紹介されているのには驚いた。
色々勉強されているなあという感想を持った。
TDDであろうとも、肝心のテストケースは既に知られている各種技法を使った方がテストの効率も生産性も上がる。

TDDでは普通とは異なるプログラミング技法がある点も技術者としては興味深い。
モックやリフレクション、メタ言語などがそれに当たるだろう。
xUnit Test Patterns: Refactoring Test Code (Addison-Wesley Signature Series (Fowler))」の本とその勉強会のログも紹介されていたので、調べてみたいと思う。

xUnit Test Patterns(xUTP)読書会 - FrontPage

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

チケット駆動開発の感想を集めてみた #tidd

チケット駆動開発の感想が書かれたTwitterを見つけたのでメモ。

【元ネタ】
プロジェクトマネジメントとアジャイル開発というやつを調べている - Chiseiのはてなダイアリー

Twitter / @Chisei Takenouchi: [ブクマ] アジャイルなプロジェクトマネジメントの本質が書いてあるような気がした。まだアジャイルというものを実践出来ていないのでそんな気がした、というレベルでしかないが http://bit.ly/gmO3ec

Twitter / @Chisei Takenouchi: [ブクマ] すごい発見の多いエントリーだった。アジャイル開発というものに触れるために必要な知識を仕入れることが出来た。 http://bit.ly/hR81xL

最近、バージョンのないRedmineプロジェクト~TiDD初心者が陥りやすい罠: プログラマの思索のリンクが多くて、他の人がどのような感想を持っているか、に興味を持っている。

僕自身としては、チケット駆動開発を実践してみて、Agile開発の落とし穴やアンチパターンが体で体験できたので、他の人の体験談も集めてみたいと思っている。

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

XP祭り関西2011が無事に終わりました #xpjugkansai

1/30に開催されたXP祭り関西2011が無事に終わりました。
参加者、そしてスタッフの皆様、ありがとうございました。

【元ネタ】
XP祭り関西2011 - XPJUG関西wiki

2006年の第1回、そして2009年の第2回から毎年1~2月に開いて、今年で4回目になります。
関西のアジャイルコミュニティの中では、100人規模のITイベントとして冬の風物詩となった感はあります。

今年は、木下さんのアジャイルな受託開発ビジネス、僕のチケット駆動開発、井芹さんのTDD、森崎さんのワークショップのようなセッション、PFP関西による朝会入門、そしてライトニングトークと盛り沢山でした。
毎年、ちょっとずつ講演内容を変えてますが、その時々のトレンドがよく分かりますね。

懇親会でも、沢山の人に来て頂いて盛り上がりました。
懇親会に来てくれた人達には、スポンサーから頂いた書籍が必ず1冊は当たるようにしていたので、懇親会代の元は取れたと思います。

僕も下記3冊の本をGetしました。

特に「プログラマーの復権」は松原友夫さんの翻訳本なので興味があります。
松原友夫さんの講演をSEA関西で2回聞きましたが、いずれも、後でもう一度深く考えさせられる内容でした。
僕のつたない質問にも丁寧に回答して下さったのが印象に残ってます。

今はゆっくり読んでいて、また感想をアップしようと思います。

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

2011/01/27

どの業界でも管理・設計支援ツールの重要性が増している

日本の半導体産業は一世を風靡していたが、今はエルピーダ1社以外は生き残っていない。
日本の半導体産業が負け組になった原因は、半導体設計支援ソフトの開発で負けた時に勝敗が決まっていたからだ、という指摘を見つけたのでメモ。
下記は思いついたままのラフなメモ書き。

【元ネタ】
日本の半導体産業はどこで負け組みに転じたのか - しんたろサンの日記

「半導体」の検索結果 - しんたろサンの日記

日本「半導体」の凋落とともに歩んだ技術者人生 世界シェア50%を誇った日本の半導体はどこへ JBpress(日本ビジネスプレス)

日本「半導体」の凋落とともに歩んだ技術者人生 世界シェア50%を誇った日本の半導体はどこへ JBpress(日本ビジネスプレス)

消滅つつある日本のCAD開発史 - カタチづくり

(引用開始)
日本の半導体産業はどこで負け組みに転じたのか。
結論から言うと、半導体設計支援ソフトの開発で負けた時に、もう勝敗は決していたのだろうと思う。
当初、日本の半導体メーカーはどの会社も、半導体開発のためのソフトを自前で開発していた。これをある時期から大半をアメリカ製に頼るようになった。何でもかんでも自前がいいというつもりは無いが、なぜここで負けたのか、という点には、反省すべき点が山ほどある。この戦いで勝てないのに、他人のふんどしよろしく購入したツールで勝負しようなどと考えたのが甘すぎたんじゃないのか。
(引用終了)

半導体産業は設備装置産業。
日本の半導体産業はそのスピードに追いつけなかった。
その根本原因は、設計支援ソフトを外国製の製品に依存していて、製品がコモディティ化したことではないか、と。
実際、DRAMはネジクギと同様に、タダ同然。

そして、自動車産業もCADという設計ソフトを自社製ではなく外国製の製品に依存しており、ガソリン自動車から電気自動車へ転換する時代の流れを考えると、自動車もじきにPCの部品組立のようにコモディティ化されてしまう可能性もある。
つまり、自動車は誰でも簡単に作れてしまう時代がもうすぐ来ている。

同様の事象は、液晶テレビや携帯電話などの家電製品にも見られる。
パソコンの設計・製造と同じビジネスモデル。
携帯電話も自動車も家電製品も、半導体が辿った道のように、じきにネジクギと同じぐらい安値になる。
PC業界のソフトウェアのように、付加価値の高い部分へシフトする必要があるのに。

半導体産業はシリコンサイクルという過酷なビジネス環境の産物。
半導体産業は「イノベーションのジレンマ」に書かれているショウジョウバエのような実験モデルと同じ。
経済学者から見れば、短期間に企業の勃興から消滅までの成長過程を見ることができるのだから、これほど研究しやすいビジネスモデルはないだろうが、当事者の経営者や開発者からすれば変化についていけず苦しいだけ。

イノベーションのジレンマ~過剰技術・過剰品質の罠: プログラマの思索

ソフトウェア開発でも、設計工程と言う前工程の品質を上げるやり方は、安く早く作るAgileなやり方に相反している。
WF型開発という高コストで高品質な開発プロセスは、今の時代に合致していないのではないか?
製造業での過去の成功体験がIT業界の技術革新を阻害しているのではないか?

上記の記事で思ったのは、管理や設計支援ツールの重要性がIT業界だけでなく、半導体や自動車業界でも高まっていること。
もはやハードの製造はPCの部品組立レベルになっている。
すると、どこで付加価値を作るのか?

IT業界は、実は他の業界に比べると、自分たちの作業の自動化が非常に遅れているように思える。
プログラムの自動生成よりも、テスト駆動開発や継続的インテグレーションのように、書いたプログラムを即製品化するプロセスの方がはるかに重要。
いくら前工程の設計プロセスに時間をかけても、製品になるまでの期間が長いほど、顧客からのフィードバックが遅れて、機能改善という名のバグ修正が延々と続くだけ。
動かない設計書、動かないプログラムがたくさんあるほど不良在庫になる。

そして、Excelでチマチマと進捗管理したり、部門別の損益計算書をExcelで手集計したりするのはもはや時代遅れ。
特に昨今は工事進行基準やらJ-SOXやらで、プロジェクトマネジメントの精度の高さを要求させられている。
マネジメントもツールによる自動化が必須の時代になっているのではないか?

現代は、あらゆる業界でソフトウェアの重要性が増しているわけだ。
ソフトウェアを制するものがビジネスを制するのかもしれない。

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

OracleのPIVOT句

SQLで横持ちにデータを集計したい時に、PIVOT句を使うと便利だったのでメモ。

【元ネタ】
Oracle 11g検証 隠れた新機能検証 その1|おら! オラ! Oracle|技術情報|株式会社インサイトテクノロジー

Oracle 11g R1新機能のPivotとUnPivot(1/5):CodeZine

OracleのSCOTTスキーマにある従業員テーブルで、JOB(仕事)とDNAME(部門)ごとに集計したい場合、下記のSQLで書ける。

select emp.deptno,dname
,sum(decode(job,'CLERK' ,sal,null)) "CLERK"
,sum(decode(job,'MANAGER' ,sal,null)) "MANAGER"
,sum(decode(job,'PRESIDENT',sal,null)) "PRESIDENT"
,sum(decode(job,'ANALYST' ,sal,null)) "ANALYST"
,sum(decode(job,'SALESMAN' ,sal,null)) "SALESMAN"
from emp,dept
where emp.deptno = dept.deptno
group by emp.deptno,dname
order by emp.deptno,dname;

PIVOT句を使うともっと簡単に書ける。

select * from ( select emp.deptno,dname,job,sal
from emp,dept
where emp.deptno = dept.deptno )
pivot ( sum(sal) for job
in ('CLERK','MANAGER','PRESIDENT','ANALYST','SALESMAN') )
order by deptno,dname;

PIVOT句を使う状況は、月別に横持ちでデータを表示したい時がある。
例えば、月別に部門ごとに売上金額を集計したい時など。
いわゆるクロス集計で使えると思う。

クロス集計されたデータをCSV出力すれば、Excelで簡単にグラフ化して、レポート用に整形できる。
チケット駆動開発ならば、ステータスとトラッカー・カテゴリ・バージョン・担当者のクロス集計の出力にも使えそうな機能だろう。

再帰SQLと同様にSQLは実は奥が深いのだ。

再帰SQL: プログラマの思索

再帰SQL part2: プログラマの思索

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

2011/01/24

【公開】デブサミ2011でチケット駆動開発とチケット管理システム大決戦セッションで話します #tidd

【元ネタ】
創発 未来につながるために 世界に帆を立てるために Developers Summit 2011

セッション内容~創発 未来につながるために 世界に帆を立てるために Developers Summit 2011

【17-B-3】チケット駆動開発~タスクマネジメントからAgile開発へ~

最近、RedmineやTracのような高機能なBTS(バグ管理システム)をソフトウェア開発のタスク管理に適用して、アジャイルに開発する「チケット駆動開発(TiDD:Ticket Driven Development)」が静かに広まっています。
チケット駆動開発は細かな作業をチケットで管理することから生まれましたが、アジャイル開発と関連する点が多いことから、アジャイル開発をブラッシュアップする技術としても、利用されるようになりました。
本講演では、ソフトウェア開発の歴史におけるチケット駆動開発の意義と、アジャイル開発への適用方法についてお話します。

【17-B-4】チケット管理システム大決戦 JIRA vs Redmine vs Trac ~ユーザーが語る、なぜ私はこのツールを使うのか

チケット管理システムはソフトウェア開発に必須のツールの一つです。
現在、日本で人気のあるチケット管理システム3製品(JIRA、 Redmine、Trac)について、各ユーザー代表をパネリストとして迎え、パネルディスカッションを行います。ユーザーの生の声をお届けし、参加者が知りたい情報を得られる機会を提供します。
チケット/課題/バグ管理システムに興味をお持ちの方、導入を考えているがどのシステムにしようか情報を収集している方、エクセルによるチケット管理からの移行を検討している方、などを対象としています。

【メモ】
チケット駆動開発について、デブサミでさかばさんと講演することになりました。
@t_wadaさん曰く、今年度のデブサミにおけるAgile開発プロセスの文脈では、Scrumとチケット駆動開発は必ず話しておくべきテーマだ、とのこと。
上記2セッション共に残席僅かですので、興味ある方はお早めにご登録下さい。

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

2011/01/23

なぜなぜ分析の良書籍

先日のSEA関西プロセス分科会にて、なぜなぜ分析のアンチパターンや方法論について講演された時に、なぜなぜ分析の書籍「なぜなぜ分析 実践編」を紹介されていたのでメモ。

【著者のHP】
なぜなぜ分析の効果的なやり方・展開のしかた | 有限会社マネジメント・ダイナミクス

なぜなぜ分析は、品質管理の一つの技法として紹介されている。
事故や障害が発生した後で、その障害防止策の作成に使うときが多いだろう。
多分、トヨタのなぜなぜ分析から発生してきたのではないか、と推測する。

実際になぜなぜ分析を使って考えると、単純に「なぜ?」を5回繰り返すだけだが、実はかなり難しい。
なぜ?と問いかけても、ロジックがずれていると、変な方向へずれてしまって、肝心の原因まで辿り着けない。
例えば、待ち合わせに遅れたケースをなぜなぜ分析した時に、事故が起きたのが原因だから、道順を変えてみると分析した場合などがあるだろう。
実際の原因は、自分のスケジューリングがまずかった、などもあったはずなのに、いつの間にかずれてしまっているのだ。

本来のなぜなぜ分析では、最後の5回目のなぜで、心理的要因にたどり着くものらしい。
例えば、油断、思い込みなど。
すると、そのような分析の過程で、徹底的に掘り下げていくために、自分や他人に対して、かなりきつく当たってしまう時も多い。
だから、精神的にとても疲れやすいように思う。

しかし、なぜなぜ分析で徹底的に考えし尽くす方法はやっぱり重要だと思う。

似たような手法として、PFのKPTによるふりかえりがあるが、観点が違う。
KPTによるふりかえりは、ラフな雰囲気の中でメンバーが過去のチームの出来事について、問題点を洗い出し、緩やかな対策を作り出す手法だ。
以前、平鍋さんに、ふりかえりを問題解決の手法として使えるか、と聞いた時、ふりかえりは問題解決のために使うのではなく、問題の提示に力点をおくべき、と回答して頂いた時があった。
つまり、PFのふりかえりはチームビルディングの一手法であり、問題解決のために原因を徹底的に掘り下げるための手法ではない。

おそらく問題解決のための徹底的な思索は、なぜなぜ分析を使うのがベターではないかと思っている。
なぜなぜ分析を日本流ロジカルシンキングとして、論理的思索に使ってみるのも面白いかもしれない。

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

2011/01/22

Redmineでコミットメッセージによる作業時間の記録が可能

Redmine.JP Blogに書かれているRedmine1.1の機能説明が素晴らしいのでメモ。

【元ネタ1】
Redmine 1.1 新機能紹介: コミットメッセージによる作業時間の記録 | Redmine.JP Blog

上記の記事によれば、SVNユーザとRedmineユーザを紐づけた後、下記のようなコミットログを書くと実績工数がチケットに反映されるらしい。

○○画面の表示不具合(カラム落ち)を修正。
refs #9999 @2.5h

この手法が使えるならば、開発者にとって成果物の変更に伴う実績工数の書き込みがかなり楽になる。
コミットするタイミングが、どれくらいの工数がかかったのか、自分で把握するタイミングになる。
PSPのように自分の作業履歴や作業時間を記録していく習慣につながるだろう。

但し、最新バージョンでは、コミットログの書き方が変わったと言う意見もあるので、注意。
今度試してみたい。

Twitter / yusuke-kokubo: #redmine 最新のRedmineではリポジトリ連携でrefs #XXXとして、チケット番号の前に#をつけないとチケットと関連付けてくれません。注意!! http://bit.ly/eLTEBs

【元ネタ2】
Redmine 1.1 新機能紹介: ガントチャートの改善 | Redmine.JP Blog

Twitter / yusuke-kokubo: redmine 1.1のgant chart rewriteはEric Daivisが残してくれた置き土産だと思ってる。

Redmineの次なる機能 nested Gantt Chart: プログラマの思索

ガントチャートがカラフルになり、ステータスや進捗率、チケットの親子関係なども表示してくれるみたい。
Redmineのガントチャートが使いたくて運用を始めるマネージャが多いだろうから、彼らにアピールできる良い機能だろうと思う。

そこから、チケット駆動開発を運用して、ガントチャートのような詰まらないツールで進捗管理しながら開発するのではなく、Agileに開発するスタイルへ静かに変更していけばいいと思う。

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

「Redmineによるタスクマネジメント実践技法」の感想を集めてみたpart10 #tidd

Redmineによるタスクマネジメント実践技法」の感想を見つけたのでメモ。

【元ネタ】
Redmineによるタスクマネジメント実践技法 - takeboruta’s Blog

(引用開始)
諸々の細かい部分は本書を参考にすれば良いと思いますが、一番のメリットだと思っているのは、開発に関わるコミュニケーションと見える化です。作業の抜けを出来る限りなくし、端折ることがなければ、チケット、タスクを管理しているリーダだけではなく、開発メンバー全員が知る事ができます。
見える化のいいところは、「見えるものは制御できる」と本書でも述べていますが、見える化は、人間的、アナログ的な良さがあり、自分の担当ではなくても、関連するチケットに注目し、助け合うことが容易にしやすいことも重要だと思います。担当の切り分けがチケット単位なので手伝いやすい、チケットを自分がもらう、渡すも分かりやすいです。
後は、チケットの運用者が、慣れていき、同じような使い方、メリットを感じていることも大事な要素だと思います。やはり、複数人で開発などを行う時には、何人か同じメンバーがいて運用方法などの共有ができることが望ましいですが、そうもうまく行かない事が多いと思うので、ワークフローを確立しておくことも非常に大事だと思います。
(引用終了)

感想ありがとうございます。
見える化がコミュニケーションやマネジメントにも役立つという指摘がとても参考になります。

Redmineによるタスクマネジメント実践技法」に書いた内容は著者の経験や思索をまとめあげたものに過ぎないので、もっと素晴らしい運用方法を持っている人たちも多いと思います。
そういう運用ノウハウを、コミュニティやネットのようなオープンな場で議論してプラクティスや概念としてまとめあげられれば、他者に役立つ知識になるだろうと思います。

他にもあったら探してみる。

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

データモデル表記読み替えハンドブック

IDEF1X、T字形ER、TH法、UMLの記法の違いをデータモデル表記読み替えハンドブックなるものが詳細に解説してくれていて、とても分かりやすかった。
リンクしておく。
できれば、渡辺式ER図の記法も比較してくれるとありがたがった。

【元ネタ】
データモデル表記読み替えハンドブック (第1.0版)

DOA+コンソーシアム第3分科会 CONCEPTWARE販売管理をTH法で描く

「DOA+への入り口」 さまざまなモデリングの手法

個人的には、UMLは習得しているので、IDEF1Xが馴染みやすい。
TH法の記法は独特。
T字形ERはIE記法だから読めるけれど、概念が難しい。

サブタイプ、関連などの例を見ると、それぞれの記法の特徴が分かる。
UMLは多重度や継承、ロールの表現は強いが、関連クラスの表記は弱い。
つまり、UMLは連関エンティティ、複合キーの表現が弱い。

IDEF1XはUMLのようにサブセットやロールの表現は優れていて、特に穴もない感じ。
サブタイプ実装は、確定が完全、未確定が不完全、共存はロールで表現するやり方なので、UMLが分かっていれば理解しやすかった。

T字形ERは、NULL除去、Resourceから外部キー(event)削除、という発想はとても優れている。
しかし、再帰やヘッダ・明細の表現がイマイチ。
サブタイプ実装は独特で複雑。僕はまだ理解できてない。

TH記法は、エンティティの分類が多く、導出属性の分類も多い。
何となくCobolから発達したデータモデリング記法のように思えた。
何となく使いづらそうなイメージ。

但し、いずれも僕がUMLの観点から各技法を眺めているので、理解できてないだけだと思っている。

モデリング技法は、どんな問題をどのように解決しようとしているのか、が背後に動機として隠れているので、ある問題の解決には強く、他の問題では有効でない場面があると思っている。
今後もDOAに関してまとめていく。

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

2011/01/17

データベース設計で派生関係は難しい

@t_wadaさんが、データベース設計の素晴らしい資料をリンクしていたのでメモ。
下記の資料は、MySQLでソーシャルゲームのDB設計のお話らしいが、データモデリングの設計ノウハウが秀逸。
気になった点をメモしておく。
理解できたことをラフなメモ書き。

【元ネタ】
Twitter / Takuto Wada: 素晴らしい資料。"「スキーマ」「トランザクション」「インデックス」はもっと評価されるべき" / ソーシャルゲームのためのデータベース設計 http://htn.to/PzrnbR

【1】可用性や整合性に関する要求が意外と多い
たとえ、SNSやゲームであろうが、課金体系になるとお金が絡むため、ユーザの要求のレベルも上がるし、事業者の責任も大きくなる。
データモデリングはアーキテクチャ設計につながる。

【2】派生関係
データベース設計(DOA)でも、派生関係(継承関係)はオブジェクト指向設計(OOA)と同様に存在する。
但し、データベース設計の派生関係はOOAとはニュアンスが若干異なる。
DOAの派生関係の方がOOAよりもはるかに難しい。

DOAでは、派生関係は1対0..1の関係になる。
但し、完全・不完全、排他・共有の2種類の意味を持つ。

完全の派生関係は、スーパータイプのインスタンスは必ずどれかのサブタイプに属すること。
例えば、会員のサブタイプを個人会員と法人会員の2種類に分けて、会員は必ず個人会員又は法人会員のいずれかに属する場合、完全な派生関係になる。
不完全は完全の逆。
不完全の派生関係の場合、どのサブタイプにも属さないスーパータイプのインスタンスが存在する。

共有の派生関係は、スーパータイプのサブタイプが複数のサブタイプに属すること。
例えば、取引先をスーパータイプ、仕入先や得意先をサブタイプにした場合、仕入先かつ得意先でもある取引先があるなら、共有の派生関係になる。
排他は共有の逆。

上記の資料では、アイテムをスーパータイプに持つ場合、攻撃アイテム、防御アイテム、補助アイテムはおそらく完全の派生関係になるようにモデリングしていると思われる。
アイテムは、攻撃・防御・補助のいずれかに分類されるだろうから。

又、ユーザIDを主キーに持つテーブル群であるゲーム共通情報、ゲームのメイン情報、イベント中のユーザ情報などは、共有の派生関係になるようにモデリングしていると思われる。
共通情報・メイン情報・イベント中のユーザ情報のいずれにも含まれるユーザIDは存在するだろうから。

本来、派生関係を導入してモデリングすることによってモデルを綺麗に見せるようにするためにあるのに、DOAの派生関係が難しい理由は、完全・不完全と排他・共有の2種類の派生関係を混乱しがちであることと、概念データモデルを実装レベルのER図に落とす場合にスーパータイプとサブタイプの関係をそのまま射影するとは限らないからだ。

佐藤正美さんが提唱するT字形ERでも、サブセット(サブタイプ)の生成はSEの腕の見せ所、という表現がある。
多分、そういう意味が込められているのだろうと推測する。

【3】階層型部品表
ゲームに登場する人物(戦士、武闘家、僧侶など)を階層型部品表で設計しているのは面白い。
この設計手法は再帰型でモデリングしているのと同じ。
となると、LLC(階層の深さ)が問題になるはずだが、どうやって制御しているのか、気になる。

【4】連関エンティティ(対照表、対応表)
ユーザID+αで一意になるテーブルは、ユーザと別のリソース系マスタから生成される連関エンティティを指す。
つまり、ユーザID+αが複合キーになる。

「ユーザID+αで主キー/一意キーになるものはレコード数が 飛躍的に跳ね上がる」意味は、ユーザと別のリソース系マスタの組合せだから、当然レコード数は大幅に増えるはず。

また、人と人の関係を管理するために、連関エンティティがイベント系テーブルになっているのも興味深い。
この設計手法が使えるのは、ユーザマスタのサブタイプを細かく作っているから、それらのサブタイプを組み合わせれば、連関エンティティ(対応表)が発生するからだ。

佐藤正美さんが提唱するT字形ERで、リソースの数が多いほどトランザクションをたくさん生成できるので、ビジネスの可能性があるという指摘を連想させる。

【5】スキーマ、トランザクション、インデックスはもっと評価されるべき
RDBだろうがNoSQLだろうが、結局、ディスク性能(I/O)が一番のボトルネックになる。

Insert処理をメインメモリ上で関係させるためにインデックスサイズを小さくする、ないしはインデックスを作らないようにするとは、テーブルを徹底的に正規化することなのだろう。
つまり、NULL値を持つカラムは派生関係を使って排除し、インデックスの発生源となる候補キーを無駄にたくさん作らないようにすればいいのだろう。

【6】楽観ロックによる整合性管理
トランザクションの更新は楽観的制御を用いた方が楽ということなのだろう。
Versionパターンとは、トランザクションテーブルのカラムにVersionというNumber型のカラムを作っておき、更新する度にインクリメントさせて、二つのトランザクションが競合する時、Versionカラムの値を比較してロックの制御をかけるという意味だろう。

【7】イノベーションは現場で起きている
データモデリングも理論ばかりではなく現場の経験も大事であり、現場の実例があるからこそ、次への飛躍につながる。
この言葉は、特に下流工程で技術革新が起きている最近で言えるように思う。
データモデリングだけでなく、プロジェクト管理も品質管理技術も、最近はツールを上手に使えば、現場での経験値を増やすことで、プログラマもそれらの技術をマスターしやすくなっている現状がある。

データベース設計に関しては又まとめていく。

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

2011/01/15

TestLinkを運用して気付いたことpart12~スモークテストはお試しテスト

SEA関西プロセス分科会で講演後、宿口さんとNakaさんから、ブロッキングバグが多発するならスモークテストをあらかじめやってレビューで潰しておけばいいのでは、という指摘を受けて、なるほどと思ったのでメモ。

【元ネタ】
【公開】SEA関西プロセス分科会講演資料「TestLinkのベストプラクティス~日本の品質管理技術を見直そう」: プログラマの思索

TestLinkを運用して気付いたことpart11~お試しテスト、フールプルーフテスト、探索的テスト、モンキーテスト、フェイルセーフテスト、ラッシュテスト: プログラマの思索

Software Testing - Columns: スモークテスト

スモーク テストのガイドライン

@IT:The Rational Edge オープンソース時代のテスト手法(2)

スモークテストの定義は下記の通り。

(引用開始)
最初に実施するテストは「スモークテスト」だ。
これは元来「ハードウェアコンポーネント」テストと呼ばれていたもので、エンジニアが慎重に部品に電源を投入し、これから実施する大規模テストに向けて十分それが安定していることを確認するものだ。
もし、部品から煙が出たり発火したりするようなことがあれば、この最初のテストは失敗ということになる。
一方、ソフトウェアのスモークテストは、基本テストをいくつか実行し、そのソフトウェアが大規模テストに耐えられるかどうか確認する。

つまり、スモークテストとはお試しテストと同義だ。
スモークテスト(お試しテスト)が必要な理由は、本来のテストの観点でテストするために、ブロッキングバグが出る回数を減らして、テスト効率を高めるためにある。

テストを実施してバグが多発した場合、失敗したテストケースに依存するテストケースはブロックになる。
ブロッキングバグがたくさん見つかるほど、ブロッキングバグ数が少なくても、ほとんどのテストケースがブロックになってしまい、テスト不能の状態に陥りやすい。
すると、本来、テストで確認したかったテストの観点の検証ができなくなり、テストの意味がなくなってしまう。

例えば、複雑な業務シナリオに基づいて、本番の業務を想定した受入テストを行っている時に、単体テストレベルの不具合がたくさん見つかり、本来のテストを進められない状況が相当するだろう。

Software Testing - Columns: スモークテストで西さんが書かれているように、スモークテスト(お試しテスト)は、開発プロセスがしっかりしていて、単純なバグが出ないぐらいの品質を確保されているなら、実施する必要はない。

スモークテスト(お試しテスト)が有効な場面は、プロジェクトが混乱していて、たくさんの仕様変更に対応したためにデグレードが頻発していたり、ブロッキングバグを全て潰しきれていないのに機能追加を進めている状況だ。
そんな状況では、いくら大量のテストケースを準備しても、すぐにブロッキングバグが多発して、テスト不能になってしまい、テストしても無意味な状況になる。
だから、基本的なテストケースを少数用意しておき、それをスモークテスト(お試しテスト)として実施して、ビルドモジュールの品質をあらかじめ味見しておくわけだ。

スモークテストでバグが多発するようでは本番を想定した受入テストを実施しても無意味なので、まずはスモークテストが通るレベルの品質は保証してもらえるようにあらかじめチェックしておく。
つまり、スモークテストのテストケースを品質保証部門があらかじめ作っておき、それを開発チームに渡して、開発チームはスモークテストをクリアしておくように運用する。
そうすれば、品質保証部門に渡されるビルドモジュールは最低限の品質は保証されているので、受入テストなどの複雑なテストケースを実施して、テスト効率を高めることができる。

Software Testing - Columns: スモークテストで西さんが書かれているように、スモークテスト(お試しテスト)は回帰テストで自動化できるようにしておくと、より効率がよくなる。
スモークテストのテストケースはあらかじめ決まっているのだから、Seleniumなどのツールを使って自動化しておけばいいだろう。

スモークテスト(お試しテスト)は全て成功するのが当たり前のテストであり、そこでNGになるようでは先が思いやられる。
特に大規模プロジェクトでは、複数チーム間でライブラリのやり取りが多くなるので、スモークテスト(お試しテスト)で品質を味見しておくようにすれば、スムーズに作業できるようになるだろう。

テストはまだまだ奥が深い技術だ。

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

【公開】SEA関西プロセス分科会講演資料「TestLinkのベストプラクティス~日本の品質管理技術を見直そう」

本日、SEA関西プロセス分科会にて講演した「TestLinkのベストプラクティス~日本の品質管理技術を見直そう」をCC Attributionライセンスで公開します。

チケット駆動開発に関する内容はさかばさんにお任せして、本講演ではTestLinkによるテスト管理のプラクティスについて話しました。
僕が過去3年間TestLinkを通じて経験したこと、理解したこと、考えたことは全て話したつもりです。

TestLinkを通じて経験したことは、テストはプログラミングとは異なる技術だということ。
テストはやはり計画駆動であり、Agile化は難しい。
そして、テストの特徴として、回帰テストが多いこと、同類バグ調査が重要な点があります。
だからこそ、継続的インテグレーションによる回帰テストの自動化は、XPのプラクティスの中でも最も重要な指摘事項になります。
そして、バグの周辺には必ず同じ原因のバグ(同類バグ)や関連するバグが残っているので、どれだけ残存バグを見つけられるかが重要になってきます。

テスト技術はまだまだ未知の世界なので、ノウハウを少しずつ貯めていきたいと思います。

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

ReviewBoardでプレコミットレビュー

岡本さんがReviewBoardの素晴らしい記事を掲載されていたのでメモ。

【元ネタ】
Review Board | Take the pain out of code review

Review Boardならコードレビューを効率良くできる! (1/3) - @IT

InfoQ: Review Board - コードレビューをオンラインで

ReviewBoard 釣られて使ってみた | tsuyuki.makoto

Rietveldでレビューしよう @ val it: α → α = fun

徒然さめざめ Redmine Hack! reviewboardとの連携

ReviewBoardのインストール方法: プログラマの思索

ReviewBoard 釣られて使ってみた | tsuyuki.makotoには下記のように説明されている。

(前略)
Tracのような感じなのかと思っていたけれど、実は全然違うものでした。
ReviewBoardは、『改変したコードを、Subversionにコミットする前に、レビューを受ける』ためのツールです。
(後略)

つまり、ReviewBoardはSVNコミット前にコードレビューを実施するプレコミットレビュー(pre-commit review )が基本的なワークフローだ。

Review Board | Documentation | General Workflow

InfoQ: Review Board - コードレビューをオンラインででは、下記のようなワークフローになる。

1. ユーザーが何かとてもクールな変更を思いつき、ローカルへチェックアウトしたコードを変更する
2. ユーザーがレビュー依頼画面で差分を登録し、説明を書き、何人かのレビュアーを選ぶ.
3. ユーザーはそのレビュー依頼の「公開」ボタンを押して、レビュアーの誰かが見てくれるのを待つ
4. 誰かがレビュー依頼を見てこうコメントする。「なんてクールなんだ。ただちょっとおかしいな」
5. ユーザーはレビュアーがコメントした点を直すためにコードを更新する .
6. ユーザーは更新した差分を登録し、レビュアーのコメントに何を変更したか(あるいはなぜ提案されたような変更をしなかったか)返答する
7. レビュアーが更新されたコードを見てゴーサインを出す
8. ユーザーは変更をレポジトリにコミットする
9. ユーザーはさっきのレビュー依頼画面の「承認済み」ボタンを押して、レビュアーのダッシュボードからリクエストを消す

プレコミットレビューの利点は2つある。
一つは、レビューを完了していないソースはコミット不可にすることによって、SVNリポジトリの品質を保持出来ること。
XPならば、テスト駆動開発によって単体テスト済みの品質を保障するが、プレコミットレビューを使えば、二人の目による品質チェックを更に補強できる。
コードレビューをやっていないチームでは、コミットした後に間違いを発見して更に修正するといった2度手間が発生して、デグレードの危険が高くなる。

もう一つは、コードレビューの作業履歴がWeb上で一括管理できるので、レビューアとレビューイのコミュニケーションのやり取りが促進されること。
Redmineによるチケット駆動開発、TestLinkによるテスト管理も同様だが、複数人の共同作業をWeb上で一括管理できれば、作業履歴を検索するのも簡単なので、インタラクティブなコミュニケーションが可能になる。

従来は、レビューの作業履歴をExcelやメールで残していたりする。
Excelの欠点は、ドキュメント駆動になりがちで、指摘事項を探すのが面倒だし、指摘が反映されたかどうかチェックするのも面倒なこと。
メールの欠点は、返信メールに履歴が残ることによって、メールそのものが長くなりがちで、レビューの経緯を追跡しにくいこと。

ReviewBoardの使い道としては、岡本さんの記事に書かれているように、大規模プロジェクトでレビューの重要性が非常に高い場面で使うと効果的だと思う。

但し、ReviewBoardはソースのDiffを自分で作って、そのパッチをアップロードする手間がかかるために、運用がちょっと面倒な時がある。
最近は、MercurialやGitのような分散バージョン管理があるのだから、レビュー前のコードラインとtrunkを別々にブランチ管理しておき、レビュー後にtrunkへPush又はRebaceするワークフローの方が良い気がしている。

ReviewBoardの人達もそのワークフローは意識しているようで、分散バージョン管理と組み合わせたpost-commit reviewのツールも作っているようだ。

Review Board | Documentation | post-review

僕は試していないのでよく分からないが、上記の記事によれば、RBToolsというツールを使えばGitやMercurial、Perforce、SVNなどでpost-commit reviewが可能らしい。

色々試してみたいと思う。

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

2011/01/14

TiDDを実践して気づいたことpart8~事象にユニークなIDを採番するとコミュニケーションが促進される

チケット駆動開発を運用して、チームとして仕事がスムーズに進むようになったという記事を見つけたのでメモ。

【元ネタ】
チケットの書き方(我流) - 地平線に行く

事象にユニークなIDを採番する利点: プログラマの思索

紙やExcelによる管理が残っている工程: プログラマの思索

事象にユニークなIDを採番する最大の利点は、コミュニケーションを促進してくれることだ。
チケット駆動開発を運用していると、あのバグはXXのチケットです、今はタスクYYをやっています、チケットZZをコミットしたから検証お願いします、などのコミュニケーションがあちこちでかわされる。

プロジェクト内部の作業は全てチケットを起票して開始されるので、プロジェクト内部で発生した事象は全てチケットを経由するから、メンバーの認識は必ず一致する。
作業履歴や変更理由はチケットを見れば分かるから、作業の不明点を質問するレベル上がる。

事象にユニークなIDが振られていないと、事象の発生日や発生事由などを最初から逐一説明しないといけないので、お互いのメンバーの認識もずれやすい。

Excelで管理していた時は、障害報告票の番号をユニークにするために、わざわざ採番用のExcelシートから発行して、起票していたりしていた。
あるいは、リリースするビルドモジュールのタグをExcelのシートから採取して、ユニークなリリース番号を作る運用をしたこともあった。
いずれにしても、ユニークな番号を採取するために、Excelの場合はかなり苦労していたわけだ。

だが、ソフトウェア開発の全ての作業にユニークなIDを振って作業しているだろうか?
チケット駆動開発をやっているなら、チケットが障害も要望も作業も全て記載されているから、タスクにはIDが付いているだろう。
しかし、テストケースや仕様、要件にIDは振られているだろうか?
設計書を書いているメンバーは多いだろうが、仕様にIDを振っているか?
要件定義書を書いているなら、要件IDを振っているか?

要件IDを振っているからこそ、テストケースと要件を紐づけて要件カバレッジを行うこともできる。
要件IDがあれば、要件から仕様、ソース、ビルドモジュールまでのトレーサビリティも可能になる。

ソフトウェア開発の全ての成果物にIDを振る事は結構重要だと思う。
ユニークなIDがあるからこそ、成果物の質もコミュニケーションの質も上がるはず。

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

2011/01/13

エスカレーションをRedmineで運用する方法

エスカレーションをRedmineで運用する記事があったのでメモ。

【元ネタ】
redmineで案件を回したいんですよ!! - お前の血は何色だ!! 4

チケットの複製とコピーの違い | Redmine.JP Blog

Twitter / 働くぱぱ: スッキリ。Redmineで、プロジェクトをまたいでチッケトを複製するなら、コピーを選択するそうだ。複製は、同一プロジェクト内。コピーはプロジェクト間。

RedmineやTracをバグ管理だけでなく、問合せ管理にも使いたい時、エスカレーションが発生する。
例えば、オペレータがユーザから問合せを受けた時、ユーザの質問に対してすぐに回答できればよいが、調査しないと分からない場合は上司の判断を仰ぎ、開発チームに調査を依頼するワークフローがエスカレーションに相当する。
つまり、ITILのインシデント管理プロセスだけでは解決できない場合、自分より一つ上の階層へ調整を依頼して、問題管理プロセスや変更管理プロセスに回すフローになる。

上記の記事では、エスカレーションのワークフローをサポートのチケットと開発のチケットに分ける点が上手だ。
つまり、オペレータはトラッカーがサポートのチケットを起票してエスカレーションしたい時、そのチケットをコピーしてトラッカーを開発に変えて、作業を始める。
そして、開発チケットが終われば、オペレータはユーザに連絡して、サポートのチケットを閉じる運用フロー。

Redmineによるタスクマネジメント実践技法にも、エスカレーションすればー的なことは書いてあるけど、どうやってエスカレーションするのかはあまり書いてなかった。。。」という指摘の通り、具体的には書いていなかった。
僕なら、具体的には、Redmineの機能にある「コピー」と「複製」を使い分けて運用するだろう。

実際の運用では、インシデント管理と開発のRedmineプロジェクトは別々に作っておく時が多い。
理由は、インシデント管理はオペレータ、開発は開発チームのタスク管理であり、観点が全く異なるからだ。
一つのプロジェクトで問合せと開発のタスクを混ぜると、リリースタイミングの違うタスクが混じっているので管理しづらい。

すると、インシデント管理で登録したチケットを開発チームへ依頼したい時、チケットをコピーして手渡したくなる。

Redmineでは、チケットの右上に「複製」と「コピー」のリンクがある。
「複製」は同一プロジェクト内部でチケットをコピーする機能。
「コピー」は別プロジェクトへチケットを「複製」して「移動」する機能。

つまり、開発プロジェクトはインシデント管理とは異なる別プロジェクトなので、Redmineのチケットを「コピー」する機能を使えば、簡単にチケットを「複製」できる。

その後は、Redmineの優れたワークフロー機能を使って厳格な変更管理を行っても良いし、Redmineの優れたチケット集計機能で進捗をリアルタイムに管理すればいい。
あるいは、Subtasking機能を使って、コピーされたチケットをストーリーカード(要望)と見なして、複数のタスクカードをチケットの親子関係で関連付けて管理してもいい。

Redmineのトラッカーはワークフローそのものであり、作業分類はタスクの工数管理の観点なので、上記の記事のやり方はうまく考えられている。

Redmineによるチケット駆動開発を開発だけでなく問合せやSW開発以外のタスク管理に使う手法は、未知の部分が多いので、色々試してみたいと思う。

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

2011/01/12

Tracのマイルストーンを階層化する

Tracのマイルストーンを階層化する方法が書かれた記事があったのでメモ。

【元ネタ】
Tracのマイルストーンを階層化する - Hirohiroの日記

Tracのマイルストーンを階層化したい - Basic

ExtendedVersionPlugin - Trac Hacks - Plugins Macros etc. - Tracを使うと、Tracのバージョンとマイルストーンを1対Nの関係で関連付けしてくれるらしい。

この機能はTracによるチケット駆動開発をAgile化するのに重要な機能だと思う。
理由は、このプラグインによって、Tracのバージョンをビルドモジュールのリリース予定バージョンに紐づけることができて、更にイテレーションの階層化を実現出来るからだ。

これによって、ビルドモジュールからのトレーサビリティを容易に実現できるし、Tracのマイルストーンを内部リリースや段階リリースに置き換えることで、小刻みにリリースしながら機能拡張していく小規模リリースのプラクティスのバリエーションを増やすことができる。

Tracのバージョンやマイルストーンは正直使いづらかったけれど、上記プラグインがあれば、Redmineよりもチケット駆動開発を強力に運用できるようになるかもしれない。

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

2011/01/11

Redmineのロードマップにある進捗率の意味

Redmineのロードマップの進捗率について良い説明があったのでメモ。

【元ネタ】
ロードマップ画面に表示される進捗率の算出方法 | Redmine.JP Blog

Redmineのロードマップでは、進捗率が2種類表示される。
一つは終了チケットの進捗率で濃い緑色で表示される。
もう一つは仕掛り中も含めたチケットの進捗率で薄い緑色で表示される。

上記の機能が意味するのは、濃い緑色の進捗率こそが実質の進捗率であること。
顧客が使える機能は、実装する機能のチケットのステータスが終了でなければ、実装できたとしてもテストも終わっていないのだから、リリースできる品質が確保されていない。

Agile開発では、Done(終了)でない作業は全て未完了と見なすけれど、その意味は、顧客に取って価値あるソフトウェアはまさに動くソフトウェアであるからだ。
まともに動かないソフトウェアは価値あるソフトウェアとは言えない。

仕掛り中のチケットの進捗率は、見かけ上の進捗。
開発の進捗が遅れている時によくあるケースは、ロードマップで濃い緑色が短く、薄い緑色がやや長めで落差があること。
この状況は、メンバーは必死で頑張っているものの、仕掛り中のチケットが多くて、終了チケットがリリースすべき機能を満たしていないことを意味している。

例えば、工程単位に設計して開発して単体テストまでチケットは順当に消化できたものの、実際に動かしてみたら次から次にバグが見つかって、バグが登録されたチケットが多くなり、進捗率の計算式の分母に当たるチケット総数が増えたことがあげられるだろう。

PMはロードマップの進捗率を見ながら、実質の進捗(濃い緑色)と見かけ上の進捗(薄い緑色)の乖離が目立つようならば、抜本的な対策を講じる必要があるだろう。
そうでなければ、そのプロジェクトはすぐにデスマーチに陥る。

Redmineのロードマップに現れる2種類の進捗率がPMBOKのEVMに関連することに付いては以前書いた。

見かけ上の進捗: プログラマの思索

チケット駆動開発にEVMの概念を導入してみる: プログラマの思索

RedmineプラグインRodmapsにEVMの機能を追加する: プログラマの思索

つまり、終了チケットの進捗率はSPI(スケジュール効率指数)、仕掛り中も含めたチケットの進捗率はCPI(コスト効率指数)を表現していると言える。
チケットには予定と実績の作業開始・終了日と予定・実績工数が記載されているのだから、最終的にはプロジェクトの原価計算も計算可能だ。

Redmineのロードマップ画面に表示される進捗率と原価計算の関係: プログラマの思索

PMBOKのEVMや原価計算は今はアイデアの段階に過ぎないけれども、チケットに書かれた進捗情報を使えば、ソフトウェア開発に関するすべての情報を集計することは可能だと思う。

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

Redmineに複数SCMリポジトリ表示が必要な理由

Redmineに複数SCMリポジトリを表示するパッチについてメモ。

【元ネタ】
Twitter / yusuke-kokubo: #redmine #redmine Multiple SCM per Projectの本体側へのマージに動き出した感じがする。JPLもrake testを追加してる。

Twitter / yusuke-kokubo: 社内Redmineをアップデートする過程でMultiple SCM per Projectも直さないといけなくなったので半泣きになりながらも頑張ってアップデートした。

Redmine - Feature #779: Multiple SCM per project - Redmine

Redmineは元々、1プロジェクト1リポジトリの発想。
つまり、Redmineプロジェクトには、一つのSCMリポジトリからビルドされるリリースモジュールと1対1に対応する設計思想がある。

しかし、1リポジトリが急激に成長して複雑化した場合、分割して管理したくなる。
その場合、1プロジェクト・複数リポジトリで管理したい。

あるいは、バージョン管理している設計書のリポジトリとビルドモジュールの元ネタとなるソースのリポジトリが別のディレクトリで管理されている場合、複数SCMリポジトリ表示の機能がなければ、ソースとチケット間のリビジョンが表示されるだけで、設計書とチケットの間でリビジョン表示がされないので不便。

実際、Tracには既に複数リポジトリ表示の機能は実装されている。

Kosei Kitahara's Blog: Trac with Multi SVN Repos

Redmineでも早く実装して欲しい機能の一つ。

なお、BTSプロジェクトを工程単位で分割するアンチパターンについては下記に書いたので参考にして欲しい。

TiDD初心者が陥りやすい罠part2~工程単位のRedmineプロジェクトやリリース予定バージョン: プログラマの思索

【続】TiDD初心者が陥りやすい罠part2~工程単位のRedmineプロジェクトやリリース予定バージョン: プログラマの思索

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

2011/01/10

主流プログラミング言語は50年かけてLispに追いつこうとしている

IT技術は変化しているように見えて、実はそれほど進化していないという指摘を見つけたのでメモ。

【元ネタ】
変化と進歩は違う - 極北データモデリング

技術野郎の復讐---Revenge of the Nerds---

なぜ関係モデルという名前なの?

Lispという言語は、既に、条件式・関数型・再帰・動的型付け・ガベージコレクション・メタ言語(Lispのマクロ)などの機能を既に1960年代に実現していた。
Fortrun、C、C++、Java、そしてRubyへ進化したプログラミング言語をふりかえると、Lispが実現した機能を手続型言語で実装できるように進化した歴史と見ることもできる。

同様に、RDBの数学的モデルは1970年代に既に提示されていて、その当時、第二階述語論理に基づく関係モデルは既に提唱されていたらしい。

ソフトウェア工学もその誕生以来、本質的な問題は何も変わっていない。
IT技術は激しく変化しているように見えるけれど、その底流にある本質は実はあまり変わっていないのかもしれない。

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

2011/01/09

【続】TiDD初心者が陥りやすい罠part2~工程単位のRedmineプロジェクトやリリース予定バージョン

工程単位のBTSプロジェクトやBTSバージョンが何故よくないのか、再考してみた。
ラフなメモ書き。

【元ネタ】
TiDD初心者が陥りやすい罠part2~工程単位のRedmineプロジェクトやリリース予定バージョン: プログラマの思索

バージョンのないRedmineプロジェクト~TiDD初心者が陥りやすい罠: プログラマの思索

Agile開発の肝はイテレーションにあり: プログラマの思索

頻繁なVerUpがソフトウェア開発の本質: プログラマの思索

【1】WF型開発に染まっているPMやPGは、どうしても工程単位にBTSプロジェクトを作ったり、BTSバージョンにアサインしたりする。
自分たちの開発スタイルが、滝の流れのように成果物を下流工程の人へ渡して、最終成果物を作っていくからだ。
例えば、設計プロジェクト、結合テストプロジェクト、本番障害プロジェクト。
機能Aの設計バージョン、機能Aの開発バージョン、結合テストのバージョン、のように。

チケット駆動開発はそもそも、プロジェクト管理機能を持つBTSをタスク管理に使う発想だから、WF型開発でそのように使うことも可能。
だが、その運用方法では、チケット駆動開発の特徴を生かしきれていないと思う。

【2】工程単位にBTSプロジェクトやBTSバージョンを作って一番困る状況は、問合せや改善要望、リファクタリングなどのチケットはRedmineのどこに配置すべきか?が分からないこと。

プロジェクトの前半では、確かに工程単位に設計書を作り、プログラムを作り、単体テストをしていく。
その頃までは順調に進むだろう。
しかし、結合テストやシステムテストの工程に入ると、実際にシステムを動かしてみて、今までの潜在リスクが初めて現れる。
バグの原因は単体テスト漏れだけでなく、要望は判明していたにも関わらず設計そのものが漏れていたり、顧客の要望を間違えて設計していたりする時があるだろう。

設計漏れならば、設計書を最初から作り直し、ソースも修正してテストしなければならない。
それぞれの作業はSE・PG・テスターと役割が異なるから、それぞれのチケットを起票した場合、それらは結合テストやシステムテストのBTSプロジェクトやBTSバージョンにアサインされるべきだが、本来どの工程で直すべきなのか、が分かりにくい。
結局、設計書作りもソース修正もバグ検証も、同一のBTSプロジェクトやBTSバージョンで管理しないと、連携作業が悪くなるからだ。

あるいは、実際にリリース後、顧客から改善要望や問合せが来た場合、本番障害プロジェクトにチケットを起票すべきかどうか迷う。
何故なら、本番障害プロジェクトは、顧客から指摘された障害のみを登録する運用ルールの場合が多く、それ以外が発生原因のチケットが混ざると、PMが集計して進捗報告する時に困るからだ。
その運用ルールを外した場合、本番障害プロジェクトには、実際に顧客の業務に支障が出る本番障害だけでなく、顧客の改善要望や、システム修正と無関係な問合せのチケットが混じってしまうから、もはやぐちゃぐちゃのプロジェクトになる。

しかも、それまでに使った設計プロジェクトや結合テストプロジェクトはもはや使われなくなる運用にすべきかどうか、判断に迷う時もある。
仕様変更が来た場合、最初から設計書のどの部分を修正するか検討して、ソースも修正して、テストもしていくとなると、どのBTSプロジェクトに入れたら良いか分からない。

結局、工程単位にBTSプロジェクトを作ったとしても、プロジェクトの後半では、どのBTSプロジェクトも何でもありのチケットが混じってしまって、ぐちゃぐちゃの状態にならざるを得ないだろう。

工程単位にBTSバージョンを扱った場合も、設計バージョンのタスクは全てのチケットが100%完了になるのは、プロジェクト終了ぎりぎりか、そもそも100%でCloseすらされないだろう。
何故なら、設計バージョンに含まれる設計書は実際は、顧客の要望吸い上げの作業が遅延して間延びしたり、顧客の都合でリリースが延期されてバックログ扱いになったりして、保留の設計チケットが残るはずだからだ。

結局、工程単位にBTSバージョンを作ったとしても、いつまで経っても完了しないBTSバージョンが残ってしまって、じきに放置されて、作業漏れの原因になりやすい。

【3】チケット駆動開発の基本的な運用ルールは下記4個あると言える。

3-1・BTSチケットをXPのタスクカードのように扱う
3-2・PFのかんばんをBTSチケット集計結果で表現する
3-3・BTSバージョンをビルドモジュールのリリース予定バージョンと対応付ける
3-4・BTSプロジェクトをSCMリポジトリ(リリースするビルドモジュール)単位に対応付ける

【3-1】1番目は、チケット駆動開発をAgile化するための基本的な運用ルール。
チケットは作業指示書であり、仕様書そのものではない。
チケットをタスクカードのように扱うことで、開発チーム内部の作業を全て見える化できる。
ここから、プロジェクト内部の作業はチケットに起票してから始めるというチケットファーストの運用ルールが派生する。

また、チケットは作業指示書であるからには、その作業結果である成果物が必ずアウトプットとして要求される。
だから、チケットと成果物を紐づける運用ルールとして、「No Ticket, No Commit!」が派生される。
そして、この運用ルールは、ビルドモジュールからソースのSCMリビジョン、チケットに書かれた修正理由まで追跡できるインフラが整う。
すなわち、従来のAgile開発にはなかった特徴であるトレーサビリティが自然に現れる。

【3-2】2番目は、PFのかんばん、XPのタスクボードは、チケットの状態をグルーピングしたクエリで表現できることを意味している。
PFのかんばんは所詮、イテレーションに含まれるチケットに対し、未着手(ToDo)・作業中(Doing)・完了(Done)というチケットの状態でGroup Byしただけに過ぎない。
BTSの優れたチケット集計機能を使えば、かんばんやバーンダウンチャートだけでなく、ガントチャートやカレンダー、予定・実績の工数比較、バグ収束曲線など、いろんな観点で進捗や品質のメトリクスをいくらでも簡単に出力できる。
これによって、現場リーダーの意思決定を支援するインフラが整う。

【3-3】3番目は、XPの小規模リリースを実現するための最も重要な運用ルール。
Agile開発の最大の特徴は、短期間に動くモジュールを作りながら、頻繁にリリースすることによって、品質も機能も改善していくことだ。
WF型開発では、リリースのタイミングはプロジェクトの一番最後であり、リリース予定バージョンはただ一つしか無い。
だから、イテレーションが存在しない。
従って、開発者にとってAgile開発の最大の利点である開発のリズムが生まれず、延々と残業が続き、最後の一発の本番リリース前後では、休日出勤はおろか徹夜作業も強いられる時もあるだろう。

BTSバージョンがリリース予定バージョンと紐づく利点は、二つある。
一つは、SCM連携によるトレーサビリティのおかげで、ビルドモジュールのバージョンに含まれる全てのソース修正理由を追跡できることだ。
実際のソフトウェア開発では、モジュールをリリースする場合、障害修正だけでなく、顧客の要望を受けてユーザインターフェイスを改良したりエラーメッセージを直したり、障害とは言えない仕様変更も含んでリリースするのが普通だ。
だから、デグレードを起こさないために、どのソース修正がどのバージョンに含まれるのか、を追跡できるインフラがあるのは心理的に非常に心強い。

もう一つは、BTSバージョンの集合はリリース予定(リリース済)バージョンの集合でもあるから、Redmineのロードマップがリリース計画そのものになって、変更管理のインフラが整うことだ。

たとえWF型開発であろうとも、ハードやOSのバージョンアップやセキュリティパッチなどの要件で、ソフトウェア開発は頻繁なバージョンアップが宿命だから、変更管理プロセスがしっかりしていないと、すぐにシステムは不安定になる。
たったソース1行の修正やミドルウェアのVerUpでシステムはすぐに動かなくなるからだ。

だから、いつどんな機能追加や障害修正をリリースすべきか、というリリース計画を作ることが重要。
そうでなければ、マネジメントが機能していない開発チームであり、行きあたりばったりのシステム開発になってしまうだろう。

そのリリース計画は過去のリリース履歴も含んだ、将来のリリース計画でもある。
すなわち、将来のリリース予定バージョンの集合はRedmineのロードマップ、過去のリリース済みバージョンの集合はRedmineの変更履歴(リリース履歴・ChangeLog)に相当する。

PMはロードマップを見ながら、顧客の要望の重要度と開発チームの作業の優先度を天秤にかけながら、チームの直近のゴールとその先のゴールを明確にすべきなのだ。
駄目なPMはチームのゴール(リリース予定バージョン)を提示できないから、メンバーも今何を作業すればよいのか分からなくなる。

そして、BTSバージョンに含まれるチケットは、作業の種類をワークフローの単位でチケットに起票して管理すればよい。
PMは、リリース対象の機能追加や障害修正はどんなワークフローで制御すべきか、判断して、担当者にアサインする。
Redmineならば、トラッカーでワークフローを制御できる。

上記の例のように、システム開発の作業中に突然発生した仕様変更や顧客の要望、問合せは、それぞれのワークフローに対応するチケットで起票すればいい。
そして、どのタイミングでリリースすべきか、という問題は、どのBTSバージョンにチケットを設定すべきか、という問題へすり替えればいいだけなのだ。
もし、顧客の要望がかなり先のリリース物件ならば、バックログのようなBTSバージョンに一旦入れておけばいい。

BTSのチケットは元々突発的な障害を管理するために作られたから、作業予定日やステータス、実績工数、リリース予定バージョンなどの属性を変更するのは非常に容易だ。
だから、Agile開発のように変化が激しいソフトウェア開発に非常に適していると言える。

上記の理由から、XPの小規模リリースという運用ルールは、チケット駆動開発では、トレーサビリティやリリース計画、ワークフロー管理に密接に絡んでいることが分かる。

【3-4】4番目は、BTSプロジェクトを作る観点は、SCMリポジトリ、つまりビルドモジュールの単位であるべきということ。
Redmineは元々、BTSプロジェクトとSCMリポジトリが1対1に対応すべきという設計思想で作られている。
その意味は、BTSプロジェクトは動くモジュール単位で作るべきということだ。

何故、工程単位のBTSプロジェクトが良くないのかという理由は、例えば、設計プロジェクトでは、設計だけではリリースできるモジュールが出来上がらないからだ。
設計書だけできても、動くプログラムはないわけだから、顧客に価値あるソフトウェアを届けると言うAgile開発の精神とは全く異なる。

BTSプロジェクトがSCMリポジトリに紐づく利点は二つある。
一つは、並行開発のタスク管理が可能なインフラが整うこと。

Agile開発を実践してみると、頻繁にリリースするが故に、本番運用中のリリースブランチと裏で新規開発中のtrunkの2本のコードラインを持つ必ず並行開発になる。
一度リリースしたコードラインは、それで終わりではなく、顧客が業務で使ってみて、障害が発覚したり、UIを改善して欲しいなどの要望が届く。
しかし、開発チームは次のリリースに向けて新規開発中なので、突発的に発生する本番運用中の障害修正や機能改善の作業も必ず強いられる。

並行開発のタスク管理はとても難しいけれども、チケット駆動開発ではブランチ(コードライン)単位にBTSプロジェクトを作る運用なので、どのソースをどのチケットで修正すべきかが明確になり、作業が混乱しない。
そして、メインラインモデルのような構成管理パターンも併用すれば、品質重視のリリースブランチと機能拡張重視のtrunkを使い分けることができるので、ソースのデグレードも起きにくくなる。

もう一つは、Agile開発のスケールアップが運用しやすくなること。
大規模プロジェクトになると複数チームのタスク管理をBTSでやりたくなるが、WF型開発しか知らないPMならば、その時に工程単位にBTSプロジェクトを作ってしまいがちだ。
すると、複数チームの設計タスクが設計プロジェクトに混じってしまい、各チームがリリースするコンポーネントがぐちゃぐちゃに混じってしまう。

BTSプロジェクトが動くビルドモジュール(コンポーネント)に対応する運用ルールを課すならば、各チーム単位のBTSプロジェクトを作り、各チームのコンポーネントのSCMリポジトリと対応させるべきだ。
そして、各チームのBTSプロジェクトで、設計から開発、テスト、リリースまでのタスク管理を行えばよく、BTSバージョンはそのチームのリリース計画に基づいたリリース予定バージョンに対応させることができる。
そうすれば、各コンポーネント単位で小規模リリースを実現できるようになるから、自然にAgileになる。

Agile開発のスケールアップを更に徹底させるならば、複数チーム間で発生する課題の棚卸しはスクラムオブスクラムで行い、複数チーム間のイテレーションを同期させるためにアジャイルリリーストレインを課せばよいだろう。

アジャイル開発のスケールアップはアジャイルリリーストレインが鍵を握る: プログラマの思索

スクラムオブスクラム: プログラマの思索

現代のAgile開発が抱える課題: プログラマの思索

段階リリースとアジャイルリリーストレイン: プログラマの思索

すなわち、各チームのタスク管理だけでは解決できない課題は、チームリーダーの一つ上の階層であるスクラムオブスクラムで合議制によって意思決定を下す運用にする。
そして、他チームのコンポーネントが自チームの開発に必要ならば、各チームのイテレーションを同期させることアジャイルリリーストレインの運用ルールを行えばよい。

そうすれば、大規模プロジェクトのタスク管理は各チームのリリース計画(ロードマップ)の集合になるから、各チームがリリースするコンポーネントの整合性に注力しながら、全体のリリース計画を調整すればいい。
各チームリーダーが集まって意思決定を行うスクラムオブスクラムは、プロジェクトのリリース計画を決める重要な場でもある。
つまり、PMBOKのCCB、ITILのCABのような変更管理会議の役割であるべきだ。

上記の理由から、BTSプロジェクトとSCMリポジトリが1対1に対応する特徴は、メインラインモデルによる並行開発やAgile開発のスケールアップに密接に絡んでいることが分かる。

【5】上記のことを考えていると、実際のソフトウェア開発の特徴がおぼろげながら見えてくる。
実際のソフトウェア開発はもっと泥臭くて、とても繊細だ。

工程単位に穴のないような品質を作りこんで作業していくWF型開発は、あまりにも理想的で、綺麗過ぎる。
現場のソフトウェア開発は、突発的な仕様変更や障害修正、設計漏れによる手戻り作業がとても多い。
そして、リリースしたシステムは納品して終わりではなく、OSのセキュリティパッチ、顧客の要望による機能改善など、頻繁にVerUpしていかざるを得ない。
かと言って安易なVerUpはデグレードを発生させて、システムを不安定にさせてしまう。

それらの作業をこなしながら、並行して現状の作業を行わなければならない。
だからこそ、イテレーション単位に、どのタスクをいつリリースするのか、という観点でまとめて、小刻みにリリースしながら品質も機能も拡張していくAgile開発が有効であると思われるのだろう。

チケット駆動開発には、WF型開発の弱点を補うだけでなく、Agile開発を強化してくれるヒントが隠されているように思う。

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

2011/01/08

TiDD初心者が陥りやすい罠part2~工程単位のRedmineプロジェクトやリリース予定バージョン

TiDD初心者が陥りやすいアンチパターンを更に見つけたのでメモ。

【参考】
バージョンのないRedmineプロジェクト~TiDD初心者が陥りやすい罠: プログラマの思索

Agile開発の肝はイテレーションにあり: プログラマの思索

【1】WF型開発のプロマネとしてバリバリ腕を鳴らしている人がRedmineでタスク管理を運用していると、共通した特徴がある。
それは、工程単位にRedmineプロジェクトやRedmineバージョンを割り当てていること。

例えば、プロマネが1個のプロジェクトだけを抱えているなら、Redmineプロジェクトは1個だけだが、Redmineバージョンを設計、開発、テスト障害、本番障害のように工程単位にアサインしている。
大規模プロジェクトで、プロマネが複数チームをマネジメントしているなら、Redmineプロジェクトを課題、設計、開発、テスト障害、本番障害のように工程単位にアサインして、チケットのカテゴリをチーム単位にアサインしている。
この手法の弱点について考えてみる。

【2】前者の場合、設計のバージョンの成果物は設計書だけであり、機能ごとの設計書のタスクがチケットにアサインされている。
最初は、設計書が書き終わるごとにチケットが終了していくので、順調にタスクが消化されているように見える。
しかし、バージョンの納期があまり明確でない。
実際のSW開発では、出来上がった設計書から順に開発していくので、設計バージョンが50%でも次の開発バージョンに含まれるチケットに手を付けていく。
じきに、設計バージョンはプロジェクト後半になっても進捗率が100%にならないまま、ずっと残る。
同様に、開発バージョンも、保留となった機能の実装のチケットが残ったままになるから、進捗率は100%にならずに、プロジェクトが終わっても残ったままになる。

あるいは、レビューで指摘を受けて手戻り作業が発生したり、仕様変更が発生して複数の設計書を修正する場合、そのチケットをどのバージョンに入れてよいか分からない。
実際、仕様変更が発生した場合、設計書だけでなく、ソースも直すし、テストケースも修正しなければならない。
だから、設計バージョンや開発バージョン、テスト障害のバージョンまで関係するから、きちんとした運用ルールが無ければ、どこのバージョンに入れて良いか分からない。

一番困るのは、ビルドモジュールからチケットへ辿りにくいことだ。
工程単位にバージョンをアサインしている場合、プロジェクト後半では、テストで見つけたバグ修正もあれば、顧客から要望が上がった機能追加もあるだろうし、設計が間違っていたという名の仕様変更のチケットもビルドモジュールに反映されているから、どのRedmineバージョンがビルドモジュールに紐づいているのか、が分からない。

すなわち、Redmineバージョンは、チケットのカテゴリのような単なる符号に過ぎず、ビルドモジュールに関連付けされてない。
従って、RedmineロードマップやRedmineの変更履歴が、実際のリリース計画やリリース履歴に対応付けされてない。

結合テストやシステムテストのようにプロジェクト後半のテスト工程では、いつリリースしたモジュールにどんな修正が反映されているのか、という変更管理をきちんと行うのが重要。
しかし、Redmineバージョンが変更管理におけるベースラインの意味と一致していないため、リリース計画に基づかない行き当たりばったりのパッチの集合体であるビルドモジュールが出来上がってしまう。

この手法は、突然発生した仕様変更やどの工程にも属さないタスクを管理しにくい点と、ビルドモジュールからのトレーサビリティが運用されていない点が最大の弱点だ。

【3】後者の場合も前者と似たような状況になる。
課題、設計、開発、テスト障害、本番障害ごとにRedmineプロジェクトを作っているので、各工程でそれぞれのチケットを書けば良い。
だから、最初はチケットに書かれたタスク(設計書を作る、機能を実装する、バグを直す)をこなしていけるので、順調に進むように見える。
しかし、前者と同様に、例えば、設計プロジェクトにあるRedmineバージョンをどのように対応付けるのかが分かりづらい。
設計だけ終わっても、実装が終わらなければ、モジュールが出来上がらないのだから、リリースとは言えない。
リリースと言えないのだから、バージョンを付ける必要もない。

また、リリース予定バージョンをビルドモジュールのリリースタグ(SubversionのTagみたいなもの)に対応付けた場合、複数のプロジェクト間で同じようなバージョンを作って、同期させるのが面倒。
実際のビルドモジュールには、設計プロジェクトの仕様変更もあれば、本番障害プロジェクトのバグ修正もあるだろうし、課題プロジェクトにある顧客の要望対応も含まれているだろう。
それらの対応が含まれているビルドモジュールから、チケットやバージョンへ辿っていくのが面倒なのだ。

つまり、プロジェクト間の横断的なチケット管理がやりづらい。

また、本番運用モジュールと新規開発中のモジュールは、それぞれリリースブランチとtrunkに分けてソース管理しているだろうから、各プロジェクトのチケットと対応しているSCMリポジトリが、Redmineプロジェクトと1対1対応していない時が多いだろう。
だから、モジュールに含まれているソース修正はどんなチケットの集まりなのか、が判別しにくい。

また、仕様変更のチケットは既に稼働中だから本番障害プロジェクトに置くべきなのか、それとも顧客から上がった要望だから課題プロジェクトに置くべきなのか、運用ルールがはっきりしない。
つまり、工程とチケットが関連していない場合、チケット登録が非常にやりにくい。

この方法の弱点は、複数プロジェクト間でバージョンを同期しづらい点と、ビルドモジュールからのトレーサビリティを運用しにくい点があげられる。

【4】BTSプロジェクトとリリース予定バージョンに関するチケット駆動開発本来の考え方は明確だ。
BTSプロジェクトは、SCMリポジトリ(つまりリリースするビルドモジュール)に1対1対応させる。
リリース予定バージョンは、ビルドモジュールのバージョンに対応付ける。

前者の理由は、SW開発の最終成果物であるビルドモジュールとチケットに書かれたタスクを紐づけるようにトレーサビリティを実現できることだ。
後者の理由は、ビルドモジュールからのトレーサビリティが実現できるだけでなく、リリース予定バージョンの集合が将来のリリース計画や過去のリリース履歴になるように自然に対応付けるためだ。

チケット駆動開発では、BTSバージョンをXPのイテレーション、Scrumのスプリントに紐づける。
更に、BTSプロジェクトをリリースするビルドモジュールの単位、つまりSCMリポジトリの単位に紐づける。
これによって、イテレーション単位に機能拡張していく開発スタイル、つまりXPの小規模リリースを容易に実現できる。
ソフトウェア開発を花壇のガーデニングのように、手入れしながら少しずつ育てていく開発スタイルへ持っていける。

Agile開発では、顧客に価値あるソフトウェアを早く届けることを最優先にする。
その意味は、動くビルドモジュールを確実に頻繁にリリースすることだ。

工程単位にBTSプロジェクトやBTSバージョンを割りつけると、最終的な成果物であるビルドモジュールへの対応付けがあいまいになってしまう。
設計が終わっても動くシステムは出来ておらず、リリースしたとは到底言えない。
開発が終わっても、単体テストがまともに終わっていないモジュールは品質が悪く、顧客にとって価値あるソフトウェアとは到底言えない。

そういうアンチパターンを見ていると、チケット駆動開発はTracのチケット管理から生まれたゆえにチケット管理が重要に見えるけれども、実はイテレーション管理(BTSのリリース予定バージョンの管理)こそがAgile開発の運用の肝なのだと実感できる。

実際のソフトウェア開発は、設計も開発もテストも同時並行しながら試行錯誤しながら作っていくものだ。
実際に作ってみて設計の不備が分かり、システムへの理解を深める。
実際にテストして動かしてみて、顧客が本来どんな動作を期待していたのか、を理解するようになる。
突発的なタスクの発生や、仕様変更はソフトウェア開発では日常茶飯事だ。

チケット駆動開発でAgileに開発していると、工程単位に綺麗に作ろうとするWF型開発は、SW開発の現場にそもそもマッチしていないのではないか、と思う。

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

2011/01/05

【告知】今年もXP祭り関西でチケット駆動開発の講演やります #xpjugkansai #tidd

2011年もやります! 「XP祭り関西2011」

関西のアジャイル系イベントとしてすっかり定着した「XP祭り関西」。今回も多彩なコンテンツをご用意して、皆様の参加をスタッフ一同お待ちしております。

今年は、現場の皆様にお役に立つ実用的なコンテンツを多数用意。
190名様収容可能な会場を確保しましたので、職場の皆様お誘いあわせの上、是非ご参加下さい。
満席となる事が予想されます。なるべくお早めの申し込みをお勧めします。

1月29日 XP祭り関西2011

XP祭り関西2011 - XPJUG関西wiki

【開催概要】
日時 2011年01月29日
開催場所 大阪市立 会館 鶴見区民センター
(〒530-8201 大阪市北区中之島1丁目3番20号)
参加費 無料
定員 190人(先着順)
申し込み開始 2011年01月05日 00時00分から
申し込み終了 2011年01月24日 23時59分まで
懇親会場所 詳細未定
懇親会費 4,000円(税込)
懇親会定員 60人(先着順)

■メイン会場(2F小ホール)―190名
【1-1】 基調講演 (詳細は後日発表)
木下史彦 /永和システムマネジメント

【1-2】セッション1「Agile開発のスケールアップ」
あきぴー /XPJUG関西

XPが登場して10年経ち、Agile開発の利点は広く知られてきたものの、Agile開発は大規模プロジェクトに適用しにくいなどの弱点を言われ続けてきました。
しかしながら昨今、従来のAgile開発の弱点を補強しようとする動きが起きており、これらはAgile2.0(2週目のAgile)と呼ばれています。
チケット駆動開発は高機能化したBTS(バグ管理システム)をAgile開発のプロジェクト管理に使う発想から生まれましたが、このAgile2.0の潮流の一つとしてあげられています。
本講演では、昨今のAgile2.0がAgile開発の弱点をどのように解決しようとしているのか、そしてチケット駆動開発はAgile開発をどのように進化させようとしているのか、について解説します。

【1-3】セッション2(詳細は後日発表)
井芹洋輝

ユニットテストの保守性の作りこみ、ユニットテストの継続的活用などについてお話を頂きます。(予定)

【1-4】セッション3(詳細は後日発表)
森崎 修司 /奈良先端科学技術大学院大学

■ワークショップ会場(2F控え室1/2)―25名
【2-1】ワークショップ (詳細は後日発表)
PFP関西

2006年に発足後、「プロジェクトファシリテーション」を主題にソフトウェア開発現場の改善方法を参加者と共に模索し続けている団体。

※ [セッション1/2]と[ワークショップ]は並行実施します。
※ どちらに参加するか、選択頂くこととなります。

今回もやります!「ライトニングトークス」

ライトニングトークスとは、持ち時間がたったの5分という短いプレゼンテーション。だった5分でも、何か話したい、発表したいとお考えの方、是非お申し込みください。(先着5名様迄)
参加申し込み受付中!

* メイン会場 - 先着200名
* ワークショップ会場 - 先着25名
* ライトニングトークス - 先着5名

カンパのご協力をお願いします。

参加費は無料ですが、カンパ(お一人様500円)をお願いしております。ご協力頂ければ幸いです。

※ 懇親会は有料です(¥4,000円)
注意事項

・参加をキャンセルされる場合は、なるべくお早めに本ページからキャンセル手続きを実施願います。

・2011/1/24以降、懇親会の参加をキャンセルされた方は、参加費をご負担頂く場合があります。

・会場内にて関係者以外の、撮影や録音、LIVE映像配信等は禁止します。

・関係者以外で、会場内での携帯電話、カメラ、ビデオ等を用いた撮影・録音等を行っていると疑わしい方には、スタッフが声をかける場合があります。

・当日、スタッフ管理の元、写真撮影およびUSTREAMによる動画配信を実施する場合がありますが、肖像権に配慮した上で、会場内の撮影を行います。

【追記】
今年のXP祭り関西では、新しいAgileな受託開発のビジネスを始められた木下さん、ユニットテストをお話する井芹さん、日本におけるソフトウェアレビューの専門家である森崎さん、日本流のAgile精神を生み出したプロジェクトファシリテーションのセッションを行うPFP関西コミュニティを迎えます。

僕も、Agile2.0の背景に隠れている「Agile開発のスケールアップ」について、チケット駆動開発の経験を元にAgile開発の進化の方向性についてお話したいと思っています。

テスト管理ツールTestLinkのお話は、第43回 SEA関西プロセス分科会で今までの経験談を語る予定なので、そちらでも聞きに来て下さい。

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

2011/01/03

TestLinkを運用して気付いたことpart11~お試しテスト、フールプルーフテスト、探索的テスト、モンキーテスト、フェイルセーフテスト、ラッシュテスト

Nakaさんからテスト手法について聞いたのでメモ。
以下メモ書き。

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

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

TestLinkのベストプラクティス集: プログラマの思索

TestLinkのアンチパターン: プログラマの思索

TestLinkのFAQ: プログラマの思索

TestLinkを受入テストで運用する方法: プログラマの思索

【1】お試しテスト

お試しテストとは、テスト対象モジュール・テストケース・テスト実施者などを対象として、本格的なテストを実施する前に味見するテスト。

例えば、携帯電話の実機とそのプログラムをテストする場合、本格的なテストをする前に、いくつかの基本的なテストを実施して、発見されるバグが多すぎるなら、テストしても無意味だから開発チームへ送り返す。
業務システム開発ならば、要件定義や詳細設計などの上流工程が穴だらけのまま何とか開発して動作できるようにしたものの、異常系のテストがボロボロみたいな状況の場合、テスト不能として送り返す。

これらの状況の場合、テストケースをきちんと準備してテストを開始すると、いきなり重大なバグが出て、後続の依存するテストケースが殆どブロックになってしまって、テスト不能に陥った状態があげられるだろう。
つまり、テストを続行しても、テストに耐えれる品質でない場合が多いだろう。

あるいは、テストケースをお試しテストの対象とした場合、テストで殆ど潜在的なバグを見つけられないなら、テストケースの品質が良くないと評価して、テスト仕様書を作り直す。
この状況の場合、テストケースの品質が良くないため、バグ出しできていないので、テストケースが要件や仕様を網羅しているか、漏れている仕様はないか、などの観点で作り直す時が多いだろう。

あるいは、テスト実施者(テスター)をお試しテストの対象の場合、テスターがテスト作業に向いているかどうかを判定するために使う。
実際のテスト作業は、仕様を理解して、テストの事前条件のためのテストデータを揃えて、エビデンスをきちんと採取して、細かい部分まで検証する作業が多い。
そういうテスト作業に向いていない人もやはりいる。
だから、お試しテストでふるいにかける。

いずれの場合にしても、本格的なテストを行う前に、モジュール・テストケース・テスト実施者の品質がクリアされているかどうかを早めに検知して、開発チームへフィードバックすることを目的とするわけだ。

【2】フールプルーフテスト、探索的テスト、モンキーテスト、フェイルセーフテスト、ラッシュテスト(ストレステスト or 負荷テスト)

フールプルーフテストとは、フールプルーフの機能をシステムが満たしているかどうかのテスト。
つまり、ポカよけできているかどうかのテスト。

信頼性設計 - Wikipedia

よくある例は、電子レンジのふたを開けたら発熱を止める機能があるだろう。
例えば、医療機器や家電製品の場合、ユーザが誤動作しても安全に動作しないと、人体や社会に大きな影響を与えるから重要なテストになる。
開発者がテスターになるよりも、開発に携わっていない人がテストすると、マニュアル通りの操作をしないので、ポカよけできているかどうか判断しやすい。
多分、結合テストやシステムテストの一部として含まれる時が多いだろうと思う。

似たようなテストとして、モンキーテスト、探索的テスト、フェイルセーフテストもある。
モンキーテストとは、特に目的を定めず、猿のように操作を行うテスト。
Webシステムなら、テストの最後に、実際にユーザが初めてシステムに触れることを想定して、何も考えずにテストする時が多いだろう。

探索的テストとは、経験者がテスト仕様書から離れて、特定の機能を深堀してテストしていくこと。
テストの例としてよくあげられるが、実際のテスト作業としては難易度が高いと思う。
理由は、バグが出たとしても再現させるのが難しかったり、仕様を深く理解していなければテスト工数の無駄になりがちだからだ。
前者の対策としては、バグを再現させるために、作業ログが重要。
昔は紙に作業ログを書きながら、少しずつテストしていくしか無かったけれど、今は操作を動画で採取するのが非常に簡単になった現状もある。

フェイルセーフテストは、フェイルセーフの機能をシステムが満たしているかどうかのテスト。
つまり、故障が発生したとしてもシステムが安全に稼働しているかどうかを検証する。
実際は、ある部品や機能が壊れたとしても安全に動作するように冗長化されているか、などの観点が含まれるだろう。
最近は、組込製品の安全性が品質要件として重要になってきた傾向があるので、フールプルーフテストやフェイルセーフテストもテスト工程に含める時が多くなっているだろう。

フォールト・アボイダンスからフェイルセーフ、フォールト・トレランスへ: プログラマの思索

ラッシュテスト(ストレステスト)は、特にWebシステムの負荷テストのこと。
下記の記事のように、システムが大量のアクセスに耐えれるかどうかを検証する。
最近は、JMeterなどのツールを使って、性能要件を満たさないボトルネックを見つけて、サーバーの設定を変えたり、メモリを増やしたり、RAIDにして冗長化するなどの対策を取る時が多いだろう。

負荷テストとは 「ストレステスト, ラッシュテスト」 (stress test): - IT用語辞典バイナリ

Webシステムのリリース作業とフォールトトレランス: プログラマの思索

TestLinkで上記の観点のテストを含める場合は、テスト計画単位にアサインする手法が良いと思う。
つまり、お試しテスト、フールプルーフテスト、フェイルセーフテスト、ラッシュテストのテスト計画を作って、それぞれのテストケースを割り付けて、五月雨式にテストしていくやり方。
テスト計画をイテレーションに紐付けて、イテレーション単位にアジャイルにテストしていく手法が良いと思う。

理由は、プロジェクト後半という限られたテスト工数しか確保できない状況では、テストの目的を明確化してテストした方が効率が良いからだ。
但し、モンキーテストや探索的テストは特にテストケースが無いため、除いている。

テストはやればやるほど奥が深いと思う。

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

2011/01/02

ITの地殻変動はどこで起きているのか?~チケット駆動開発が進むべき道

2011年になって、ITの地殻変動がどこに起こっているのか?を改めて考えてみる。
ラフなメモ書き。

【元ネタ】
チケット駆動開発 … ITpro Challenge のライトニングトーク (4) - まちゅダイアリー(2007-09-07)

チケット駆動開発が進むべき道part1~ソフトウェア開発のベストプラクティスをオープンソースのツールで実現する: プログラマの思索

チケット駆動開発が進むべき道part1~ソフトウェア開発のベストプラクティスをオープンソースのツールで実現する: プログラマの思索

現代のAgile開発が抱える課題: プログラマの思索

Agile開発が指摘したソフトウェア開発の特徴: プログラマの思索

【ソフトウェア開発の課題】
ソフトウェアは変化するのが宿命。
ハードがこれだけ日進月歩で進化しているのに、VerUpしないソフトウェアは価値がない。

しかし、SW開発はとても繊細。
たった1行のソース修正でシステムはすぐに動かなくなる。
ハードやOS、ブラウザを安易にバージョンアップすると、システムは不安定になる。
ソフトウェア開発は製造業よりもはるかに繊細だ。

だから、変更管理が重要。
どのコンポーネント、どのソースをどのように直したのか、どのモジュールをリリースしたのか、をきちんと記録して、あらかじめ作業手順をレビューして承認していくフローが必要になる。
だが、そのワークフローは大量のドキュメントとたくさんの承認フローによって、すぐに重厚長大となり、ソフトウェア開発の速度を落とす。

開発案件が大規模になるほど、承認フローや意思決定が複雑になる。
サブシステム間の課題や作業のやりとりをチームレベルではなく、もう一つ上の層で意思決定する場が必要になってくる。
従来の課題管理会議では、開発チームのリーダークラスが集まって、チーム間の課題やプロジェクトの方向性について議論して、組織としての方針を決定する。
しかし、大規模化するほど、会議は長引き、決まるのが遅くなり、組織そのものの進捗も遅くなる。

だが、ソフトウェア開発の本質から生じる上記の諸問題に対し、アジャイル開発は過激な主張を持って解決しようとしている。
「変化を抱擁せよ」のキャッチフレーズ通り、アジャイル開発の最大の特徴は変化に強いこと。
XPが提唱するソースの共同所有、テスト駆動開発、継続的インテグレーション、小規模リリースなどのプラクティスによって、開発者が作業するインフラが整う。
そして、Scrumが提唱するバックログ、スプリントなどの諸概念によって、アジャイル開発のプロジェクト管理のフレームワークも整った。

しかし、アジャイル開発の最大の弱点は、従来の環境のままでは変化が激しいタスク管理やイテレーション管理を制御するのが難しいこと。
そして、アジャイル開発の事例は小規模プロジェクトが多かったため、つい最近まで、大規模プロジェクトではアジャイル開発は適用しにくい、アジャイル開発は設計や品質の作り込みが弱い、と言われ続けてきた。

【チケット駆動開発の意義】
チケット駆動開発はTracのチケット管理から生まれた。
発端はまちゅさんが提唱されている。

チケット駆動開発の特徴は、BTS(バグ管理システム)のチケットを障害だけでなく、仕様変更やリリース作業などあらゆるタスクを管理する方向へ拡張した点にある。
これがいわゆるIssue Trackingと呼ばれる特徴だ。
だから、TracやRedmineはBTS(Bug Tracking System)ではなく、ITS(Issue Tracking System)と呼ばれている。

そして、チケット駆動開発の最大の意義は「BTSチケットをXPのタスクカードのように扱う」ことによって、アジャイル開発のプロジェクト管理に応用できる点にある。
#この発想はさかばさんが提唱された。

TracやRedmineでは、単にチケットを障害管理に使えるだけでなく、ガントチャートやカレンダーなどの進捗管理機能、ロードマップやリリース履歴などのリリース計画機能、チケットの種類(トラッカー)に応じた柔軟なワークフロー管理、構成管理との連携によるトレーサビリティ、チケットの集計機能を使った品質管理機能など、各種の機能が豊富にある。

BTS(ITS)の優れたプロジェクト管理機能を使って、アジャイル開発のプロジェクト管理を容易に構築して、更にブラッシュアップすることも可能になった。

この発想は、生物進化の前適応の話を連想させる。
前適応とは、ある適応された形質が形作られる場合に、以前から存在した別の機能を持つ形質が用いられたことを指す。

前適応 - Wikipedia

大量絶滅 - Wikipedia

前適応の例は、恐竜から鳥へ進化した経緯が分かりやすい。
恐竜は、数億年前、生物の大絶滅で酸素が急激に減った環境から生まれた。
そのため、恐竜は低酸素の環境でも生存できるように、気嚢と呼ばれる優れた酸素ガス交換機能を持つようになり、その機能が鳥にも引き継がれた。
実際、鳥を解剖してみると、気嚢とよばれる器官が肺から体中に伸びていて、新鮮な酸素を体中に行き渡らせることができているらしい。
その機能のおかげで鳥は、ヒマラヤの高山の空という低酸素の空間でも飛ぶことができる。

更に、小型化した恐竜は体温を維持するために、羽毛を持つようになった。
その羽毛が翼に進化して、鳥は飛べるようになったという説がある。

つまり、鳥が持つ気嚢や羽毛は、本来恐竜が生存していくために作り出した機能だったが、鳥はそれらの機能の目的を変えて、自分たちの都合の良い機能へ意味を変えたわけだ。
だから、鳥は生きた恐竜の化石とも呼ばれているらしい。

前適応の話を聞いて、障害管理からチケット駆動開発へ発展した話と全く同じ構造を持っているような印象を持った。
チケット駆動開発の特徴であるプロジェクト管理機能(チケット管理、進捗管理、構成管理やビルド管理との連携によるトレーサビリティ機能、強力なワークフロー管理など)は、本来は障害管理に必要な機能として発展してきたのだが、目的を変えるだけで、アジャイル開発のプロジェクト管理にも使える、と世界中の人達が気付いたわけだ。
そして、世界中の開発者が、アジャイル開発のプロジェクト管理を実現するツールをどんどん作り出している。
その可能性はとてつもなく大きいと思っている。

【チケット駆動開発の可能性】
僕が今後試してみたいのは、Redmine上でチケット駆動開発を行う事によって、アジャイル開発の運用のハードルを下げるだけでなく、アジャイル開発の新しい運用方法も提唱してみたいことだ。
チケット駆動開発にXP・Scrum・CMMI・PMBOK・ITIL・SW工学・原価計算・PFなどの知識を詰め込んで、チケット駆動開発を理論として強化していきたい。
Redmineを単なるプロジェクト管理ツールだけでなく、SW開発の全ての業務を支援するツールへ高めたいのだ。

つまり、XP・Scrum・CMMI・PMBOK・ITIL・SW工学・原価計算・PFなどの理論や概念は本来それぞれの目的があるだろうが、チケット駆動開発を支援するための手段や道具とみなして、チケット駆動開発をソフトウェア開発の体系的な理論として骨付して肉付けしていきたいのだ。

ラフなイメージは下記の通り。
以下は書きかけ。
少しずつ考えていきたいと思っている。

【1】ロードマップによるリリース計画作り
 小規模リリース
 イテレーションとリリース予定バージョンを同一視する
 タイムボックス的な開発
 漸進型開発と反復型開発の違い

【2】バックログによる要件管理
 要件のイテレーション管理
  チケットの親子関係
   RedmineのSubstasking
  期限の無いリリース予定バージョンで管理する方法もある
  チケットをイテレーション間で移動する
 サスペンドリンク
  要件変更の影響範囲
  仕様変更の工数を予測可能になる

【3】SCM連携によるトレーサビリティ
 レコメンドエンジンの実装
  ソース修正時に過去に修正した関係ソースやチケットを表示する
  同類バグの調査
  設計漏れをなくす
 分散バージョン管理との連携
  構成管理パターン
   ブランチ管理
   マージ機能
  イテレーションとコードラインの関係性

【4】テスト管理ツールとの連携、ビルド管理ツール、コードレビュー管理ツールとの連携
 メトリクスの使い方
  信頼度成長曲線
   SRATS
  テスト消化曲線
   TestLinkCnvMacro
 品質管理の考え方
  ブロックやみなしバグの影響範囲を示唆する
  同類バグの範囲を自動的に示唆する
 移植性
  再利用性
  ソフトウェアプロダクトライン
  派生開発
  XDDP
 保守性
  リファクタリング
  変更容易性
 コードレビュー
 ビルド管理
  並行ビルド
  本番環境の仮想化
 RestfulAPI
  外部ツールと連携
  エンドユーザコンピューティングのためのクライアントツールと連携

【5】ワークフロー管理
 変更管理の考え方
  自然なペア作業
  チケットをCloseする時は必ず二人の目を通す
 ITILの考え方
  サーバー監視ツールが障害を検知したら、メール送信する時にチケットも自動登録
  Hudsonがビルドエラーを検知したら、メール送信する時にチケットも自動登録
  トラッカー単位に集計してプロセス改善
  オペレータが対処できないチケットは、上位管理職へエスカレーションする
 ワークフローの可視化

【6】大規模アジャイルの運用方法
 アジャイルリリーストレイン
 スクラムオブスクラム 
 アーキテクチャ助走路
 分散開発は?
  プロジェクトファシリテーションを分散開発のチームビルディングへ拡張する

【7】PMBOKのEVM、活動基準原価計算(ABC)
 予定・実績工数の管理から原価管理
 プロジェクトの製造原価、コスト、利益をシミュレーションする

【8】PMBOKの応用
 クリティカルパスの計算
 ボトルネックの探索
 PMIS
 アジャイル開発のプロジェクト管理の概念をPMBOKで支援する

【9】PF(プロジェクトファシリテーション)のプラクティスと連携
 朝会
 KPTによるふりかえり
  プロセス資産
 ニコニコカレンダー、かんばんをデジタル化
 オフショア開発のように場所が離れた場合のチームビルディング方法
  オープンソースでは当たり前

【10】Excelをエンドユーザコンピューティングとして使う
 マネージャや顧客が欲しいデータはCSVで渡せばいい
  好きなようにカスタマイズしてくれればいい
  何も全ての機能をRedmineで実現する必要は無い
   業務システムが全帳票を作る必要はなく、CSVでデータ提供する機能を実装しておくのと同じ

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

2011/01/01

連関エンティティと関連クラス

データモデリングの連関エンティティとUMLのクラス図の関連クラスの関係がようやく分かったのでメモ。
ラフなメモ書き。

【元ネタ】
「関連クラス」をデータモデルで解き明かす(前編): 設計者の発言

「関連クラス」をデータモデルで解き明かす(後編): 設計者の発言

@IT:オブジェクト指向の世界(13)

@IT:オブジェクト指向の世界 (4)

Oracleのデータ整合性

UMLによるオブジェクト指向モデリングでは、関連クラスが分かりにくい。
普通の多対多の関係とどう違うのかが分かりにくいからだ。

渡辺さんのBlogによれば、データモデリングで実装すれば一目瞭然。
OOAの関連クラスは、DOAの連関エンティティ(対照表)と同等。
つまり、連関エンティティの場合、複合キーを持つ。

OOAの普通の多対多の関係は、DOAでは外部キーで参照制約を持っているだけ。

二つの実装は、仕様の意味が異なる。
連関エンティティの場合、複合キーになるので、二つのエンティティの主キーの組合せが一意というのが重要な意味を持つ。
連関エンティティはイベントになる可能性があり、イベントであるからには何らかの日付を持つ。
つまり、連関エンティティは履歴系テーブル(トランザクション)になりやすい。

DOAの外部キーは、二つのエンティティにおいて、関連する業務が存在することを意味する。
普通は参照制約(reference)が存在するが、更新したり削除したりする時の業務ロジックを考慮しないと、変なデータが残ってしまう。
だから、更新や削除を制限するならno action制約、共に削除するならcascade制約などを追加する時もあるだろう。

データモデリングについては今後も少しずつまとめていく。

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

リソース数がビジネスの可能性に関係する理由

T字形ERではテーブルをリソースとイベントの2種類に区別して、ビジネスを分析する手法を取る。
T字形ERでは「リソース数>イベント数なら、イベントを増やすことによってビジネスを拡張できる可能性がある」と言われている。
その理由が分かったのでメモ。
ラフなメモ書き。

【元ネタ】
なぜresourceにeventが混入してはいけないのか - 極北データモデリング

resourceの数がデータベースの限界を決める - 極北データモデリング

T字形で事業を解析する、とは - 極北データモデリング

「データベース設計論」を読む(1) - 極北データモデリング

【1】T字形ERでは、ヴィトゲンシュタインの本にインスパイアされたという言葉がよく紹介されるが、その理由がresourceの数がデータベースの限界を決める - 極北データモデリングなぜresourceにeventが混入してはいけないのか - 極北データモデリングに書かれている。

つまり、ヴィトゲンシュタインが言う論理空間はデータベースであり、対象がリソース、事態がイベント、論理形式がスキーマに相当する。
目の前の事象を、対象や事態に区別し、本来の対象を見出す作業がヴィトゲンシュタインの哲学みたい。

事態(イベント)から対象(リソース)を見出すのが正規化なのかもしれない。
また、対象(リソース)と対象(リソース)を組み合わせて事象(イベント:対照表)を作り出すのが、T字形ERの発想に似ているらしい。

すると、対象(リソース)はそのビジネスルールによって生成できる事態(イベント)は限られているから、生成できる事態(イベント)の数は、対象(リソース)の数で制限されている。
ましてや、総当たりで対象(リソース)を組合せたとしても、本当にビジネス上意味のある事態(イベント)はそうは存在しないはず。
だから、できるだけ事態(イベント)を多く作っておき、ビジネスの可能性を残しておくという手法を取るのだろう。

【2】T字形で事業を解析する、とは - 極北データモデリングでは、「論理データベース論考―データ設計の方法:数学の基礎とT字形ER手法」の本に書かれているアパレルメーカーのビジネスの例が書かれている。
ここは非常に分かりやすい。

アパレルメーカーだから、ユニクロなどが例にあげられるだろう。
ここでは、「生地を裁断してから染色するのか」「生地を染色してから裁断するのか」のどちらを業務フローにしているのか、がデータモデリングで分かるらしい。
すると、裁断と染色の順番が分かったら何が嬉しいのか?

実は、ベネトンがセーターの染色と編み上げの順序を入れ替えることで大成功を収めた、という事例があったらしい。
つまり、伝統的なセーターの製法は「糸を染めてからセーターを編む」だが染色から販売まで6ヶ月もかかるので、見込生産となってしまい、大量の在庫ができてしまい、需要予測が外れると大赤字になってしまう。
しかし、編んだセーターを染める技術が確立されたおかげで、ベネトンは「セーターを編んでから染める」手法へ製造順序を逆転することによって、受注生産や直販が可能になり、在庫と機会損失が減った、という話。

この話から得られる教訓は、T字形で事業を解析する、とは - 極北データモデリングにも書かれているが、その業界のビジネスがあまり分からなくても、データモデリングでエンティティを見出し、その順番について考えざるを得ない時、コロンブスの卵の発想のような業務革新のアイデアをSEが提案できる可能性があること。

昨今の技術革新の進歩は速いので、エンティティの順序やエンティティの組合せを変更するだけで在庫が減り、在庫の回転率が上がる業務フローをSEが見出すことも可能なはず。

データモデリングには、ビジネスを知らないSEがビジネスを分析する手法が隠されている気がする。

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

2次識別子を使ったデータモデリング

渡辺式ER図を使ったデータモデリングでは、2次識別子が重要な役割を意味する。
生産管理・原価管理システムのためのデータモデリング」を読んで腑に落ちなかった点が下記のBlogを読んで分かったのでメモ。
ラフなメモ書き。

【元ネタ】
2006-07-19 - 極北データモデリング ボイス・コッド正規形への分解は、結局どうすればいいのか(2)

ボイス・コッド正規形への分解は、結局どうすればいいのか(1) - 極北データモデリング

データ値の制約SQL -TECHSCORE-

@IT:Oracle管理者のためのSQLリファレンス

生産管理・原価管理システムのためのデータモデリング review - Ynishi Bussiness Logs

【1】2次識別子とは

2次識別子とは、主キーでないが一意になるキー。
但し、2次識別子となるキーは、値が更新されてもいいし、NULL値も許される。
例えば、商品マスタのJANコードや、製品マスタの仕様コードなどがあるだろう。

2次識別子は主キーにはなりえないが、ビジネスルール上は一意だが、更新タイミングによってはNull値の場合がある。
2次識別子は候補キーでもある。
DOAを駆使しないならば、アプリケーションでロジックを実装しているだろう。

生産管理・原価管理システムのためのデータモデリング」では2次識別子を実際のデータモデリングで駆使する。
その理由がよく分からなかったけれど、上記のBlogでようやく理解できた。

【2】ボイスコッド正規形へ分解する時に何故2次識別子が必要になるのか?

2006-07-19 - 極北データモデリング ボイス・コッド正規形への分解は、結局どうすればいいのか(2)ボイス・コッド正規形への分解は、結局どうすればいいのか(1) - 極北データモデリングの例をあげておく。
#詳細は上記Blogを参照。

受講:学生,科目,教官

というテーブルがあったとする。
主キーは、学生と科目の複合キー。
但し、下記2この関数従属があるとする。

{ 学生, 科目 } -> { 教官 }
{ 教官 } -> { 科目 }

「1科目を教える教官は複数いてよい」ビジネスルールが{ 学生, 科目 } -> { 教官 } 、「1教官は1つの科目しか担当しない」ビジネスルールが{ 教官 } -> { 科目 }の関数従属に相当する。

受講テーブルは第3正規形だが、{ 教官 } -> { 科目 }の関数従属があるので、ボイスコッド正規形ではない。
受講テーブルの弱点は、学生と科目が決まらないと教官を含めたレコードを登録できないので、履修登録前の講座(教官と科目のペア)を受講テーブルに登録できなかったり、公開中の講座から学生が全員履修取り消しで0人になったら講座のレコードそのものが消えてしまう。
つまり、更新時異常の弱点がある。

受講テーブルに他の参照制約(no action, cascade, check)を追加しても解決できない。

普通の教科書では、下記へ分解するため、{ 学生, 科目 } -> { 教官 }の関数従属が消えてしまう。

講座:教官,科目 (教官が主キー)
受講:学生,科目 (学生、科目が複合キー)

つまり、{ 学生, 科目 } -> { 教官 }の関数従属を満たさないレコードが受講Tblに挿入可能になってしまう。
だから、普通の教科書では、ボイスコッド正規形を分解するとよくない、と言われて終わる。

しかし、T字形ER図や渡辺式ER図では別の解決策を取ろうとする。
つまり、上記Blogに書いているように、全てのビジネスルールを表す構造(テーブル、リレーションシップ)を新たに追加すればいいという発想で解決しようとする。

渡辺式ER図では、下記のようなER図になる。
#()が主キー。

科目 = { (科目コード), 科目名 }
教官 = { (教官コード), 教官名, 科目コード }
学生 = { (学生コード), 学生名 }
受講 = { (学生コード, 教官コード), (学生コード, 科目コード) }

受講テーブルは、(学生コード, 教官コード)が主キーであり、 (学生コード, 科目コード)を2次識別子として、教官テーブルへ参照制約を追加すればよい。
そうすれば、(学生コード, 科目コード)は教官テーブルに存在するデータのみしか登録できなくなるので、受講テーブルに更新時異常が起きることはない。

但し、実際の受講テーブルは{ (学生コード, 教官コード), 科目コード}であり、実際の2次識別子の実装方法はunique制約を使えば良い。

create table class_attending (
teacher_id integer not null references teacher(teacher_id),
course_id integer not null references course(course_id),
student_id integer not null references student(student_id),
-- 主キーの設定
constraint class_attending_pk_key primary key (teacher_id, student_id),
-- "{ 教官 } -> { 科目 }" の実装(参照制約)
constraint class_key foreign key (teacher_id, course_id) references class(teacher_id, course_id),
-- "{ 学生, 科目 } -> { 教官 }" の実装(2次識別子)
constraint class_attending_unique_key unique (course_id, student_id)
);

unique制約を持つキーは、テーブル上で一意の制約があるが、複数個作れるし、NULL値も許される。

生産管理・原価管理システムのためのデータモデリング」の72ページでは、MS Accessで2次識別子を実装するには、インデックスプロパティで固有インデックス=はい、NULL無視=はい、を選択する方法を紹介されている。

生産管理・原価管理システムのためのデータモデリングでは、二次識別子の実装を諦めたと書いてあるが、unique制約を付ければ問題なく実装可能のはずだと思う。

実際の2次識別子となるキーは、固有属性でなく継承属性で初めて現れるキーもあるため、注意しないと分かりにくいので要注意。

【3】渡辺式ER図の独創性

渡辺式ER図で2次識別子を使ったデータモデリングを駆使する理由は、ボイスコッド正規形も使って最終的には第5正規化まで正規化し尽くすためにあるからだ。

販売管理システムで学ぶモデリング講座 (DB Magazine SELECTION)」にも書かれているが、業務システムの複雑さそのものは、いくらサーバーの性能がアップしても、プログラミング言語の生産性が上がっても変わらないことを「業務システムの複雑さの保存則」と呼んでいる。
その保存則が正しいと言う仮定のもとで、機能モデルは簡単にして、データモデリングと業務モデルを複雑化する方向がよいと「販売管理システムで学ぶモデリング講座 (DB Magazine SELECTION)」は主張している。

正規化するほどテーブル数も増えて、整合性の制約も増えていき、データベース設計が非常に複雑になるけれど、ビジネスルールがデータベースの制約で実装されているため、アプリケーション層で実装すべきビジネスルールが減る利点がある。

昨今のWeb開発は、Railsのような優れたフレームワークがあるおかげで、データベース設計さえしっかりしていれば、CRUD機能などは簡単に実装できるし、複雑なロジックもRubyでサクサク実装すればいい。

エンタープライズ Rails ―企業ユーザのためのWebアプリケーション設計術」では、Railsのスケールアップのためにデータモデリングをあらかじめ考慮すべきと主張し、RailsでのDOAの重要性を主張している唯一の本でもある。参考になる。

又「データベース・リファクタリング」では、プログラムのリファクタリングと同様にデータベース設計のリファクタリング方法を説明している唯一の本。とても役立つ。

データモデリングの技法は、実は最近どんどん重要性を増しているという隠れた事実があるように思う。

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

« 2010年12月 | トップページ | 2011年2月 »