檜山正幸のキマイラ飼育記 このページをアンテナに追加 RSSフィード Twitter

キマイラ・サイトは http://www.chimaira.org/です。
トラックバック/コメントは日付を気にせずにどうぞ。
連絡は hiyama{at}chimaira{dot}org へ。
蒸し返し歓迎!
このブログの更新は、Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama
ところで、アーカイブってけっこう便利ですよ。

2016-12-26 (月)

「フローチャート」騒ぎ、もう少し頭使って考えてみようよ

| 11:13 | 「フローチャート」騒ぎ、もう少し頭使って考えてみようよを含むブックマーク

割と最近、次の記事がブックマークと注目を集めたようです。

見る前に予想したように、「何言ってんだ!? コイツ」「アホかバカか」的な扱いでしたね。雰囲気としては、「ホメオパシー効いたよ、マジおすすめ」という類の記事への反応と似たようなものです。

上記「フローチャート徹底解説」記事は、特段に酷いとは思いませんが、かといってたいして役立ちそうにないし、反感を買いそうな記述もある*1ので、記事を擁護する気はありません。しかし、フローチャート自体は強く擁護してきたので、ここでまたフローチャート擁護論を展開すべきかな、… と思わなくもないですが、あんまり乗り気じゃない -- 言いたいことは過去にほぼ書き尽くしていて、繰り返しになってしまうからです。

それと、僕がなにか言ったくらいでは、根強いアンチ・フローチャートの空気や信仰をどうこう出来る状態ではないようで、ちょっと虚しい。なので、フローチャート擁護つうより、フローチャート批判にホントに根拠あるのか? を問いたいと思います。

内容:

  1. あなたが嫌っている「フローチャート」って何なの?
  2. 感情と論理を整理してみよう
  3. 古い! 確かに。だから?
  4. ほんとの批判者はいないのかも知れない

あなたが嫌っている「フローチャート」って何なの?

本気で僕は不思議に思ってるのですが、何を根拠にフローチャートを批判/否定しているの? そもそも、批判/否定している対象であるフローチャートって何なの? 厳密な定義じゃなくてもいいから、どんなイメージを持っているのか知りたいですね。どこがそんなに嫌いなの? なんでダメだと思うわけ? 別に挑発や煽りではなくて言うのだけど; 誰か説明してくれないかなー。

皆んなが忌み嫌い攻撃したがるモノと、僕が擁護しようとしているモノがズレているのかなぁ。それについては、過去に「「フローチャート」という言葉の問題」に書いたことがあります。僕自身は、「四角やひし形の箱を線で繋げた図式」程度の意味で「フローチャート」という言葉を解釈し使っています。この広い意味だと、ストリング図(例えば「絵算のススメ 2015 年末版」参照)もフローチャートの仲間、つうか、僕にとってはストリング図が典型的なフローチャートです。

なので、次のようなことを言われても、何でそう考えちゃうのか? 理解できないのです。

  • フローチャートは手続きしか表現できない。
  • フローチャートはgoto文だからダメ。
  • フローチャートは関数型言語オブジェクト指向言語とは無縁。
  • フローチャートはダメだ、UMLのアクティビティ図ならいい。

もう一度言うと、「四角やひし形の箱を線で繋げた図式」がフローチャートで、図式の構成要素の意味は:

  • 四角は、何らかの処理を表す。
  • ひし形は、条件判断と分岐を表す。
  • 線は、制御やデータの流れを表す。

こういった図式法で、プログラムや構文を表すのが何故にマズイと判断するのでしょうか? 論理的な根拠じゃなくて、感情的な理由でもいいでから知りたい。

[追記]僕(檜山)が「フローチャート」という言葉に抱いているイメージは、

[/追記]

感情と論理を整理してみよう

前節の“感情的な理由”については、「苦い経験?」で、僕の想像(実体験ではない)を書いています。フローチャートを憎む人は、次のようなイヤな経験をしたのではないだろうか? という想像です。

  1. 現場の開発工程のなかでフローチャート作成を義務付けられた。
  2. プログラムコード(テキスト記述)と同じ内容を重複して無駄に書かされた。
  3. 他人が描いた図を見ても、制御とデータの流れがゴチャゴチャでワケワカんなかった。
  4. 図をキレイにレイアウトしないと文句を付けられた。

もし、そんなことがあれば嫌いにもなるでしょう。しかし、そのようなイヤな経験は、手法やアイディアとしてのフローチャートの評価とは別物です。どんな手法やアイディアでも、運用される環境や制度によってはイヤな経験に結びつくかも知れません。

例えば「ワタシの場合はホメオパシーで風邪が治った、だからホメオパシー効く」という論法に、皆さんはどう反応しますか。個人的・個別的経験から「効く」という一般論を導くのは早計だ、と思いますよね。たまたま自然治癒した可能性もありますから。

「俺はフローチャートで酷い目にあった、だからフローチャートはダメだ」は、上の「ホメオパシーは効く」と同様に、個人的・個別的経験から「ダメだ」という一般論を、他の要因を考慮することなく導く論法になっています。

もうひとつ、僕が論理的妥当性を疑う点は、フローチャート批判に際して、いったん誇張してから批判していることがある点です。どういうことか言うと、次のような主張に対して批判をしていることです。

  1. すべてのプログラマは、フローチャートを学ばねばならない。
  2. プログラマコードを書く前に、必ずフローチャートを描かねばならない。
  3. テキストコードと1:1対応するようにフローチャートを描かねばならない。
  4. フローチャートは何でも表現できる。

こういう極端なことを言う人はあまりいないと思います(「フローチャートはもちろん万能じゃない」も参照)。こういう極論、例外的主張を取り出して(あるいは捏造して)批判するのは詭弁のたぐいです。「論理的であるかのごとくに装って、根拠のないイチャモンをつける 13+2 の方法」の「傾向や量に関する主張に、勝手に全称限量子を付けてしまう」を実践しているわけです。

フローチャート否定の説得的な根拠が見いだせないので、次のような状況ではないかと僕は考えています。

  1. 否定する人も肯定する人も、実は「フローチャート」に対して明確な定義を持ってないし、イメージがズレている可能性がある。
  2. イヤな経験から感情的に「フローチャートはダメだ」という人が一定数いる。
  3. 経験も自分の意見もなく、あまりものを考えない人が「フローチャートはダメだ」と言ってみる。
  4. 「フローチャートはダメだ」な空気が醸成される。
  5. この空気のなかで、あまりものを考えない人が(以下略)

古い! 確かに。だから?

このテの話題だと、id:JavaBlackさんが言及してるんじゃないかと確認してみたら、ビンゴ、語ってましたね。

遅くとも「人月の神話」は1975年には出ていたらしいから,その頃にはフローチャートが役に立たないというのは,既に広く知られた事実だったと言って良い.あれからいったい何十年たったと思ってるんだよ.

さすがにJavaBlackさん、良い情報を提供してくれます。1975年頃にはフローチャートは役に立たないという認識があった、ということです。つまり、はるか昔に否定されているんだ、ってことです。それは事実でしょう。

1975年、確かに昔ですよね。だったら、その知見が古い、って可能性は考えないのかな?

フローチャート研究の歴史(断片)」に書いておきましたが、1970年代/80年代に、アービブ&マナ、ロビン・ミルナー、ダナ・スコットなどの大家がフローチャートの研究をしていて、80年代にはカザネスクとステファネスクが精力的にフローチャート(フローノミアル→ネットワーク代数と名前を変えて)理論を整備しています。トレース付きモノイド圏(traced monoidal category)としては、90年代にハイランド、長谷川などが不動点理論を完成させています(「トレース付き対称モノイド圏とはこんなモノ」、「絵算で見る「カザネスク/ステファネスク/ハイランド/長谷川の定理」」参照)。

フローチャートを復権させよう -- 2020年代のプログラミングへ」より:

1990年代以降、トレース付きモノイド圏/前モノイド圏の計算科学への応用は長足の進歩をしました。いまや、フローチャートは科学として扱えるのです。再びプログラミンミングの有効な道具としてフローチャートがカムバックする準備は出来ています。忌まわしい過去は忘れましょう。

時代は変わったのに、「フローチャートってダメなんだよね」とか根拠もなく盲信しているのって、なんなの?

「いまどきフローチャート」、「ふっ、古過ぎる」、「昭和だ、20世紀だ」といった揶揄も見かけますが、「古いからダメ」って主張したいなら、次の命題が必要ですよね。

  • ∀X.(Xは古い ⇒ Xはダメ)

これはいくらでも反例があるでしょ。ハードウェアなんかは古いと使いものにならないけど、手法やアイディアって、けっこう寿命が長い。TCP/IPもHTTP/HTMLもLispモナドも20世紀でしょ*2米田の補題なんて1954年だよー、驚いちゃうよね*3

ほんとの批判者はいないのかも知れない

今回のように、フローチャートに関してなんか言うと批判が集まる、という現象は観測されます。しかし、誇張した(勝手に全称限量子を付けた)主張への批判や、おそらくはイヤな経験からの感情論や、とりあえずイチャモン付けたいだけの人の戯言しか見つからないので、ほんとの(本気の)批判者はいないのかも知れない、という気もしてきます。

ネット上で根拠のない(ときに虚偽の)情報が高速大規模に拡散される様をみて、ものを考えない人が増えた、と感じる人もいるでしょう。実際は、ものを考えない人の行動が露出しやすいだけかも知れません。空疎な反射行動のみで、もともと根拠ある発言や指摘なんてなかった、と。

もしそうだとすると、僕は今、何の手応えもない、ひょっとすると存在しない相手に理由と根拠を問いかけているってことになりますね。あー、やっぱり虚しかったか。


[追記]

技術的な内容には全然触れてなかったので、ちょっと書き足しておきます。

箱と線(ワイヤー)の組み合わせで、ワイヤーを曲げて逆行することも許すと、その図式(チャート、ダイヤグラム)はトレース付きモノイド圏の射を表します。

  • 箱 -- 基本の射
  • ワイヤー -- 対象
  • 箱/ワイヤーの併置 -- モノイド積
  • 曲げて逆行 -- トレース

これに菱形の条件判断を入れたいときの描画法は、例えば「非決定性プログラミングだって絵を描いてみれば一目瞭然」あたりを参照。

箱とワイヤーの図をフローチャートと呼ぶのが過度な拡大解釈だと思う人もいるでしょう。確かに、一番の齟齬の原因は「狭義の解釈」と「広義の解釈」のズレかも知れません。でもね、広く解釈すると楽しいことがあるんですよ。例えば、量子情報学の絵図なんていかが。眺めてるだけで楽しくなれます。

[/追記]

*1:「初心者に必須」とか「コーディング前に描きましょう」とかは、さすがに現実性がないので反感を買うだけです。強調すべきは、プログラム意味論と、グラフ書き換えによるプログラム変換です。

*2:Mizarは1970年代、処理系の古臭さにはさすがにイライラしてます。→「Mizar、嫌いじゃないんだけどな

*3:米田の補題は、今回の話題と関係はないです。けどね、圏論が始まってすぐの時期、60年以上も前ですよ。古いけどスゴイ。