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

2010年5月

2010/05/31

Agile2.0時代のAgile開発が目指す方向を示唆する書籍

Agile2.0時代のAgile開発が目指す方向を示唆する書籍を2冊あげておく。
アジャイル開発の本質とスケールアップ 変化に強い大規模開発を成功させる14のベストプラクティス」と「実践アジャイルテスト テスターとアジャイルチームのための実践ガイド」の2冊は、今後Agile開発を実践しようとする開発者にとって必須の書籍だと思う。

初期のAgile開発は、XPのように少人数のチームが小規模案件でAgilityを活かして開発するスタイルが主流だった。
それらの開発スタイルから、XPの優れたプラクティスであるテスト駆動開発、継続的インテグレーション、小規模リリースなどが発見された。
しかし、初期のAgile開発では、その事例の規模が小さいために、「アジャイル開発はスケールアップが難しい」「アーキテクチャや品質の作り込みの考慮が足りない」などの弱点を指摘され続けてきた。

Agile2.0時代のAgile開発は、初期のAgile開発の弱点であったスケールアップやテスト工程にフォーカスを当てているように思う。
アジャイル開発の本質とスケールアップ 変化に強い大規模開発を成功させる14のベストプラクティス」では、スケールアップのための14のプラクティスが提示されている。
僕がそれらのプラクティスの中で最も重要と思うものは、アジャイルリリーストレインとスクラムオブスクラム。
この2種類のプラクティスを自分たちのプロジェクトで運用できなければ、大規模プロジェクトを制御できるわけがないと思う。

更に、大規模プロジェクトの難易度が更に高いのは、開発チームが物理的にも心理的にも分散しているからだと思う。オフショア開発の例だけでなく、同じビルでもフロアが違えば物理的には廊下だけしか離れていなくても分散している。その分、開発チームのコミュニケーションのコストは急激に上がり、それがリスクになる。
その点に関しては、単にコミュニケーション重視、人間重視と叫んでも何も解決できたわけではないと思う。
何らかの抜本的な解決方法が必要だろう。

実践アジャイルテスト テスターとアジャイルチームのための実践ガイド」では、アジャイルテストの4象限が素晴らしい。
XPは確かにテスト駆動開発、継続的インテグレーションなどの優れたプラクティスを提唱したが、それだけでソフトウェア開発のテストをカバーするわけではない。
受入テストや負荷テストなど、テストの自動化の恩恵が受けにくい範囲のテストもある。
僕はその部分のテストは、TestLinkを有効に使えば解決できると思っている。

更に、Hudsonによる並行ビルドやVMWareによるテスト環境の仮想化という技術も必要だろうと思う。
というのも、受入テストや負荷テストは本番環境に近いテスト環境のために、テスト環境の構築コストやテストの実施工数があまりにも大きすぎるために、初期のAgile開発の技術だけでは不足しているからだ。
例えば、テスト環境をいくらでも複製して、受入テストのテスト実行やビルド作業を並行作業で高速化して初めて解決できると思っている。

すなわち、初期のアジャイル開発は開発工程では確かにAgileだが、本番リリース作業のように本番環境のリリース管理やビルド管理にはそれほど恩恵がないという弱点を持っていたのだ。
その弱点に対する解決の考え方を「実践アジャイルテスト テスターとアジャイルチームのための実践ガイド」は示唆しているように思う。

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

電子書籍の作り方part3

単なるテキストファイルを縦書きで読みたい場合は、もっと簡単な方法があるのが分かったのでメモ。

【元ネタ】
ポケット文庫 SkyBook 購入 - 移り気プログラマーの航海日誌

SkyBook のカスタマイズ / iPhone Application

ポケット文庫 - SkyBook / iPhone Application

i-FunBox | File Manager, Browser, Explorer, Transfer Tool for iPhone, iPad & iPod Touch via USB

【環境】
ポケット文庫 - SkyBook / iPhone Application
iPhone/iPod touchビューワー i-FunBox

【手順】
テキストファイルを準備しておく

iPhone上のSkyBookの設定で、「青空文庫以外のテキストのダウンロード」をONにしておく

i-FunBoxでPCに接続したiPhoneの中身を開く

/Raw File System/Photos/ を開いて「SkyBook」という名前のフォルダを作る

SkyBookフォルダへテキストファイルを配置する

iPhone上のSkyBookの本棚選択にUSBという項目があるので該当のテキストを開く

【感想】
・やはり縦書きの方が日本語は読みやすい。
 但し、技術系や理系のテキストは英文字が多いので読みにくい時がある。

・画像の表示は一工夫いるみたい。

・ちょっとしたメモ、原稿、授業のノートなどは、この手順で簡単に読めるようになる。
 通勤電車や昼休憩のような隙間時間を有効活用できる。

iPhoneが文庫本のように扱えるのは素晴らしい。

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

2010/05/29

電子書籍の作り方part2

電子書籍を作るプロセスについて考えたことをメモ。

【元ネタ】
404 Blog Not Found:Ambient Reading - 書評 - 電子書籍の衝撃

書籍の価格構成比をめぐる小考 - 狷介庵無聊雑録

Island Life - 『プログラミングClojure』のできるまで (訳者サイド)

技術書をアジャイルに作る: プログラマの思索

電子書籍の本質は、404 Blog Not Found:Ambient Reading - 書評 - 電子書籍の衝撃の下記の文言に言い尽くされている。

(中略)
電子書籍は、こうした「本の黒宿命」を一挙に打破する。オンラインであればいつでも買える。在庫切れはありえない。そして不動産価格ゼロ。
電子書籍がすごいんじゃないんだ。電子化されたことで、本はやっとTVやWebといった他のメディアと同じ土俵に立てるようになったと見るべきなんだ。
(後略)

書籍がオンライン化されることによって、音楽CDがiTunesによる曲のダウンロードに代わったように、本も電子書籍のダウンロード販売へ突き進むだろう。
音楽CDが1枚2000円だった価格から1曲100円に下がって一気に普及したように、書籍も1冊2000円から200円に下がれば皆が気軽に本を読めるようになるはず。

Web2.0時代のマーケティング手法であるロングテールを活かして、あまり売れない専門書や学術書も絶版を気にせずにいつでも取得することができる。

そして、電子書籍は、従来の出版社が原稿をDTP化して管理するのではなく、ePubのようなフォーマットでテキストベースで管理すべきだろう。

我々プログラマは、自分たちが作った成果物は必ずバージョン管理の配下に置く。
ソースもExcelの仕様書も構成管理に入れることで、バックアップできるだけでなく、修正履歴も残すことで、安心して修正できる。
そのおかげで、修正のリズムが生まれ、モチベーションも上がる。

電子書籍も同様に構成管理で管理すべきだ。
ePubフォーマットならば、XHTML+CSSというテキストだからSCMによるソース差分が有効で、安心して修正できる。

技術書をアジャイルに作る記事にも書いたように、電子書籍は下記のようなイメージでアジャイルに作れるはず。

著者は、電子書籍の原稿をsigilのようなうWYSIWYG エディタで書いてePub形式で保存する。

修正が終わったら、SVN・MercurialなどのSCMへコミットする。

毎晩、ビルド管理ツールHudsonでPDF又はePubにビルドして公開する。

公開した電子書籍をユーザが読んで、RedmineやTracのようなITSへフィードバックする内容をチケットに書く。

著者は、チケットを読んで原稿を修正し、SCMコミット時にチケットとSCMリビジョンをリンクさせる。
修正が完了したら、チケットをCloseする。

電子書籍の最終版を公開して、読者はePub形式でiPhoneやiPadで読む。

つまり、SVN(Mercurial)+Huduson+Redmine(Trac)という出版管理サーバーによって、簡単に電子書籍を作って公開できるようになるはず。

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

電子書籍の作り方

iPod touchで電子書籍を作って読む方法が分かったのでメモ。

【元ネタ】
hikariworks::blog ? Stanza iPhoneアプリで手元に図書館が

[ipod touch]さっそく、Stanzaをいれてみた | たまには人柱も悪くない

書類をstanzaでiPhoneに移植:Winged Dogの本棚:So-netブログ

EPUBを作製してStanza Desktopで見てみた ? NODE 科学、技術、サブカル ニュース

iBooksが待ちきれず「EPUB」を自作する - unakami - builder by ZDNet Japan

EPUB形式で作成した電子書籍を、iPhoneやPCのStanzaで読んでもらう方法 - RyoAnna’s iPhone Blog

【ツール】
Stanza: a Revolution in Reading | Lexcycle

【電子書籍の作り方】
Stanza on WindowsをローカルPCへインストール

Stanza on Windowsを開き、テキスト・Word・PDFなどのファイルを選ぶ

Saveメニューから、電子書籍フォーマットで保存する
 ePub, Amazon Kindle, Palm, XHTMLなど各種フォーマットへコンバートできる

「Enable Sharing」をONにしておく
 iPod touchと共有するため

【iPod touchで読む方法】
Stanza on iPhoneをAppStoreからインストール

Stanzaを開き、「ブックを取得」を開く

Stanza on Windowsで作った電子書籍ファイルをダウンロードする

「ライブラリ」からダウンロードした電子書籍を開けば読める!

【感想】
・iPod touch上では、横文字で表示される。日本語の文字も読みやすい。
 フォントの種類はMS明朝にしたら読みやすくなった。

・ページめくりも1回タップするだけ。
 画面を縦から横に変えられる。
 頁そのものの拡大もできる。

・テキストファイルをStanza on Windowsで電子書籍へコンバートするのは簡単。
 電子書籍の各種フォーマットに変更できるのはいい。
 ePubはXHTML+CSSなので、PerlやRubyスクリプトでテキストを自動変換するのも可能なはず。

・画像はカットされてしまう。
 Wordの目次は一部文字化けしている。

・電子書籍のフォーマットで原稿を書くなら、sigilというWYSIWYG エディタで書けばいい。
 画像の挿入、フォント変更など細かな作業ができる。

sigil - Project Hosting on Google Code

MOONGIFT: ? ePubフォーマットにも対応した電子書籍エディタ「Sigil」:オープンソースを毎日紹介

月曜ジャーナル Sigilの基本的な使い方(1)

【結論】
本を書きたい人は、sigilで書いて、電子書籍化すればいい。
電子書籍の良さは、個人の考えが1冊の本に体系化されて、その個人の考えを世の中の全員に広めて評価してもらうのが簡単なこと。
是非試してみて欲しい。

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

2010/05/27

GTDとチケット管理が似ている

iPhone情報整理術 ~あなたを情報’’強者’’に変える57の活用法!(デジタル仕事術シリーズ)」を読んで気付いたことをメモ。

【参考】
404 Blog Not Found:(iPhone|iPod Touch)オーナー必携! - #書評_ - iPhone情報整理術

はじめてのGTD - ITmedia Biz.ID

メールのための GTD、「Inbox Zero」の実践 | Lifehacking.jp

GTD 再入門 (1) なぜ、いまさらもう一度 GTD なのか? | Lifehacking.jp

Getting Things Done - Wikipedia

GTD + R (Getting Things Done + RHODIA) (eXtreme Gadget (エクストリーム ガジェット) ポケットに入るアジャイルな究極の小道具)

GTDは個人用タスク管理であり、ライフハックにおける主流として広く普及している。
チケット駆動開発もTracのチケット管理から生まれたが、その発想はそもそもToDoリストのようにラフにタスク管理するのと同じ。

GTDは、「収集」 → 「処理」 → 「整理」 → 「レビュー」 → 「実行」という流れでタスク管理する。
元々は紙と鉛筆でやるけれど、ロディアのようなメモ帳を使ったり、iPhoneのアプリを使ったりするのが最近は多いだろう。
GTDとチケット駆動開発が似ている特徴は3つあると思う。

一つは、タスク(チケット)はまずInBox(バックログ)に貯めること。
GTDでは、収集時に、InBoxという箱にまずはタスクをリスト化して貯める。
この作業ではタスクに優先順位を付けたり、整理したりなどの作業は行わず、頭を使わない。
タスクで一杯になった頭を空にして、今ここでやるべき作業に集中するために行う。

この発想は、Scrumのバックログ、リーンソフトウェア開発の「決定をできるだけ遅らせる」プラクティスに似ている。
タスクを貯蔵して、必要な時に取り出せばいい。
必要でないならば、手を付ける必要はないのだ。

つまり、GTDもチケット駆動開発も残タスクの管理に大変有効という特徴があるだろう。
ゴールに向けて必要なタスク一覧を取り出せば、残タスクを管理することで進捗管理しているのだ。

2つ目は、タスク(チケット)はコンテキスト(属性)で分類すること。
GTDでは、処理時にタスクをリスト化し、整理時にカテゴリで分類する。
リスト化する作業は、タスクの依存関係を整理すること。
カテゴリで分類する作業は、タスクの優先度、カテゴリ、作業期間などの属性を付与すること。
つまり、どのタスクを最初から行えば効率的か、タスクをふるいにかけているのだ。

この発想は、チケット管理そのものズバリだ。
チケットには、優先度、作業期間、カテゴリ、トラッカー、予定工数などの属性を付けることができ、色んな観点で集計できる。
チケット駆動開発の利点は、チケットの自動集計機能によって、ガントチャートやカレンダー、ロードマップ、チケット一覧、PFのかんばんなど各種のメトリクスを出力してくれること。
この利点によって、進捗を随時モニタリングできる。

iPhone情報整理術 ~あなたを情報’’強者’’に変える57の活用法!(デジタル仕事術シリーズ)」を読んで、iPhoneのGTDアプリで興味を引いたアプリは、OmniFocusとRememeber The Milk。
OmniFocusでは、タスクのリストにプロジェクトとコンテキストの2種類が必ずある。

OmniFocus の心理:もっとも高機能でもっとも難解な GTD アプリを使いこなす | Lifehacking.jp

普通は、タスクはプロジェクトごとに作られ、タスクの実行順序や依存関係でまとめられる。
コンテキストでは、タスクは場所や機能など、別の文脈(観点)で分類される。
すなわち、各種の観点(文脈)でタスクを見ることによって、タスクのふるい分けをサポートしている。

この手法は、Redmineのプロジェクト、トラッカー、チケットのカテゴリなどの属性によってチケットを分けるのと同じ発想だろう。

Rememeber The Milkでは、タスクは任意のリストに入れられ、タグを付けることができる。

これなら毎日できるタスク管理 1から学ぶRemember The Milk:第3回 さっそく使ってみよう!|gihyo.jp … 技術評論社

これなら毎日できるタスク管理 1から学ぶRemember The Milk:第7回 いろんな方法でタスクを登録する|gihyo.jp … 技術評論社

きゅーり.jp: remember the milk - 安定運用編

普通は、タスクはまずバックログ用にリストに入れられる。
次に処理時にタスクに「private」「work」「buy」「wait」「send」タグを付けて、期日を入れる。
そして整理時に「Action」「Calendar」「Wait for」「Project」「Someday」などのリストへ移す。
開始日付になったらアクションが始まる。

iPhone情報整理術 ~あなたを情報’’強者’’に変える57の活用法!(デジタル仕事術シリーズ)」によれば、リスト・タグ・期日の三つの観点があるから、スピード感のあるToDo管理が可能だと言う。
リストは仕事・役割・場所の観点であり、場所に依存している。
タグはタスクの特徴を一言で表す観点であり、カテゴリや機能でもある。
期日は、優先度やマイルストーンを表す観点であり、時間軸に対応する。

チケットなら、リストはプロジェクト、タグはカテゴリやカスタムフィールド、期日は開始日・終了日・リリース予定バージョン(イテレーション)に相当するだろう。
つまり、タスクは時間・場所・機能の3つの属性で十分だということ。

時間・場所・機能という3種類の観点をチケット管理に応用したら面白いかもしれない。

3つ目は、リズムが生まれること。
GTDの良さは、タスクを消し込む快感があること。
タスクを消し込む度にモチベーションが上がり、ストレスから開放される。
1日ごとにタスクを片付けるリズムが生まれる。

チケット駆動開発もアジャイル開発のように運用すれば、イテレーション単位にリリースするリズムが生まれる。
TiDDにも毎朝の朝会、リリース後のふりかえりで、プロセス改善のリズムがある。

人間という生き物は、一定のリズムで動かされるべき存在なのかもしれない。

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

2010/05/25

チケット駆動開発にGTDの概念を導入する

yusuke-kokuboさんのつぶやきに惹かれたのでメモ。

【元ネタ】
Twitter / yusuke-kokubo: ビジョンを説く・「プロジェクトの管理者と作業者をシームレスにつなげたい」・「プロジェクト管理にかかる無駄工数を極限まで少なくしたい」・「管理者は管理の本質に集中できて作業者は自分の作業だけに集中できる環境を作りたい」

Twitter / yusuke-kokubo: そのための手段として・「Redmineを使ってプロジェクト管理をシステム化する」・「RedmineAirを使って個々のタスクとRedmineを連動させる」

Twitter / yusuke-kokubo: RedmineAirはどうあるべきか?・「作業者が普段メモをとる感覚で使えないといけない」・「WebブラウザがなくともPCを立ち上げればRedmineのチケットが勝手に表示される」 →よくある付箋紙アプリがRedmineのチケットを結びついたら面白そう

ソフトウェア開発では、プロジェクト管理の工数が実は大きい。
ソフトウェア開発は流れ作業ではなく、新技術を使いこなしながら、顧客の曖昧な要求から試行錯誤しながらシステムを作り込む。

頻繁な要求の変更、タスクの変更、優先順位の変更は当たり前。
全ての作業はUnixのコマンドのように、パイプラインでつながっている。
一つの作業が遅れると、後続の作業は全て遅れてしまう。
つまり、一つの作業の遅延はクリティカルパス上のタスクに影響をもたらす。
しかも、クリティカルパス上の作業は状況によっては、毎日変わってしまう。

Redmineによるチケット駆動開発は、アジャイル開発のようにタスクの変化を取り込んで作業が可能。
パイプライン上の作業に変更が生じたら、イテレーションの範囲内で作業順序を変えればいい。
リリースの優先順位まで変わってしまったら、そのタスクをイテレーションから外してしまえばいい。

つまり、日々で頻繁に変化するタスクを見える化することによって、マネジメントを見える化しているのだ。
ある意味では、GTDに似た構造を持っていると言えるだろう。

チケット駆動開発とGTDについても考えてみたい。

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

チケット駆動開発の概要と体験談

さかばさんがTiDDのスライドを公開していたのでメモ。

[TiDD] チケット駆動開発の概要と体験談: ソフトウェアさかば

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

2010/05/24

分散バージョン管理のブランチは仮想フォルダ

Gitのコマンドを上手く喩えた記事があったのでメモ。

【元ネタ】
gitのbranchは「仮想フォルダ」と考えるといろいろうまくいく - IDEA*IDEA ~ 百式管理人のライフハックブログ

Aha! Moments When Learning Git | BetterExplained

◆ git checkout master
cd master

◆ git branch dev
cp * dev

◆ git merge dev
cp dev/* . (最後のピリオドに注意)

◆ git branch
ls

 同様に、リポジトリ作成は「mkdir」に相当するだろう。
 Mercurialのコマンドも上記に当てはめれば、分かりやすくなるはずだ。

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

2010/05/23

弾言の感想

弾言 成功する人生とバランスシートの使い方」をiTunesでダウンロードして、iPod touchで読んでみた。
電子書籍というものにも触れてみたかったので買ってみた。
とても面白い。

Dangen by Dan Kogai for iPhone, iPod touch, and iPad on the iTunes App Store

人生を貸借対照表で考える。
現金の総量を資産で増やすのか、負債で増やすのか、全く違う。
資産がどこから生まれるのか、で全く違う。

ベーシックインカムと言う発想。
年金、こども手当の発想を国民全員に拡張した考え方かな。

電子書籍としても素晴らしい。
文庫本のように読めるし、しおりのような機能もあるから、ちょっと手を離した後に再読する時に役立つ。

Amazonなら1500円するのに、iTunesなら350円で売られている。
書籍そのものを電子化したら、この価格まで安くなるのかもしれない。
また、安価なほど数多くの人に触れられるので、社会的影響力も大きくなるだろう。

色々と考えさせられた。

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

2010/05/22

Redmineプラグイン集

Haru Iidaさんのr-labs - Redmineプラグイン集 - Redmineをリンクしておく。
いつもお世話になってます。

【元ネタ】
Twitter / Haru Iida: 久々に Redmine プラグイン集を更新した。あまりにたくさん増えていたので疲れた。

r-labs - Redmineプラグイン集 - Redmine

Redmine - Plugin List - Redmine

2年前に比べると、プラグインの数が多すぎてトレースできないくらい。
プラグインの中で興味があるのは、Scrumをサポートする機能、バーンダウンチャート表示などのメトリクス出力機能かな。

最近、面白そうだと思ったのは、JoelTestプラグイン。

r-labs - Joel Test - Redmine

自分たちのソフトウェア開発チームの質を評価してくれる。
12点中11点以上でなければ、何らかのプロセスに問題があり、実際に症状が出ているはずだ。
おそらく殆どの開発チームは10点以下なので、いつデスマーチに陥ってもおかしくないぐらい危険な状況のはず。

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

2010/05/17

TestLinkを使いこなすとテストケース作成が上手になる

TestLinkを使いこなすとテスト仕様書やテストケースを作るコツが分かるみたい。
下記のTwitterを見つけた。

【元ネタ】
Twitter / Jun Kawashima: Testlinkを使った経験からテストケース作成の勘所がなんとなく分かってきた。今回はExcelで作成しているが、テスト仕様書作成の苦手意識がなくなっている。ベストプラクティスは応用が利くということか。

TestLinkのテストケースの書式は、Excelのテスト仕様書そのものだと思っていい。
概要、ステップ、期待値がテストケースの属性であり、この書式に慣れれば、テスターも作業しやすい。

それらテストケースをリリース予定バージョン別、工程別、機能別、テストの目的別に階層化すれば、テストケースを管理しやすくなる。
テストケースを管理しやすくすれば、TestLinkのテスト仕様にテストケースを貯蓄しやすくなり、運用保守でテストケースを再利用できる。
1次開発でバグが続出して苦労した機能を2次開発で機能追加する場合、以前のテストケースを流用したり、過去に成功したテストケースも周辺テストで回帰テストして品質を担保する戦略を取ることもできる。

オープンソースの業務支援ツールには、ベストプラクティスが含まれているから、ツールの機能に慣れた方が生産性が上がるはずだ。

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

2010/05/16

ERPの落とし穴part2~業務の裏には会計あり

ERPの落とし穴part1~SW開発ではない。要求開発だ!の続き。

グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」を非常に参考にしているので、全てが僕のオリジナルの考えではないので注意。

【1】業務の裏には会計あり。業務データは必ず仕訳データに連携される。

業務システムの裏には必ず会計システムがある。
Webで作っていても、メインフレームで動く会計システムと連携できなければ、ただの箱に過ぎない。
会計システムと連動できて初めて、業務コストや売上が計算出来るし、更には売掛金管理や請求管理で経理担当者の仕事もサポートできる。

例えば、「グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」によれば、販売業務では、受注→出荷→売上→請求→入金のような業務フローがあるだろう。
業務データの裏には、仕訳データと連動している。

普通はお金のやり取りが発生したタイミングで仕訳が発生するから、売上処理で「売掛金//売上」、入金処理で「当座預金//売掛金」という仕訳が発生しているだろう。
業務SEは、この流れを理解しているから、業務分析ができるのだ。
この流れがスラスラと出なければ、業務SEとは呼べない。

仕訳の知識が必要な理由は、業務には例外処理や訂正処理が非常に多いからだ。
グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」によれば、「商品の返品は売上高のマイナスになる」「請求に対して過入金があった場合、売掛金のマイナスで処理される」例がある。

前者の仕訳は「売上//当座預金(又は現金)」という逆仕訳が発生する。
後者の仕訳は「当座預金//仮受金、売掛金」という仕訳で、仮受金と言う内容が不明な入金があった負債勘定科目を当てる。

このように、売り上げた(又は仕入れた)商品の返品や値引き、入金の過不足対応などの例外処理の業務に対応するだけでなく、仕訳データも連携しておく必要がある。

ERPでは、会計システム連動の機能は、普通は、自動仕訳と言う仕組みでIT化されているのが普通だろう。
つまり、業務データに対し、仕訳データのパターンは決まっているので、仕訳パターンに従って仕訳を自動で起こし、会計システムへ流す。
仕訳パターンはあらかじめDBに登録しておいてもいいし、経理担当者がWebのUIから入力できるようにしておけばいい。

グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」によれば、自動仕訳のパターンの例があげられている。
すべて覚えても良いぐらいだ。

仕入: 仕入//買掛金、仮払消費税
仕入返品 :買掛金//仕入値引、仮払消費税
売上: 売掛金//売上、仮受消費税
売上返品: 売上値引//売上、仮受消費税
入金(改修消し込みと別): 当座預金//仮受金
回収(入金あり): 仮受金//売掛金
回収(入金と同時処理): 当座預金//売掛金
回収(消費税端数不足): 当座預金//売掛金、雑損
回収(振込手数料差し引き): 当座預金//売掛金、支払手数料
回収(加入金): 当座預金//売掛金、仮受金
支払い: 買掛金//当座預金

普通は、企業規模が大きいほど1日のお金の取引は多いので、いわゆるバッチ処理で実装する時が多い。
そのバッチ処理は、PLSQLのようなストアドプロシージャで実装する時が多い。
例えば、毎日深夜にCronで定期的にシェルをキックして、シェルにあるJavaのメインクラスがPLSQLをキックする仕組みが普通だろう。
この仕組で実装しておけば、JavaからPLSQLをキックしているから、PLSQLの単体テストにDBUnitを使えるので、テスト駆動開発もデイリービルドも可能になる。

WebシステムはJavaで、バッチ処理はPLSQLで使い分けるアーキテクチャが多いだろうと思う。

【2】赤黒伝票という訂正仕訳。逆仕訳。

日本特有(?)の会計処理として、売上や入金などに関する仕訳データを修正する場合、赤黒処理を行う。
つまり、直接データを修正するのではなく、黒伝票を赤伝票で相殺して、正しい仕訳を追加する方法を指す。
簿記3級では、訂正仕訳とも呼ばれていて、「まず正しい仕訳をメモしておき、誤った仕訳の次に逆仕訳、その次に正しい仕訳を書く」(正誤逆正)と教わった。

訂正仕訳を使う状況は、職員が勘定科目を間違って仕訳を作った時が多いだろう。
訂正仕訳が必要な理由は、会計情報と言うお金に関する情報は必ず操作履歴を残す必要があるからだ。
コンプライアンス上の理由もあるのだろう。

逆仕訳、訂正仕訳が起きる業務は要件定義や要求のヒヤリングで漏れやすいので、何度もユーザに確認すべき。
要件漏れがあると、そのシステムはユーザにとって非常に使いにくくなる。

【3】締め処理という考え方。支払いサイト、月次締めの違い。

日本特有の請求処理として締め処理という概念がある。
例えば「月末締め翌月末払い」とは、毎月末に売上や仕入の請求を締めて、翌月末に入金や出金を行うことを指す。
つまり、掛取引を締め日と言うタイミングで一括処理するのが日本の商習慣。
日本の会社は基本的に、5日、10日、20日、30日のように5の倍数の日に締め日を指定しているから、銀行は5の倍数の日は非常に忙しい。
給与振込も普通は5の倍数の日が多いだろう。

グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」によれば、取引先ごとに締め日を変えたりする複数締め日もあるという。こんな例はまだ見たことがないけれど、要件定義になかったら、受入テストで痛い目にあうだろう。

支払い方法は銀行振込以外にも日本特有の手形取引という手法もあり、手形の振出日から期日までの期間を支払いサイトという。
「月末締め翌月末払い」の例では、支払いサイトは「月末の振出日から30日サイト」になる。
「20日締め翌月末払い」の例は、支払いサイトは「振出日20日から40日サイト」になる。

手形のサイトが長いほど、現金化できる日が伸びるので、受け取る側は貸し倒れリスクも発生する。
グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」によれば、古い体質の業界では、大手企業が下請けいじめとして、支払いサイトを120日以上も指定する時もあるという。

支払いサイトの考え方が重要な理由は、売掛金や買掛金処理で重要だからだ。
普通は、ユーザ企業の営業日カレンダーをDBで持っておき、取引先への支払日は支払いサイト情報からPLSQLで自動計算する仕組みになっているだろう。
支払日の計算は単純にサイト日数を足すだけではないのだ。

この締めという概念は、上記のような請求締や支払い締だけではない。
もう一つは月次締という概念がある。
月次締めは、毎月の売上や損益を月次単位で集計するための締めだ。
いわゆる計上日と関連する。

普通の会計システムは、月次締めは仮締めと本締めの2種類がある。
3月末に締め切ったとしても、4月1日に3月上旬の経費の請求書が届く場合もあるし、3月の仕訳に誤った仕訳もあるだろう。
それらの仕訳を入力修正した後、仮締めを実行して何度も集計結果をチェックする。
これでOK、となった時点で、本締めで3月度の売上や損益が確定し、締められた3月の仕訳は入力できなくなる。
だから、3月中の会社の出張旅費や交通費の精算書は、必ず3月末までに経理担当者へ提出しなければ、手元に戻ってこなくなる。

IT化される以前は、経理担当者は3伝票(入金・出金・仕訳伝票)で日々の仕訳を残し、締め日になってから手作業で集計してチェックしていたから、締め日から本締めできる日まで15日~1ヶ月もかかっていたらしい。
しかし、最近は3伝票のような紙はなくなってIT化されたので、3~5営業日で本締めできるようになった。
その分、月次の売上や損益のデータを経営者へ早くフィードバックできるので、よりスピーディな経営判断ができるようになった流れがある。

締め処理は、国税庁へ提出する会計帳票を作るために非常に重要な概念の一つ。

【4】残管理を業務システムがサポートする。

業務システムを作った場合、残管理という業務支援の使い勝手の良さが顧客満足度を左右する時が多い。
グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」によれば、受注残(受注したが未計上)、未請求残(売り上げたが未請求)、売掛残(請求したが未入金)などの例がある。
つまり、残管理を徹底して、出荷漏れ、請求漏れの防止や未入金顧客への督促などを支援したいのだ。
昨今のように会社倒産が多い場合、売掛残の管理がしっかりしていないと、せっかく売上があっても入金されないと言う悲しい事態が起きやすい。

残管理でよく出る帳票は、買掛金元帳と売掛金元帳。
買掛金元帳は仕入先元帳とも呼ばれ、仕入れたが出金していない買掛残を管理するための帳票。
経費の支払、商品の仕入が相当するだろう。
買掛金元帳は、仕入先単位に毎月の買掛残の詳細と集計を出力し、振込日にいくら支払えばいいか、チェックするために使う。
取引先ごとに支払いサイトを変えて振込する時もあれば、自社の支払サイトに従って全ての取引先へ振り込む場合もある。
銀行振込には振込手数料がかかるから、できるだけ一括払いしたいものだろう。

売掛金元帳は得意先元帳とも呼ばれ、売り上げたが入金回収していない売掛残を管理するための帳票。
商品の売上、サービスの検収などがあげられる。
売掛金元帳も、得意先単位に毎月の売掛残の詳細と集計を出力し、請求書を得意先に送って入金を促す。
最近は得意先の資金繰りも苦しい所が多いので、入金を催促する時が多い。

更に商品の在庫管理も重要だ。
在庫引き当てという処理は、倉庫にある商品を注文単位で予約しておくこと。
だから、リアルタイムに在庫数を表示すること、複数の注文の在庫引き当てが発生した場合、きちんと排他制御ができていることが重要になってくる。
在庫引き当て処理は、どの業務システムの中でも実装もテストも難しい部分。

商品在庫の残高管理も重要だ。
簿記3級では、商品有高帳という補助簿があり、商品単位に仕入と支払を仕訳で記帳して残高を管理する。
残高の計算では、商品の原価を計算する必要があり、原価法として先入先出法と移動平均法が有名だ。

先入先出法は、先に仕入れた商品から先に出していくものとして払出単価を決める。
移動平均法は、商品を異なる単価で仕入れるごとに、平均単価を計算して決める。
情報処理技術者試験でもよく出てくる概念。

いずれもIT化されていば自動計算できるので、リアルタイムに在庫のコストがすぐに計算できる。

【5】株式会社が必要とする会計帳票。主要簿と補助簿。

株式会社が必要とする会計帳票には簿記3級では主要簿と補助簿に分かれる。
主要簿は仕訳帳と総勘定元帳。

仕訳帳は日々の仕訳を日別に記録した帳簿。
日次で出力する時が多いが、量が膨大なので本当にチェックしているのか、と思いたくもなる。

総勘定元帳は、仕訳帳から勘定科目ごとに転記した帳簿。
いわゆるT字形勘定に相当する。
総勘定元帳は月次で出力する時が多い。
総勘定元帳は、国税局や経営者へ提出する会計帳票の元ネタとなる帳簿であり、とても重要。

補助簿は、買掛金元帳、売掛金元帳、商品有高帳は既に上げたが、他に重要な帳簿として、現金出納帳や当座預金出納帳がある。
現金出納帳は、現金の収入と支出を記録した帳簿。小遣い帳と同じ。
当座預金出納帳は、当座預金の取引を記録した帳簿。預金通帳と同じ。
これら二つは日次で出力し、会社の小遣い帳や預金通帳として経理担当者がチェックするのが普通だろう。
会社の資産が減っていないかチェックしているのだ。

そして、日々の仕訳は月次締めで集計され、年度末になったら、1年間の会計期間の帳簿として、損益計算書と貸借対照表を出力する。
会計システムは損益計算書と貸借対照表を出すために存在すると言っていい。

年度末は経理担当者にとって一番忙しい時期。
これら二つの会計帳票を株主に公開して、国税局へ税金を納めるからだ。

年度末決算の作業は、決算整理仕訳という特別な仕訳を作る作業期間を設ける。
決算整理仕訳は棚卸表による修正仕訳を指す。
過去1年間の帳簿や会社の資産、在庫がある倉庫を全てチェックして、資産の状態を洗い出さねばならないのだ。

この時に作られる帳簿が、合計残高試算表と精算表。
合計残高試算表は毎月月次に総勘定元帳を元に作られ、各勘定口座の残高と借方・貸方合計を一覧表示した帳簿。
この帳簿を元に、経理担当者は残高や合計金額を毎月チェックする。
合計残高試算表は上半分がBS、下半分がPLになるように作られているので、すぐに貸借対照表や損益計算書のイメージが湧く。

精算表は、試算表、決算整理仕訳の修正仕訳、、貸借対照表と損益計算書の4個が合わさった一覧表。
精算表からすぐに貸借対照表や損益計算書が作られるので、会計帳票のチェックに使う時が多い重要な帳簿。

これらの帳簿は普通はバッチ処理で日次、月次、年次で作られる。
取引量が多いほど集計処理は大変になるから、DBモデリングやアーキテクチャの腕や品質が問われる。

【6】業務の裏に法律あり。

最近は、J-SOX、個人情報保護法、コンプライアンス、CSRなど会社を縛る色んな法律や概念がある。
業務システムの仕様が複雑になるのは、それらの法律を反映させる必要があるからだ。

今の時代は、会社の管理コストがとても大きくなっていると思う。
簡単にベンチャー企業が作れる時代ではない気がする。
業務システム、会計システムというITインフラがなければ、コンプライアンス上、会社経営はとても危険だろうと思う。


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

ERPの落とし穴part1~SW開発ではない。要求開発だ!

今まで数々のERP開発に携わってきたけれど、正直楽しかったと言う印象はあまりない。
開発者が想像するソフトウェア開発とは何か違う。

そんな時に梅田弘之さんの「グラス片手にデータベース設計~販売管理システム編 (DBMagazine SELECTION)」を再読して、ERPについて色々と感じるものがあった。
ERPの落とし穴やポイントについて考えたことをメモ。

【1】ERP開発はソフトウェア開発ではない。要求開発だ!

ERPは基幹系業務システムのためにある。
その開発スタイルは正直ソフトウェア開発ではないと直感している。
開発者がイメージするソフトウェア開発は、問題やタスクをプログラミングやサーバー構築などの技術で解決していくこと。
その作業は大変だが、やりがいはある。

しかし、ERP開発では、顧客から要求を収集し、要件として定義して後続の設計作業に落とし込む作業期間が非常に長い。
開発できる段階になれば、正直楽なものだ。
実際は、要件定義に非常に時間がかかっている。何故なら、顧客の要求を全て聞き出して、更に整合性のとれた要件にまとめるのは至難の業だからだ。

ここで中核となる人物はいわゆる業務SE。
プログラムは書けないけれど、業務にとにかく詳しい人を指す。
彼らは、ExcelやWord、PowerPointを駆使して、システムのイメージを作り出す。
要求をまとめて要件に確定するのが彼らのお仕事。
彼らの開発スタイルは、ソフトウェア開発ではない。要求開発だ。

萩本さんが提唱する要求開発は、おそらくこの部分で最も威力を発揮するのでは?と思ったりする。

プログラミングを得意とする開発者から見れば、業務SEは顧客との駆け引きがうまいが要件をきちんとまとめられなければ、口先だけじゃないか!と思ったりもする(笑)

【2】システムの外部接続が多い。外部接続のI/Fがリスク要因になる

ERPを導入する時の注意点の一つとして、ERPへ取り込むデータを外部システムからもらったり、逆に外部システムへデータを送る機能を要求開発で早めに洗い出すことがあげられる。
外部システムへ接続する要件は頻繁にあり、それはリスクが高い。
何故なら、ERPの要件定義だけでも大変なのに、外部システムの仕様まで抑えないといけない上に、接続テスト環境を準備するのも大変だからだ。

よくある例は、メインフレームの会計システムへERPで作ったデータを送信する時があるだろう。
ERPでは会社の日々の業務を支援するが、取引で発生したお金のやり取りは、外部の会計システムへ連携するパターン。

外部接続が難しい理由の一つは、接続のタイミング。
日次夜間なのか、月次なのか、年次なのか、リアルタイムなのかタイミング情報を収集し、ERPの業務データと整合性を取らねばならない。
この作業は業務を知らなければ結構難しい。

外部接続で使う技術の例としては、HulftとEBがあげられるだろう。

Hulftはメインフレームとオープンシステムの間でよく使われる接続プロトコルで、日本ではよく使われている。
集配信サーバー上にHulftファイルと言うバイナリファイルを送り、取り込んでもらう。
APIも技術もかなり枯れているから、実装は難しくない。
だが、要件定義がしっかりしていないと、HulftファイルのI/F定義書通りにデータが作られていなかったりする時があるので、接続テストで泥沼にはまる時がある。

EBは、エレクトロニック・バンキングの略で、銀行振込や入金の作業を自動化する接続プロトコル。
日本の銀行は全銀協という団体に属していて、銀行番号と支店番号がユニークに振られている。
全銀TCP/IPという接続プロトコルを使って、銀行の当座預金から入出金する。
最近は、請求業務だけでなく、出張旅費の仮払精算や給与振込でも使われるようだ。

全銀フォーマットというテキストファイルに入手金情報を書いておけばいいから、この技術もかなり枯れている。
しかし、要件定義がしっかりしていないと、どのDBから入出金情報を取得するか、どのタイミングで入出金するかという所で泥沼にはまる。

【3】品質要求の中でも移植性が重要視される

ERPは既存のパッケージ製品や既存のシステムをカスタマイズして作る時が非常に多い。
既存のパッケージ製品があるならば、同じ物を一からスクラッチ開発する必要もないし、コスト削減になる。
何よりも、既に運用されているから品質も担保されている。

従って、既存のシステムをそのままコピペする作業が非常に多くなる。
しかし、元々のシステムが移植性を考慮していない設計になっているともう大変。無駄な機能まで取り込んでしまい、システムが膨れ上がる。
だからこそ、品質要求の中でも移植性が非常に重要視される。

移植する作業方法としては2パターンある。
一つは移植元のライブラリはいじらず、I/Fのラッパーを作って動かす手法。
もう一つは、移植元のライブラリを若干修正して移植先へ移す手法。

前者は、Cobolの時代から行われてきた手法で、このやり方を使える状況ならばできるだけ使った方がいい。
I/Fの仕様さえ抑えれば、ラッパー部分だけ作る作業はそれほど工数がかからない。
しかし、結合した時に性能が悪くなる場合があるので、非機能要件に注意した方がいい。

後者は、特に組込製品でよく発生する手法。
心臓移植などと同様で、既存ライブラリをそのまま移植先へ持っていける状況はそう多くない。
移植元のライブラリを若干修正して、移植先の環境に合わせる時が多い。
しかし、この手法を使うと実装工数よりもテスト工数が増えるし、修正時に別のバグを入れ込む危険も出てくる。
又、移植元のライブラリがバージョンアップしたら、移植先にも同様に取り込む必要があり、その作業が非常に難しくなる。
移植先に合わせて修正しているから、マージ作業が大変なのだ。
ERPでは、このやり方を実施してデスマーチにはまる時が多い。

後者については、パターンによるソフトウェア構成管理 (IT Architects’ Archive―ソフトウェア開発の課題)にあるベンダブランチという構成管理技術を使えば、問題を改善できるだろうと思う。
つまり、移植元のライブラリはベンダブランチとしてバージョン管理し、移植先のシステムへ取り込む時にマージ作業をバージョン管理ツールを使って補完すればいい。
MercurialやGitなどの分散バージョン管理を使っていれば、ベンダブランチからtrunkへのマージ作業は楽になるだろう。

part1ではERP開発の開発プロセスや技術に関して、考えをまとめてみた。
他にも書きたいことは後で書く。

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

2010/05/15

分散バージョン管理の弱点は日本語対応

分散バージョン管理の日本語対応についてメモ。

【元ネタ】
TortoiseHg で日本語ファイル名 - あすかぜ・ねっと

GITとBazaarの個人的比較まとめ - namutakaの日記

Mercurialは、完全に日本語対応していない。
Gitはファイルパスに全角を使うと文字化けするらしい。
唯一、BazaarはUnicodeに完全対応している。

最近は、バージョン管理の対象が単なるソースコードだけでなく、ExcelやWordなどのドキュメント、ビルドスクリプト、ビルドモジュールなども含む。
だからこそ、日本語にも対応していて欲しいものだ。

しかし、分散バージョン管理はUnicode対応が完全ではない弱点がある。
おそらくCVSやSVNなどの中央集権バージョン管理に対する唯一の弱点だろう。

個人的には、分散バージョン管理を普及させるためにも、早く日本語にも完全対応して欲しいと思う。

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

Redmineユーザによるオンライン会議

yusuke-kokuboさんのTwitterで、Redmineユーザによるオンライン会議を知ったのでメモ。

【元ネタ】
Twitter / yusuke-kokubo: UXTeamなるものができてRedmineに新規追加される機能をレビューするらしいです。第1回は Subtasking

Redmine - UXTeamMeeting1 - Redmine

上記の会議はSkypeで行われ、2010/5/11に既に開催が終了しているようだ。
会議の内容を見ると、Subtaskingの機能について、そもそもどうあるべきか、などの議論を行う予定だったらしい。

英語に自信がある日本人のRedmineユーザも参加してみてはどうだろうか?

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

2010/05/14

ペア作業やミーティングをクラウド化する

大規模プロジェクトになるほど、コミュニケーションの重要性が高まる反面、複雑性も増す。
コミュニケーション作業そのものをクラウド化できないか、アイデアをメモ。

大規模プロジェクトでは、小規模プロジェクトとは違った問題が現れてくる。
メンバーが増えるので、XPのようなオンサイト顧客、ペアプロのような対面の作業がやりにくくなる。
メンバーが増えるほど、コミュニケーションパスは増大し、誰が何を言ったのか、すぐにわからなくなる。
ちょっとした仕様変更を伝えるにも、逐一ドキュメントに残す作業が増える。

メンバーが多いほど、トップのマネージャの考えが伝わらないのだ。
まさに伝言ゲーム。

一番の問題はミーティングにあると思う。
ちょっとしたレビュー、仕様変更のフィードバック、課題の棚卸のために、十数人のメンバーが2時間以上も会議を開く。
マネージャやプロジェクトリーダーなど地位が高い人ほど、1日の大半が会議で潰れてしまう。
10人が2時間の会議を開くだけでも、20人時間、つまり2.5人日分も浪費している。
それだけの価値があるかどうかも不明。

だが、ミーティングをクラウド化することで、ミーティングを効率化できないか?
各メンバーは自席のPCで、Skypeで議論しながら、GoogleDocsのドキュメントを複数人が更新し合って、一つの議事録を作り上げる。
あるいは、UStreamやWebカメラなどを使って、物理的に離れたチーム同士でミーティングをスムーズに行う。

レビュー作業が重要と分かっているのに、そのレビューが不十分な原因の一つは、せっかくレビューしたのに理解漏れのために仕様が漏れてしまうこと。
ペア作業みたいにやりたいけれど、5人以上のレビュー会議では、1台のPCで作業できない。
ならば、各自の自席のPCでSkypeで議論しながら、一つの設計書を見ながら、レビューアが直接修正してはコミットすればいい。そうすればレビュー漏れもない。

ペアプロもそうだ。
特にオフショア開発の場合、Skypeで議論しながら、SVNにある一つのソースコードを複数人のレビューアがソースレビューすればいい。
Eclipseには、地理的に離れていてもペアプロできるプラグインもある。

幸いなことに、SkypeもUstreamも導入コストは小さい。
その気になれば、開発チーム内でストリーミングサーバーを作って、Webカメラを使って、地理的に離れたチーム同士でミーティングできるようにすればいい。

とにかく、大規模プロジェクトになるほどコミュニケーションのコストが大きい。
システムに非機能要件があるように、単体のコンポーネントの信頼性が高くても、全てのコンポーネントを結合して初めて分かる問題もある。
大規模プロジェクトのコミュニケーションコストの大きさは、小規模プロジェクトにはない特有の問題なのだ。

大人数の作業環境そのものをクラウド化して、誰でもその作業が見えるようにして、すぐにフィードバック出来る環境が欲しい。

チケット駆動開発は、進捗情報を自動集計することによって、進捗報告のコストを無しにした。
同様に、クラウド化によってコミュニケーションコストを下げることはできないか?
同様に、昨今の技術革新でコミュニケーションをサポートできないのか?

|

RedmineのRESTful APIを使う

RedmineのtrunkにはRESTful APIが公開されている。
アイデアをメモ。

【元ネタ】
Twitter / yusuke-kokubo: RedmineはREST APIを持ったことで色んなやりたいことができるようになる。

Redmine - Rest api - Redmine

Redmineをプロジェクト管理サーバーとして扱うならば、他のツールや機能と連携したくなる。
その時にRESTful APIはとても便利。

大量のチケットを一括インポートするためのデスクトップアプリを作りたい。
MSProjectのタスクをインポートしたり、逆にMSProjectに取り込んだりしたい。

HinemosやTivoliのようなサーバー監視ツールが障害や警告を検知したら、すぐにRedmineチケットを発行して、障害やインシデントのその後の経過も管理したい。

TestLinkやHudsonなどのツールと連携したい。
HudsonでビルドしてJUnitのエラーが出たら、即バグチケットを登録したい。

Redmineに溜まった進捗情報をDBから取り出して、進捗報告やプロジェクト報告書を自動生成したい。

RESTful APIがあれば、HTTP経由でRedmineを操作できる。
上記の要望は簡単に実現できるはず。

例えば、URLさえ投げればRedmineへチケットを登録できるから、チケット一括インポート用デスクトップアプリは簡単に作れるはず。

ソフトウェア開発に必要なリソース情報をRedmineに集めておけば、いつでも最新の進捗や品質情報を取得して、プロジェクト運営の意思決定をサポートできる。
更に、RedmineのRESTful APIを使えば、他のツールからの情報も連携したり、取り込むこともできる。
Redmineがソフトウェア開発のあらゆる情報の中継基地になるのだ。

RedmineのRESTful APIを使いこなせれば、Redmineは文字通りソフトウェア開発のERP(Enterprise Resource Plannning)になりうるはずだ。

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

2010/05/09

セーフウェア

第42回 SEA関西プロセス分科会に行って、松原友夫さんのセーフウェア、岸田さんのソフトウェア開発における美学原理の講演を聞いてきた。
感想をメモ。

【元ネタ】
第42回 SEA関西プロセス分科会のご案内

【告知】第42回SEA関西プロセス分科会「セーフウェア~システム安全とコンピュータ」: プログラマの思索

松原友夫さんは日立に長く勤められて、品質管理やソフトウェア工学を1960年代からずっと研究されている。
2005年のSEA関西の講演でも聞いたことがあり、それ以来尊敬している。
講演では声が小さくて聞き取りにくい部分もあったけれど、メモしながら色々考える所があった。

セーフウェアとは、システム安全には組織的な取り組みが必要であることを意味する著者ナンシーの造語であり、今回出版のタイトルでもある。
セーフウェアの本「セーフウェア 安全・安心なシステムとソフトウェアを目指して (IT Architects’Archive)」は、600頁にものぼるが、付録の事例が200頁近くもあり、松原友夫さんによるとこの付録に価値があると言う。

セーフウェア 安全・安心なシステムとソフトウェアを目指して (IT Architects’Archive)の主張は、いくつかある。
一つは、ハインリッヒの法則が重視するオペレーションミスから有意義なノウハウは得られないという主張。
ハインリッヒの法則は、一つの重大な事故の背景には、多数の軽い障害のオペレーションミスがあるという事実を指摘し、軽い障害のオペレーションミスを改善することの重要性を示唆した。
しかし、「ヒューマンエラーは悪い」という結論は役立たないと言う。
何故なら、最近は、コンピュータが単なるオペレーションの自動化だけでなく、運用フローそのものを自動化しているため、オペレータに原因があるという仮説が成り立たなくなっている、と言う。
大規模な例は、原子力発電所やロケット、スペースシャトル、飛行機であり、身近な例では最近は車の制御装置が例になるという。実際、トヨタのプリウスを見ても、ハンドルもブレーキも組込機器のプログラムが自動制御していて、人間が操作できる限界を超えている。

問題は、ヒューマンエラーは悪いのではなく、人間とタスクのミスマッチにあるという仮定から、システム安全について考えるべきだ、ということ。

もう一つは、コンポーネントの信頼性が高くてもシステム全体の観点では安全ではない、という主張。
つまり、信頼性の範囲と安全性の範囲は、共通部分なら信頼性が安全性に関わっているが、それ以外の部分では影響しない。
例えば、事故はコンポーネントの故障の組み合わせで起きるわけではなく、想定していた信頼性境界を超えた部分で、色んな諸条件が組み合わさって事件が起きる、と。
故に、実際の障害分析は、非常に稀な条件が原因であることが多く、その検出は難しい、ということ。

セーフウェア 安全・安心なシステムとソフトウェアを目指して (IT Architects’Archive)で出てくる安全関連の概念として、独自性があるものは、ハザード。
ハザードとは、潜在危険とも訳され、システムの環境における他の条件とともに、必然的に事故をもたらし得るシステムの状態や組み合わせの条件を指す。
上記のように、信頼性のあるコンポーネントが多数結合されて初めて障害が起きる症状は、まさにハザードが隠れているのだろう。

松原友夫さんはセーフウェアの講演資料では、アメリカで発生したトヨタ問題に対して厳しい意見を書いている。
自動車がとてつもなく複雑な怪物に化けたことに、頭で分かっていても行動が伴っていないのではないか、と。
信頼性≒安全性と考えているのが間違っている、と。
安全性はシステムの属性、と理解しているのか、と。
ドライバー(オペレータ)のせいにしたがる文化が見え隠れしている、と。
数値化出来る現象の「見える化」ばかりに注目して、定性的なハザードや起こりうる事象の遷移についての深読みが軽視されていないか、と。

松原友夫さんは、システム全体をイメージすることの重要性を言っていた。
僕は、システムと操作する人も含めた運用フローで考えなければいけない、と理解している。

上記の話を聞いて思うのは、一つは、非機能要件のようにプログラミングの分割統治という手法が通用しない分野があること。
つまり、大規模で複雑なシステムを小さなコンポーネントに分解して信頼性の高いコンポーネントを作ったとしても、それらを結合したら、レスポンスが悪い、とか、特定の環境では使い物にならない、とか、非機能要件が出てくるのと同じ現象があること。
岸田さんは、数学のトポロジーのバナッハ-タルスキーの定理を持ち出していたが、部分の総和は全体と一致しないケースも現実世界ではありえる。

そして、我々の操作をシステムで自動化した場合、運用フローも含めて考えないと、予期しない副作用が起きること。
チケット駆動開発でも、Redmineというツールの特徴を知り尽くして運用フローをも考えておかなければ、実際に運用してみてもその改善効果をさほど得られないだろう。
システム化によって、人が不要になり、権限が明確になり、ワークフローが変わり、組織構造そのものも変わるからだ。

松原友夫さんは、「ピープルウエア 第2版 - ヤル気こそプロジェクト成功の鍵」「デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか」など各種の優れた著作・翻訳があるので読んでおいて損はないと思う。

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

2010/05/07

課題管理のチケット駆動開発

従来から言われているアジャイル開発の弱点として、スケールアップと上流工程への応用があった。
チケット駆動開発を実践してみて、スケールアップはアジャイルリリーストレインとスクラムオブスクラムで解決できると思っている。
しかし、上流工程への応用はチケット駆動開発でも試行錯誤している。
考えていること、まだ疑問に思っていることをメモ。

アジャイル開発を現場に導入する場合、開発やテストの工程から導入すると成功する。
テスト駆動開発、継続的インテグレーションのようなプラクティスを部分的に導入するだけでも、開発の生産性は大きく上がる。
更に、Scrumを導入すれば、プロジェクト管理も支援できるだろう。
しかし、要件定義というシステム開発で最も揺れる工程にアジャイル開発を導入するのは上手くいっていないように思う。

アジャイル開発では要件をストーリーカードで表現して、バックログに貯蔵して管理する。
バックログに一度入れば、後はタスクカードへ落とすだけだから、開発者の本領発揮の領域だ。そして、どのイテレーションでリリースすべきかは、ユーザの希望順位とシステムの整合性の観点から、開発者主導で決めることができる。

しかし、肝心のストーリーカードをヒヤリングから収集して凝縮する作業が大変。その作業はアジャイル開発の領域というよりも、萩本さんが提唱する要求開発の領域に近い。
つまり、ユーザの現状(AsIs)を分析し、どこに不満や問題意識、課題を持っていて、どのように改善したら、あるべき姿(ToBe)になるのか、を導出しなくてはならない。
ToBeの業務がストーリーカードとしてまとめられるべきなのだが、そう簡単にはいかない。

その工程は要件定義というよりも、要件定義の前工程に当たるシステム化構想の工程。
要求されるスキルは、ビジネスモデリングや業務知識。
アジャイル開発なら、ユーザが常に開発者の身近にいるから、口頭ベースでヒヤリングしながらストーリーをまとめていけばいい。
実際はユーザの元へ出向いて、定期的にヒヤリングとレビューを繰り返しながら、ユーザの夢や不満をシステム構想へ落としていく。
その作業をアジャイル開発っぽく運用できないか、模索している。

今考えているアイデアは二つある。
一つは、顧客にヒヤリングやレビューしてもらうタイミングをイテレーションに変えてしまうこと。
つまり、定期的な訪問準備のための資料作りという作業をイテレーション単位で繰り返す。
実際、ヒヤリング前にドキュメントを準備する必要があるし、顧客によるレビューのタイミングが、作ったドキュメントを評価されるタイミングだから、顧客によるテストと見なすこともできる。
そして、そのドキュメントは、顧客のレビューやフィードバックをイテレーションのたびに反映していくから、どんどんVerUPされていく。
すなわち、システム化構想や要件定義書、RFPなどは構成管理の配下に置くべき。
このやり方は、チームに馴染みやすい。

もう一つは、課題管理にチケット駆動開発を導入すること。
例えば、ドキュメントを作っている時に顧客へ質問したい課題、顧客から宿題として受けた課題、等が当たる。
これらの課題はシステム化構想や要件定義の工程で随時発生するが、普通の開発では課題管理はExcelで行われるため、作業ステータスや最新化がうまくいっていない時が多い。
だから、顧客に同じような質問を何度も繰り返したり、同じ原因の課題が似たような課題として随時現れたりする時が多い。
特に、システムのイメージが曖昧だったり、顧客の不満や課題を理解しきれなかったり、業務知識が不足していると起きやすい。すると、顧客からの信頼も落ちてしまい、その後の設計作業に支障が出る。
実際のコンサルティングでは、課題を見つけてそれをどんどん解決していくのがお仕事ゆえに、課題管理こそが最も重要とも言える。

課題をチケットで扱えば、作業ステータスも一括管理できるし、課題をカテゴリ分けしたり、集計することもできる。
課題をチケットにした場合の利点の一つは、上記のイテレーションで課題をアサインすることで、どの課題をまず片付けるべきか、という優先順位付けを自然に行えることだ。これによって、課題の優先度に自然に意識が向かい、膨大な課題を整理するモチベーションにもなる。

もう一つの利点は、課題をチケット駆動開発のワークフローにのせることができること。
課題の担当が今、開発チームにあるのか、顧客にあるのか、その後のフローはどうあるべきか、一貫して制御できる。
そして、課題を消し込むタイミングでチケットをCloseすればいい。
チケットをCloseするタイミングで、チケットに書かれた内容をSVNの配下にあるドキュメントへ反映すれば、チケットとSVNリビジョンのトレーサビリティができるから、その後の設計や開発で、何故こんな要件や仕様があるのか、追跡できる仕組みが整うだろう。

だが、課題管理のワークフローがいまいちスッキリしない。
普通は「新規→担当者決定→問合せ中→回答済み→終了」のワークフローになるだろう。
つまり、顧客に質問(問合せ)して、回答を得たら、その内容をドキュメントに反映すればいい。
しかし、実際は、顧客もその場で回答できず保留にすることがある。
あるいは、質問したのに、逆に、システム開発の工数を少なくするために他の案を出してくれ、などと逆に宿題として突き返される時もある。
すなわち、「顧客の回答待ち」「顧客の内容を受けて再設計」「宿題として保留」という作業状態が生まれる。
その作業状態にある課題を解決するのが難しい時が多く、顧客と開発チームの間で何度もやり取りしてやっと解決される時もままある。
これらの作業状態をワークフローに入れると、結構複雑になる。
しかしやむを得ない事も多く、課題だけがどんどん増えていくのが嫌だ。

更に、課題の終了条件がスッキリしない。
普通は、課題に対して回答が得られて、その回答をドキュメントに反映すれば終わる。
あるいは、課題の回答を受けて、疑問が解けて、何も問題なかったと分かれば終わる。
しかし、課題の回答を受けて、更に別の課題や要件が出てきた場合、その課題をどうすればいいのか?
今は、課題から要件が出た場合、その要件を要件定義書へ反映あるいはストーリーカードを作成すれば、その課題は要件定義の工程では完了としていいと思っている。
しかし、他の課題が出てきた場合、本来の課題から離れているので、管理が難しい。
実際は、元々の課題をCloseし、別の課題としてチケットを作り、元々のチケットへリンクしておく運用にしている。

実際の運用では、課題管理会議でアーキテクト、上司などがそれらの課題に対しヒントを授けたり、方針を決めて、解決する方向へ持って行く。
つまり、できるだけ課題をCloseする方向へ持って行く。
結果的にはうまくいっている。
でも、課題管理のチケット駆動開発は何かしっくりしない感触を持っている。
Redmineのワークフローを厳格に運用するとうまくいかない。
課題管理会議での棚卸しするために、課題が見える化され、議論して共有できるのが利点みたいだ。

何かしっくりしない。

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

2010/05/05

Agile開発が指摘したソフトウェア開発の特徴

Redmineによるチケット駆動開発を通じて、Agile開発の利点や特徴、その弱点も少しずつ理解できてきた。
今後の進化の方向も含めて考えてみた。
以下はあくまでもラフなメモ書き。

【1】現代のSW開発マネジメントは、従来の品質・コスト・納期の三角形から、スコープ・コスト・納期の三角形に変わっている。
この事実は、現代では納期(Deliveriy)の重要性がすごく高まっていることを示唆している。
実際、3ヶ月後の景気すら分からない状況で、数年越しのプロジェクトを実施するビジネスは非常にリスキーになっているからだ。

Agile開発は、WF型開発よりも納期重視の開発スタイルと言える。
Agile開発の開発スタイルは、XPのイテレーション又はScrumのスプリントというタイムボックス単位で順次リリースしていく戦略をとる。これは、納期が2~4週間後に定期的に決まっていて、チームメンバーは数人で固定するからコストも決まっているから、システム要件と言うスコープを変化させてバランスを取ろうとする手法。

この手法はXPの計画ゲームから生まれたと認識しているが、ScrumはこのXPの計画ゲームをより厳密に運用しやすいマネジメント手法として最近は広く普及している。
Scrumの各種の技法の中で最も重要な概念の一つは、バックログという考え方だと思う。

バックログは、システム要件を書いたストーリーカードの貯蔵庫。
顧客からの要望はバックログへ一旦貯蔵し、実装方法やコストを吟味したり、ビジネス上の重要度や作業の優先度を考慮したりして、どの要望を最優先に開発するか、ふるいにかける。
そして、リリース計画あるいはスプリント計画を作る時に、開発する対象のストーリーカードをバックログから取り出して、スプリントにアサインし、スプリント期間中に開発して、リリースする。
つまり、バックログという貯蔵庫があるからこそ、要望のフィルタリング、要望のトリアージが可能になるのだ。

この発想は、リーンソフトウェア開発にある特徴「決定をできるだけ遅らせる」に似ている。
すなわち、必要になった時にバックログから要望を取り出してくればよいのであり、そうでなければ、すぐに判断を下す必要はないのだ。

バックログと言う発想は、Scrumだけでなく、TestLinkのテスト仕様にも同様の概念が見られることに注意したい。
つまり、バックログは意思決定時の取捨選択において重要な技術の一つと言える。
バックログがあるからこそ、柔軟な意思決定が可能になるのだ。

納期重視の開発スタイルが可能になった背景には、Webシステムのようにリリース作業はサーバーにデプロイするだけだったり、組込製品のソフトウェアアップデート機能のように簡単に後からソフトウェアを更新できる仕組みが普及しているからだ。
例えば、iPodや携帯電話も、製品を購入後にソフトウェアを更新できるだけでなく、ROMさえも更新できるのだ。
つまり、致命的な障害でない限り、そこそこの品質が保証されていれば、早くリリースした方がビジネス上優位に立つという現状があるのだろう。

【2】Agile開発の全ての技術、そして発想は、XPのプラクティスである小規模リリースで全てを説明できると思う。
つまり、ソフトウェア開発はVerUpしながら機能拡張していくのが最善なのだ、という主張が込められているように思う。
逆に言えば、VerUpしないソフトウェアは無価値。
どんどん機能拡張されないソフトウェアはすぐに陳腐化されてしまう。

そして、この主張を実現するには、頻繁にリリースできる技術を持つことが前提になる。
しかし、頻繁にリリースするのはとても困難なのが実情だろう。
現代のAgile開発でも、XPやScrumでさえも2~4週間の開発サイクルは必要としている。
リーンソフトウェア開発のように毎日リリースできる開発スタイルは理論上成り立つけれども、実践するのは不可能に近いのが現実だろう。

この前提条件を満たすために、テスト駆動開発、継続的インテグレーション、ソース共同所有、リファクタリング、シンプルなどのXPのプラクティスがあるのだと言える。
これらXPのプラクティスを見ると、Agile開発はソフトウェア構成管理(Software Configuration Management)を重視していると読み取れるように思う。

ソース共同所有のおかげで、誰もがいつでもソースを取得してパッチを当てることができる。
更に、テスト駆動開発によって単体テストの品質は最低限保証され、継続的インテグレーションによって、メインライン(trunk)は常時リリース可能な品質を維持できる。
これらのインフラがあるからこそ、頻繁にリリースできるのだ。そうでなければ、リリース作業の間隔を短くするのは難しいはずだ。

【3】複数の機能を常時統合するアイデアから継続的インテグレーション(CI)のプラクティスは生まれた。
システムが大規模になるほど、コンポーネントを結合する時に初めて重大な問題が現れやすい。
全てのモジュールを別々に並行して作って、進捗を早めるのは良いが、結合する時にビッグバンテストを行うと、たくさんの問題が噴出して制御できない時が多い。
だからこそ、部品(コンポーネント)を少しずつ結合して早めにビルドする方がリスクヘッジができる。
そして、その作業は自動化してしまえばいい。
自動化できれば回帰テストが可能になるから、デグレを早期に発見することもできる。

しかし、継続的インテグレーションが有効な範囲は実は限られる。
実践アジャイルテスト テスターとアジャイルチームのための実践ガイド (IT Architects’Archive ソフトウェア開発の実践)」にあるアジャイルテストの4象限では、継続的インテグレーションが有効な範囲は、第1象限の単体テストと第2象限の機能テストだけだ。
第3象限の受入テストや第4象限の負荷テストは、従来の発想だけでは、継続的インテグレーションやテスト駆動開発が有効でない。
何故なら、受入テストや負荷テストは自動化するが難しく、テスト環境が高価な上、それらのテストを実行したら数日もかかってしまう時があるからだ。

つまり、「アジャイル開発は開発環境ではとても有効だが本番環境ではその恩恵があまりない」という指摘は「ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション」において「ラストマイル問題」として既にあげられている。

だが、このラストマイル問題に対しても、最近の技術を上手に使えば解決できるだろうと思う。
本番環境が高価で作ることさえ難しいという問題は、VMWareのような仮想化技術で解決できるだろう。実際、一度環境を作れば、最近のHDDやメモリ、サーバーはとても安価なので、その仮想イメージをいくらでも複製すればいい。
そして、実際のテストが複雑で工数もかかるという問題は、ビルド管理ツールHudsonで並行ビルドすればいいと思う。つまり、本番環境の複雑なビルド作業をHudsonの複数のジョブへ分割して、並列に実行すればいい。そうすれば、見かけ上のビルド時間は半減されるはず。

最近は、RedmineやTracのようなプロジェクト管理ツールに目が行きがちだが、Hudsonにはアジャイル開発の作業の自動化に最も大きなポテンシャルを持っていると思う。
Hudsonに関する情報がネット上も少ないのは残念。

【4】アジャイル開発の構成管理に関わる技術として重要なのは、並行開発を支える構成管理技術と分散バージョン管理だ。
アジャイル開発が難しい理由の一つは、アジャイル開発は実は二つ以上のコードラインを常時保守せざるを得ない並行開発である認識がないからだろうと思う。
アジャイル開発の最重要なプラクティスである小規模リリースを実践すると、一度リリースしたコードラインを保守する作業と次のイテレーションで機能追加していく作業の2本が発生する。つまり、一度リリースしたらシステムはそれでお終いというわけではないのだ。
だから、一つのコードライン上で機能追加と障害修正を混ぜ込んでしまい、いつまて経っても品質が安定しない時が多いのだろう。

この問題に対する解決法としては、trunkとリリースブランチで分けて作業するメインラインモデルがある。つまり、リリースしたらリリースブランチ上で障害修正を施し、trunk上で機能改善していく構成管理技術を指す。
これによって、障害修正と機能改善のソースを別々に管理できるので、ソース修正の影響を限定でき、品質を確保しやすくなる。
しかし、ブランチが増えるほどマージ作業が増えて、ソースの最新化が難しくなる。

だが、分散バージョン管理を使うと更にトピックブランチという開発手法が使える。
この手法は「入門Git」で詳しく説明されているオープンソースではよく知られた構成管理技術。
マスターリポジトリから別のブランチを作り、一つのトピックに対するパッチをこのブランチ上で実験する手法だ。
SVNの場合、トピックブランチで作ったパッチは一度Diffを出力して手作業でマージするしかないが、MercurialやGitなら、リビジョンを指定してPushやPullを使えば、自動的にマージできる。
トピックブランチはメインラインモデルの発展形と言えるのはそれが理由だからだろう。

【5】これらの手法を通じて分かることは、アジャイル開発では特に移植性や保守性を重視していることだろう。
納期を重視するからこそ、少ない工数で開発せざるを得ないから、移植性や保守性という品質が特に重要視されているのだろうと思う。

既成のシステムへ機能追加するには、保守性が高くなければ、機能追加する以前にリファクタリングの工数がとてつもなく大きくなる。デグレしないために品質を保証する作業がとても大変なのだ。

更に、既に成功したシステムを基盤として派生した製品を作り出す場合、移植性が高くなければ、又一からスクラッチで開発せざるを得ないから、コストも工数も膨れ上がる。かと言って、戦略もなしにソースをコピペすると、オリジナルのシステムがVerUpした時に、最新ソースを取り込むのが難しくなり、派生した製品なのに独自発展した製品系列になってしまう。

保守性を重視する開発スタイルは、XPならリファクタリングやシンプルというプラクティスで既に実現されている。
しかし、移植性を重視する開発スタイルは、XDDPのような派生開発ソフトウェアプロダクトラインのような製品ファミリー開発のようなノウハウが必要になってくるのだろうと思う。

| | コメント (0)

2010/05/03

Mercurial チュートリアル hginit.com の和訳のリンク

ジョエルテストで有名なJoel Spolsky が書いたMercurial チュートリアル hginit.com を和訳していたサイトがあったのでリンクしておく。
MercurialがSubversionとどのように違うのか、そして、どのように使えば効果的なのか、説明がとても分かりやすい。

【元ネタ】
Mercurial チュートリアル hginit.com の和訳 (Contents) - mmitouの日記

Subversion Re-education (Subversion 再教育)

Ground up Mercurial (Mercurial の基礎)

Setting up for a Team (チームのために設定する)

Fixing Goofs (失態に備える)

Merging (マージする)

Repository Architecture (リポジトリ構成)

構成管理ツールがCVS、SVN、Mercurialへ進んだ歴史を辿ってみると、単なる履歴管理ではなく、リビジョン、チェンジセットという概念へどんどん昇華されている。
Mercurialでは、リポジトリにはチェンジセットの歴史が積み重ねられている。
つまり、パッチ(Diff)の積み重ね。
だからこそ、ブランチから中央リポジトリへPushしたり、逆にPullする処理は、パッチの取り込みをしているに過ぎない。
だからこそ、マージ作業を自動化できるし、とても高速。

分散バージョン管理の本質は、トピックブランチをいくらでも作れて、好きなだけパッチを当てられることにあると思う。
中央リポジトリがどのように発展していても、トピックブランチ上では関係ない。
それ故にこそ、新しい機能を追加して実験してみたり、バグ修正に専念することが可能になる。
つまり、トピックブランチはメインラインモデルの発展形だと言える。

TortoiseHgもつい先日、Ver1.0.2がリリースされた。
今後のMercurialの機能改善も要注意だろう。

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

スクラムオブスクラム

アジャイル開発の本質とスケールアップ 変化に強い大規模開発を成功させる14のベストプラクティス (IT Architects’ Archive)」のプラクティスの一つにスクラムオブスクラムがある。
考えたことをメモ。

【元ネタ】
「塹壕よりScrumとXP」

大規模プロジェクトで複数の開発チームがScrumをベースにアジャイル開発していたとする。
その場合に注意すべき点は何だろうか?

「アジャイル開発のスケールアップ」という従来から長く指摘され続けた問題に対し、その解決のキーワードとなる概念は、アジャイルリリーストレインとスクラムオブスクラム。

まず、「アジャイルリリーストレイン」とは、複数の電車が同時刻に発車/到着するように、複数の開発チームのスプリントを同期させること。
「塹壕よりScrumとXP」では、スプリントを同期させる理由として、各チームの編成を行うタイミングが各チームのスプリントの間であること、スプリントを同期しているから他チームとスプリント計画ミーティングを一緒に実施出来ること、管理上のオーバーヘッドを減らせることの3つを指摘している。
これは重要な指摘だ。
何故なら、「アジャイル開発の本質とスケールアップ 変化に強い大規模開発を成功させる14のベストプラクティス (IT Architects’ Archive)」にも書いているように、一つの開発チームのスプリントが遅れることによって、他のスプリントにも遅延が影響するからだ。
例えば、開発チームAがスプリントで作っているライブラリを他の開発チームが使う予定の場合、ライブラリの提供が遅れれば、他の開発チームにも悪影響を与えてしまう。
丁度、TOCの「作業が早く終わっても伝播しないが、遅延は伝播してしまう」言葉を思い出させる。

次に、「スクラムオブスクラム」とは、各チームのスクラムマスターが定期的に集まる課題管理会議。
「塹壕よりScrumとXP」では、Scrumマスタが集まる定期的なミーティングであり、自身のチームの進捗や問題点を他チームのScrumマスタと共有して議論する場だ。
この会議では、チームリードと呼ばれる人がいて、Scrumマスタの1個格上のリーダーが議論をコントロールする。
スクラムオブスクラムが必要な理由は、一つのチームで解決できない問題を全チームが共有して、解決する方向へ持って行くことだ。
例えば、他チームが作るライブラリを早く提供して欲しい、とか、自チームは技術ノウハウが少ないので他チームのメンバーにヘルプで来て欲しい、とか、自チームの課題が実は他チームのスプリントに影響する、とか、他チームと調整しなければ自チームの進捗が遅れる状況はよくある。
だから、課題管理会議を定期的に開き、その場で各チームの課題を棚卸する時が多いだろうと思う。

アジャイル開発の本質とスケールアップ 変化に強い大規模開発を成功させる14のベストプラクティス (IT Architects’ Archive)」では、大規模なアジャイル開発チームをアジャイルコンポーネントチーム・スクラムオブスクラム・ステアリングコミッティーの3つの階層に分けて編成することを推奨している。
最終的にはこのようなチーム構造になるだろうと思う。

同様の概念は、PMBOKのCCB、ITILのCABに相当する。
PMBOKのCCBは変更管理会議と呼ばれ、プロジェクトに発生する変更作業に対し、承認作業を行う委員会。プロジェクトのスコープ、成果物、WBSの変更は、公式な手続きを踏むことによって、ステークホルダー間の合意を取り、変更のトレーサビリティを容易にするために行う。
ITILのCABは変更諮問委員会と呼ばれ、ITの運用保守において、変更管理プロセスで行われ、変更要求とその対策(開発、テスト、リリース手順など)、作業計画を承認して、レビューを行う。

スクラムオブスクラムのような中間的な組織が必要になってくるのは、アジャイル開発だからというわけではなく、PMBOKでもITILでもCMMIでも同様に発生してくる問題なのだ。
システム開発でも、非機能要件と言うものが出てくるのと同じ。
小規模な開発なら無視できた非機能要件も、たくさんのコンポーネントを結合して一つの有機的なシステムとして捉えようとすると、非機能要件と言う全体最適な観点で解決しなくてはならない問題が出てくるのと同じなのだ。

「アジャイル開発のスケールアップ」には、従来のアジャイル開発では解決できなかった問題の本質がいくつか隠されているように思う。
色々考えてみたい。

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

Redmine Ver 0.9.4がリリース

5/1にRedmine Ver 0.9.4がリリースされた。
Redmineが頻繁にマイナーバージョンアップしているのは心強い。
Redmineの機能改善で気付いたことをメモ。

【元ネタ1】
Redmine - Redmine 0.9.4 bug/security fix released - Redmine

【元ネタ2】
Redmineのプロジェクト親子間でコミットログを連携 - プチ技術メモ

Redmine - Defect #4674: Sub-project repository commits not displayed on parent project issues - Redmine

上記は、子プロジェクトにあるチケットNoが親プロジェクトのリポジトリのコミットログへ反映されるという機能で、Ver0.9.2で既に反映されている。
Ver0.9からプロジェクトの階層が無制限になったので、プロジェクト構造をツリー構造に複雑に作ることができる。
しかし、親子関係のプロジェクトに対し、親プロジェクトのコミットログと子プロジェクトのチケットをリンクさせることは今までできなかった。
上記の機能改善は見た目は小さいが、使いやすいユーザインターフェイスを実現してくれる重要な機能と考える。

【元ネタ3】
Twitter / yusuke-kokubo: #redmine この機能がとても欲しい。チケットの親子関係なんてどうでもよいからこっちをなんとかして欲しい。

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

上記は、1プロジェクトで複数のリポジトリを表示する機能。
Redmineの元来の設計思想は1プロジェクト1リポジトリであり、普通はそれで運用できるが、ブランチをたくさん作って開発している時、複数のブランチを1プロジェクトに紐づけたい時がある。
しかしながら、現時点では、Redmineのロードマップに入っていないので、実現される可能性は今はないみたい。
できれば、yusuke-kokuboさんがつぶやいているように、マルチリポジトリ機能も実現して欲しいと思う。

【元ネタ4】
Ver0.9からチケットのTarget versionにカスタムフィールド編集機能が追加されている。
バージョンに各種の属性を追加したいときに役立つ。

Twitter / yusuke-kokubo: #redmine trunk 念願のTarget versionへのカスタムフィールドが実装された。

Redmine - Feature #4219: Allow custom fields for Versions - Redmine

【元ネタ5】
チケットの親子関係を実現するSubtasking機能については、既に書いた。
Subtasking機能はtrunkに取り込まれている。
要件管理にどのように使えるか、楽しみ。

Redmine - What's new in trunk: Subtasking - Redmine

ついにRedmineのtrunkにSubtaking がコミットされた!: プログラマの思索

Redmineのsubtaskingを使った画面: プログラマの思索

Redmine のsubtaskingを使った画面part2: プログラマの思索

【元ネタ6】
下記は、チケットのカスタムフィールドのクエリー機能によってレポートを生成できるようにする機能が要望としてあげられている。
Ver1.0がリリース予定バージョンになっている。

Twitter / yusuke-kokubo: #redmine カスタムフィールドをベースにしたレポート機能。これは興味深い。

Redmine - Feature #4249: Generate report by custom fields on a project - Redmine

例えば、「Operating System」というカスタムフィールドを作って「'Operating System' = 'Linux'」でフィルタリングして出力できるといいな、というコメントもある。
この機能が実現されれば、自分の好きなチケットを集計してCSV出力した後、Excel上で好きなように加工すればいい。
マネージャにとって有り難い機能だろう。

【元ネタ7】
Haruさんによれば、Redmineのtrunkには、Wikiのサイドバーを追加・編集する機能が取り込まれたらしい。
Redmineの頻繁な機能改善によって、有志が作られたプラグインの機能の一部もどんどんtrunkへメイン機能として取り込まれているようだ。
(訂正:Hudsonプラグインはnobiinu_andoさんが作られたとのこと)

Haru's blog: Redmine のwikiでサイドバーの編集が可能になった。

Redmine - リビジョン 3632 – Redmine

Redmineの機能改善は、チケット駆動開発やアジャイル開発を容易にしてくれる機能が含まれているので、こまめに見ていきたい。

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

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