2008年07月19日 16:00 [Edit]
フローチャートがダメな3つの理由
というわけで、前世紀の遺物、フローチャートを供養する試み。
フローチャートと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
先生・・・下品すぎw
いいか。大切なことは、コード化しやすいフローチャートじゃない。苦しくても辛くてもフローチャート通りにコードを組むことなのだ。そうじゃないと保守と更新が本当に面倒くさいんだ。
なぜなら、管理するのはプログラマでも賢い小学生でもなく、普通の文系オジサンだからだ。読めないよ!プレゼン現場で見慣れたフローチャートぐらいしか。そのとおりに作っとけよ。管理にばっか譲歩を求めるんじゃなく、開発の人も分かりやすい書類を作る努力をしてよ。マジで。
プログラマがそういう考えだから、仕様書工房とかが売れるんだ。
買ったよ最新版も。くそう。
蓋し名言也。
時々全く勃たない自分に絶望します。
バイアグラ代わりにこのblogを読ませて頂いていますが…
勃起不全の無い人生を送りたいんですが。。
う〜ん、LabVIEWとかMATLAB/Simlinkとかのグラフィカル言語はものすごく普及してると思いますが、いかがでしょう。
もちろん、ウェブ業界やSI業界のような、科学技術計算とは縁遠い世界ではグラフィカル言語も「おもちゃ」になってしまうのかもしれませんが。
って思ってたので、これはツボ。爆笑。納得。
正直、フローチャートなんて理解できない人間のためにあるようなもので、プログラマーには必要ない。
プログラマーに必要なのはそのコードのアルゴリズムなんかを自力で考えだす能力そのものの方。
プログラミング!=お絵描きなのだから。
#フローチャートはすっかり供養されたとしても、親戚のUML図なんかはやはり生存してるんですかね
しかし,実際のところ小学生(またはそのレベルの人)に
プログラミングやアルゴリズムを教えるのに,
フローチャートはかなり役に立つのだが。
中学生以上になっても使ってたらだめじゃん,
というのは同意。
だんさんの狙い通りだ。
複雑な物事を丁寧に記述する能力がないのですね
書きにくいのではあるが
「分からない奴に対しても分かり易く説明する能力」は
むしろ情シス屋にこそ必須の能力であるからして
プレゼン・説明目的のフローはばきばき書けなきゃダメ
なので
情シス屋にとって「フローチャート書ける能力」は
むしろ重要性を増している。
あと
新人は簡単なループ処理もろくに書けない
というかきっちり理解しないまま既存コード流用で
お手軽に済ませる奴が多いので
連中の理解度を計るにはフロー書かせると
けっこう露骨に差が出て判断しやすい。
少なくとも,私の周りの現場ではSimulinkはよく使われる大事なツールです.あなたが見てきたものだけが現場ではないんですよ.
「おもちゃ」という表現は,私には侮辱に感じました.
(私はコーディングとかできない、数学上手でない理系人間です。)
このお話って、「アルゴリズム」という考え方に意味がない、という主張なのでしょうか?
アルゴリズムとフローチャートの差を私はちゃんと説明できないので、気になります。
UMLはどうなんでしょう。供養されるべき?
フローチャートがなければDFDやUML等の図解方法て生まれてないわけで。
フローチャートがあったから、今のビジュアルプログラミング言語ができたわけで。
ビジュアルプログラミングが駄目だからフローチャートだが駄目といってる時点で、
この人は議題を正しく理解できていないね。
ビジュアルプログラミングに関しても、simlinkやrhapsodyのようなソフトが、開発現場で普通に使われていることを知らないんだね。
他の記事もそうだけど、あなたは自分の見識に問題があることを自覚した方がいい。
手続きというよりは関数型に近いという印象を受けます.
並列動作と遅延実行のモデルで記述します.
私はおもちゃでは無いと思いますけど,
限られたアプリケーションに特化することで
なんとか実用的になっているという側面はあると思います.
>であって、手続きは手段に過ぎない。
>フローチャートが許されるのは小学生までだよねー
下流工程しかやったことがないエンジニアなのですね、わかります。
せめてちゃんと自分の立場と領域を説明してから語ったらいかがでしょう?
フローチャートを表現方法とプログラム言語をごっちゃに考えてる
時点でその程度だと感じてますが…
他人(主に新人)に既存のプログラムを教えるのにはフローチャートを利用してます。
アレは絶対ダメでコレが絶対に良いという考え方はプログラマ向きではないですね。
それとは別件ですが、上の画像、著作権とか大丈夫ですか?
上流工程と下流工程として切り離して、「俺達は上流だから偉いんだぜ」と
思ってる老害しょうか?上流工程と下流工程という区切り自体が時代遅れ
だということを、そろそろ自覚していただいた方がよろしいかと存じます。
レポ〆前なのに萎え萎えです。
あと適当にググると2chやらはてなやらばっか出てくるのどうにかして下さい。
検索の邪魔です。眠いし。
今職場でフローチャート書いてって言われて萎えたので通りますよ
うん、こうやってサボってしまうしマジで役に立ちませんね
おおむね記事に同意なんですが何でこんなに責められてるんだろう
ちゃんと「プレゼンには有効」「後からの説明向き」とかフォローしてるし
その通りでしょう
あと上のほうのコメントで、
コードをわかりやすく説明する能力がどうたらこうたらとか言ってますが、
そんな細かい所、お客さんとかプログラムも出来ないような
オッサンにわざわざ説明します?
工数の無駄ですよそんなもん。可哀想な職場だと思いました。
I/Oインターフェース考えたり整理するのに便利。
デジタル電子回路設計とフローチャートはきっても切れない関係だし。
弾さんソフトはめっぽう強いけど電子回路はどうなのよって思うときあるな。
プレゼン以前に仕様を確定しなければならないわけですが、
物流やら製造やらのシステムだと、情報を「誰が入力するか」「どのシステムから受け取るか」
「このパターンの不良品はどこで発見されて、誰が管理するか」って処理の順序が重要なので。
各人の箇条書きから、処理の流れや情報処理の穴埋めをしていく感じですね。
勝手に説明書作って「これからはこれでやってね」は通じないでしょう。
現場までオブジェクト指向にはなりませんよ。
>そんな細かい所、お客さんとかプログラムも出来ないような
>オッサンにわざわざ説明します?
>工数の無駄ですよそんなもん。可哀想な職場だと思いました。
現実的には、そういう説明役はシステム全体が理解できる少数の「出来る人」に丸投げしてますね。
でもそれが無いと、工場の方が「今はどうやってるのか」「これからどうしてほしいのか」
の刷り合わせの時点で行き詰るので。
特に大人数相手になると、文字だけで説明する&説明してもらうのは大変ですよ。
以前シミュレータ組むのに使ったことあるけど、PID系の簡単な制御なら簡単に使えたけど、ブロックの中味に学習項とか付けようとすると、自分でスクリプト書かないといけないから、結局ほぼテキストプログラミングになっちまったぞ。
自分のためじゃない
人のために書くものなんだ
みつお