« 2012年11月 | トップページ | 2013年1月 »

2012年12月

2012/12/29

チケット駆動開発が紹介されている書籍

チケット駆動開発が紹介されている書籍を見つけたのでメモ。
他の人がチケット駆動開発をどんなコンテキストで理解して使っているのか、に興味がある。


僕が立ち読みして「チケット駆動開発」という概念を解説している部分を見つけた本は、「アジャイル概論」と「本当に使える開発プロセス」の2冊。

アジャイル概論」では、アジャイル開発における開発環境の一部として、BTS/ITSを使ってバージョン管理ツールと連携する部分でチケット駆動開発を紹介されている。(150頁)
バージョン管理がアジャイル開発で役立つ利点がいくつかあげられている。
それは「コードの共同所有」のプラクティスを実現すること、進化的・探索的な開発をサポートすること、そして、チケット駆動と相性が良く開発のリズムを保つ効果があること。
最後の点の説明部分では、タスクをチケットを粛々と消化していくことで開発のリズムを保つだけでなく、バージョン管理リポジトリと連携することでトレーサビリティが実現されることも付け加えられている。

本当に使える開発プロセス」では、受入テスト駆動開発(ATDD:Acceptance Test Driven Development)の文脈で、チケット駆動でプロジェクト管理する方法として紹介されている。(70~77頁)
チケット駆動開発の3つの原則として「チケットをプロジェクトの情報の中心とする」「チケットによる作業の割り振りと進捗管理を行う」「チケット無しのコミットは禁止とする」があげられている。
この文脈では、プロジェクト管理をサポートする意味として使われているみたい。

いずれの2冊の本でも、チケット駆動開発がアジャイル開発のプロジェクト管理を補完する事例の一つとして紹介されているのが興味深い。

また、Redmine、Tracを使った「定量的プロジェクト管理ツール」の紹介 - ウィリアムのいたずらの開発日記では、IPAが公開している定量的プロジェクト管理ツールでも、RedmineやTracをベースとして、チケット駆動によってアジャイル開発へ適用しようとする手法として紹介されている。

IPAは、チケット駆動開発が当たり前と思ってるってこと? - ウィリアムのいたずらの開発日記

そういう事例を見ると、チケット駆動開発をアジャイル開発の中の一つの手法として適用しようと試みている人が多いのかな、と思ったりする。
今後も集めてみる。

【追記】
こういう文脈もあるそうです。

Twitter / sakaba37: 「本当に使える開発プロセス 」はテスト関連技術やCIを含むALMの文脈での紹介です。システム企画、要件定義、基本設計が前の章にあるので、アジャイルとは呼びにくいですね。/ RT @akipii: チケット駆動開発が紹介されている書籍 http://bit.ly/ToYKnR

| | コメント (0)

RedmineでCVS連携する時の注意点

RedmineでCVS連携する時の注意点が書かれていたのでメモ。

リポジトリの更新タスクが複数回実行されてしまう。 - Redmine Users (japanese) | Google グループ

2012年の今、CVSを最初から使い始めるプロジェクトはもうないだろうと思う。
しかし、5~10年以上の前からバージョン管理していたリポジトリがCVSなのでそのまま引き継いでいる、という現場はまだあるかもしれない。

RedmineのSCM連携の対象は、SVNやGit、MercurialだけでなくCVSも使える。
僕もCVSを連携して、CVSリポジトリ参照にRedmineを使った時もある。
SVNの時と違和感はない。

しかし、上記によれば、以下の問題があるらしい。

【問題(引用)】
バージョン管理システムとの連携をhttp://Redmineサーバ名/sys/fetch_changesets?key=APIキー
を使用して行っています。
Subversionだけを連携している時は長くても1~2分程度で終わっていたのですが、CVSとの連携を設定したところ、連携に数時間かかるように なってしまいました。
やむなく夜中から1回走るように設定したのですが、連携自体は行われているのにタスクの状態を見ると同じ処理が複数回実行されるようになってしまいました。
(朝の10時とかになっても同じ連携処理が数タスク同時に実行されています)
詳しく調べてみると、どうも15分おきに処理が呼び出されているようです。
CVSの連携自体が遅いのはしょうがないとしても、この何回も呼び出されるのは何とかしたいと思いいろいろ調査しているのですが、情報が見つからずに困っていま す。
現状だと昼間に実行するとCVSの接続とredmineサーバのタスクを食いつぶして使い物にならなくなってしまいます。

Redmineコミッタの丸山さんが、この問題に対して丁寧に解説されている。

【回答(引用)】
結論から言うと、「CVSはやめておいた方が良い」です。
お勧めとしては、「Mercurialにコンバートした方が良い」です。
http://mercurial.selenic.com/wiki/ConvertExtension#Converting_from_CVS
Gitは、「複数回並行して処理」が、やや難があります。

【理由(引用)】
SubversionとMercurialは連番のリビジョン番号があります。
changesetsテーブルのrevisionカラムにsvn/hgのリビジョン番号が入ります。
次回の取り込みでは、DBに保存されているリビジョン番号+1のものから 順番に取り込まれます。
revisionカラムはユニーク制約があるので、svn/hgの場合、同時に実行されても後からのものは制約違反になるので、後のものの保存が失敗するだけです。
CVSについては、リビジョン番号に相当するものがないので、Redmine側で擬似的に作成しています。
おそらく、この処理が失敗しているものと思います。
http://www.redmine.org/projects/redmine/repository/entry/tags/2.2.0/a...
今見たらトランザクションの範囲が大きいので、全く保存されていないと思われます。
svn/hgの場合は、1リビジョン毎にトランザクションがかかっているので、全く保存されないということはありません。
http://www.redmine.org/projects/redmine/repository/entry/tags/2.2.0/a...
Gitの場合、リビジョン番号に相当するものがないので、かなり複雑なことをしています。
Redmine1.4で実装が変わったので、「複数回並行して処理」に対してはsvn/hgに対しては弱いです。

丸山さんがGitよりもMercurialを推薦する理由の一つは、Redmineが連携対象のSCMのリビジョン番号で管理しているため、SVNやMercurialの方がRedmineと相性がいいからだろう。

個人的には、CVSをSVNへ移行する方法が今後の運用のハードルが低いのではないかと思っている。
cvs2svnというツールを使えば、そう難しくはない。
Windows上でもコンバート可能だし。

cvs2svn

既存の CVS リポジトリから Subversion への移行

| | コメント (0)

アーキテクチャに対応する日本語がない

「アーキテクチャに対応する日本語がない」事実に関するラフなメモ書き。

【元ネタ】
Twitter / akipii: 昨日の話で驚いたのはアーキテクチャに対応する日本語がないこと。元は建築の様式でパルテノン様式とか高床式とかのイメージらしい。ではソフトウェアは何に相当するか?

Twitter / akiyama924: @akipii 方式設計がアーキテクチャ設計に対応する日本語かも。

Twitter / akipii: 研修ではアーキテクチャの例としてOSI参照モデルやMVCモデルがあげられました実現可能なシステム設計でしょうか @akiyama924 方式設計がアーキテクチャ設計に対応する日本語かも。

Twitter / akiyama924: @akipii OSI参照モデル、、、確かにアーキテクチャといえばアーキテクチャか。MVCは、もう少し設計よりのデザインパターンですね。アーキテクチャは要求と設計をつなぐものというふうに捉えています(特に前半の方が大切かと)。

元々、アーキテクチャは建築業界における様式の概念らしい。
ソフトウェア業界でこの言葉が使われ始めたのは、さほど古くない。
だが、欧米人がアーキテクチャという言葉で使い始めた意味、新しい価値について、日本語に相当する言葉がない。
だから、日本人は輸入された言葉をそのまま使わざるをえない。
アーキテクチャと設計は違う。
秋山さんが言われるように、アーキテクチャは方式設計と訳す方がいい。

「ITアーキテクト」という職種はITSSスキルレベル4でも定義されているし、最近の日本でも流布されているが、まだまだ胡散臭い職種と思われがち。
アーキテクトはどんな仕事をするのか、というイメージが湧かないからだ。

僕がアーキテクトの職種で一番分かりやすいと思った説明は、ソフトウェアプロダクトラインではアーキテクトは顧客(プロダクトオーナー)、開発者(チーム、プログラマ)、会社の上司(プロジェクトオーナー)の間でシステムを説明する役割を担うというもの。
システムを、開発者はプログラムの構造で捉えるし、顧客は自分たちの業務を自動化したり効率化する仕組みと認識しているし、上司はシステム開発の案件からどれだけ売上やコストが計上されるか、に興味を持つ。
それぞれの立場でシステムに対する認識が全く違うのだ。
アーキテクトはシステムを翻訳する役割を担う調停者である、と。

そのボタンを押したら何が起きるのですか?~アーキテクチャは利害関係者のコミュニケーション手段: プログラマの思索

オンサイト顧客が暗示したもの~プロダクトオーナーとアーキテクトの役割: プログラマの思索

今自分が考えていることは、アーキテクチャを業務システムの観点で捉えるために、DOAを用いてアーキテクチャを幾つかの観点で明確にして、現代のシステム開発に適用できるようにすること。
DOAのように、日本のソフトウェア開発は意外にも歴史があるにもかかわらず、アーキテクチャを明確に確立しておらず、開発現場ですぐに適用できるような知識体系にしていない。
だから、開発現場で同じような失敗を何度も繰り返しているし、顧客の言葉でシステムを説明できる道具をSEやPGは持っていない。
個人的には、アーキテクチャはパターン言語で表現した方が、開発現場で再利用しやすいと思っている。

また、アーキテクチャを重視する人達はWF型開発に囚われ過ぎで、昨今のアジャイル開発の潮流に乗り遅れている。
アーキテクチャとアジャイル開発は2つとも融合できるし、お互いに補完し合える。
クラウドやチケット駆動開発のような開発環境の整備のおかげで、アジャイル開発がアーキテクチャ設計をより実践しやすくしている背景もある。
だが、開発プロセスに囚われないアーキテクチャの本質というものもあるはず。
その辺りを今後まとめていく。

| | コメント (0)

同期・非同期処理に関するアーキテクチャ

同期・非同期処理に関するアーキテクチャで良い記事があったのでメモ。

【元ネタ】
ITシステムで見られるシーケンス データベースコンサルタントのノウハウちょい見せ

ダメな設計は、シーケンスが階段状ではなく、一つのオブジェクトに全ての処理を任せる「責任が肥大化したオブジェクト」がある。
特に初心者が、設計を考えずにいきなりプログラムを書いたり、システムを作ってしまう場合によく見られる。
この設計では、スパゲティコードになりやすく、一つのプログラムが千行を超えて保守しにくかったり、スケールアップや性能要件で壁にぶつかる時が多いだろう。

Webシステムは基本は、上記記事の「三角形」シーケンスに相当する。
メッセージを階段の図のように渡して、処理の結果を受け取るイメージ。
オブジェクト指向の権限移譲では、この設計手法がよく使われる。
MVC2モデルと呼ばれるように、Webシステムはオブジェクト指向ととても相性が良い。

但し、「三角形」シーケンスは同期を取るのに優れているが、リクエストが返ってくるまでに3秒以上かかるような場合では、タイムアウトが頻発したり、性能改善しにくかったりする。
つまり、同期処理の信頼性や性能に問題が出る場合に、「中継方式のシーケンス」のように、非同期処理を混ぜたアーキテクチャ設計で実現したりする場合が多い。

「中継方式のシーケンス」を使う非同期パターンとしては、幾つかのケースがある。
例えば、ユーザに画面から膨大なデータの帳票出力(例えばPDF)をキックして、バックグラウンドで帳票を生成し、後でユーザが帳票を取り出すケース。
あるいは、月末にユーザが締め処理のボタンを押したら、翌朝に勘定元帳、損益計算書、貸借対照表などの帳票が出力されるケース。
あるいは、ユーザが株を注文したら、しばらくした後にその取引が決済されるケース。
あるいは、ユーザがクレジットカード決済した後、オーソリ認証や与信チェックが行われて、カード決済の実行可否を回答するケース、など。

非同期処理は基本はバッチ処理になる場合が多いと思う。
何故なら、大量のデータを一括処理するには、リアルタイム処理よりもバッチ処理で一気に実施した方が信頼性が高まる場合が多いから。

しかし、非同期処理の欠点が上記の記事に書かれている。

(引用開始)
落とし穴1

普段は問題ないものの、ある時、障害になり、DBにリクエストが溜まりすぎて、性能不足(たまったものが掃けるのに時間がかかる)になるケースがあります。

落とし穴2

中継のためにデータを取り出す処理があります。そのDBを検索する際には、「残っているもの全部」という取りだし方が多くなります。テーブルをフルスキャンしてしまうため、一時的にデータが溜まった後は、再編成しないと性能が悪くなることがあります(OracleでいうHWM(ハイウォータマーク)が上がってしまい、スキャンが長くなった状態です)。インデックスで検索するようにしておくか、再編成の手段を用意しておきましょう。

落とし穴3

中継のためにデータを取り出す処理は、定期的にポーリングするプログラムが通常です。数分や数秒といった間隔であれば問題ないかもしれませんが、たまに、「早く処理したいので、数msecが要件です」と言われることがあります。そのような処理では、DBへの問い合わせ回数も多くなり、CPU使用率が高騰しやすくなりますし、性能要件を達成するのも難しいかもしれません。
これイベント処理(インメモリDBやCEP:Complex Event Processingと呼ばれる製品が得意)が最適なケースがあります。
(引用終了)

非同期処理では、大量データを一括処理するために、事前にデータを再編成(DBMSならカタログ化)しておいたり、ポーリングで定期的に実行できるようにインメモリDBやmemcachedのようなキャッシュメモリを使うとか、色々な代替手法を容易しておく必要がある。

また、非同期処理の最大の落とし穴は、障害発生時のロールバック処理だろうと思う。
数十万~数千万件のデータを一括コミットしようとして失敗した時、ロールバックしようとすると、ロールバック処理そのものにも時間がかかって、DBMSがハングアウトしてしまう危険もある。
だから、例えば1千件起きにコミットして、途中で障害が発生したら途中までのコミット結果は保持しておき、復帰する時は途中のコミット結果から実行し直すような仕掛け(とあるシステム開発では、リカバリーコミット、リカバリーロールバックなどと呼んでいた)を作っておく必要がある。
つまり、非同期処理のトランザクションの信頼性を保持するフレームワークを別途実装しておくコストも必要。

アーキテクチャ設計では、機能要件よりも非機能要件の方が重要。
すなわち、信頼性や性能などの非機能要件や制約がアーキテクチャに強固な枠をはめる。

アーキテクチャではトレードオフは避けられない: プログラマの思索に書いたけれども、インフラ構築では、品質特性のシナリオの観点でアーキテクチャ設計すべきだと思う。
その意味では、アーキテクチャ設計はプログラミングとは別の観点が必要。

業務フローで非同期キューが現れる理由: プログラマの思索

非同期処理のアーキテクチャとは: プログラマの思索

この辺りも今後もまとめてみる。

| | コメント (0)

2012/12/25

Atlassian製品による「No Ticket, No fork!」

Atlassian製品による「No Ticket, No fork!」に関する記事をリンクしておく。

GreenHopper を使用した Bamboo と Bitbucket の自動化 | Atlassian Japan

(引用開始)
率直に言って、チームが 課題ごとに開発ブランチを作成する慣習 を採用 (または検討) していない限り、上記の手法にこだわる必要はありません。 この手法には 3 つの意義があります。1 つ目として、ブランチ作成、マスターへの最終マージ、およびブランチの削除が自動化されます。これによって課題の実装にかかる時間が何時間も短縮されるというものではありません。しかし、開発者の作業項目からいくつかの管理タスクを省いてくれます。また、ストーリー ブランチの実践も促します (チームがそうすると決めた場合)。しかも、しつこくメールをしたり、井戸端会議で愚痴を言ったり、チーム ミーティングをしたりすることなく、洗練されたやり方でそれが実施されます。3 つ目として、これらのブランチに対する命名規則が自動化されます。チームのレポジトリ内のブランチを見るときに格段に見分けやすくなります。
(引用終了)

課題・障害・タスクのチケット単位にブランチを派生し、更新して、ブランチをmasterへマージする時にチケットも同時にCloseする方法が公開されている。
この手法は、チケットをトピックブランチ(ストーリーブランチ)とみなした場合によく使われるだろう。

この手法の利点は上記には3つ挙げられている。

(1)ブランチ作成、マスターへの最終マージ、ブランチ削除を自動化
(2)メンバーにチケット単位にストーリーブランチを作ることを促す
(3)ブランチに対する命名規則が自動化される

目を惹くのは(2)におけるチームへの影響だ。
バグ修正や機能改善、リファクタリングなど、開発者個人の作業は必ずブランチ上で更新され、masterへ最終マージされる運用が自然に促される。
いや、むしろ強制されるといって良い。
その運用によって、masterへのマージ時にコードレビューするタイミングが生まれたり、ブランチ上で試行錯誤する空間を得られることで自由に開発できる、などの利点が生まれる。

ツールがチームにプロセス改善を促す良い事例の一つだと思う。

| | コメント (0)

2012/12/24

RedmineにおけるEVMの考え方

Redmine.JP Blogで>Redmine 2.2の新機能が紹介されていたのでメモ。

Redmine 2.2新機能紹介: 休業日の設定 | Redmine.JP Blog

Redmine 2.2新機能紹介: プロジェクトをまたいで子チケットを作成 | Redmine.JP Blog

Redmine 2.2のCHANGELOG (新機能のみ・日本語訳付き) | Redmine.JP Blog

【1】「休業日の設定。休業日は後続するチケットの開始日の再計算とガントチャートの表示で使われる」「先行するチケットの期日を前倒しした際に後続するチケットの開始日・期日も前倒し」などの機能改善を見ると、最近のVerUpが進捗管理の機能改善に力を入れているように思える。

【2】チケットの属性には開始日・期日・進捗率があるので、ガントチャートというビューをすぐに表示できるし、EVMプラグインを入れれば、EVMでコスト管理も可能。

EVM - Plugins - Redmine

imaginary-cloud/redmine_evm ・ GitHub

EVMプラグインでは、PV・AV・EVは以下のように定義されているらしい。

PV=チケットの予定工数
AC=チケットの実績工数の和
EV=チケットの予定工数 * 進捗率(%)

EVの解釈は、例えば、現時点のチケットが次のように考えると分かりやすい。

チケットの予定工数=10人日
チケットの実績工数の和=8人日
チケットの進捗率=60%

この例では、以下の計算になる。

PV=10人日
AC=8人日
EV=6人日(=10MD * 60%)

つまり、本来の予定(PV)では、10人かかるタスクに8人分のコスト(AC)が既に消費されているのに、成果物(出来高:EV)は6人分のタスクの量でしか達成されていない。
本来は、8人分のコストが計上されているなら、成果物も8人分の分量ができて然るべきなのに、6人分しかできていないから、効率が悪い。
この時の「効率」という概念がCPIであり、CPI=EV/AC で計算される。
つまり、CPI=6/8=0.75ゆえに、1よりも小さいからコストパフォーマンスが悪い。
CPIは開発能率、生産能力に相当するので、定義は違うけれどもアジャイル開発のVelocityに似ている。

【3】EVMプラグインのスクリーンショットにあるように、EVMプラグインはSPIやCPIもデフォルト表示されるので、プロジェクトの進捗でどれだけ工数を浪費しているのか、リアルタイムに観察することができる。
できれば、Redmine metrics pluginのようにEVMをマイルストーン単位にバッチ処理で集計できれば、マネージャの意に沿うようになるだろう。

redmine_evm/screenshot.png at master · imaginary-cloud/redmine_evm · GitHub

Redmine_evm

スクリーンショットの例では3つある。
Test_Redmine_Evmバージョンでは、PVがかなり大きく、EVがACを上回っているものの、PVよりもはるかに小さい。
CPI=1.2なので、1人投入して1.2人分の仕事はしているが、SPI=0.33なので、スケジュールはかなり遅れている。
普通は、他のプロジェクトに人員が取られて、予定通りにメンバーをアサインできず、少ない人数で進めている状況と思われる。
計画通りにメンバーをアサインできていないのだから、マネージャは組織上の上司に訴えかけてプロジェクトを打破する必要がある。

test_version_1バージョンでは、当初はPV=0の時期にACが発生していて、その後、ACは増えていないのにEVが増えている。
色々解釈できるが、当初の計画よりも先にメンバーがタスクを消化しようとしていたが、途中で実績工数を更新せずに進捗率だけ更新していると思われる。
マネージャはチーム状況をヒヤリングし、正しく実績入力するように指導するだろうと思う。

test_version_2バージョンでは、ACが一時期PVを追い越すほど高止まりしていて、EVが停滞している。
CPIもSPIも1よりもはるかに小さい。
普通は、メンバーが残業や休日出勤でリカバリーしようとしたが、本来想定している出来高(アウトプット)が出せていない状況に相当する。
多分デスマーチプロジェクトになっているのだろう。

【3】RedmineからPMBOKのEVMを計測する方法: プログラマの思索にも書いたけれども、EVの考え方には、WF型開発とアジャイル開発の2種類がある。
EVを進捗率で考える方法がWF型開発、EVをチケットが完了したかどうかで決める考え方がアジャイル開発。
つまり、仕掛中の成果物をEVという出来高に含めるかどうかで、EVの考え方が変わってくる。

マネージャの仕事の殆どは予算管理やコスト管理なので、EVの基準を定めることはまさにプロジェクトの成功基準を定めることと同じ。

EVMに限らず、先行・後行、クリティカルパスの計算なども、チケットの属性という入力さえあれば実装可能。
RedmineはRailsで作られているのだから、Rubyでアジャイルに開発してしまえばいいだけのことだ。

| | コメント (0)

2012/12/22

ドメイン特化言語の感想~ドメイン専門家とプログラマが会話するための環境作り

ファウラー著「ドメイン特化言語」を読んだ。
やはり、ファウラーはIT業界の未来について、いつも一歩先のことをよく考えている。
自分が理解できたこと、感想をラフなメモ書き。


【参考】
ごあいさつ - DSL翻訳者の悩み

48章(DecisionTable)のクラス図 - DSL翻訳者の悩み

41章(Dynamic Reception)のクラス図 - DSL翻訳者の悩み

【1】ステートマシンの例からDSLの意義を考える

第1章で、ステートマシンの例を持ちだして、DSLが何故必要なのかを説明してくれている。
自分が本を出版してみて分かったことは、本の最初で、この本で言いたいことは何なのか、を明示することが重要。
普通は最初に、具体例や問題を提示して、本で言いたい主張を概略的に述べると、読者を引き込みやすい。

ステートマシンの例では、Javaで実装したステートマシンを各インスタンスごとに振る舞いを変えるために、XMLやRake構文を使う方法が示されている。

XMLを使う場合は、設定ファイルみたいなもので、その利点は、実行時に動的に振る舞いを変えることができるのでコンパイル不要になること。
この場合、XMLは外部DSLになる。

XMLは基本は外部DSLと見なして良い。
外部DSLで最も成功した例はAnt。
外部DSLでは、DSLスクリプト、パーサー、セマンティックモデルの3つに分けて実装される。

Rakeを使う場合は、設定ファイルのように見えるが、Rubyで書かれているので実行可能なスクリプトでもある。
この場合、Rakeは内部DSLになる。

内部DSLはAPIとは違う。「流れるようなインターフェイス」と呼ばれるらしいが、具体的な構文はメソッドチェインと同じ。
内部DSLが脚光を浴びたのは、Railsの出現であり、Webフレームワークを内部DSLで一種のモデルとして表現したことにあると思う。
内部DSLではセマンティックモデルとパーサーが混じっているので、セマンティックモデルと式ビルダーという形式で分けて表現すると良いらしい。

内部DSLの例は、GroovyやJRuby、Lispなど。
Lispは昔からマクロという形式で表現していた。
内部DSLはLispの先祖返りとも言えるかもしれない。

この例で重要な点は、DSLがステートマシンのモデルを表現する事に使われていること。
ここから、DSLとモデルの密接な関係が出てくる。

【2】DSLの特徴

DSLの一番の特徴はチューリング完全でないこと。
チューリング完全でないという意味は、命令形の制御構文を持たないことを意味しているらしい。
実際、本来のAntはタスク志向なので、If文やFor文は使えない。
とはいえ、AntはIf文やFor文もライブラリを拡張することで使えるようになってしまった。
その点はファウラーは批判的で、DSLは汎用言語化すべきでなく、問題領域の表現に注力すべきと言っている。

ファウラーはモデルをドメインモデルとセマンティックモデルで区別している。
ドメインモデルは振る舞いを持つ動的モデル。
ドメイン駆動開発(DDD)では、ドメインモデルの構築が基本方針になっている。

セマンティックモデルは基本はデータしか持たない静的なモデル。
外部DSLならXMLの設定ファイルがセマンティックモデルになる。
内部DSLでは、セマンティックモデルに実行可能な振る舞いも混じっている。

セマンティックモデルが重要な理由は、プログラマがDSLで表現できることと、そのDSLがユビキタス言語へ進化する可能性があるkと。
つまり、ドメイン専門家の言葉でセマンティックモデルを表現することで、ドメイン専門家とプログラマが有意義な会話ができる。
すると、プログラムの実装方法を表現する事よりも、プログラムの意図を表現することへ注力できるようになる。

セマンティックモデルの使い道の一つは、ドメイン専門家によるモデルの理解だけでなく、そのモデルからコード生成できる点もある。
Lispは昔からマクロでやっていたし、RailsはActiveRecordという概念でORマッピングしている。
ドメイン特化言語」では、Cobolのコピー句からJavaソースを生成するDSLを作ったという例が記載されていた。
この例の意味は、Cobolのコピー句はストアドプロシージャのカーソルのようにレコードを定義しているので、そこからそのレコードに操作するJavaライブラリを作ったのではないか、と想像する。

セマンティックモデルが普通はXMLのような静的モデルで表現される場合、XMLというテキストをパースしてモデルへ変換する仕組みが必要になる。
つまり、パースして抽象構文木を作る仕組みが必要なため、チョムスキー階層とか、レキサーとか、コンパイルに関する知識が必要になる。
ドメイン特化言語」のあとがきでは、この本を翻訳するために、コンパイルを勉強するなら誰もが知っているドラゴンブックを読み直したという文章があり、すごいなと思う。

DSLは奥が深い。

【3】DSLの動物園

DSLの抽象的な話を読むよりも、やはり具体例を見る方が分かりやすい。
ドメイン特化言語」では、幾つかのDSLが紹介されている。

Graphizは、DOT言語で書かれる外部DSL。
ネットワーク図のような絵を出力してくれる。
モデルの可視化に役立つ。

CSSもDSLと見なすのは驚いた。
実際、WebのUIの構造を表現している。
重要な点は、CSSを扱う人は自分をプログラマーではなくWebデザイナーと呼んでいること。
つまり、DSLを扱えるのにプログラマーではないWebの専門家であると自称しているわけだ。

HQLはHibernateで使われているSQLライクな内部DSL。
普通のSQLとは違う。
ORマッピングの一つ。

FITは表形式のテストフレームワークをサポートする内部DSL。
ユーザが、テストの条件をデシジョンテーブルで表現したりすることで、受入テストが理解しやすくなる。

もう一つ重要な点は、FITがテスト志向なDSLであること。
DSLの使い道は、モデルの表現やコード生成だけでなく、テストをサポートするライブラリとして使う方法もある。
ユーザというドメイン専門家がテストを理解できる点が重要。
Cucumberのような最近流行している振る舞い駆動開発(BDD)も、内部DSLを使った一つの例とみなせるだろう。

makeやAntなどのビルドスクリプトもDSL。
Antは外部DSLだし、Rakeは内部DSL。
これらは、タスク指向、成果物指向とも言われる。
タスク指向の意味は、処理をタスクと見なして、タスクの流れと見なすこと。
例えば、ソースのチェックアウト→コンパイル→パッケージング→デプロイという流れでタスクを分割し、タスクの順序を定める。
これは、バッチ設計のジョブネット図、ジョブフロー図の考え方に近い。
つまり、一連のタスクが条件分岐したり、合流したり、あるタイミングで起動するなどの制御を入れるなどの手法が必要なことを示唆している。
今なら、Antなどのビルドスクリプトで複雑なビルド処理や自動テストを分割しておき、Jenkinsでタイミングを制御したり、処理の流れを定めるなどのやり方になるだろう。

【5】全体を通しての感想

DSLの使い道は、モデルの表現、受入テスト、ビルド処理があげられる。
モデラーはDLSでモデルを表現して、コードを自動生成することで、モデル駆動開発を目指す人が多いが、そのやり方は既に失敗していると思う。
むしろ、DSLを通じて、ユーザとプログラマが会話できる環境を作る方へ注力した方が有意義なのだろう。

ドメイン特化言語」で面白いのは、ExcelやAccessがDSLに似た例としてあげられていること。
Excelは、表形式でデータを扱い、VBAのようなマクロがあり、一つの汎用言語である。
Excelを使っている人は、自分はプログラマではないと思っているけれど、実際は、彼らが欲している用途に応じてモデルを作り、Excel内で計算している。
でも、Excelは表というデータが目立ちすぎて、計算方法をプログラムという構造まで抽象化できない弱点がある。
Accessも同様だ。

このようなツールは昔のCaseツールを連想させる。
Caseツールはモデルを作るためのツールとして販売されていたが、結局廃れてしまった。
現在の流れを見れば、DSLをプログラムの一部として書いて、モデルをどんどん改良していくスタイルの方がいいだろうと思う。

僕は「ドメイン特化言語」の前半しか読んでなくて、後半のパターン集はさほど読んでいない。
厚さが600ページもあるので盛り沢山。
概略だけ読んでも面白いと思う。

| | コメント (0)

Redmine .Net APIであるredmine-net-api

Redmine .Net APIがあるらしいのでリンクしておく。

【元ネタ】
Rest api with csharp - Redmine

redmine-net-api - Redmine .Net API - Google Project Hosting

Twitter / akipii:後で読む。発想は面白い RT @Kokawa_Takashi: Redmine .Net API libraryをUnity上で動かす。JSON形式は怪しいがXMLでは普通に動くと。 http://www.redmine.org/projects/redmine/wiki/Rest_api_with_csharp … #unity_meetup

Windowsでデスクトップアプリを作るなら、このAPIがあればRedmineのチケット情報を表示したり更新することが簡単にできるだろう。
マネージャはWindows上でExcel使いが多いので、チケット集計するクライアントアプリがあれば喜ばれるかもしれない。

他にも、JavaのAPIであるredmine-java-apiもあるみたい。

Rest api with java - Redmine

taskadapter/redmine-java-api ・ GitHub

redmine-java-api: プログラマの思索

| | コメント (0)

2012/12/16

現代のソフトウェア開発で構成管理が重要になった理由

プロジェクト管理ツールBacklogを作っているヌーラボ社の開発者が書いた記事「現代のソフトウェア/サービス開発で構成管理が重要になった理由」がとても分かりやすいのでメモ。
構成管理がソフトウェア開発のサプライチェーンの一部になってきたのが原因ではないかと思った。
ラフな感想。

【元ネタ】
DevOps時代の開発者ための構成管理入門(1):現代のソフトウェア/サービス開発で構成管理が重要になった5つの理由 (1/2) - @IT

DevOps時代の開発者ための構成管理入門(1):現代のソフトウェア/サービス開発で構成管理が重要になった5つの理由 (2/2) - @IT

【1】記事では、構成管理が重要性を増してきた理由として以下が挙げられている。

【1】簡単になってきたプログラミング
【2】クラウド(PaaS)の登場
【3】さまざまな用途のツールの進化
【4】ソフトウェアビジネスの移り変わり―アジャイルへのシフト
【5】リーン型の開発プロセスの重要性の高まり

RedmineやJenkinsやGitなどのツールの隆盛、クラウドの普及、アジャイル開発への注目度の高まりなどの昨今の流れを見ると、ソフトウェア開発をもっと効率化しようとする流れ、つまり、リーンソフトウェア開発の流れが背景にあるように思う。

リーンソフトウェア開発の発端は、トヨタ生産方式(TPS)にあると言われる。
僕はTPSはよく知らない。
でも、その発想の根底には、「いかに効率良く在庫管理すべきか」という命題がある気がする。

【2】在庫は、売れる前の製品や商品を倉庫に保管しておくのだから、在庫回転率が悪いほど、資産価値は劣化する。
在庫問題の構造を把握するために : タイム・コンサルタントの日誌からにもあるように、在庫があると在庫金利が発生して、余計にコストがかかる。
金利がかかるということは、住宅ローンや消費者金融のように、借金にプラスアルファのコストがかかっているということを意味している。

かと言って、在庫がゼロであると、売りたい時、本来売るべき時に手元に製品や商品がないために、販売機会を失い売上が立たない。
JITのような優れた在庫管理と思われていた手法も、東日本大震災などの天災でサプライチェーンがズタズタにされた時は無力だった。
良い在庫・悪い在庫 : タイム・コンサルタントの日誌からでは、安全在庫、計画在庫という概念で、在庫という概念を区別しようとしている。

また、その在庫はストックですか、フローですか? : タイム・コンサルタントの日誌からの記事にもあるように、15年醸造したウィスキーの方が価値があがる場合、在庫とはそもそも何なのか?

【3】BtoB企業とサプライチェーンの強者 ~これから就活をする大学3年生へ : タイム・コンサルタントの日誌からでは、自動車、家電、農業の3つの分野で、サプライチェーンを分析している。

図1 自動車業界のサプライチェーンを見れば、トヨタやホンダ、マツダなどの自動車組み立てメーカーが何故あれほど強いのか、ということがよく分かる。
組み立てメーカーの鎖が一番細いから、彼らが価格決定権を持っている。

図2 電機業界のサプライチェーンを見ると、ソニーやパナソニック、シャープなどの家電組み立てメーカーが苦境に陥っている理由がよく分かる。
組み立てメーカーよりも量販店の方が現代では強い立場にいる。
また、各メーカーがお互いに部品を融通しあっているので、製造計画がマチマチですぐに在庫が膨れ上がる構造がある。

図3 農産物のサプライチェーンを見れば、青果市場が価格を決定しているけれど、天災で農産物は出来不出来がバラつきやすいし、そもそも野菜などは長期間在庫できないから、変動性が高い。
サプライチェーンを作ること自体難しい。

この記事では、生産者から消費者までのサプライチェーンを分析することで、消費者(顧客)へ価値をもたらすには何を改善したら良いのか、どこに問題があるのか、をひと目で分かるようにしてくれているのが興味深い。

【4】すると、ソフトウェア開発のサプライチェーンはどうなっているのか?
ウォーターフォール型開発では、要件定義→設計→開発→テスト→リリースというV字型で流れていく。
一番無駄が多いのは、要件定義とテスト・リリースの工程だろう。

要件定義で要件を聞き漏れていたから、仕様漏れが出て手戻りが発生したり、リリースした後で、こんな機能ではなかった、と言われる時がある。
設計して開発した後、テストで動かしてみて、初めて性能要件を満たしていなかった事実が判明したり、まずい設計のためにバグが多すぎた、とか分かったりする。

アジャイル開発が注目されてきている理由の一つが、要件定義の工程で顧客を巻き込む、ないし、内製開発することでプロダクトオーナーと開発チームが一体化することで、要件の取りこぼしや仕様漏れ、リリース後の認識の食い違いをなくそうとしているのだろう。
また、V字型の流れそのものがサプライチェーンとして長過ぎるならば、もっと短くした方がいい。
だから、タイムボックスでのアジャイル開発もその問題解決になると思われているのだろう。

また、構成管理が重要になってきた理由は、テストやリリース工程の作業が従来は手作業だったり、数多くのプロセスを踏むために時間がかかりすぎていた問題点を解決しようとする流れの一つと捉えることもできるだろう。


業務モデリングの分野では、サプライチェーンの管理(SCM)がとても重要で、問題解決するためにモデル化の技法が数多く生み出されてきた歴史がある。
SCMの基本は在庫管理といってもいいだろうと思う。

この考え方はもっと深めてみる。

| | コメント (0)

2012/12/15

リスクと問題と課題を再考

日々の作業の中で、リスクと問題と課題を時々混同して議論しまう時があるので、戒めとして書き記す。

【元ネタ1】問題、リスク、課題、対策 - ee83126の日記

(引用開始)
日々の会話の中で議論の軸がぶれるので、自分への戒めとして書き残しておきたい。

・問題
 →現在、理想と現実に乖離が発生している事物
・リスク
 →将来、理想と現実に乖離が発生する恐れのある事物
・課題
 →問題を解決するためにすべきこと
・対策
 →リスクが問題として顕在化したときにすべきこと
(引用終了)

【元ネタ2】リスクと問題と課題:あるコンサルタントのつぶやき:ITmedia オルタナティブ・ブログ

(引用開始)
じゃあ「問題」と「課題」は?
「問題」は、現状(As-Is)と、本来、こうあるべき(To-Be)姿とのギャップを「問題」と呼称し、その「問題」を解決するためにやるべきことを「課題」と定義することにしています。
(引用終了)

【元ネタ3】プロジェクトマネージメント連載シリーズ第2回【PMBOK】 - OBPM : SI Object Browser PM

(引用開始)
リスクについて話をします。PMBOKの対応は、リスクに対して「回避」「引き受け」「緩和」「転嫁」の適用です。
具体的に言うと、
「回避」は,リスクが予見される作業を実施せず代替作業によって目的を達成できないか,もしくはリスクの要因を潰すこと。
「引き受け」は,発生時のインパクトよりも対処コストの方が高くつく場合に,そのリスクをあえて引き受けた方が有利かどうかを考えること。
「緩和」は,リスクの発生確率を最小限にするにはどのような手を打てばよいのかを考えること。または発生時のインパクトを最小限にする,すなわち,リスクが起きてから後工程への影響を最小限に抑えるにはどうすればよいかを考えること。
「転嫁」は,自社以外の第三者,すなわち保険会社や顧客,提携先のベンダーなどにリスクを引き受けてもらえないかを考えることです。

PMBOKを理解している人ならばだれでも知っていることです。そこで、実際のプロジェクトで、「このリスクを転嫁しよう」というと、大抵の(日本)人は「そんな事はできない」と言います。ではなぜ、リスクの転嫁を否定するのでしょうか?
PMBOKには、リスクの対応として「転嫁」の適用が定義されています。
どうも日本人は他人に責任を負わせることが苦手なようです。自社にないスキル、例えば特殊なデータベースのチューニングをスキルの高い第三者にリスクを「転嫁」しても良いのではありませんか。当然、トレードオフで、それなりの請求書が来る事を覚悟して。

PMBOKをソリューションの源と考えることが重要です。技術者のプライドも重要ですが体系だった知識を生かすこと。PMBOKを駆使することがプロジェクトの問題の解決に役立ちます。
(引用終了)

課題管理やリスク管理を行うようになると、4つのリスク対策「回避」「引き受け」「緩和」「転嫁」がよく出てくる。
プロジェクトマネージャで腕の立つ人は、リスク転嫁が上手いと思う。
外部ベンダーや開発ベンダー(SI)にうまく振る。
そもそもマネージャは自ら作業せず、指示するのがお仕事ゆえに、そのような技能に長けているのかもしれない。

【参考】
課題、問題、リスクを区別できていますか?|プロジェクトマネジメントの現場

ケンブリッジ・ファシリテーション研究所 - 第5回 課題管理とTo Do管理 -概要編-:ITpro

課題管理のチケット駆動開発part2: プログラマの思索

PMstyleプロデュース: リスクと課題の違い(2)

超入門・問題解決力 - 問題とは何か、課題とはどう違うか : タイム・コンサルタントの日誌から

| | コメント (0)

組織や管理職が技術革新のボトルネック

とあるBlogを読んでみて、組織や管理職が技術革新のボトルネックではないか、と思った。
ラフな感想。

【元ネタ】
継続インテグレーションは強みではなくなった:柴田 芳樹 (Yoshiki Shibata):So-netブログ

継続インテグレーションは強みではなくなった(2):柴田 芳樹 (Yoshiki Shibata):So-netブログ

カンファレンスは、若い人ばかり?(2):柴田 芳樹 (Yoshiki Shibata):So-netブログ

(引用開始)
私自身が日頃から感じていて、Jenkinsユーザ・カンファレンスの参加者による質問を聞いて再認識したことは、JenkinsなどのCIツールの導入を阻害しているは、現場のエンジニアではなく、ソフトウェア開発組織の管理職でないかということです。つまり、管理職がCIツールの導入の検討を指示して、予算(工数、機材費)を認めてくれればスムーズに導入できるかと思います。しかし、現実は、CIツールに関する知識や使用した開発経験もないため、管理職が指示することはなかったりします。そして、開発現場が上司に提案をして説得しなければならないことが多いということです。
現状は、このような開発組織が多いでしょうが、Jenkinsユーザ・カンファレンスに参加したような若い人達が10年後、20年後には積極的に改善を指示してくれるのではないかと期待しています。
(引用終了)

Twitter / akipii: SW開発の改善を阻害しているのは40代以上の管理職。開発現場が上司に提案して説得しなければRedmineもJenkinsも導入できないという壁がある。カンファレンスは、若い人ばかり?:So-netブログ http://goo.gl/nBIEr

2012年現時点では、RedmineもJenkinsもGitももはや当たり前の開発環境。
使いこなせて当然だし、それらツールをどのように運用したらいいのか、という方向へ進化している。

でも、自分自身がツールを使ったプロセス改善を組織へ導入しようとしてみて、色んな阻害要因があることに気づいた。

現場でボトムアップに導入するのは結構うまくいく。
現場の問題解決に役立てたいという動機があるから、現場のプログラマやリーダーは積極的に使いこなそうとするし、若い人ほどすぐに慣れてくれる。
しかし、30歳を過ぎたSEはなかなか馴染んでくれない。
自分たちの過去のやり方に固執して、新しい技術を取り込んでくれないのだ。
第三者から見れば、過去の成功体験、過去の習慣が新しい技術の導入を阻んでいるように見える。

そして、組織全体へ拡張していこうとすると、それぞれの現場の問題は異なるので、一つのツールで全てが解決できるわけではないから、適用方法を考えないといけない。
すると、ドキュメントを作ったり、説明会を開いたり、実際に手取り足取り説明したり、色々と手間はかかる。

経営トップはこういうツールの導入はあまり違和感はないみたい。
現場が上手く回って、結果的に売り上げが出るなら問題ないのだ。
でも、管理職層は今までの自分たちのやり方が新しいツール導入で変わってしまうため、変化を恐れる時が多いみたい。
計画→実行監視→測定というサイクルが従来は手作業だったのに、ツール上で行うようになってしまうため、そのやり方に慣れるのが大変だからだ。

アジャイル開発の本質とスケールアップ」では「スクラムチームは常に改善し続けるために解決されなくてはならない組織的な阻害要因に直面し続ける」という言葉があるけれど、それを連想させる。
開発環境も含めた開発プロセスを改善しようとすると、組織と緊張関係をもたらす場合が出てくる。
そういうこともそろそろ考えないといけないのかなと思っている。

| | コメント (0)

2012/12/11

RedmineのEVMプラグイン

RedmineのEVMプラグインが公開されていたのでメモ。
プロマネなら、このプラグインを試す価値はある。

【元ネタ】
EVM - Plugins - Redmine

imaginary-cloud/redmine_evm ・ GitHub

RedmineからPMBOKのEVMを計測する方法: プログラマの思索

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

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

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

チケット駆動開発におけるソフトウェア見積り: プログラマの思索

チームは加速するのか~Velocityの使い方 #agilesamurai: プログラマの思索

ソフトウェア開発の工数見積もりが混乱しやすい理由: プログラマの思索

EVMプラグインの概要を直訳するとこんな感じ。

(引用開始)
このプラグインは、EVM(アーンド・バリュー・マネジメント)に使用されるプロジェクトと、作業中のバージョンごとに、グラフィカルな線で表示する。これは、実績(AC)(時間、ログの時間で報告)、計画値(PV)(新規チケットの見積り時間)を示しており、週/年で出来高(EV)を取得しています。また、CPIとSPIを表示します。Redmineの2.1.3でテストした。
(引用終了)

つまり、チケットに予定工数、実績工数、バージョンを入力設定する運用を行なっておけば、リアルタイムにEVMのメトリクスを出力できる。
但し、今はSPIとCPIしか出力できていないので、プログラミング技術力さえあれば他のメトリクスも実装できるだろう。

チケット集計によるEVMの計算方法は、拙著「Redmineによるタスクマネジメント実践技法」の第8.1節「PMBOKのEVM」で詳しく書いているのでご参考下さい。

ここで、CPIというメトリクスがEVMの中で重要だ。
何故なら、CPIを使ってプロジェクトのトータルコストを予測して計算するからだ。
PMBOKのEVMでは、EACの計算方法が2,3パターンほどあるけれども、その意味は、開発ペースが計画通りなのか、現在の実績に見合ったペースで今後も進捗が進むと仮定する(普通は計画時よりも開発ペースは落ちる)のか、という観点を加味するからだ。

ソフトウェア開発の工数見積もりが混乱しやすい理由: プログラマの思索に書いたけれども、CPIは開発チームの進捗度合いに比例している。その意味では、CPIは厳密には違うけれども、Velocityに似ている。

IPAの定量的プロジェクト管理ツールもRedmineやTracをベースに、EVMだけでなく品質やコストも計測しようとしている。
色々参考にするといいだろうと思う。

定量的プロジェクト管理ツールはIT企業の基幹システムを目指す: プログラマの思索

IPAの定量的プロジェクト管理ツール #redmine: プログラマの思索

| | コメント (0)

BitNami TestLink Stackができている

BitNami TestLink Stackが公開されていたのでリンクしておく。
TestLinkもワンクリックインストールできるようになったし、仮想イメージが公開されているのでVMWareやAmazonEC2で簡単に動かすことができる。

【元ネタ】
BitNami TestLink Stack - Free installers, virtual machines and cloud hosting images

また、TestLinkもVer1.9.5にバージョンアップしたみたい。
少しずつ進化しているようだ。

1.9.5 Released (2012-12-08)

| | コメント (0)

2012/12/09

フィーチャーチーム

Scrumのスケールアップでは、フィーチャーチームという考え方が必要になってくる。
リンクをメモ。

【元ネタ】
Scrumチームを編成する際の必読記事2点 - Always All Ways

フィーチャーチーム

Feature Team Primer - Craig Larman and Bas Vodde(日本語)翻訳者 : ebacky

(前略)
一般的に、Scrumにおけるチーム編成を行う上でポイントとなることが2点あります。それは、
・チーム分けの切り口(フィーチャーチームvs.コンポーネントチーム)
・メンバーの多能工化の進め方
(中略)
この2つに共通することはいくつかありますが、最も重要なのは「学習」だと思います。
フィーチャーチームを作ったり、またコンポーネントチームからフィーチャーチームに移行したりするときも、チーム内におけるSpecializatiionとGeneralizationのバランスを取ったりするときも、そこではある意味個人としてあるいは組織としての「学習」が要求されます。
その意味では、Scrumは改善のフレームワークであるとともに、組織の学習を強制するフレームワークとも言えるかもしれません。
(後略)

複数チームでソフトウェア開発する場合、コンポーネント単位にチームを形成してしまいがち。
よくある例は、インフラチーム、DBチーム、Webアプリチーム、バッチアプリチーム、などのように、機能と言うよりも使われる技術の単位でチームを作る。
すると、それぞれのチームのインターフェイスがシステムの溝になり、Conwayの法則が述べるように、システムのアーキテクチャに組織レイヤーが反映されて複雑になる。
上記の例では、フィーチャチームを作り、どのチームでもシステムのどこでも対応できるように形成すべきと言っている。

認定スクラムマスターの講師だったBas Voddeさんは、Scrumのスケールアップの話の中で、上記と同じようなことを言っていた。
その内容は、Feature Team Primer - Craig Larman and Bas Vodde(日本語)翻訳者 : ebackyとほぼ同じだ。

Bas Voddeさんの話を聞くと、とても分かりやすいけれど、本当にScrumで大規模チームが回せるの?という疑問は僕だけでなく、マネージャクラスの人達も同様に思っていたらしく、何度も質問していた。
Bas Voddeさんはその質問に丁寧に回答してくれたけれど、まだ理解が追いついていない。

僕自身、フィーチャチームで複数チームを運営した経験がないため、たくさんの疑問はある。
でも、ソフトウェア開発の本来のあるべき姿なのだろう。

但し、Bas Voddeさんは以下のように、Scrumのスケールアップに関する本を既に2冊出版されている。
しかも共著者は「実践UML」を書いたラーマンさんなので、経験に基づいて納得できるような内容なのだろうと推測する。
個人的には、@ebackyさんに是非翻訳してほしいなあと思っている。

また、Coplienの本も翻訳してほしいなあ。

| | コメント (0)

スティーブ・ジョブズ自叙伝の感想

スティーブ・ジョブズ自叙伝を一気に読んだので感想をメモ。
ラフなメモ書き。


【1】製品に込められたアフォーダンス

アフォーダンス - Wikipedia

アフォーダンス

アフォーダンスとは、環境が動物や人間に提供する性質。
よくある例は、ノブのないドア。
ノブがなければ、ドアを押すしか、部屋に入ることはできない。
判断せずに、そのままドアを押すだけ。
ノブがあると、ドアを押すのか、引くのか、どちらを選択すべきか、判断に迷う。
アフォーダンスの説明は「誰のためのデザイン?―認知科学者のデザイン原論」の本が一番良い。

スティーブ・ジョブズ自叙伝では、コロンビアの山奥で、文字も知らない6歳の子供にiPadを渡した所、その操作を教えてもらうことなく、自分で遊び始めたという話がある。
コンピュータという難しい機械の操作を知らなくても、考えなくても、自然に操作できる。
まさに、アフォーダンスそのもの。

マックが生み出したアイコンもそう。
アイコンというアプリケーションを象徴するデザインが、そのアプリが何を処理してくれるのか、アプリがどんな機能を持つのか、アプリがどんな機能を提供してくれるのか、一目で暗示してくれる。
デスクトップPCのアイコンの発想は、iPhoneにおける角が丸い四角いアイコンに受け継がれている。

ジョブズがデザインにこだわり続ける理由を、スティーブ・ジョブズ自叙伝ではこう語っている。
「デザインというのは人工物の基礎となる魂のようなもの。人工物は、連続的に取り囲む外層という形で自己表現するのだ」
「連続的に取り囲む外層」はアフォーダンスという概念を連想させる。

【2】使用性という品質特性、狩野モデルの品質特性を重視

狩野モデル-品質とは - techdmba

Kano model - Wikipedia, the free encyclopedia

スティーブ・ジョブズのデザイン重視、製品へのこだわりは、基本品質だけでなく、魅力品質を重視する。
単にバグが少ないだけでなく、機能性だけでなく、使用性をとことんまで突き詰める。
狩野モデルは日本では殆ど知られていないのに、欧米では知られているみたい。
何故日本人は忘れているのだろう??

そのために、プロトタイプを重視する。
発泡スチロールで、重さも全く同じになるように作り、そのプロトタイプから製品のイメージを固めていく。
そのやり方は、リーンソフトウェア開発のMVP(最小機能製品)に似ている。

Lean Startup基礎~MVPとピボット: プログラマの思索

スティーブ・ジョブズがよく言う言葉は「シンプル」。
iPodも音楽を聞くまでに、操作を4個以下になるように機能の削減を命令した。
シンプルなデザインがアフォーダンスや魅力品質を更に強化する。

【3】スティーブ・ジョブズはプロダクトオーナー

スティーブ・ジョブズはアップルの独裁者。
アップル製品に全て口を出す。
だが、彼は、その製品の仕様やロードマップに対する最終責任者だった。

iMacを作った時も、USBやCDドライブ以外は全てカットし、半透明なデザインのデスクトップPCでアップルを復活させた。
iPodもiPhoneもiPadも、彼が製品の機能に逐一口を出し、実際に手に触ってデザインを洗練させた。
何を優先すべきか、何を作るべきか、開発チームに提示した。
彼の役割は、Scrumのプロダクトオーナーを連想させる。
プロダクトオーナーに関する情報は「スクラムを活用したアジャイルなプロダクト管理―顧客に愛される製品開発」を読むと良い。

プロダクトオーナーは、製品のバックログを作り保守するだけではない。
製品の予算計画、原価管理もやるし、スクラムチーム外にいる顧客やベンダーとも製品を完成するためにリソースの確保やらユーザの要望やらを調整する。
製品のロードマップは、もちろんコストという制約があるし、顧客へ届けるために納期という制約もあるから、それらをコントロールする責任も担う。

プロダクトオーナーの特徴で重要な点の一つは、プロダクトオーナーは基本は一人の人物に集約していることだ。
権限と責任が一人の人物に集中しているからこそ、決断も速くなる。
悪い例は、製品やシステムの仕様を決める権限が一人の人物になく、会議体に逐一稟議をかけなければならない状況。
その状況では、決断が遅れるし、あるべき製品の姿を導くことはできない。
たくさんの利害関係者の要望を最大公約数で反映したシステムになるから、魅力のあるシステムになるわけがないからだ。

【4】マッキントッシュ、スマートフォンという新しいマーケットの創造

スティーブ・ジョブズがすごいのは、常に新しい市場を作り出したこと。
マッキントッシュ登場によって、個人が使うデスクトップPCという市場が生まれた。
但し、この市場はMSのWindowsに置き換わった。

iPodとiTunesで、デジタル携帯音楽プレーヤという市場が生まれた。
そして、ソニーは駆逐された。

iPhoneやiPadによってスマートフォンという市場が生まれた。
いつの間にか、PCよりもスマートフォンの市場の方が大きくなり、更に新しい技術がどんどん生まれた。

これらの現象はイノベーションのジレンマを想像させる。
高機能な製品を作り市場を独占していた既存企業が、その商品に劣るが別の特色を持つ商品がどんどん売れていくことによって、新興企業に飲み込まれていくという理論。
イノベーションのジレンマ―技術革新が巨大企業を滅ぼすとき (Harvard business school press)」が詳しい。

イノベーションのジレンマ - Wikipedia

スマートフォンが市場を席巻したことによって、日本の携帯、WiiやPSのようなゲーム機の市場がどんどん侵食されている。
最近の日本の家電メーカーが力を落としている現象は、イノベーションのジレンマで説明できるのではないだろうか?

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

日本製の携帯がなくなる日: プログラマの思索

ゲーム市場が大きく変化している: プログラマの思索

既存の高機能な製品をもっと高品質にしていく改良戦略では、イノベーションのジレンマにはまってしまっていて、本来の問題解決にはなっていないのだろう。

また、アップルの戦略は、ブルー・オーシャン戦略も連想させる
MSが独占するデスクトップPCの市場で戦うのではなく、iPod・iPhone・iPadという新しい市場を作り出すことで、その市場の先頭者として利益を独占することができた。
ニッチなマーケットがいつの間にか、メインマーケットになってしまったという事例。

【5】iPod→iPhone→iPadというソフトウェア・プロダクトライン

iPhoneやiPadが成功したのは、OSXという優れたOS、iPodのような携帯機器の開発ノウハウが十分にあったからとも言える。
OSXがあったからこそ、OSXを流用して、携帯機器用のOSであるiOSを早期に作ることができた。
iPodというハードウェア製造の経験があったからこそ、iPhoneやiPadでは何が重要なのか、を早期に判別できただろうし、過去の製品のリソースを流用することもできたのだろう。
その開発経緯を第三者が見ると、ソフトウェア・プロダクトラインを連想させる。

ソフトウェアプロダクトラインとは【software product line】 - 意味/解説/説明/定義 : IT用語辞典

iPodという製品ラインから、iPhoneやiPadという製品ラインを派生して作ることができた。
しかも、iPodナノ、iPodシャッフルのように、iPhone3GSやiPhone4Sのように、iPad2やiPadミニのように、似たような製品だが仕様が微妙に異なる製品を次々に作り出すこともできている。
そういう結果を見ると、ソフトウェア・プロダクトラインや派生開発という開発スタイルがうまく機能していたのではないだろうか?

そうでなければ、あれだけの短いリリースサイクルで、細かな仕様が微妙に異なる製品群を次々に出荷することはできなかったのではないか?

| | コメント (0)

2012/12/08

MSのTestManagerメモ

細谷さんのBlogでMSのTestManagerの使用感想が公開されていたのでメモ。

【元ネタ】
TFS事件簿 - Yasuo's Notebook

新しいテスト専用ツールを活用したテスト プロセスの包括的な管理

Test Manager 2010 のホワイト ペーパー完成 - KKONDO's Blog - Site Home - MSDN Blogs

TestManagerはTestLinkと同等ないしそれ以上に使いやすいユーザインターフェースを持つテスト管理ツール。
TestManagerに関しては、以前Blogを書いた。
僕自身は、TFSの中でTestManagerに最も興味を持っている。

MSのTestManagerはTestLinkと全く同じ!: プログラマの思索

上記Blogでは、TFSがTestManagerのテスト実行結果を消していたという話が書かれていたのだが、僕が興味を持っていたのは、TestManagerの感想を久しぶりに見つけたこと。
「TestManager」で検索してみれば分かるが、検索結果にはTestManagerを使ってみたという記事はMSの記事ばかりで日本人が書いた記事は殆ど無い。
おそらくほとんどの開発チームでは、TestManagerを使っていないのだろうと思う。

TestManagerが必要になっていくる場面は、サイクルを考慮した業務システムのサイクルテストないしシステムテストだと思う。
単なる単体テストや機能テストはJUnitのようなテスト自動化で十分だが、ユーザ観点の運用フローに沿ったテストを行うには、複雑な操作手順を書いたテストケースとそのテスト実行の管理が重要になってくる。
普通は、Excelのテストケースでテスト管理している現場が多いだろうが、Excelの進捗管理と同様にたくさんの問題点がある。

Redmineによるタスクマネジメント実践技法」にも書いたけれど、Excelのテストケースの横に、テスト実施日、テスト検証日、ビルド番号、障害管理番号、テスト再検証日などの項目を追加していくと、Excelファイルがどんどん肥大化していく。
しかも、たくさんのテスト担当者がテスト実施結果を頻繁に更新するため、きちんとかんりしなければExcelファイルがでグレードしやすい。
更に、テスト実施結果を集計するのもExcelは面倒で、マネージャの作業の殆どが集計作業に取られてしまう時もある。

TestManagerがTestLinkよりも良い点は、Excelのテストケースをインポートしたり、エクスポートする機能が強力なので、マネージャは作業しやすくなる。
テストケースそのものも間違っていたら更新する時も多いから、Excelとやり取りするユーザインターフェースはとても重要だと思う。

TestManagerについて興味深い記事は、手動テストだけでなく、探索的テストもサポートしていること。
以下の記事を読むと、試行錯誤しながらテスト作業のログを記録しながらテスト結果を残すやり方も紹介されている。

方法: Microsoft Test Manager を使用して探索的テスト セッションの結果を表示する

Microsoft Test Manager を使用した探索的テストの実行

Microsoft Test Manager を使用した手動テストのテスト設定の作成

方法: Microsoft Test Manager を使用してラボ環境で自動テストを実行する

探索的テストを使う場面としては、例えば、使用性という品質特性を検証するために、モンキーテストを実施するとか、ユーザにゲームのベータ版を使ってもらうなどのやり方もあるだろう。
テストには色んな技法があるので、強力なツールとセットで運用すれば、ソフトウェア開発の効率向上に役立つだろうと思う。

| | コメント (0)

2012/12/07

WordやExcelから直接Mercurialへコミットできるアドオンmsofficehg

以前、WordやExcelから直接SVNにコミットできるアドオンを紹介したが、Mercurial版ができたようだ。
とても嬉しい。

【元ネタ】
Introduction_ja - msofficesvn - Microsoft Office (Excel, Word, PowerPoint) add-ins that assist document version control - Google Project Hosting

WordやExcelから直接SVNにコミットできるアドオンmsofficesvn: プログラマの思索

Excel Word の文書管理に Mercurial? - MAJ1MAの日記

IntroductionJ - msofficehg - Microsoft Office (Excel, Word, PowerPoint) add-ins that assist document version control with TortoiseHg - Google Project Hosting

msofficehg - Microsoft Office (Excel, Word, PowerPoint) add-ins that assist document version control with TortoiseHg - Google Project Hosting

(引用開始)
Microsoft Officeのアドインとして機能し、ワード、エクセル、パワーポイントのリボンインターフェースからバージョン管理ソフトであるTortoiseHgのコマンドを実行することができます。
TortoiseHgは、ソフトウェアのソースコードのバージョン管理をするのに定評のあるソフトウェアですが、文書ファイルのバージョン管理にも便利に利用できます。 マイクロソフト オフィスファイルの文書管理が必要な場合、TortoiseHgの利用をご検討されることをお勧めします。
(引用終了)

MercurialでExcelやWordを使う利点は、ローカルPC上でプライベートブランチで履歴管理できること。
例えば、Bitbucketにプライベートリポジトリを作っておき、そこからローカルPCへクローンしてコミットすれば常に履歴管理できる。
また、Bitbucketと常時同期しておけば、PCが壊れてもサーバー上にバックアップがあるからいつでも復元できる。

提案資料、報告資料、課題一覧など、マネージャや営業マンはOffice文書を保守する場面が多い。
Office文書もプログラムと同じように、少しずつ書いては推敲していくのが普通だ。
だから、Mercurialのような強力なバージョン管理ツールとセットで運用する方が、作業効率が良くなるだろうと思う。
上記のアドオンを入れれば、上部のインターフェイスから選択できるので便利。


| | コメント (0)

2012/12/02

ITの地殻変動はどこで起きているのか?~アジャイルへの流れと設計技法の違和感

第50回SEA関西プロセス分科会の放談会で話しながら、2012年末時点で、ITの地殻変動がどこに起こっているのか?を考えてみた。
#ラフなメモ書き。

【1】日本のSIもアジャイル開発を最近は積極的に取り入れようとする流れがある。
2000年代前半、XPをコミュニティ中心で実践したものの、日本のIT業界のメインストリームにならなかった頃に比べると隔世の感がある。

ニュース - NTTデータと楽天が共同でアジャイル教育コース作成、両社で180人育成へ:ITpro

その理由は、欧米を中心にScrumを中心としたアジャイル開発が主流になったため、日本でも従来のウォーターフォール型開発にこだわらず、最新の開発プロセスを取り入れようとしたいからだろう。
だから、アジャイル開発が日本のソフトウェア開発の現場に合っているかどうかは、過去の経緯からして、まだ未知数の段階だろうと思う。
でも、リーマン・ショックや東日本大震災が突然降りかかり、ビジネス環境が激変する現代では、10年もの長期計画を綿密に立ててもあまり意味がなく、環境の変化に俊敏に合わせないといけないことは、経営者も痛感しているようだ。
管理職層よりも経営者にいる人たちの方から、アジャイルと言う言葉を最近はあちこちで聞かれるようになってきたからだ。

【2】そして、アジャイルという言葉がそれぞれの立場で意味が異なってきていると思う。
平鍋さんが、各人が発するアジャイルという言葉の違和感に対して、以下の記事でうまく表現されている。
僕としては、平鍋さんのように2つの意味で分ける意見はとてもしっくりする。

アジャイルの「ライトウィング」と「レフトウィング」:An Agile Way:ITmedia オルタナティブ・ブログ

アジャイルの右翼は開発重視。
TDD、CI、継続的デリバリ、分散バージョン管理など、技術的側面を重視ないし、ツールによる開発の効率化を重視する方向性を指す。
2000年頃、XPが提唱したTDDやCIなどの諸概念は、ソフトウェア自身でソフトウェア開発を効率化、透明化する流れへ発展した。
チケット駆動開発も本来はこちらの流れにいるだろう。

10年前はソフトウェア開発の環境自体が貧弱だったけれども、今となっては誰もが手軽にプログラミングできるようになっただけでなく、オブジェクト指向やXPのプラクティスのように優れたノウハウをすぐに吸収できるような環境がある。

逆にアジャイルの左翼は、マネジメント重視。
Scrum、PFなどが相当するだろう。
特にソフトウェア開発では、専門家集団によるチーム開発になりやすいため、チームで一体化して開発するのが難しいという特徴があると思う。
隣の人の仕事が大変で助けたいと思っても、技術や専門的知識がなければ、人を投入しても解決できないのだ。
それは人月の法則という経験則から既に言われていることだ。
だから、専門家集団がいかにチームで一体感をなしてチーム開発していくか、というマネジメントスキルが現代ではとても重要になってきている。

その流れにおいて、最近目立つ特徴は、Scrumにあると思う。
現代のアジャイル開発の隆盛を理解するには、Scrumが必須だと思う。
そして、Scrumは体系として確立されたフレームワークゆえに、WFだけでなく、XPやFDDなど他のアジャイル開発とは全く異なる開発スタイルと認識して勉強し直した方がいいと思っている。
そうでなければ、Scrumの理解を誤ってしまうから。

第三者からScrumを見ると、とても厳しいマネジメント手法の一つだと思う。
Scrumの価値は「コミットメント」「集中(専念)」「オープン(透明性)」「尊重」「勇気」の5つがあるが、それらをそのまま理解したとすれば、まるで軍隊の規律のように思える。
その5つの価値を促す行動を実践すると、アジャイルな特徴が出てくるのが面白い所だと思う。

【3】アジャイル・ルネサンスの中で違和感を持つのは、アーキテクチャなどの設計技法が軽視されていること。
技術革新が速すぎて、過去の経験が有効でない場面が多いのだ。
例えば、一昔前は、DB設計の非正規化によって性能要件を確保していたが、今となってはそのテクニックそのものが古い。
リソースが不足していたからそんなバッドノウハウが必要だっただけのことだ。
あるいは、業務システムでは、Cobolなどのバッチ設計がとても重要だが、Webシステム全盛の中でそのノウハウが忘れ去られている。
むしろ、RDBMSのスケールアップが現代の流れに遅れていて、NoSQLやMapReduceのような開発スタイルの方が注目されている。
確かに、Cobolという言語は個人的には消え去って欲しいけれども、バッチ設計というノウハウはJenkinsによるジョブ管理ツールでよみがえると思っているのに。

すると設計技法そのものが過去の経験知を活用しにくいため、プロセス管理で設計の未熟さを補おうとする傾向があると思う。
その傾向があるからこそ、アジャイル開発が注目されているのだと思う。
つまり、試行錯誤しながら小規模リリースすることによって、少しずつ設計したものを試しては安定できる基盤を求め、少しずつシステムを作っていくしかベストな方法がないのだ。

そんな考えは、以下の記事でも書かれている。

設計と実装の狭間で - 急がば回れ、選ぶなら近道

今はそういう時代なので、設計技法を確立するのはかなり難しい。
でも、個人的には、日本人技術者が過去の開発で蓄積してきた技術であるDOAや品質管理は、今のアジャイル開発にも適用できるし、設計技法の不足に対して何らかのサポートができるのではないか、と直感している。

忘れ去られた日本のIT技術~DOAと品質管理: プログラマの思索

忘れ去られた日本のIT技術~プロジェクト管理: プログラマの思索

この辺りで考えたことは又まとめていく。

【追記】
阪井さんとデブサミ2013に応募しましたので、応援してくださる方は、講演資料に「いいね」をお願いします。

Developers Summit 2013 Action!

デブサミ2013のプレサイトオープン~「公募コミュニティ」に加え、「公募セッション」「公募レポーター」を新設:CodeZine

(12) Developers Summit 2013 公募セッション応募ページ

あきぴーさんと二人でデブサミに応募させていただきます。
タイトル:「チケット駆動開発の本質」
応募者:阪井 誠 & あきぴー
Redmineによるタスクマネジメント実践技法」「チケット駆動開発」の著者らが語る実践を踏まえたチケット駆動開発の本質。著作に書ききれなかった思いを語らせていただきます。
まず、阪井がチケット駆動開発のバリエーションの一つである「挑戦の道具としてのチケット駆動開発」について語り、あきぴーが「チケット駆動開発のフレームワーク~現場の経験知からパターン言語へ」と題して語り、チケット駆動開発の本質に迫ります。
デブサミでは、リンク先のスライドをベースにより洗練した発表を二人で行います。1コマにまとめるつもりですが、2コマに分けての講演も可能です(コメントをお願いします)。応援の「いいね!」をお願いします!

「挑戦の道具としてのチケット駆動開発」

「チケット駆動開発のフレームワーク~現場の経験知からパターン言語へ」

【追記2】
小林さんの資料もリンクしておく。
資料に掲載されている以下4つの論文は、いつか再読する。

・「ウォーターフォール」原論文再読 Windston Royce, “Managind the Development of Large Software Systems”
・プロダクト指向からプロセス指向へ Christiane Floyd, "Outline of Paradigm Change in Software Engineering"
・プロセス・プログラミング Leon J. Osterweil, “Software Processes are Software too”
・ソフトウェアの進化 M M Lehman and J F Ramil, “Software Evolution”

【追記】
感想を見つけたのでメモ。
共感してくれた人がいるのは嬉しいです。

Twitter / mnagaku: http://ow.ly/fL74z あきぴーさんの記事はイチイチ刺さるわー。「軍隊の規律」とか「リソースが不足していたからそんなバッドノウハウが必要だっただけ」とか。アジャイル界隈の言説で一番好きかも。自分が気になってて他人の意見を聞きたいとこを書いてくれる感じ。

| | コメント (0)

« 2012年11月 | トップページ | 2013年1月 »