2014年12月22日月曜日

工学の終焉と再生

ある研究会での質疑の話を聞いた。フロアから、なぜそのアルゴリズムを使ったのか、と質問があったところ、発表者が
OpenCVにあったから」
と答えた。OpenCVは有名な画像処理のライブラリである。この話は、ツールに依存して基礎を疎かにしている発表者を戒めるための逸話として語られている。しかし最近私は、もう少し大きな流れ、工学の民主化、もしくはコモディティ化、極端に言えば工学の終焉を表す一つの事例と考えるようになった。

デザイナーの奥山清行氏が自著[1]でトヨタのヴィッツと、BMWのニュー・ミニの話をしている。曰く「工業製品として優れているのは間違いなくヴィッツの方である。その差は圧倒的」だ。しかし、氏が選ぶのはミニである。性能が低くて、価格が倍以上するミニを選ぶのは何故か、また氏以外にも選ぶ人が相当数いるのはどういうことか。それはヴィッツがニーズ(Needs)であり、ミニがワンツ(Wants)であるからだ。他でも手に入るが仕方なく必要なものに、人は徹底的に財布の紐を絞る。対して、喜びのためであれば何倍もの金を、人によっては何十倍、何百倍の金を注ぐ。
私はこれを工学の敗北と読んだ。もちろん、高品質で低価格な製品が世の中にあふれることで、社会が得ている利益は莫大である。ただ、コモディティと化した製品は低価格競争に陥り、利益を得ることが難しくなり、やがては開発費用や維持費用を負担できなくなる。
この話を読みながら私は、電気が徹底してコモディティとなっている現状を重ねていた。電気事業の一翼で禄を食む物として、電気の普及による社会的利益の大きさと、それに比して極めて低い、電気に対する人々の価値意識を思っている。あってあたり前のものに高い金を出そうと思う人はいない。

もうかれこれ10年以上前に、渋谷で田中さんという研究者と会った。彼は写真をうまく使った興味深いアプリケーションを作っており、それを手伝えないかという話だった。結局私の技術では支援できないことがわかり、話はそれきりになった。ただ、その時に感じた、良いと感じたものに体ごと飛び込んでいく彼の姿勢は印象的だった。それから数年後、あるワークショップの昼飯時に彼が今どうしているのか、と話に出したら、彼はFabの伝道師になっているよ、その道では有名だ、と聞いた。慶応大学の田中浩也准教授である。彼の武勇伝は「FabLife」に詳しい[2]
Fabは、パーソナルファブリケーションの意味であり、ものづくりをパーソナルに行うことを意味する。この場合、ワンツは自分の中にある。例えば、MITFabLabに来た芸術系の女性ケリーが、自分で部品を組み立てて作り上げた「スクリームボディ」は、前に抱くバッグの形をしている。これは町中で急に叫びたくなった時に、口をあてて思いっきり叫んでも周囲に迷惑がかからない道具である。さらに後から誰もいない場所で再生できる機能まである(注1)。彼女は大勢人がいる場所で急に大声を上げたくなる衝動の持ち主で、その衝動のためずいぶん苦労してきた。しかし彼女のために製品を作ってくれるメーカーは無い。だから作った。
FabLab利用者が物を作れるのは、レーザーカッターや、3Dプリンタ、Python、またそれこそOpenCVなどの、各種装置、部品、ライブラリが普及したことによる。さらに、彼女にとって電子工学やプログラミング、工具の使用方法は、自分自身のワンツを叶えるために必要性の明らかなハードルである。だから乗り越えられる。
パーソナルファブリケーションに関してMITのガーシェンフェルドが書いた「Fab」という本[3]には、自分の必要のために、また楽しみのために、障害を乗り越えてものづくりをする人々が描かれている。例えば、ニコラ・テスラが1913年に発明した、薄い板が重なった低速回転用タービンと太陽熱を使って、動力源を作ろうとしているガーナの人たちが紹介されている。
こういった話はブルーエコノミー[4]や、適正技術[5]という文脈で様々に語られている。現地で手に入る材料や道具を使って、安価かつ簡易に「たどん」を作れる技術の有用性と、取り組みへの現地の人々の熱狂について。どこまでもシンプルに工夫された灌漑用ポンプの、コストパフォーマンスの高さ、また作っている人々の自活力、創造力の高さ。

さらに別の側面から。従来のマーケティングの無力さ、大量のアンケートに基づくデータ分析をしても、また、たくさんのユーザにニーズ調査をしても、なぜ魅力的な新製品を作り出せないのか、という課題に対して色々な提案がなされている。その中に「仮説生成型」とでも言うべき開発方法群がある。
例えば、「デザイン・ドリブン・イノベーション」[6]では、市場自体を変えた複数の製品開発に関して、ヒアリングをもとに議論している。そういった新製品、例えばアレッシーのワインオープナーや、任天堂のWiiを作り出すには、ユーザへの耽溺ではなく、デザインディスコースへの耽溺が必須である。デザインディスコースとは、隠された新しい意味、まだ気付かれていない新しい価値を探り当てようと日々取り組む人々(解釈者)のネットワーク(コミュニティ)である。解釈者の、まだ確信のない仮説、つぶやきに耳を傾けることが最も重要と彼らは主張する。
また、takram design engineeringは「ストーリー・ウィーヴィング」を提案している[7]。これは開発に先駆けて、使われるシーンをイメージした短いストーリーをグループで作るという方法論である。そのストーリーには、調査やプロトタイピング、ユーザビリティテストなどを通じて、常に立ち返って改訂を繰り返していく。モノ主導でも、ユーザ主導でもなく、魅力的なストーリー主導としている点が独特である。例えば、重なった所に虹ができる透明な傘「虹の傘」、雨粒がそのままストッキングの美しい模様になる「Stockings of Splashes」など、斬新な発想のプロトタイプが作られている(注2)
三品らは「リ・インベンション」こそが必要と主張している[8]。この言葉はスティーブ・ジョブズが言った、
“Today, Apple is going to reinvent the phone, and here it is.”
で記憶に残っている方も多いだろう。イノベーションが旧来の価値基準で圧倒的に優れた技術を作ろうとする活動なのに対し、リ・インベンションは評価軸自体を作り替え、誰に・何を・どのように提供するかまで遡って再発明することを意味する。そのためには測定可能な客観指標を捨て、感覚的な理想を明確にイメージし、その理想に至るインテグリティ(一貫性)を貫くことが、容易な追随を許さない製品を生み出す、とする。

この100年、工学が急速に発展し、高度に専門化し、大きな社会的成功を達成した背景には、工学が「クオリティ」を無視したことが大きい、と私は考えている。工学は人間が「すてき」とか「うれしい」と感じるクオリティそのものは無視し、その代わりに精度や、効率、解像度、安定性、再現性などの客観指標を、クオリティに置き換えて追求してきた。それがヴィッツを、また停電のしない電力系統を実現させた。
しかし、そのことが今、工学を苦しめている。技術的に素晴らしい製品をいくら作っても高く買ってくれる人がいない。何故か。それは前述の奥山氏が書いているように、
「身もだえするほどほしい」
と思えないからだ。これを目的関数とする最適化アルゴリズムは無い。その意味で工学はすでに終焉している。
一方で、Fabや適正技術、また仮説生成型の製品開発といった流れが、新しい工学の再生を示唆している。世に無くどうしても自分が必要な、また売れるかどうか自信は無いが腹の底から欲しいと思うものを、自分で作れる環境が、まさに工学の発展のおかげで手に入りつつある。昔は椅子も家も、近所の職人が、また多くは自分で作っていた。一周してそこに戻っていくのだと考えることもできる。
私は、上述した本やウェブサイトで紹介されている、世界中でものづくりをしている子供から老人まで、多数の人々の写真や映像を見ながら、彼らの楽しそうな顔、自信に満ちた顔、ドヤ顔に、工学の新しい未来、再生を感じている。

参考文献:
[1]       奥山 清行「100年の価値をデザインする: 『本物のクリエイティブ力』をどう磨くか」 PHP研究所,2013
[2]       田中 浩也「FabLife ―デジタルファブリケーションから生まれる『つくりかたの未来』」オライリージャパン,2012
[3]       ニール・ガーシェンフェルド「Fab ―パーソナルコンピュータからパーソナルファブリケーションへ」オライリージャパン,2012
[4]       グンター・パウリ「ブルーエコノミーに変えよう」ダイヤモンド社,2012
[5]       シンシア・スミス「世界を変えるデザイン――ものづくりには夢がある」英治出版,2009
[6]       ロベルト・ベルガンティ「デザイン・ドリブン・イノベーション」同友館,2012
[7]       渡邉 康太郎「ストーリー・ウィーヴィング」ダイヤモンド社,2011
[8]       三品 和広, 三品ゼミ「リ・インベンション: 概念のブレークスルーをどう生み出すか」東洋経済新報社, 2013




注2: このURLにプロトタイプが多数紹介されている。
 

2014年12月21日日曜日

Processing で ポップアップスレッド (Pop up dialog thread for Processing sketch)



Processing で drawの中の状態に応じてポップアップダイアログを出す方法。
普通にdraw内に記述すると、drawが止まってしまう。だからスレッドを使う

If you want to use dialog pop up in your draw function,
you should use a thread for the dialog.

-------------
float   percent;    // progress bar
boolean isRunning;  // flag for thread running
Thread thread1; // thread for pop up dialog
boolean answer; // answer of user

void setup() {
  size(400, 300);
  isRunning = false;
  percent = 0;
  answer = false;
}

void draw() {
  background(255);
  if (answer) stroke(#AA0000);
  else stroke(#0000AA);
  line(10, 10, percent++, 10);

  if (percent == 300) {
    percent = 0;
    if (!isRunning) {
      thread1 = new Thread(new popupThread());
      thread1.start();
    }
  }
}

// pop up thread
class popupThread implements Runnable {
  public synchronized void run() {
    isRunning = true;
    popUpJPanel();
    isRunning = false;
  }
}


import java.awt.*;
import javax.swing.*;

// pop up dialog
int popUpJPanel() {
  JPanel panel = new JPanel();
  BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS);
  panel.setLayout(layout);
  panel.setPreferredSize(new Dimension(400, 50));

  panel.add(new JLabel("Feel Good?"));
  //checkComment = new JTextField();
  //panel.add(checkComment);

  int r = JOptionPane.showConfirmDialog(
  null,
  panel, "Feel Good", // title of dialog
  JOptionPane.YES_NO_OPTION, // option
  JOptionPane.QUESTION_MESSAGE);  // message type

  if (r == 0) answer = true;
  else answer = false;

  return r;
};

Processing で タイマースレッド (Timer thread programming in your Processing sketch)

Processingでタイマースレッドを使う方法は以下
(How to implement a timer thread in your Processing sketch)

---------------------
Thread thread1; // thread for timer
boolean tick;

void setup() {
  size(400, 300);
  tick = false;
  thread1 = new Thread(new timerThread());
  thread1.start();
}

void draw() {
  background(255);
  if (tick) line(10, 10, 100, 10);
  else line(10, 10, 10, 100);
}

// thread for 1 sec. timer
class timerThread implements Runnable {
  public synchronized void run() {
    while (true) {
      try{
        Thread.sleep(1000);
      } catch (InterruptedException e) {}
      tick = !tick;
    }
  }
}