某人とfacebookチャットで盛り上がったのでログとして残そうかと。

「繰り返し」または「反復」の重要性はみんな認識しているけど、それを聞く人のこれまでの文脈がエンジニアリングかデザインかで意味が大きく異なるのではないか、という背景的な話からしていきます。


繰り返しの種類について

http://www.infoq.com/news/2008/01/iterating-and-incrementing

http://d.hatena.ne.jp/wayaguchi/20111030/1319926043

上記のモナリザの例で示されているように、「反復的につくろう」という時にはIncrementalとIterativeの2つが存在します。これはどちらも正しいし、しかし相容れないものだと考えています。これは「全体」と「部分」に関する捉え方が大きく作用していると思います。

思想的な話に広げてみます

ざっくりと西洋思想と東洋思想に分けた時、西洋思想では部分の集合(積み上げ)を全体と捉えて、東洋思想では全体と部分は関連するものの不可分なものと捉えているように思います。一方は医療的な分野で耳鼻科、精神科、内科、外科…と分けて人間に起こる病気や疾患など「全体」を各診療科という「部分」に分けていく考え方、他方は足つぼを押すと肩こりが治った、漢方を飲んだら◯◯が治った、といった身体を分割するのではなくある「部分」の作用が「全体」に影響を及ぼしていく、といった考えであると思っています。(ここは私自身掘り下げて考えてないので、間違っていたらご指摘いただけるとありがたいです。)

上記のような考えのもとに整理すると、「Incremental」は「全体は見えないのである程度目星がつく規模の部分を作って、見て、徐々に全体を見よう」とする態度における反復であり、「Iterative」は「ある対象物のおぼろげな全体をまず見て、それが作用するものを壊さないように部分を見ていく」という態度における反復である、というのが現時点での私の理解です。


ソフトウェア開発におけるプロセスの話に縮小してみます

こういった視点から見ると、「繰り返しが大事だよ」だけでは済まない違いが出てきてしまいます。

W. ウォーターフォール(と信じられている)プロセス

ソフトウェアエンジニアリングでよく出てくるプロセスとして。要件定義→外部設計→内部設計→詳細設計→(製造…?)→単体テスト→結合テスト→総合テストといったプロセスにおいては、まず全体を把握した上で部分に分け、その部分を作ってテストし、組み上げてテストし、全体をテストする、といったプロセスを踏んでいると考えられます。

これは全体を見るという意味ではIterativeなのですが、部分から作りあげるといった部分ではIncrementalであり、どっちつかずである印象を持っています。どっちつかずというと悪い印象になってしまいますが、あるチームやマネージャの能力によって、最適な反復ができる、という意味かもしれません。


A. アジャイルなプロセス

ナウでヤングなソフトウェアエンジニアリングでよく出てくるプロセス。アジャイルなプロセスでは、設計→実装→テスト、といったプロセスというよりは組織単位で見た「学習」のプロセスであるように感じています。

それはさておき、全体を一気につくろうとするとこの学習に対するフィードバックがなくなってしまうので、必然的に問題を小さくし、部分をつくっていく方策がとられるように思います。この意味でアジャイルなプロセスの本質はIncrementalであるように思います。もちろんIterativeな要素も最近は入ってきているような気がしますが、インセプションデッキの内容を見ていると、本当に大事な本質の部分(コンセプト)を共有しつつ、分解可能な単位を見極めるための全体を見ている、という感じだと思います。


H. HCD(人間中心設計)のプロセス

たぶん一部でしか広まってないのですが、人間中心デザインという考え方がありまして…「利用状況の把握と明示」→「ユーザーの要求事項の明示」→「ユーザーの要求を満たす解決策の作成」→「要求事項に対する設計の評価」という4象限をクルクル回しましょう、というのがHCDプロセスになります。デザイン思考などでも若干の修正はあるものの、概ね同じようなものだと思っています。(※私はエンジニアなので、他にデザインプロセスというものがあれば教えてください。

これはIterativeなアプローチだと考えています。まず、おぼろげながら感じている問題意識を利用状況調査→要求事項の明示で明確化して共有し、全体を形づくります。それを解決策の作成でざっくり作ってブラッシュアップ、という形でおこなっていきます。

このプロセス自体はプロダクトデザインの領域から出てきて受け入れられているという点からすると、反復のポイントとしてはIterativeであるように思います。


I. アイデア発想のプロセス

広義のデザインにおいてアイデア発想の重要性は高くなってきていると感じています。ここはこれまで明確なプロセスがなく、属人性の高い領域だったと思います。私が強い影響を受けている石井力重さんのスライドを見ると…

(URL)

「設定する」→「拡げる」→「絞る」→「強化する」というプロセスがあるようです。他にもあるように思いますが、これだけを見ると、あるアイデアの全体像ではなく、あるテーマの周辺における全体像を出しているように思います。いや、その前に…他の図ではありがちなループ構造がありません。そもそも「繰り返し」についてアイデア発想ではどう捉えているんでしょうか。どこかで聞いてみよう…


どうプロセスの中で反復をしていくか

脱線しました。ここからはどう開発プロセスの中で反復していくかといったことに焦点をあてたいと思います。

現時点で私が持っている案としては「チームでIncrementalかIterativeかを選択する・合意して進める」かと思います。不用意に混ぜない、ということがシンプルかなぁと。どちらが正しくて間違っているというものではない以上、変に混ぜてしまう危険性があるような気がします。これはエンジニアリングとデザインの融合を仕事のテーマとしたい私としては「ぬーん」となってしまう点なのですが。

よくアジャイルの説明に、ホールケーキをつくるとしてスポンジ→重ねる→クリーム→イチゴと層ごとの部分をつくるのではなく、ショートケーキのようなスポンジ~イチゴを含んだ完成したセットとしての部分をつくる、というものがあります。(最近聞かないですが

HCDなどのデザインのプロセスは、「そもそもホールケーキ作るんだよね?だよね?」という部分に多くの時間が割かれているように思います。「お菓子をつくる→ホールケーキをつくる」の部分を指していると思います。

なので、そもそもどの程度つくろうとしている対象についてイメージがあるか、といったことがあるように思います。分からないから作るならIncrementalになるし、分からないから考えるならIterativeになるし、といった具合です。


「試作」に関する知見を整理するとよいのではないか

あとは試作についての知見の整理が必要な気がします。

そもそも試作に関する言葉もプロトタイピング界隈(そんなのあんのか)での意図がつかめてないような気がしますが、「モックアップ」(使い捨ての試作)と「プロトタイプ」(本番でも使う試作)と「スパイク」(アジャイルでいう調査用の試作)、などなどがあるように思います。「ペーパープロトタイピング」もあるので、ごちゃまぜになるのですが。

某コミュニティのメンバーがやっている研究でプロトタイピングに関するものがあるのですが、それを見ていると、プロトタイピングの手法の広がりは求める効能によって分岐していたりします。例えば検討段階でのイメージ共有であったり、もう少し進んでインタラクションを暫定的にでも確認したいものであったり。こういった試作に関する知見を整理すると、IncrementalとIterativeの違いを認識しつつも融合する一つの方法であるように思います。


おわりに

以上、モヤモヤしていたので違いを考えるために吐き出してみました。

最近はグラフィックからインタラクション、情報構造、それを考えるための組織、サービス、社会…とどんどんデザインの対象が大きくなってきているように思います。そうするとデザインであればIterativeな考え方・方法がフィットするようになっていく感じがしています。ソフトウェアエンジニアリングではどうなのでしょう。アジャイルの文脈はIncrementalを軸に、Iterativeな部分に切り込み始めている気がします。

結論

・IncrementalとIterativeはどちらも有用なアプローチであり、どちらかを選択する方がよいように思う。

・プロジェクトに関わる個人の立場からすると、反復を求められている場合にIncrementalとIterativeのどちらを求めらているのかを意識する必要がある、また、現在はどちらに傾いているのかを見極める力が必要なのではないか

・IncrementalとIterativeはどちらかを選択するのが現状の最適解に思う。しかし、試作領域の分野が進展すると、世界が変わる転換点になるのではないか