workflowって何だろう

最近だいぶメジャーになってきたBPMとかワークフローとかについてちょっと考察してみたりする。
よく目にするのがグループウェアにおまけで付いてくるワークフロー。たとえば稟議書とか、申請書みたいなものを電子化しようというもの。
紙の申請書とか見ると、課長、部長、総務、総務課長なんかが印を押す欄が右上に並んでたりする。たとえばこんなの
これを電子化することで、ペーパーレス(死語)化して経費削減(無理)しようとか、迅速化したり紛失を減らしたりという事を狙う。
まぁ普通良くあるフロー(文書の人から人への流れ)として定型化されるものであればグループウェアのオマケでOK。ただ、ひどいものだと、

A→B→C→D→E

みたいに一直線のみとか、毎回手入力でAは誰、Bは誰と選ばなければならない。
これがワークフローシステム単体で販売しているものになると、

(自分)→(課長)→(部長)→(総務)→(総務課長)

みたいに設定しておくと、自分が技術一課なら(課長)のところが技術一課課長となったり、(総務)のところは、総務の数人の担当者の誰でも処理できるようになっていたり、はたまた自分が課長なら(課長)のところをスキップできたり、稟議の金額が5万円未満なら(部長)をスキップできたりと、さまざまな便利な機能を持っていたりする。
機能については私が云々言うより専門の記事(これとか)を参考にしてもらうほうがいいだろう。

ワークフローの定義

自分なりの解釈だが、一般的に言われるワークフローとは、

複数の人によって処理されるデータの流れの定義

ということになるだろうか。だから、それは紙ベースや、wordベースである必要はない。WEBのフォームでもいいし、画像であっても良い。その処理の流れを定義するのがワークフローである。
ただこれも狭義のワークフローだと考えていて、広義で考えると「人」でなくても良い。そして上記では決定的に省略されているものとして、「時間を超えて処理される」という点があげられる。
人から人へデータを渡していくのであれば、必ず不定長の時間の経過が必要(ベルトコンベアなんかでない限り)なので、省略されているのである。
つまりワークフローとは、

時間的に不連続に複数回処理されるデータの流れの定義

と言える。

身近なワークフロー

広義のワークフローを考えると、さまざまなものがワークフローを持つことがわかる。あまりにも多くのものが当てはまるので、なるべく「なるほど」と直感できるものだけを挙げてみる。

稟議書
これはさっきも出てきたのでいいだろう。
回覧板
電子化されると、順不同(というか同時でも)閲覧できたりするが、全員閲覧し終われば終わりというワークフローだ。
バグトラッキングシステム(BTS)
バグの報告者、コーディネータ、開発者などをバグレポートが回されていく、正にワークフロー。
複数ページを持つアンケートフォーム
人は単数だが、画面を遷移しながらアンケートというデータを処理していくし、データは時間を越えて保持されている。
電車の改札
切符を買う、自動改札を通る、社内で車掌が検札し、乗り換え改札を通り、出口で精算して改札を抜ける。これはワークフローだろう。
自動販売
最初に誰かがお金を入れる、購入できる商品のボタンを点灯、ボタンを押されるまで待って、押されたボタンの商品を排出、投入金額と商品価格を確認して、必要ならばお釣りを排出。ほらワークフローだ。あれデータは何だろう。お金?これは違うかな。

極端な例まで出したが、みな広義にはワークフローと言えそうだ。

ワークフローをさらに抽象化する

ワークフローをさらに抽象化するとどうだろうか。
開始があって、あるステータスに落ち着いて、しばらくしたら次のステータスに遷移、そしてあるステータスまで行き着いたら終了。そう、ステートマシンだ。
s2buriで有名な羽生さんもワークフローの一形態はステートマシンだと言っています
じゃ、ステートマシンと広義のワークフローは何が違うか。
ステートマシンは単なる状態遷移だけを表したもの。ワークフローはそれに付随する永続性のデータの存在が決定的に違う。
そして多少狭義のワークフローに話を持っていけば、永続性データに対する処理のバリデーションがあるのもワークフローの特徴だろうか。
ちなみに羽生さんの言う、コードジェネレータ系とか、ルールエンジン系というのはどんなものだかよく判りません。でも、コードジェネレータ系も、Yacc/Lexみたいに、結局ステートエンジン生成をコンパイルしてから実行するか、インタプリタとして実行するかの違いだけで、結局両者ステートマシンなんじゃないかなと思っていたりします。

で、次は何?

もう夜も更けたので次回また続きを書きたいと思うのですが、さて次はどんな話の展開にしましょうか。永続性データをどうやって保持するか、マイクロなワークフローとマクロなワークフロー、ディレクトリ情報との連携の重要性、そこらあたりになるでしょうか。
あ〜さぶい。