« 2009年4月 | トップページ | 2009年6月 »

2009年5月

2009/05/31

時代はO-Rマッピングからkey-valueストアへ

Apache CouchDBに関するメモ書き。
#理解が不完全なので、後で正しく書く。

【元ネタ】
Apache CouchDB: The CouchDB Project

Web 時代の非リレーショナルデータベース: 第 1 回 Apache CouchDB の概要とインストール

Web 時代の非リレーショナルデータベース: 第 2 回 Apache CouchDB と Ruby on Rails を使って wiki アプリケーションを作成する

Web 時代の非リレーショナルデータベース: 第 3 回 Apache CouchDB で MapReduce フレームワークに基づく問いあわせを行う

MOONGIFT: ? Web2.0時代のニュータイプDB「CouchDb」:オープンソースを毎日紹介

CouchDBはこのように説明されている。

CouchDB を探る


CouchDB はオープンソースのドキュメント指向データベース管理システムであり、アクセスには RESTful JSON (JavaScript Object Notation) API が使われます。
「Couch」という言葉は「Cluster Of Unreliable Commodity Hardware」の頭字語であり、CouchDB の目標を反映しています。
CouchDB の目標とは、極めてスケーラブルであると同時に、故障を起こしがちなハードウェア上で実行された場合でも高可用性と高信頼性を実現することです。
CouchDB は元々 C++ で作成されましたが、2008年4月、フォルト・トレランスを強化するために、このプロジェクトは Erlang OTP プラットフォームに移行されました。


CouchDBは関数型言語Erlangで作られた非RDBなDB。
RESTなWebAPIで問い合わせると、JSONが戻り値で返ってくる。
問い合わせ処理は MapReduce フレームワークに基づいて記述されているらしい。

使い道は、クライアントPCのユーザビリティ向上。
インターネットにつながっていないBTS、掲示板、Wikiでデータを更新して保存したい時に、クライアントのCouchDB に一旦保存して、そのデータは非同期にサーバーのRDBへ格納される。
この機能があれば、Webアプリは、画面ステータスをCouchDB に保存できるから、デスクトップアプリのように扱える。

多分、そういうイメージだと思う。

最近のWebアプリは、MVCモデルのうち、Viewの部分に技術革新が起きている。
最新バージョンのRailsが持つCookie Session Storeのように、非同期処理の機構をWebアプリに導入することで、Webアプリをデスクトップアプリのように、ネットワーク接続に無関係のまま扱えるようにしたい。

以前、友人から、最近の傾向としては、MVCモデルのうち、ViewでもAjaxやJasonのように、Viewの中にMVCモデルを作ろうとしているんですよね、と指摘してくれたことがあった。
多分、key-valueストアはその部分で使われるのだろう。

key-valueストアの良さは、関数型言語やMapReduceと相性がよいことだ。
CouchDB がErlangという風変わりな関数型言語で実装されているのは注目に値すると思う。
並列処理による処理の高速化(MapReduce)、分散システムによるフォールトレランス(耐障害性)などの特徴があるのだろう。

昨今のWebアプリの技術を鳥瞰してみると、RailsやSeasarでO-Rマッピングのインピーダンスマッチの問題は事実上解決されたと言える。

そして、技術革新の場所は、GoogleのMapReduce、Amazonのレコメンドエンジンなどの機能へ移っている。
これらはいわゆるデータマイニング。
膨大なトランザクションデータを大量のマシンパワーと関数型言語による並列処理で解析して、マーケティングや経営上の意思決定に生かす。

時代は、オブジェクト指向言語から関数型言語へ静かに移りつつあると思う。


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

2009/05/30

Redmine勉強会

IT 勉強会カレンダーに登録されている「Redmine勉強会@東京」が気になっている。

【元ネタ】
6/12 Redmine勉強会は決行の方向で - yandodの日記

RedmineのCakePHP移植版「candycane」の話もあるらしい。
最近はRedmineのプラグインも充実して、チケットの一括インポートやチケット集計結果のグラフ表示、タスクかんばんなど色んな機能も追加できる。

でも一番知りたいのは、他の人がどのように運用しているのか?という実際の運用例だろう。

トラッカー(チケットの種類)はどれだけ作ってる?
ステータスとそのワークフローはどれだけ作っている?
インシデント管理や要件管理は、どのように運用すればいい?
チケットを放置したり、乱発しないように運用するための解決策は?

疑問はたくさんあるから、皆でノウハウを共有できれば、プロジェクト管理をもっと手軽にIT化できるようになるだろう。
その運用ノウハウに、従来のSW工学の知識を当てはめれば、もっとブラッシュアップできるに違いない。

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

2009/05/27

TestLinkにあるアジャイルの概念

下記の記事を読んで気づいたことをメモ。

【元ネタ】
TestLinkを検証しました ― ありえるえりあ

【引用】
テストケースの管理と、テスト計画(=テスト実施の記録)の管理のふたつの軸があるのがポイントです。
RDBアプリ風に言えば、前者がマスター(リソース)、後者がトランザクション(イベント)的な構造です。
テストケースは手順と期待値の記述で、何度も実施されればその度ごとに結果レコードができます。
テストケースの1レコードに対して、実施結果のレコードは1対多の関係で存在します。

テストケースと実施結果が1対多の関係になるのは、言われてみれば自然で当り前の構造なのですが、バグトラッキングシステム(BTS)とは違うんだという現実に改めて気づきました。
昔、wishlistもBTSで管理している話を書きました(http://dev.ariel-networks.com/Members/inoue/wishlist-management)。
実を言うと、テスト管理もBTSでできるのでないかと漠然と考えていたことがあります。
テストの実施をテストエンジニアにアサインして、実施後に結果がでるという一連の流れがBTSの一連のフローと似たようなものだと思っていたからです。
実に浅はかでした。
テスト管理ツールにはテスト管理ツールの存在意義がありました。先人の知恵を無視してはいけません。

【プロダクトバックログとスプリントバックログの違い】
上記の記事のポイントは2つある。
一つは、テストケースとテスト結果は1対多の関係になること。
もう一つは、テスト管理はBTSのワークフローでは制御しにくいこと。

前者は、TestLinkにある「テスト仕様」と「テスト計画」の概念の違いと同等だ。
(正しくは、「テスト仕様」と「ビルド」である)
つまり、Scrumで例えるならば、TestLinkの「テスト仕様」はScrumのプロダクトバックログ、「テスト計画」はScrumのスプリントバックログに相当する。

Scrumでは、顧客からの改善要望や障害報告などは、まず、プロダクトバックログに全て放り込まれる。
そして、スプリント計画を作成する時に、どのスプリント(XPのイテレーション)でその要望を実現するか、を吟味する。
プロダクトバックログにある要望がスプリントに追加されて、そのスプリントで何をリリースするか確定したら、スプリントバックログが確定される。
つまり、プロダクトバックログは、スプリントにアサインされていない要望の貯蔵庫なのだ。

同様に、TestLinkのテスト仕様もテストケースの貯蔵庫と言ってよい。
テスト仕様にあるテストケースから、実施するテスト計画へテストケースを追加していく。
テスト計画に追加されたテストケースは、実施予定のテストケースであり、テスト仕様のテストケースと実体は同じでも、意味合いは大きく異なるのだ。

Scrumのようなアジャイル開発では、頻繁な改善要望に対応するために、イテレーション(スプリント)に入れる前の要望を管理するプロダクトバックログという概念が必要になったと思われる。

つまり、プロダクトバックログで要件管理を行っているのだ。
スプリント計画を作る時に、プロダクトバックログにある要望を優先順位付けするという作業が必要になる。
この作業が本来のマネジメントでもある。

後者は、素のBTSには、プロダクトバックログつまり要件管理の概念が無いことから生じるのだと思う。
BTSは障害報告票をデジタル化して運用するために作られたので、プロダクトバックログのように障害報告を貯蔵する仕組み(つまり要件管理)の無いBTSでは運用しづらいだろう。

特に、単体・結合・総合・負荷・受入テストなど全てのテストケース数を合計したら、ちょっとした業務システムでも、テストケースは軽く1万ケース近くに膨れ上がるだろう。
だからこそ、2~4週間以内に完了できるテストケース数に抑えないと、回帰テストを実施できないだけでなく、全テストケースを流し切ることさえできないだろう。

つまり、テスト仕様には1万個ものテストケースを一旦貯めておき、複数回のリリース(開発)を前提として、複数個のテスト計画を順次実行する運用にしなければ、実施できないテストケースが出てしまい、システムの品質以前に、テスト工程に大きな問題が出ることになる。

僕としては、開発とテスト工程のワークフロー管理は、BTSとTestLinkで使い分ければよいと考える。
無理して、一つのツールで運用する必要も無い。

ツールでプロセスを改善していく。
ツールでアジャイル開発のハードルを下げられればいい。

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

2009/05/18

継続的インテグレーションをクラウド化する

Hudson作成者の川口さんのBlogを読みながら、継続的インテグレーションはクラウド化と相性が良いという指摘に関するメモ。

【元ネタ】
Hudson EC2 プラグイン - 川口耕介の日記

Hudson PXE plugin - 川口耕介の日記

Hudson Selenium PluginでHudsonクラスタをSelenium Gridに - 川口耕介の日記

HudsonクラスタをHadoopクラスタに - 川口耕介の日記

Hudson PXE plugin - かおるんダイアリー

【既存の問題】
XPを代表とするアジャイル開発におけるコード共同所有やテスト駆動開発などのプラクティスで、いわゆる下流工程の生産性を大幅Upできる。

しかしながら、自動テストや回帰テストを行う継続的インテグレーションは、システムが大規模化するにつれてビルド時間が膨大になるので、生産性が低くなっている。

そのため、「アート・オブ・アジャイル デベロップメント ―組織を成功に導くエクストリームプログラミング」においても、ビルドに含めるテストケースに優先順位をつけたり、夜間ビルドと即ビルドを切り替える等の方策を提示している。

でも、本来は単体テストだけでなく受入テストのテストケースも全て、JUnitで記述して、継続的インテグレーションによるビルド作業の一部としてしまいたい。
そうしなければ、テスト自動化の一番の利点である回帰テストの効果が生きてこない。

【一つの解決策】
一つの解決策は、テスト環境を仮想化し、継続的インテグレーションをクラウド化することだ。

例えば、OSやJDKなどのバージョンが異なるサーバー環境はVMWareで仮想化して、複数の環境を用意できるようにする。
更に、クライアントのOSやブラウザの異なるクライアント環境も仮想化しておく。
そして、Hudsonによる自動ビルドは、複数のビルドサーバー上で並列処理できるようにする。

この利点は、格安のハードウェアを並列に処理させることで、マシンパワーで持って大量のJUnitをこなすのができること。
ビルド作業の並列処理だから、見かけ上の時間は大幅に短縮されるはず。

想像であるが、一つの業務系Webシステムをリリースできる品質に持っていくために、単体~受入テストの全てのテストケースを数えたら、おそらく最低1万件近くは必要だろうと思う。
それだけの桁のテストケースを回帰テストも含めてデイリービルドするには、仮想化+クラウド化は必須の技術だ。

【可能性】
最近のHudsonの動向を見ると、もはやCIツールではなく、汎用クラウド化ツールと呼んだ方がいいかもしれない。

例えば、
Hudson Hadoop pluginでクラスタ処理する。
Hudson PXE pluginでネットワーク接続した複数のOSを制御する。
Hudson EC2 pluginでAmazonEC2のクラウド環境を使う。
Hudson Selenium PluginでHudsonクラスタをSelenium Gridにする。

いずれも、格安のサーバー、仮想化されたビルド環境をバッチ処理のために使うという発想。

しかし、これだけクラウド化の利点があるにも関わらず普及していないのは、クラウド化する設定作業が大変だからだ。

でも、Hudsonはクラウド化の設定作業を楽にする方向で進化しているようだ。
Hudsonを十分に使いこなせれば、Hudsonによってビルド管理やリリース管理を大幅に効率化できるだろう。

XPが出現して10年近く経ってようやく、プロジェクト管理や構成管理、リリース管理などがIT化できる状況が整ってきた。
この技術革新の流れを追いかけていきたい。


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

2009/05/16

All In One Redmineを見つけた

WAMP(LAMP)環境でRedmineをワンクリックインストールできるツールを見つけた。
下記のインストーラーを使えば、Redmineの最新バージョン0.8.3をわずか5分でインストールできる。

【元ネタ】
BitNami :: Redmine

上記ツールの環境は下記の通り。
これだけあれば十分だろう。

Redmine 0.8.3
Apache 2.2.11
ImageMagick 6.4.7
MySQL 5.1.30
Subversion 1.4.6
Ruby 1.8.6
Rails 2.1.1
RubyGems 1.2.0

【追記】
インストール手順は、かおるんさんのBlogを参照。
画像付きなので非常に分かりやすい。

BitNami::Redmine をインストールしてみた - かおるんダイアリー


Windowsの場合、ApacheやSVNなどのプロセスはWindowsサービスの一つとして登録されるようだ。
httpd.confやSVN、MySQLのポート番号などを既存の環境と重複しないように変更すれば、複数のRedmineを動かすこともできる。

他のワンクリックインストーラーも約30種類もあり面白い。
LAMPやWAMPだけでなく、RubyStack、JRubyStack、DjangoStackというワンクリックインストーラーもある。
ちょっとしたツールを試したいと思ったら、これらの環境を一つずつ作って、インストールすればいい。

Trac、Mantisのワンクリックインストーラーもある。
TracとRedmine、Mantisを入れてみて、BTSの機能比較するのも面白い。

掲示板を使いたいなら、phpBBを入れればいい。
Blogを使いたいなら、WordPressを入れればいい。
CMSを使いたいなら、Joomlaを入れればいい。
営業支援システムを使いたいなら、SugarCRMを使えばいい。

ツールとプロセスをセットにして運用すれば、ツールに合わせたワークフロー管理ができる。
色々試してみようと思う。

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

2009/05/14

SaaSはアジャイル開発に向いている

XPJUG代表の倉貫さんが開発されているRuby on Rails製SNS「SKIP」について、アジャイル開発の運用例と、アジャイル開発とSaaSの相性の良さが書かれた記事を見つけたのでメモ。

#アジャイル開発の特長を生かしやすいビジネスモデルについて、経験談も含めて非常に良く分析できている。
#きちんと理解して、後で内容をまとめる。

【元ネタと抜粋】
【1】[Think IT] 第1回:少人数によるアジャイル開発の事例 (1/3)

アジャイル開発を適用しやすいビジネスモデルは、納品型のビジネスではなくサービス提供型のビジネスである。
SaaSはアジャイル開発を適用しやすいビジネス。

【2】[Think IT] 第2回:チームによるアジャイルの事例 (2/3)

タスクについては、Redmineを活用して管理を行った。
Redmineは、Ruby on Railsで作られたオープンソースの課題管理ツール。
Redmineでは「チケット」という単位で、プロジェクトで行うタスクや課題を管理できる。
また、チケットの状態管理を行うことができ、プロジェクト全体で未完了のチケットがどれだけあって、誰が担当しているか、すぐにわかるようになっている。

チーム内では、行うべきすべての作業をチケットとして登録するようにしており、チケットになっていない作業をしても仕事として認めない、という厳しいルールもあった。
そうすることで、週単位での作業の進ちょく状況を把握する際も事前に共有できるので、打ち合わせ時間を短くすることができる。

【3】[Think IT] 第4回:SaaSビジネスにおけるアジャイルの事例 (1/3)

アジャイル開発はSaaSのビジネスモデルと非常に相性が良い。
ソフトウエアのソースコードを提供するビジネスではなく、ソフトウエアを動かしてサービスを提供するビジネスになっており、ソフトウエアを継続的に改善していくことができる。

特定のソフトウエアの完成を目指すのではなく、ソフトウエアで提供できる価値を継続的に高めていくために、品質の中でも特に保守性を重視して、環境や要求の変化に柔軟に対応できるアジャイル開発が向いている。

アジャイル開発では、人数を多くすることでたくさんのものを作るという思想はあまりない。
むしろ少数の人間でより良いものを作っていくという考え方に基づいている。

アジャイル開発のような少人数でもビジネスを大きくする方法として考えられるのがSaaS。
SaaSのビジネスでは、プログラミングした分だけで利益になる訳ではなく、それによって提供するサービスが利益を生み出すので、レバレッジを効かせることが可能。

今まで以上に、プログラマーに求められる責任は大きくなってきますが、それはプログラマーの価値向上につながっているとも考えられる。

【4】[Think IT] 第4回:SaaSビジネスにおけるアジャイルの事例 (3/3)

SaaSならば、ソフトウェアだけでなくハードウェア調達やハードウェア環境構築もアジャイルにできる。
SKIPでは、Amazon EC2のようなHaaS(Hard as a Service)をインフラとして使っている。
HaaSを活用したクラウドコンピューティングは、アジャイル開発と非常に相性が良い。

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

2009/05/13

チケット駆動開発を開発プロセスへ理論化できるか?

下記Blogで、これがやりたいことなんだ!と思ったのでメモ書き。

【元ネタ】
実践バグ管理―プロジェクトを成功に導くための (単行本) - watawata日記

まあ要するに僕が読みたいのはバグ管理も含めた構成管理とか開発プロセスの本なんだw。

僕が考えるプロジェクト管理サーバーのイメージは下記の通り。

RedmineやTracのようなプロジェクト管理機能を持つBTSをチケット駆動でタスク管理する。

Subversionで、ソースコードだけでなく、WordやExcelの仕様書もバージョン管理する。
更に、trunkとブランチを上手に使い分けて、メインラインモデルとしてコードラインを並行開発する。

Hudsonで、継続的インテグレーションを実現するだけでなく、並行に走らせて、ビルドや自動テストの工数を短縮する。

TestLinkで受入テストを効率化する。

VMWareでテスト環境、本番環境を仮想化して、複数の環境を作り、並行テストしてみる。
あるいは、複数のブラウザや複数のバージョンのOSのクライアント環境を仮想化して、ブラウザ依存、OS依存の検証をできるようにする。

上記のようにツールを駆使して、SW開発のプロジェクト管理からExcelをなくす。
プロジェクト管理サーバーを用意して、アジャイル開発の弱点を補強して、アジャイル開発のハードルを下げる。
ツールに合わせた運用によって、現場独自の開発プロセスを編み出す。

ツールはあくまでもSW開発を楽にするための道具の一つ。
特にオープンソースのツールには、世界中の開発者のベストプラクティスが含まれている。
ツールの運用に慣れれば、自然に開発者のスキルも上がる。

それらのツールをまとめたものが、プロジェクト管理サーバーと言う概念。
実際の開発プロセスはチケット駆動開発(TiDD:Ticket Driven Development)。

その運用プロセスを一つの開発プロセスへ昇華できないか?

おそらく、その開発プロセスは、ハンフリーのPSPやTSPに似た開発プロセスになるのではないか?

Personal Software Prcess

Team Software Prcess

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

プロジェクト管理やテスト工程をクラウド化する

Hudsonの下記記事を読んだ感想をメモ書き。

【元ネタ】
Hudson Selenium PluginでHudsonクラスタをSelenium Gridに - 川口耕介の日記


近年、HadoopやSeleniumなど、複数のサーバ上で動作する事が前提のツールが増えてきており、マルチコア化・クラウド絡みで、このトレンドは今後も続くと予想されます。
ところが、こういったツールはセットアップと運用保守に手間がかかるという欠点があります。
Hudsonで僕がやろうと思っている事の一つは、Hudsonのクラスタ上にこういったツールをインストールするのを簡単にすることです。
Hudsonのクラスタはインストールがとても簡単ですし、プラグインのインストールも容易なので、この環境の上に他のツールをオーバーレイすることで、手間なく様々なツールを利用できるようになります。


ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション」本にラストマイル問題という話がある。

※元ネタ
プログラマの思索: Antリファクタリングカタログ


長年、継続的に機能追加されて肥大化したシステムへいかにアジャイルにリリースできるか?という「ラストマイル」問題を提示している。

XPが提示したプラクティス「継続的インテグレーション」「テスト駆動開発」は、高速・高品質な開発を可能にした。
しかし、本番環境へのデプロイ+リリースのプロセスではその恩恵がない、と。
理由は、3つある。
一つ目は本番環境は大変高価であり、二つ目は検証が複雑で、三つ目は検証の工数が大きすぎるからだ、と。

アジャイル開発の最終目標は「バージョンのないソフトウェア」を提供することにある、と。
つまり、仕様変更の要求が発生したら、それを開発して完成したら、すぐにリリースして本番稼動できることだ、と。


この問題は、アジャイル開発が目指す最終目標につながると思う。
アジャイル開発を実践することで、いわゆる下流工程は高速・高品質な運用が可能になった。
しかしながら、上流工程や上流工程を検証するテスト工程(結合~受入テスト)が大きなボトルネックとして浮き彫りになってきたように思う。

今の僕が考えていることは下記だ。
RedmineやTracを基盤としたチケット駆動開発によって、アジャイル開発のプロジェクト管理はIT化できるし、アジャイル化できる。
テスト駆動開発や継続的インテグレーションの恩恵をあまり受けないユーザテストでは、TestLinkというテスト管理ツールを入れることで、アジャイル開発の弱点を補えると思っている。

上記の3つのラストマイル問題には、僕なら下記のように回答する。

1.本番環境は大変高価で複雑であること

僕なら、VMWareで本番環境を仮想化して、複数の環境を作っておけばいいと思う。
これによって、いつでも仮想化された環境で本番検証できる。
更に、IEやFirefoxなどのWebブラウザのバージョンごとに仮想化されたクライアント環境も作れば、リリースしたWebシステムの動作を色んな観点で検証できるようになる。

普通は、本番環境は世界中に唯一つしかないSWプロジェクトが殆どだろう。
だから、本番リリースを一度失敗すると、非常に危険になる。

仮想化の技術はVMWareの普及と共に、急速に技術革新が起こっている。
上手に使いこなせれば、テスト工程の品質Upができるだろう。

注:下記のVMWareの記事が優れているので参考にしたらいいと思う。
VMwareとっておきの使い方 - @IT自分戦略研究所


2.検証が複雑で難しいこと

僕なら、TestLinkでユーザテストのテストケースを一括管理し、TestLinkとSeleniumを組み合わせて、ユーザテストを自動化してしまえばいいと思う。

XPはテスト駆動開発のプラクティスを導入したが、それは単体テスト工程で威力を発揮しても、結合テストや受入テストなどでは、うまく使いこなせなかった。
受入テストでは、テストケースが全ての要件をカバーしているかという要件カバレッジの観点の方がはるかに重要だからだ。

TestLinkを導入することで、テストケースの品質を上げることができるし、上流工程でテスト計画やテストケース作成などの作業も入れるW字モデルの開発も運用できるだろうと思う。

TestLinkの最新バージョンでは、XML-RPCのAPIが提供されているので、今後、TestLinkの操作でテスト自動化も可能になるだろう。

3.検証に手間がかかること

一つのシステムをリリースできる品質までに必要なテストケースを数えたことはあるだろうか?
単体テストから結合テスト、システムテスト、受入テストに必要なテストケース数は最低でも数千~数万の桁が必要だろう。
逆に言うと、それだけのテストをこなさなければ、システムの品質を保証できない。
すると、それだけのテスト工数をどうやって確保するのか、という話になってくる。

今までは、大量のテスターを動員して、Excel上でテストケースや進捗を管理するしかなかった。

僕なら、JUnitやSeleniumをビルドに含めて、複数のHudsonを走らせて、並行ビルドしてしまえばいいと思う。
数千~数万のテストケースを自動テストする時に、数百~数千台のサーバー上でHudsonを並行に走らせられれば、受入テストを大幅に効率化できるだろう。

上記のHudson記事のよれば、複数のハードウェア、複数のプロセスでビルド作業を走らせることができるようにHudsonは改良されているようだ。

この流れは、Googleが提唱したクラウド化と同じ。
安いハードウェアを湯水のように使い、マシンパワーに物を言わせて、システム開発を推し進めて、品質を確保する。

現時点では、Hudsonの機能もまだ不十分だろうが、じきに実現されるだろう。
VMWare、TestLink、Hudsonを使えば、更にプロジェクト管理をIT化できる。


もはやIT産業も、大量のメンバーを動員して開発する労働集約的なビジネススタイルが、そろそろ成り立たなくなりつつあるのではないか?
大量の資金を使って、設備投資で大量のサーバーを準備して、マシンパワーでSW開発を大幅に効率化させる。
その時に必要な技術は、Googleが編み出したMapReduceのように、並列プログラミング、関数型プログラミングなのだろう。

昨今のビジネスがITとは切っても切れないように、SW開発のプロジェクト管理もテスト工程もIT化して、クラウド化していくのではないか。


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

2009/05/10

RedmineとTracの機能比較

RedmineとTracの両方でチケット駆動開発を運用してみて、色んな気付きがあった。
以下メモ書き。

【比較対象】
・Redmine0.8.0
・Trac0.11.1.ja

【元ネタ】
脱Excel! Redmineでアジャイル開発を楽々管理 - @IT自分戦略研究所

【1】複数プロジェクトの扱い

RedmineがTracよりも機能が優れている点の一つは、複数プロジェクトに対応していること。
Tracはプロジェクトに親子関係を入れることができないため、特に大規模プロジェクトではチケット駆動開発を実践しにくいだろうと思う。

複数プロジェクトを作りたい状況は、二つある。

【1-1】開発チームが複数のサブチームに分かれていて、それぞれでタスク管理したい場合。
RedmineやTracを運用してみると、一つのプロジェクトでメンバーが5人以上だとチケットが乱発されたり、放置されやすくなるようだ。

理由は、チケットファーストの原則に従って、プロジェクト内部の作業をチケットに登録してしまうと、タスクの粒度が極めて小さくなり、チケットが増発されがちだから。
本来は管理者がチケット管理の最終責任者だが、メンバーが多ければそれだけタスクも増えるから、管理しにくくなる。

【1-2】コンポーネント単位(jar, dll)、ブランチ単位でチケット管理したい場合。
Redmineでは、SVNリポジトリとプロジェクトが1対1に対応する設計思想のため、リポジトリ全体だけでなく、trunkのみ、branchのみだけというプロジェクトも作れる。

この状況は、大規模プロジェクトで一つの製品やシステムを複数のライブラリで組み合わせて作る時に多い。

Redmineでは、プロジェクトの親子関係を入れることができるため、親プロジェクトの下に、サブチーム単位やコンポーネント単位、ブランチ単位に子プロジェクトを作ると良いと思う。
Redmineでは、チケット同士の関係(関連する、重複する、など)の属性があるので、各プロジェクトで関連するチケットを相互リンクすれば、更に見通しが良くなるだろう。

※但し、Tracも下記のプラグインなどで対応できるらしい。

TraM

SubProjectsPatch - Trac Hacks - Plugins Macros etc. - Trac


【2】ワークフロー管理

RedmineとTracのワークフロー管理については、下記の記事で言い尽くされている。

プログラマの思索: Tracのワークフロー

そろそろTracのワークフローについて語っておくか - almost nearly dead


チケット駆動開発を運用すると、チケットを問題管理(バグ修正)だけでなく、要件管理やインシデント管理、変更管理にも使いたくなる。
しかしながら、BTS本来のワークフローはバグ管理のため、そのままの設定では使いづらい。

Tracのワークフローは実は「new → assigned → closed」の1種類しかないため、非常に使い辛かった。
Trac0.11でも「new → accepted → assigned → closed」に少しだけ拡張されただけ。

trac.iniでワークフローを設定すれば、色々拡張できるが、その設定は素人ではとても修正できない難しさがある。

Redmineもデフォルトのワークフローはバグ修正の1種類だけだが、トラッカー(チケットの種類)やステータスのデシジョンマトリクスでチケットの状態遷移をWeb上で制御できる利点がある。

この利点を利用すれば、トラッカーの単位で、インシデント管理は「新規→担当→問合せ中→回答済→終了」、要件管理は「新規→作成中→レビュー中→承認済み→開発中→終了」のようなワークフローを作ればよい。

プロジェクト管理の基本は、SW開発で現れる全てのワークフローを洗い出して、管理者の制御下に置くことが重要だ。
それで初めて、プロジェクト内部の作業やリスクを把握することができる。

ワークフローが少なければ、本当にそれだけでプロジェクトを制御できているか、という疑問が生じる。
ワークフローが多ければ、チケット管理の運用が面倒で、逆に運用コストも高くなる。

複数プロジェクトの機能があれば、ワークフローが増えすぎたら、プロジェクト管理の視点が異なると考えて、別プロジェクトへワークフローを外出しにしたらいいと思う。
少なくとも、新規開発のチケットを扱うtrunkプロジェクトと、お客様から日常のクレームや調査に対応するチケットを扱うインシデント管理用のプロジェクトは、別々で管理した方が運用は楽だろう。

要件管理に対応するストーリーカードと、開発者の日々のタスク管理であるタスクカードも別々のプロジェクトで管理した方が良いと思う。
その理由は下記の記事で書いた。

プログラマの思索: チケット駆動開発は進捗報告作りをどのように解決しようとするか?

理由は、顧客向けのチケット(ストーリーカード)と開発者が扱うチケット(タスクカード)は、ワークフローもそのライフサイクルも大きく異なるからだ。

つまり、ワークフローをグループ化して、異なるグループは別プロジェクトで管理した方が楽に運用できるだろう。

※但し、Tracも下記プラグインで、チケットの種類に応じて複数のワークフローを使い分けることができるらしい。

AdvancedTicketWorkflowPlugin - Trac Hacks - Plugins Macros etc. - Trac


【3】チケット機能

Tracは障害報告票をチケットという概念へ昇華させた点に意義があったと思う。

RedmineがTracよりも優れている点は、進捗管理と工数管理がデフォルトで組み込まれていることだ。

【3-1】進捗管理は、開始日や終了日や進捗率を入力すると、ガントチャートやカレンダーにデフォルト表示できること。

チケット駆動開発を運用し始めると、チケットに慣れていないメンバーは、開始日や終了日を入力せずにチケットを発行してしまう。
すると、そのチケットは、ガントチャートやカレンダーに表示されないため、作業状態を追跡しにくくなり、作業漏れしやすい。

チケット入力の運用ルールを徹底することがチケット駆動開発の肝。
チケット管理が開発者のタスク管理、ToDo管理であるとメンバーに理解してもらう事が大事。
チケット管理が運用に乗れば、メンバーは毎日の作業日報を書く必要はなくなる。

Redmineでは、カレンダーから日付を登録できたり、チケット一覧でコンテキストメニューから一括変更できるなど、ユーザインターフェイスも使いやすい。

【3-2】工数管理は、予定工数と作業分類ごとの実績工数を入力すれば、バージョンと月別のクロス集計で実績工数を出力するなどの機能があること。

マネジメントの基本は、予定と実績の比較にある。
経営者や営業マンが毎月の売上の目標と実績を月末に評価されるように、開発の予定工数と実績工数は記録しておきたい。

Redmineでは、作業分類というチケットの属性がタイムトラッキングと呼ばれていて、この作業分類ごとに、実績工数が色づけされる。
故に、作業分類を、「管理」「設計」「実装」「テスト」「リリース」などのように分類しておけば、工程ごとに工数管理できる。


しかしながら、Redmineと比較すると、Tracのデフォルトのチケット機能は貧弱だと思う。
Tracのデフォルトでは、チケットの属性に開始日・終了日・予定工数・実績工数・進捗率の項目がないから、そのまま使うと、チケット管理の有り難味がなくなる。

但し、Tracは、tarc.iniへ[ticket-custom] セクションを追加して、開始日・終了日・予定工数・実績工数・進捗率の項目を追加すればよい。
また、ganttcalendarプラグインを入れれば、Redmineと同等な機能になる。


【4】イテレーションの概念

RedmineとTracのチケット管理で、その概念が最も異なるのは、イテレーションの概念だと思う。
Tracの運用では分からず、Redmineの運用で初めて腑に落ちた概念が、イテレーションだ。

Redmineの「バージョン」は、システム開発のマイルストーンと、リリースするバージョンが一致した概念である。
この機能によって、Redmineの「バージョン」はXPのイテレーション、Scrumのスプリントに相当するようにアジャイル開発を運用できる。

しかし、Redmineの「バージョン」の概念に違和感を持つ人も多い。
その人達の反応を聞くと、マイルストーンとリリースするバージョンは異なるでしょ、とのこと。
確かに、実際のシステム開発では、マイルストーンとバージョンを一致させるように必ず運用する必要はない。
普通は、1個のバージョンに対し、複数のマイルストーンが紐づく関係になるだろう。

Tracの「マイルストーン」と「バージョン」の概念は、まさに上記の指摘と同じだ。
Tracの「マイルストーン」の属性には、完了日付と完了ステータスON/OFFがあり、完了ステータスONにすると、そのTracの「マイルストーン」は「閉じられる」。
つまり、Tracのロードマップ上に閉じられた「マイルストーン」は表示されなくなる。
そして、Tracの「バージョン」はリリースするシステムのタグと同等。

でも、僕はTracの運用は面倒だと思っている。
マイルストーンとバージョンを一致させる意味は、Redmineの「バージョン」に紐づく全チケットが終了ステータスになれば、いつでもリリースできるということだ。
この「全チケットが終了すれば、いつでもリリースできる」おかげでXPの小規模リリースを開発プロセスへ実装できる。

イテレーションの概念こそがアジャイル開発の運用で最重要な点だと思っている。


【5】レポート出力機能

Tracはクエリ発行画面でいくらでも欲しいレポートを抽出できるのが最大の利点だ。

しかし、Redmineの「サマリ」「工数レポート」だけで僕は基本的に十分だと思う。
Redmineの「サマリ」が意味するものは、これが進捗報告そのものだからだ。

わざわざストーリーカードとタスクカードを別々のプロジェクトで管理するのは、各ワークフローが異なるだけでなく、ステータスごとのチケット集計結果が進捗報告になるようにしたいからだ。

逆の発想では、管理者がプロジェクト管理で必要な情報をレポート出力できる形で、チケット管理を行えばよい。
進捗管理ではステータスごとのチケット集計だし、品質管理では、バグのチケット累積数を出力できればよい。
他の観点でも同様の発想でチケットの属性を上手に利用すればよいと思う。


RedmineやTracは、BTSにプロジェクト管理機能を持たせる発想は同じでも、機能や運用は微妙に異なる。
しかし、二つのBTSの運用スタイルから重要な概念を抽出し抽象化させた開発プロセスが、チケット駆動開発だと思っている。

チケット駆動開発の面白さは、SW工学が提唱する上からのプロセス改善ではなく、現場でツールを駆使して、開発者が使いやすいように運用する下からのプロセス改善である点。
そのアイデアをもっと理論化してみたい。


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

2009/05/06

Google App Engine上でJRuby on Railsを動かす

Google App Engine上でJRuby on Railsを動かす記事が気になっている。
以下メモ書き。

【元ネタ】
グーグルのクラウドがJava対応、JRubyも稼働か - @IT

ぽかぽか陽気 - ずっと君のターン

GMailが普及してもはやローカルのメールアプリは特に必要がない。
多くの日本の会社は、コンプライアンス重視と言い出してGMailなどGoogleのサービスを使わせないようにしているが、それでどれだけ業務の効率が落ちているだろう。

GAEはクラウド系サービスあるいはSaaSに位置づけられる。

従来のSIerは、販売したメインフレームを中核に、その上で動くCobolの業務システムを開発して運用している。
Web受託開発のSIerは、データセンターにあるサーバーに受託開発した業務系Webシステムを稼動させている。

GAEがまともに普及したら、ハード販売を中心に受託開発を行うSIer(IBMを中心とするメインフレームのメーカー)、サーバーのホスティングを中心とするWebに特化した受託開発のSIerはことごとく仕事が来なくなるだろう。

GAE上でWebアプリの開発がスタンダードになってしまったら、サーバーを買う必要もない。
必要なのは、Webプログラミングを中心とする技術力だけだ。
ユーザ企業に技術力があれば、SIerへシステム開発を受託する必要もない。

GAEでWebアプリがPythonだけでなく、Javaで動くのは上記の記事のように重要だ。
何故なら、GAE上でJRuby+Railsが動作する環境になったからだ。
そうなれば、Webアプリをもっと速く作り、稼動させることができる。

エンタープライズなシステムをJRuby+Railsで開発して稼動させるのは、もうすぐ普通になるだろうと思う。


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

Antリファクタリングカタログ

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション」本を読んで興味深くかつすぐに使えそうな箇所は「Antビルドファイルのリファクタリング」だった。
以下メモ書き。

【1】「ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション」の1章に「ビジネスソフトウェアの「ラストマイル」を解決する」という章がある。
長年、継続的に機能追加されて肥大化したシステムへいかにアジャイルにリリースできるか?という「ラストマイル」問題を提示している。

XPが提示したプラクティス「継続的インテグレーション」「テスト駆動開発」は、高速・高品質な開発を可能にした。
しかし、本番環境へのデプロイ+リリースのプロセスではその恩恵がない、と。
理由は、3つある。
一つ目は本番環境は大変高価であり、二つ目は検証が複雑で、三つ目は検証の工数が大きすぎるからだ、と。

アジャイル開発の最終目標は「バージョンのないソフトウェア」を提供することにある、と。
つまり、仕様変更の要求が発生したら、それを開発して完成したら、すぐにリリースして本番稼動できることだ、と。

この指摘は、アジャイル開発の別の問題点を示していると思う。
今僕が考えているチケット駆動開発、プロジェクト管理サーバーは、アジャイル開発のプロジェクト管理へ適用して、大幅に改善できると考えている。
上記では、大規模システムへアジャイル開発を適用した場合、開発プロセスの効率化ができたのを前提とした上で、リリース管理に問題があることを指摘している。

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション」にも書いているが、上記にあげたリリース管理の問題点は、二つの技術で大幅に改善できると思う。
一つは、ビルド作業やリリース作業の並行化。
いわゆる並行ビルド、並行リリース。
Hudsonなら、並行ビルドも簡単に操作可能。
これによって、二つ目と三つ目の問題が解決できる。

もう一つは、本番環境を仮想化して複数のテスト環境を作って、検証可能にしておくこと。
昨今ならVMWareで仮想イメージを簡単に作ることができる。
これによって、一つ目の問題も解決できる。

実際の現場ではまだ一つのアイデアに過ぎないだろうが、そのアイデアを実現する技術は既に登場していることに注意しよう。

【2】「ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション」の10章にAntビルドファイルのリファクタリングが書かれている。
Antビルドファイルのリファクタリングは実施した経験が無かったけれど、さっそく使ってみたい技術の一つ。
Antだけでなく、MavenやRakeなどでもその発想は使えるはずだ。

【元ネタ】
2009-01-05 - yyamanoの日記

【Antリファクタリングカタログ】

【1】ターゲットの抽出
* macrodefの抽出 - コードブロックをmacrodefとして抽出する
* ターゲットの抽出 - 大きなターゲットを小さなターゲットに分割し、依存関係を定義する
* ターゲットのラッパービルドファイルへの移動 - CI用のターゲットは別ビルドファイルに移動する
* デプロイ用コードのimport先への分離 - デプロイ用のコードは別ビルドファイルに移動する
* build.xml内へのラッパースクリプトの取り込み - シェルスクリプトで定義しているパスやオプションをビルドファイルに移動する
* 明確なターゲット名の導入 - ターゲットとプロパティで異なる命名規則を使う
* ターゲット名の名詞への変更 - ターゲット名にはプロセスではなく成果物の名前を使う

【2】コメント取り込み
* descriptionによるコメントの置き換え - XMLコメントのかわりにdescription属性を使う
* taskname属性の追加 - タスクの意図を明確にし、実行状況を簡単に把握できるようにtaskname属性を使う

【3】実行処理
* 内部ターゲットの強制 - 内部ターゲットの先頭にハイフンを追加し、コマンドラインから呼べないようにする
* 出力ディレクトリの親ディレクトリへの移動 - 生成される成果物の出力先を一カ所にまとめる
* applyによるexecの置き換え - execのかわりにapplyを使う
* CI Publisherの利用 - タグ処理は独立したターゲットとして分離する

【4】プロパティや依存関係の共通化
* 宣言の導入 - if条件分岐のかわりに、プロパティとimportを使う。
* 依存によるcallの置き換え - 明示的なantcallのかわりに宣言的な依存関係を使う
* プロパティによるリテラルの置き換え - 頻繁に使うリテラル文字列をプロパティに置き換える
* filtersfileの導入 - filter要素のかわりにプロパティファイルとfiltersfile属性を使う
* プロパティファイルの導入 - プロパティ定義を外部ファイルに移動する
* 要素のantlibへの移動 - 複数のプロジェクトで使われるコードをantlib.xmlに移動し配布する
* filesetによる多数のライブラリ定義の置き換え - pathelement要素のかわりにfileset要素を使う
* 実行時プロパティの移動 - ビルドに使うプロパティと実行時に使うプロパティを分離する
* IDを用いた要素の再利用 - 重複したpathのような要素をidを使い共通化する
* プロパティのターゲット外部への移動 - ターゲット内部で定義されているプロパティをターゲットの外に移動する
* locationによるvalue属性の置き換え - パスを表現するプロパティではvalue属性のかわりにlocation属性を使う


上記のリファクタリングカタログで面白いと思ったのは、コメントをタスクの属性(description, taskname)にしてしまうこと。
もう一つは、ターゲットを処理ではなく成果物の名前にすること。

Antは宣言的であってスクリプト言語ではない特徴がある。
だからこそ、ターゲットは成果物の名前にして、コメントも宣言に取り込んでしまうようだ。

このAntリファクタリングカタログは、ファウラーのリファクタリング本(リファクタリング―プログラムの体質改善テクニック)のように、抽出とインライン化の組み合わせなどもあり、非常に有用だと思う。


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

RedmineのTicketGrouping機能

Redmineのリビジョン 2711 についにチケットをグループ化する機能が追加された。
似たようなプラグインも開発者の有志からパッチが提供されている。

【チケット一覧にグループ機能】
Redmine - Feature #2679: Ticket grouping

Redmine - リビジョン 2711

Features:

* Issues/Ticket grouping
* Introduced queries categories, and grouping by them in sidebar
* Queries in sidebar now shows count of issues in they
* Group saving in queries

【チケットをグループ化するプラグイン】
Redmine - Ticket grouping plugin

上記の機能を見ると、右のサイドバーにあるグループ(ストーリーカード)をリンクすると、グループに属するチケット一覧(タスクカード)の状態を表示してくれる。

仕様変更の要求から複数のタスクが発生するフローに、上記の機能が使えないか?

上記チケットをずっとウォッチしてきたが、XPをデジタル化したい僕にとってすごく重要な機能。
この機能が実現されれば、変更管理を行う時に、ストーリーカードとタスクカードの関連付けの作業が楽になる。
できれば、タスクカードからストーリーカードの進捗を自動集計して表示してくれれば更に楽になる。


最近のRedmineはすごく活発だ。

世界中の開発者が目指しているのは、Redmineをアジャイル開発のプロジェクト管理ツールのデファクトスタンダードにしてしまうことだろう。

Redmineにアジャイル開発のアイデアを注入しようと考えている人は世界中にいるのだ。


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

2009/05/04

Mercurialメモ

分散バージョン管理は、ソース管理だけでなくテキスト管理に使うべき。
自分のノートPCにあるWordやExcel、テキストファイル、画像、音楽ファイルなど全ても、分散バージョン管理の方が楽だ。

理由は、ノートPCではオフラインで作業する時が多いから。
ネットワークに遮断された状況で自分の作業ファイルの履歴管理をしたい。

「ファイル名_yyyyMMdd.xls」「ファイル名_yyyyMMdd.ppt」「ファイル名_yyyyMMdd.jpg」というファイルを作っている時点でバージョン管理が必要なのだ。
ファイルのRedo、Undoができるだけでなく、変更履歴や差分も追跡できるのがバージョン管理の大きな利点。
その意味では、PC上で作業する人は全員、バージョン管理に慣れる必要があるだろう。
プログラマだけでなく、SEもPMも、デザイナーも、事務員も、社長も。

Subversionがこれだけ普及した理由は、TortoiseSVNのおかげだ。
TortoiseSVNはWindows上でGUI操作でバージョン管理できる。
更には、ExcelやWordの差分機能、バグ管理チケットと連携するなど、豊富な機能を持つ。

しかしながら、分散バージョン管理のGitのWindowsクライアントTortoiseGitはまだ力不足。
MercurialのWindowsクライアントTortoiseHgは、Googleのニュースを読む限り、ようやく使えるレベルになったみたい。
TortoiseHgをインストールしたら、Mercurialも一緒にインストールされるので、普通に使えばいいみたい。

Mercurial、TortoiseHgのリンクをメモしておく。

Google CodeがGitではなくMercurialを採用へ - @IT

Mercurialでバージョン管理

Mercurial の利用

スィンプロ (sinproject) Windows Vista 環境で TortoiseHG(Mercurial)を利用してバージョン管理とバックアップを行う (1)

スィンプロ (sinproject) Windows Vista 環境で TortoiseHG(Mercurial)を利用してバージョン管理とバックアップを行う (2)

スィンプロ (sinproject) Windows Vista 環境で TortoiseHG(Mercurial)を利用してバージョン管理とバックアップを行う (3)

スィンプロ (sinproject) Windows Vista 環境で TortoiseHG(Mercurial)を利用してバージョン管理とバックアップを行う (4)

.NETプログラミング挑戦記 Mercurialの導入

WinMerge 日本語版


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

2009/05/03

要件定義をロジカルシンキングで解析する

30の「勝負場面」で使いこなす ロジカル・シンキングの道具箱」を読んで、高度情報処理試験の論文問題を解いているような気がしてきた。
要件定義と問題解決、ロジカルシンキングについて考えたことをメモ。

【1】業務系システム開発のリスクは、Railsのような最新技術の習得、TiDDのようなプロジェクト管理、TestLinkのようなテスト管理など色々あるが、一番のネックは要件定義だ。
元々の要件が顧客の認識とずれていたら話にならない。
しかしながら、新規顧客の場合、顧客と一緒に開発してリリースして運用しなければ、顧客の本来の要求が何だったのか、が分からない時はすごく多い。

だから、SIerのビジネスモデルとしては、1次開発は赤字だったとしても2次開発や運用保守で黒字になるように仕向けるのが普通だろう。
特に大手SIerが政府の公共システムを受注する場合が当てはまるだろう。
だが、そういうリスキーなビジネスモデルもそろそろ割に合わなくなりつつある。

【2】要件定義を真正面から取り組む必要がある。

要件定義は結局は、顧客の業務で現れた問題や課題をシステム化で解決することだ。
IT業界の営業は、顧客の業務のソリューションに特化したITコンサルタントにならなければならない、といわれる理由は、結局そのことだ。

だが、顧客は自分の業務の問題点を把握しているとは限らない。
普通は、問題の本当の原因ではなく、起きた事象と間違った解答を要件として提示してくる。
それをそのまま仕様に落とすと、本来の問題を解決するシステムではない仕様で実装してしまい、役に立たないガラクタのシステムができるだけ。

だから、要件定義では、顧客の要望をそのまま鵜呑みにしてはいけない。
要望を整理して、本来の課題とその解決策を提示しなくてはならない。
つまり問題解決スキルが要求されている。

【3】「90分で学べるSEの思考術 (ITプロフェッショナルの基礎知識)」では、SEが上流工程で問題解決に関与する状況が多いと言う。
そして、多くのSEが思考の壁にぶち当たるのはこの当たりからだ、と言う。

つまり、要望を単なる箇条書きの仕様と見なすのではなく、構造化された一つのモデルとして提示する能力が必要になってくる。

今までUML、DOAなど色んなモデリング手法を学習してきたが、要件定義では、結局、ロジカルシンキングを中心として論理で整理するのがBetterな気がしている。

仕様とは一つの仮説であり、一つの論理的なモデル。
要望をロジックツリーで整理して、問題と解決策へ昇華できれば、解決策を仕様に落としてしまえばいい。

ロジックツリーがロジカルシンキングで基本なのは、論理的思考の基本スキルが全て含まれているからだろう。
ロジックツリーは、情報をツリー構造に整理するだけ。
しかし、MECEであるか、4Pや3C、PLMのフレームワークで整理されているか、因果関係が言い尽くされているか、などを検証するのは結構大変。

そして、その解決策を仕様へ落とす作業、つまり設計工程でも、整合性を取りながら一つの論理モデルを作るのはそれなりのスキルを必要とする。
僕の短い経験では、アクティビティ図、ステートチャート図、デシジョンマトリクスの3種類で業務分析していくのかな、と思う。

「SEは脳みそで汗をかく職業」とうちの上司は言っていたが、上記の作業はまさにその通り。

【4】羽生さんのBlogで下記の気になるフレーズがある。

【元ネタ】
株式会社スターロジックの羽生章洋が書いてるブログ:要件定義の営業コスト化 - livedoor Blog(ブログ)

株式会社スターロジックの羽生章洋が書いてるブログ:雑多な日々 - livedoor Blog(ブログ)

以前に要件定義の営業コスト化ということを書きましたけど、要するにお客様に「これ書いてくださいね」とお願いしてしまえば、そこに要件が整理されちゃうという感じです。


ネット注文では、顧客に商品を買ってもらうために、顧客自らに、自分の個人情報と欲しい商品情報を入力させる。
リアル注文に対するネット注文の比較優位の一つは、販売者が顧客の注文要望を受け付ける必要がないことだ。
要件定義でも、顧客自身に、仕様を書かせてしまえばいい。

つまり、顧客自身に、問題解決のテンプレートに書いてもらえれば、それがそのまま仕様書になるようにすればいい。

羽生さんの会社で提唱されている「マジカ!」「Buri」などのツールや製品を見ると、こんなイメージでシステムを作っているのかなと思う。
#自分が理解した範囲内で書いている。間違ってたらスミマセン。

【元ネタ】
ワークフロー入門Buri-TECHSCORE-

マジカ!のシートに、顧客自身にシステム要件を書いてもらう
シートを並べれば、そのまま業務フローになっている

上記のシートの組み合わせをBPMNのモデル(XPDL形式)に変換する

BuriというフレームワークでJavaプログラムへ変換する
Seasarファミリーの一つみたい

後はゴリゴリ書くだけ。


上記まで問題解決が自動化されたら、受託開発はもっと安価になり、ITビジネスもデフレになるだろう。
実際はそこまで自動化できていないが、オープンソースで提供されるツール群には市販のERPパッケージ製品に劣らないビジネス製品もある。

要件定義、問題解決、システム化をもっと綺麗に整理できないか?

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

【告知】TestLinkでアジャイルにテストする

ETWest2009のTEF関西のコミュニティセッションでTestLinkについて話します。
TestLink+アジャイル開発の運用経験を熱く語る予定です。

【概要】
名  称 Embedded Technology West 2009/組込み総合技術展 関西
会  期 2009年6月4日(木)、5日(金) 10:00~17:00
会  場 インテックス大阪 5号館
大阪市住之江区南港北1-5-102  TEL: 06-6612-8800

【内容】
2009年6月4日 (木) 12:30~14:30 6号館2F 会議室F
TEF関西勉強会 てふかん in ETW2009

13:40~14:30
TestLinkでアジャイルにテストする

【講演概要】
近年、システム開発のプロジェクトマネジメントが重視されるが、要件定義、設計、プログラミングまでの工程に注力する一方、開発工数の半分以上を占めるテスト工程が軽視される傾向にある。
これに対し、XPを代表とするアジャイル開発手法は単体テスト工程にテスト駆動開発を導入したが、結合テスト工程以降には適用し辛く品質保証が難しい。
本セッションでは、これらの問題に対し、テスト管理ツールTestLinkを効果的に運用した実例を体験談を交えて解説する。

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

2009/05/02

最近の技術のトレンド~分散バージョン管理と関数型言語

「はじめてのGit」「key-value ストア」が読みたくて、WEB+DB PRESS Vol.50を初めて買った。
すごくイイ!

WEB+DB PRESS Vol.50の気になる章】
特集2
ブランチもマージも簡単な分散型バージョン管理システム
はじめてのGit

特集3
Webアプリのパフォーマンス向上の一策
[旬のライブラリ大集合]key-valueストア入門


Java+RDBの技術だけで、IT業界で一生飯は食っていけると思っていた。
でも、Webの世界では、特にGoogleの技術が世界中を席巻しているといっていい。
自分の技術が時代から少しずつ遅れてきている気がしてきた。

オブジェクト指向はもう古い。
MapReduce、レコメンドエンジン、Cookie Session Storeなどのように、リストやハッシュでデータを保持して比較計算する処理技術の方が重要になりつつある。
これは関数型言語の発想だと思う。

例えば、Rails2.0の機能の一つであるCookie Session Storeは、セッションを暗号化してクッキーに保持する。
このアーキテクチャがあれば、各クライアントの画面の状態はローカルPCのクッキーで保持するから、Webアプリをデスクトップアプリのように操作できる。
Webアプリの古くからの難問である「戻るボタン」「注文ボタンの2度押し」などにも、アプリ側で簡単に対応できるようになるだろう。


アジャイル開発では、分散バージョン管理のように、ブランチによる並行開発、そしてブランチ間の自動マージは必須の技術だ。
CVS→Subversion→Gitというバージョン管理の歴史を辿れば、仕様変更に強い特徴を持つアジャイル開発の発展と歩調を合わせて進化している。
この関係は多分偶然ではない。

特にGitは、ブランチ間のマージ機能が優れていると言われる。
だからこそ、分散バージョン管理で、複数のブランチがメインライン(trunk)とは別にたくさん作られても、精度の良いマージのおかげでブランチにもすぐに最新機能を反映できるし、ブランチで試したパッチがリリース可能な品質になったら、メインラインへマージして反映することもできる。

ソフトウェアプロダクトラインが提唱する手法では、製品ラインを中核機能やフレームワークを持つコア資産と、カスタマイズした製品ごとに複数のコードラインでブランチとして別々に管理する。
この手法の弱点は、メインラインとブランチでマージ機能が貧弱なため、ブランチがメインラインから独自発展しやすい危険性があること。
だが、分散バージョン管理の優れたマージ機能を使いこなせれば、ブランチによる並行開発は怖くなくなる。

そうなれば、突然の仕様変更や障害修正が降って来たとしても、ブランチを積極的に使って、新規開発中のメインラインと突然の対応を行うブランチの並行開発が可能になる。
この手法は、現代のアジャイル開発のプロジェクト管理では必須の技術だと思う。

XPが提唱したアジャイル開発の構成管理も、上記の技術によって、難易度が急激に下がりつつある。


最近の技術のトレンドに注意していきたい。



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

« 2009年4月 | トップページ | 2009年6月 »