2008年07月19日 16:00 [Edit]

フローチャートがダメな3つの理由

serif

というわけで、前世紀の遺物、フローチャートを供養する試み。

フローチャートとFizzBuzz問題 - novtan別館
さて、研修の話だけど、低水準言語ってだけではなく、きちんとフローチャートを書かせて処理の流れを整理し、あるいは効率が悪くないかを考えさせる、ということも重要だと思っています。

フローチャートがそんなにいいなら、なんでビジュアルプログラミング言語が現場で使われないの?

まずは経験則による終了宣言。ちなみにここで言うビジュアルプログラミング言語の定義は、Wikipediaのそれと同じ。

ビジュアルプログラミング言語 - Wikipedia
ビジュアルプログラミング言語(英: Visual programming language、VPL)とは、プログラム要素をテキストで指定するのではなく、グラフィカルに操作することでプログラミングを行う方式のプログラミング言語である。

早い話、フローチャートをそのまま実行しようというのがヴィジュアルプログラミング言語。最近だとScratchなどがそれに相当する。

一つ留意点として、ヴィジュアルにコントロールを配置するプログラミング環境はヴィジュアルプログラミング言語ではない

なお、Microsoft Visual Studio とそれに付随する言語(Visual Basic、Visual C#、Visual J# など)は、ビジュアルプログラミング言語と誤解される場合があるが、そうではない。これらの言語はテキストを用いるものであって、グラフィカルではない。

HyperCardも、この意味ではヴィジュアルプログラミング言語ではない。HyperTalkはあくまでも文字言語である。

しかし、これらのヴィジュアルプログラミング言語がおもちゃ以上に普及した試しがない。それはなぜだろうか。

フローチャートの表現力はしょぼすぎる

結局のところ、これに尽きる。フローチャートがまともに記述できるのは「手続き」だけだが、かつてはとにかく今やプログラミングにおいて「手続き」が占める割合というのはハナクソぐらいしかない。もちろん「手続き」でないものも「手続き」に還元可能ではあるが、プログラマーに求められているのは「期待どおりに動くもの」であって、手続きは手段に過ぎない。

例えば、以下のFizzBuzzは容易にフローチャート化できる。

[C code - 19 lines - codepad]
#include <stdio.h>

int main(int argc, char **argv){
    int i;
    for (i = 1; i <= 100; i++){
        if (i % 3){
            if (i % 5)
                printf("%d\n", i);
            else
                printf("Buzz\n");
        }else{
            if (i % 5)
                printf("Fizz\n");
            else
                printf("Fizzbuzz\n");
        }
    }
    return 0;
}

しかし、以下はどうか。

[C code - 9 lines - codepad]
#include <stdio.h>

int main(int argc, char **argv){
    int i;
    for (i = 1; i <= 100; i++)
        printf( i % 3 ? i % 5 ? "%d\n"   : "Buzz\n"
                      : i % 5 ? "Fizz\n" : "FizzBuzz\n", i);
    return 0;
}

あるいは、以下は?

[C code - 12 lines - codepad]
#include <stdio.h>

int main(int argc, char **argv){
    char *fizzbuzz[15];
    int i;
    for (i = 1; i < 15; i++)    fizzbuzz[i] = "%d\n";
    for (i = 3; i < 15; i += 3) fizzbuzz[i] = "Fizz\n";
    for (i = 5; i < 15; i += 5) fizzbuzz[i] = "Buzz\n";
    fizzbuzz[0] = "FizzBuzz\n";
    for (i = 1; i <= 100; i++)  printf(fizzbuzz[i % 15], i);
    return 0;
}

ここではあえてCで書いてみた。LL言語と比較して「フローチャート通り」なプログラムを強いられやすいCですらこのありさまだ。

フローチャートとFizzBuzz問題 - novtan別館
実際、オブジェクト指向プログラムにおいて、全体の流れをフローチャートで書くのは困難です。

フローチャートで書くのが困難なのは、OOPだけではない。関数型はもっとそうだし、Dispatch Tableを使う場合もそうだし、イベントドリヴンなプログラミングもそうだ。早い話、最近ますます隆盛になるパラダイムに対して、フローチャートはそのほぼ全てを不得手としているのだ。

これじゃプログラマーは萎える。そして萎えたプログラマーの価値は、萎えたチンコに劣る。

人間はフローチャートのようには考えない

結局のところ、なぜフローチャートが駄目かといえばこれに尽きる。人間の発想は、フローチャートほど簡単ではない。せっかくプログラミング言語がそれに追随しているのに、わざわざフローチャートを使ってそれをダウングレードするのは、極上のトロをツナ缶にしてしまうようなものだ。

とはいえ、フローチャートには実は重要な利点が一つある。

プログラマーでなくとも理解できるのだ。まさに「小学生でも理解できる」という奴である。

実際、昨今フローチャートを見かけるのは、プログラミングの現場よりプレゼンテーションの現場の方が遥かに多い。雑誌でもよく見かける。このあたりは週刊ダイヤモンドとかが得意とするところだ。

それでは、なぜフローチャートはこれほどわかりやすいのか。

表現力を犠牲にしているからだ。

これはフローチャートに限らず、ありとあらゆる表現に関する鉄則である。視認性は表現力に制約を加えれば加えるほど上がる。

だから、私はプレゼンテーションの手法としてのフローチャートは否定しない。もっと積極的に使ってもいいぐらいだ。

しかし、それは「すでに出来上がったプログラムの概要を説明するため」のものであって、「仕様をプログラムにする」ためであってはならない。フローチャートはプログラムを書いた後に書くものなのだ。プログラムを書く前のものではなくて。

Dan the Free Programmer


この記事へのトラックバックURL

この記事へのトラックバック
まずは献本御礼。 マインドマップ超入門 トニー・ブザン / 近田美季子監・訳 マインドマップ資格試験勉強法 萩原京二/ 近藤哲生 「マインドマップ超入門」は「マインドマップ」とは何かを必要十分に説明したものであり、「マインドマップ資格試験勉強...
そろそろ「マインドマップ」について一言いっとくか【404 Blog Not Found】at 2009年04月20日 15:04
【フローチャートがウハウハ度:絶大】  フローチャートが話題になっているので記事
フローチャートと教育現場【情報教育と数学教育とゲームの不定期日記】at 2008年07月23日 19:49
またブログの更新が滞ってしまった…とはいえ、今回は3日の停止のみ! 今までに比べたら、わりかし優秀な方か。 ここ数日は、新しい仕事でのサービス開発にかかりっきり。 明後日テストなのに大丈夫なのか自分! どんな仕事かというと、サービスの各プロセスをひたすら紙に
気を抜くとすぐにこうなる【己に勝つ〜理系大学生アルバイトチューターの日々〜】at 2008年07月22日 23:18
フローチャートで書くのが困難なのは、OOPだけではない。関数型はもっとそうだし、Dispatch Tableを使う場合もそうだし、イベントドリヴンなプログラミングもそうだ。早い話、最近ますます隆盛になるパラダイムに対して、フローチャートはそのほぼ全てを不得手としているの
2008-07-21【Yet Another But Open】at 2008年07月21日 18:23
JavaBlackさんからトラックバックいただいて、なんか面白い議論が進行中なのを知る。 フローチャートの呪い フローチャートがダメな3つの理由 ここではフローチャートの是非を論じるつもりはない。クソだから。もっと一般化してしまえば、○○設計書みたいに「設計書」と名
[システム開発][経営][Agile開発]システムエンジニア不要説【masayangの日記(ピスト通勤他】at 2008年07月20日 08:56
自分の仕事であるソフト屋さん(自嘲表現)のことは、滅多に書かないんだけど、今読み返したら、これなんて(「開発言語の好き嫌いを言う奴は二流」)、結構いい話で、面白いじゃん(自画自賛)。 ここで自分は「言語など何でも一緒、好き嫌いを言う奴は二流」と書いている
言語なんて何でも一緒(でない場合もある)【ぼくが真実を口にするとほとんど全世界を凍らせる】at 2008年07月20日 00:43
でっかい分岐が出来て、処理の最後の方で合流するとかはやっちゃダメだよっていってもその理由を考えようとしてもくれなかったりします。まあ、メモリも潤沢にある環境でプログラムを考えるとどうでもいいことなのかもしれないけれども、そういう小さな積み重ねが色々な問題...
フローチャートは基本、基本を大事にしようね。【日刊オレ小町】at 2008年07月19日 23:10
404 Blog Not Found:フローチャートがダメな3つの理由 文系...
404 Blog Not Found:フローチャートがダメな3つの理由【OPC Diary】at 2008年07月19日 21:58
http://blog.livedoor.jp/dankogai/archives/51083212.html http://d.hatena.ne.jp/NOV1975/20080719/p2 http://d.hatena.ne.jp/NOV1975/20080719/p4 いまさら議論するのも馬鹿らしいけど,フローチャートなんぞはものの役に立たない. そんなものは作るだけ時間の無駄だし
[開発]フローチャートの呪い【カレーなる辛口Javaな転職日記】at 2008年07月19日 19:27
フローチャートがうんこだというのにはわりかし同意ですが、 なんでビジュアルプログラミング言語が現場で使われないの? http://blog.livedoor.jp/dankogai/archives/51083212.html はいただけません。 こちらの現場では、ラダーやLabViewが絶賛大活躍中ですが、工場の中は
ビジュアルプログラミング言語は現場でスゲー使われてますよ【負けないように頑張る日記】at 2008年07月19日 19:05
エントリよりも…はてなセリフが秀逸すぎる『フローチャートが許されるの… - キモーイ キャハハハハハハ』 あ、肝心の弾さんのエントリは『フローチャートがダメな3つの理由』。...
ついでにUMLも供養して欲しい【Slashcolon /:】at 2008年07月19日 17:40
まさかこんな反応があるとは思わなかったww フローチャートがそんなにいいなら、なんでビジュアルプログラミング言語が現場で使われないの? 404 Blog Not Found:フローチャートがダメな3つの理由 おおっと、いきなりですか。僕も別に現場でフローチャートを書いたことはな
[雑記][技術ネタ]フローチャートを言語の問題として語っちゃダメだよdankogai【novtan別館】at 2008年07月19日 16:55
この記事へのコメント
フローチャートは
自分のためじゃない
人のために書くものなんだ

みつお
Posted by みつお at 2009年10月22日 20:33
機械系の人がよく使うって言ってるビジュアルプログラミングってブロック線図を摸した感じのMATLABとかのプログラムのことか?
以前シミュレータ組むのに使ったことあるけど、PID系の簡単な制御なら簡単に使えたけど、ブロックの中味に学習項とか付けようとすると、自分でスクリプト書かないといけないから、結局ほぼテキストプログラミングになっちまったぞ。
Posted by cross at 2009年05月05日 18:16
Microsoft Visioは使えますよ。操作性はともかくとして。
プレゼン以前に仕様を確定しなければならないわけですが、
物流やら製造やらのシステムだと、情報を「誰が入力するか」「どのシステムから受け取るか」
「このパターンの不良品はどこで発見されて、誰が管理するか」って処理の順序が重要なので。
各人の箇条書きから、処理の流れや情報処理の穴埋めをしていく感じですね。

勝手に説明書作って「これからはこれでやってね」は通じないでしょう。
現場までオブジェクト指向にはなりませんよ。

>そんな細かい所、お客さんとかプログラムも出来ないような
>オッサンにわざわざ説明します?
>工数の無駄ですよそんなもん。可哀想な職場だと思いました。
現実的には、そういう説明役はシステム全体が理解できる少数の「出来る人」に丸投げしてますね。
でもそれが無いと、工場の方が「今はどうやってるのか」「これからどうしてほしいのか」
の刷り合わせの時点で行き詰るので。
特に大人数相手になると、文字だけで説明する&説明してもらうのは大変ですよ。
Posted by ソース考えるときには書かないけどさ at 2009年04月17日 16:04
フローチャートはメカトロ屋や弱電強電屋なら今でも有効だと思いますよ。
I/Oインターフェース考えたり整理するのに便利。
デジタル電子回路設計とフローチャートはきっても切れない関係だし。

弾さんソフトはめっぽう強いけど電子回路はどうなのよって思うときあるな。
Posted by じん at 2009年04月14日 12:27
相当前の記事ですが
今職場でフローチャート書いてって言われて萎えたので通りますよ
うん、こうやってサボってしまうしマジで役に立ちませんね

おおむね記事に同意なんですが何でこんなに責められてるんだろう
ちゃんと「プレゼンには有効」「後からの説明向き」とかフォローしてるし
その通りでしょう

あと上のほうのコメントで、
コードをわかりやすく説明する能力がどうたらこうたらとか言ってますが、
そんな細かい所、お客さんとかプログラムも出来ないような
オッサンにわざわざ説明します?
工数の無駄ですよそんなもん。可哀想な職場だと思いました。
Posted by ななしの at 2009年03月06日 13:26
フローチャート描くソフト探してる大学生にこんな記事見せないでください。
レポ〆前なのに萎え萎えです。

あと適当にググると2chやらはてなやらばっか出てくるのどうにかして下さい。
検索の邪魔です。眠いし。
Posted by フローチャートなんて単語大学入ってから知ったわ at 2008年07月29日 03:51
>下流工程しかやったことがないエンジニアなのですね、わかります。
上流工程と下流工程として切り離して、「俺達は上流だから偉いんだぜ」と
思ってる老害しょうか?上流工程と下流工程という区切り自体が時代遅れ
だということを、そろそろ自覚していただいた方がよろしいかと存じます。
Posted by プログラマー at 2008年07月21日 18:30
自分でプログラム組むのにはフローチャート使ったことないが、
他人(主に新人)に既存のプログラムを教えるのにはフローチャートを利用してます。
アレは絶対ダメでコレが絶対に良いという考え方はプログラマ向きではないですね。

それとは別件ですが、上の画像、著作権とか大丈夫ですか?
Posted by はぐれプログラマ at 2008年07月21日 04:38
>プログラマーに求められているのは「期待どおりに動くもの」
>であって、手続きは手段に過ぎない。
>フローチャートが許されるのは小学生までだよねー
下流工程しかやったことがないエンジニアなのですね、わかります。
せめてちゃんと自分の立場と領域を説明してから語ったらいかがでしょう?


フローチャートを表現方法とプログラム言語をごっちゃに考えてる
時点でその程度だと感じてますが…
Posted by 抹茶菓子 at 2008年07月20日 22:47
私はLabViewを良く使いますけど,
手続きというよりは関数型に近いという印象を受けます.
並列動作と遅延実行のモデルで記述します.

私はおもちゃでは無いと思いますけど,
限られたアプリケーションに特化することで
なんとか実用的になっているという側面はあると思います.
Posted by asdf at 2008年07月20日 16:56
フローチャートとビジュアルプログラミングをごっちゃにして、
ビジュアルプログラミングが駄目だからフローチャートだが駄目といってる時点で、
この人は議題を正しく理解できていないね。

ビジュアルプログラミングに関しても、simlinkやrhapsodyのようなソフトが、開発現場で普通に使われていることを知らないんだね。
他の記事もそうだけど、あなたは自分の見識に問題があることを自覚した方がいい。
Posted by はいいろ at 2008年07月20日 12:06
詳細設計では、フローチャートは有効でないかもしれないが、概要設計では、とても有効だと思う。例えば全体の流れを示したりする場合など。詳細なアルゴリズムを表現する場合に限り、フローチャートは駄目だと言って欲しかった。
Posted by kiy at 2008年07月20日 09:04
フローチャートってCOBOL的にはそれなりに有効なわけで。
フローチャートがなければDFDやUML等の図解方法て生まれてないわけで。
フローチャートがあったから、今のビジュアルプログラミング言語ができたわけで。
Posted by ナボ at 2008年07月20日 06:09
フローチャートの変わりになるすばらしいツールはなんかないですか。
UMLはどうなんでしょう。供養されるべき?
Posted by ru at 2008年07月20日 03:45
いつも楽しく読ませていただいております。
(私はコーディングとかできない、数学上手でない理系人間です。)
このお話って、「アルゴリズム」という考え方に意味がない、という主張なのでしょうか?
アルゴリズムとフローチャートの差を私はちゃんと説明できないので、気になります。

Posted by 入野智久 at 2008年07月20日 01:10
>フローチャートがそんなにいいなら、なんでビジュアルプログラミング言語が現場で使われないの?
少なくとも,私の周りの現場ではSimulinkはよく使われる大事なツールです.あなたが見てきたものだけが現場ではないんですよ.
「おもちゃ」という表現は,私には侮辱に感じました.

Posted by nishida at 2008年07月20日 01:04
確かにプログラム詳細仕様としてのフローは
書きにくいのではあるが
「分からない奴に対しても分かり易く説明する能力」は
むしろ情シス屋にこそ必須の能力であるからして
プレゼン・説明目的のフローはばきばき書けなきゃダメ
なので
情シス屋にとって「フローチャート書ける能力」は
むしろ重要性を増している。

あと
新人は簡単なループ処理もろくに書けない
というかきっちり理解しないまま既存コード流用で
お手軽に済ませる奴が多いので
連中の理解度を計るにはフロー書かせると
けっこう露骨に差が出て判断しやすい。
Posted by r at 2008年07月20日 00:15
フローチャートをこの程度に考えているエンジニアなら、早めに辞めたほうが良い。
複雑な物事を丁寧に記述する能力がないのですね
Posted by sss at 2008年07月19日 22:48
盛り上がってますな。
だんさんの狙い通りだ。
Posted by ダンラザー2 at 2008年07月19日 22:40
>フローチャートが許されるのは小学生までだよねー
しかし,実際のところ小学生(またはそのレベルの人)に
プログラミングやアルゴリズムを教えるのに,
フローチャートはかなり役に立つのだが。

中学生以上になっても使ってたらだめじゃん,
というのは同意。
Posted by tnk at 2008年07月19日 22:24
んじゃ、どうやって多人数でコミュニケーションしつつ設計すんの?
Posted by あ at 2008年07月19日 21:52
まじで「フローチャートが許されるのは小学生までだよねーキャハハハハハ」
って思ってたので、これはツボ。爆笑。納得。
正直、フローチャートなんて理解できない人間のためにあるようなもので、プログラマーには必要ない。
プログラマーに必要なのはそのコードのアルゴリズムなんかを自力で考えだす能力そのものの方。
プログラミング!=お絵描きなのだから。

#フローチャートはすっかり供養されたとしても、親戚のUML図なんかはやはり生存してるんですかね
Posted by U D at 2008年07月19日 21:19
>>しかし、これらのヴィジュアルプログラミング言語がおもちゃ以上に普及した試しがない。

う〜ん、LabVIEWとかMATLAB/Simlinkとかのグラフィカル言語はものすごく普及してると思いますが、いかがでしょう。

もちろん、ウェブ業界やSI業界のような、科学技術計算とは縁遠い世界ではグラフィカル言語も「おもちゃ」になってしまうのかもしれませんが。

Posted by aaa at 2008年07月19日 19:17
「萎えたプログラマーの価値は、萎えたチンコに劣る。」

蓋し名言也。
時々全く勃たない自分に絶望します。
バイアグラ代わりにこのblogを読ませて頂いていますが…
勃起不全の無い人生を送りたいんですが。。
Posted by 11031 at 2008年07月19日 18:16
Microsoft Visioをバカにするな。売れてる。Visioはちゃんと売れてるぞ。ファンもいる。プレゼン以外にも使う。

いいか。大切なことは、コード化しやすいフローチャートじゃない。苦しくても辛くてもフローチャート通りにコードを組むことなのだ。そうじゃないと保守と更新が本当に面倒くさいんだ。

なぜなら、管理するのはプログラマでも賢い小学生でもなく、普通の文系オジサンだからだ。読めないよ!プレゼン現場で見慣れたフローチャートぐらいしか。そのとおりに作っとけよ。管理にばっか譲歩を求めるんじゃなく、開発の人も分かりやすい書類を作る努力をしてよ。マジで。

プログラマがそういう考えだから、仕様書工房とかが売れるんだ。
買ったよ最新版も。くそう。
Posted by -*- at 2008年07月19日 17:46
>萎えたチンコに劣る

先生・・・下品すぎw
Posted by sf at 2008年07月19日 17:42