「プログラムを話す」 --- なんでプログラマの言うことは良くわからないのか
2005年10月04日17:42
*言葉で考える
「今日何をしたっけ」とか「メシ何食ったっけ」とか、そういうことを覚えているのは、短期記憶の仕事だ、と言うことは良く知られていることだと思う。 こういう短期記憶はあまり大切でないので、しばらくするとすぐに忘れてしまう。
だが、大切な情報は何度も何度も繰り返し思い出す必要に迫られるので、だんだんと記憶が固定化して忘れなくなっていく。 これが繰り返されると、最早、思い出すという感覚を超えて当たり前だと思えてくるようになる。 これが長期記憶だ。
人は言葉の学習において単語の記憶に長期記憶を使う。 だから、試験の前に一気に丸暗記して何とか80点を取れたとしても、だいたい終わればきれいさっぱり忘れてしまう。 いくら勉強しても英語を話せるようにはならない。
単語帳などを使って何度も何度も思い出す練習をすると、確かに忘れないようになる。だが、これも何度やってもなかなか話せるようにはならない。これは、言葉と言うのは、ある程度条件反射の要素を持っているので、言葉が実際の生々しい体験と結びついていないと、話すとき、聞くときにすぐに思い出せないからだ。
逆にその言葉を話す環境に身をおいていると、何度も何度も生々しい経験と共にその単語を聞くことになる。 すると、徐々に思い出すという状況を超えて最早当たり前のように感じられるようになる。
こうやって出来上がった「当たり前」を組み合わせて人はいろいろなことを考えるのだ。
------------------------------------------------
*プログラムで考える
システム開発と言うのは、今まで無かった物を既に有る物に変える作業だ。 当たり前だが、だからこそ、作っている物は、誰もがいまだかつて見たことも無い物なのだ、
プログラマの仕事は一つ一つの問題を何度もよく考えて問題解決方法の要点を見抜く作業から始まる。 そして、理解しただけで終わることは無く、一個一個が当たり前なものと感じられるようになるまで、何度も考えるのだ。
これは、単語を覚える作業とどこか似ている。
問題の解決方法を一度見抜いたら、それを当たり前の事として、プログラマの頭の中で長期記憶化する。 以降は、その新しく作り出した「言葉」を使って新しい問題に取り組むのだ。 こうして、無数の問題と取り組んでいく作業がプログラミングという作業なのだ。
こうやって出来上がった「当たり前」を組み合わせてプログラムを考えていく。
システム開発が終わってみると、複雑に絡み合った「当たり前」の連鎖が無数に連なっていることに気が付いて驚く事がある。
それは、その人にしか通じない独自の言葉を話していることとさほど変わらないのだ。 考えてみれば恐ろしい状況である。 自閉症で独自の不思議な言葉を話すようになってしまい誰ともコミュニケーションをとることが出来なくなってしまった可哀想な子供を彷彿させる。
もちろん、経験をつんだ優れたプログラマは、そういう膨大問題解決の連鎖にパターンを見出す事ができる。どんなシステムでも意外と似たような問題に対する典型的な解決の連鎖であることに気が付くのだ。 だが、残念ながら、これには、相当な経験と才能が要求される。
だが、案外とその才能とはと自分の努力で得られる。 必要な才能とは、自分の中の「当たり前」をどこまで破壊できるか、というセンスのことなのだ。 自分が当たり前だと思っている事を破壊するというのは、ある種の度量を要する。 自分の当たり前を破壊することにどこまで執着できるのかという事なのだ。 これは、 生まれ付きの才能とは違う。 努力によってのみ得ることが出来る。
------------------------------------------------
*何でプログラマは説明が下手なのか
人はよく、「一言でわかりやすく説明してくれ」と言う。 確かに、手短に必要な点だけを要領よく話すということは、合理的で正しい基準だ。
だが、システム開発だけに関しては、そう一筋縄ではいかない。 結果だけを聞くと、非常に意外で奇抜ですらある場合が多いからだ。 実際に順を追って理由を聞いてみれば、なるほどと理解することが出来る。だが、状況によってはその作業に非常に時間を要することも多い。
ソフトウェア開発のコストの話などが典型例ではないだろうか。 ものすごい大量の機能を持った高性能で応用性の高い優れたソフトウェアの方が、汎用性が無い低機能なソフトウェアよりも開発コストがかからないというケースは、そうまれなことではない。 極論してしまうと、ほとんどの場合そうだ。
最初の段階である程度しっかりとコストをかけておいた方が、プロジェクト全体としてみると安上がりだ。 良くあるように、最初の段階で手を抜いて作ったプロトタイプをだましだまし使っていると、2~3年後にはちょっとした機能追加にも目の玉が飛び出るほどの費用がかかるようになる。 というのもよくある話だ。
だが、これが何でそうなってしまうのかを一言で説明することは非常に困難だ。
例えるならば... 怠惰に手を抜いて作られた整理収納のない事務所で複雑な事務処理をすると、年月と共に徐々に仕事が遅くなり、しまいには書類を出すのもしまうのも2~3日かかるようになって仕事にならなくなってしまう、という状況と似ている。
だからこそ、複雑な事務処理をしなければいけないときは、みんなオフィスのシステム化にお金をかける。それが、後々になって大きなコストダウンにつながるということが良く知られているからだ。 だが、システム開発では、何故か誰もそれをやらない。 後になってお金がかかるようになってから、ようやく大騒ぎになる。
都合の良いことに、プログラマの仕事というのは他の人には見えない。だからそんな怠惰の結果、無茶無茶に散らかった事務所を他人に見られることは無い。こうして、営業担当がバナナの叩き売りよろしく豊かな創造性を駆使してあらゆる理由を作り出し、お客さんからお金を掠め取っていく。 正直、僕はそんなシステム屋に仕事を頼みたくない。
これらは例え話なので、もっともらしく簡単に聞こえるが、実際にはもっと多くの要因が絡み合っている場合が多い。判りやすいように最初から順を追って説明していくと、説明が終わった頃には最初に説明したことを忘れているという、志村ケンのコントの様な状況に陥る。
これは、システムと言うもの自体が、大量の「単語」と同じような「当たり前」が連鎖で出来上がっているからだ。 これを短期記憶で片付けようとするからこそ、志村ケンのおばあちゃんのコントの様な状況に陥ってしまうのだ。
そんな問題を回避するためには、まず、話し合っている人同士で同じ言葉を共有するところからはじめなければいけない。言葉の定義...何故その言葉が必要なのか、その言葉はどういう意味なのか...について話し合うという気の長い、根気の要る作業が必要なのだ。
実は、こうも言える。プログラマはミクロ的に細かい問題を大量に扱っている。 だから、一般ユーザーのようにマクロ的見方をすると、プログラムが組めなくなってしまう。 だからこそ、またもや説明が下手であるという評判を受けてしまう。
ミクロ的視点、マクロ的視点の両方とも同時に出来るプログラマというのは現時点では非常に貴重なのだ。 そのことに気が付かない限り、これらの問題は解決しない。
------------------------------------------------
*僕が今作っているプログラムについて
実は、プログラムを作る人(プログラマ)と使う人(ユーザー)は 、同一人物であるのが最高に理想的なのだ。 何故ならば、これまで見てきたように、プログラマとユーザーとのコミュニケーションが非常に困難だからだ。
開発でかかる半分以上の時間がここで費やされるといっても過言ではない。 プログラマとユーザーが同一であるということは非常に生産性の高いことなのだ。
そういえば、80年代前半ではプログラマのことをユーザーと呼んだ時期があった。 80年代に当時としては非常に珍しいコンピューターグラフィックを駆使した「トロン」という映画が流行った。あの映画の中でははっきりと今のプログラマのことをユーザーと呼んでおり、ストーリー上重要なキーワードを占めていた。
当時はまだコンピューターが一般的ではなかったから、当時コンピューターのユーザーといえば、プログラムを組む人でしかありえなかったのかも知れない。 だが、それだけではないとおもう。なんといっても、当時はプログラミングが、今よりはるかに簡単だったのだ。 誰でもプログラムを書くことが出来たのだ。 だからこそ、ユーザーは全員プログラマだった。
大体、当時のコンピューターは電源を入れた直後にプログラムを組み始めることが出来た。 そして、すぐに実行結果を表示することが出来た。だから、当時は僕みたいな子供でも簡単にプログラミングを楽しめた。 --- 今では夢の様な話だ。
今のプログラミング環境は規模が巨大で要素が多過ぎるため、とてもではないけど初心者が簡単にプログラミングを楽しめる状況ではない。
もしも、プログラミングという作業自体があらゆるプログラミング上の制約から解放されており、思考ツールとしての要素を完全に満たしている、つまり思いついたことを思いついたように書くだけで思い通り動く、ということが現時点で実現できたなら、恐らくソフトウェアの生産性は飛躍的に向上するだろう。
僕は、今ではエンドユーザーと呼ばれている人達にもっとプログラミングの楽しさを知って欲しい。
僕が今作っているのはそういうシステムだ。
「今日何をしたっけ」とか「メシ何食ったっけ」とか、そういうことを覚えているのは、短期記憶の仕事だ、と言うことは良く知られていることだと思う。 こういう短期記憶はあまり大切でないので、しばらくするとすぐに忘れてしまう。
だが、大切な情報は何度も何度も繰り返し思い出す必要に迫られるので、だんだんと記憶が固定化して忘れなくなっていく。 これが繰り返されると、最早、思い出すという感覚を超えて当たり前だと思えてくるようになる。 これが長期記憶だ。
人は言葉の学習において単語の記憶に長期記憶を使う。 だから、試験の前に一気に丸暗記して何とか80点を取れたとしても、だいたい終わればきれいさっぱり忘れてしまう。 いくら勉強しても英語を話せるようにはならない。
単語帳などを使って何度も何度も思い出す練習をすると、確かに忘れないようになる。だが、これも何度やってもなかなか話せるようにはならない。これは、言葉と言うのは、ある程度条件反射の要素を持っているので、言葉が実際の生々しい体験と結びついていないと、話すとき、聞くときにすぐに思い出せないからだ。
逆にその言葉を話す環境に身をおいていると、何度も何度も生々しい経験と共にその単語を聞くことになる。 すると、徐々に思い出すという状況を超えて最早当たり前のように感じられるようになる。
こうやって出来上がった「当たり前」を組み合わせて人はいろいろなことを考えるのだ。
------------------------------------------------
*プログラムで考える
システム開発と言うのは、今まで無かった物を既に有る物に変える作業だ。 当たり前だが、だからこそ、作っている物は、誰もがいまだかつて見たことも無い物なのだ、
プログラマの仕事は一つ一つの問題を何度もよく考えて問題解決方法の要点を見抜く作業から始まる。 そして、理解しただけで終わることは無く、一個一個が当たり前なものと感じられるようになるまで、何度も考えるのだ。
これは、単語を覚える作業とどこか似ている。
問題の解決方法を一度見抜いたら、それを当たり前の事として、プログラマの頭の中で長期記憶化する。 以降は、その新しく作り出した「言葉」を使って新しい問題に取り組むのだ。 こうして、無数の問題と取り組んでいく作業がプログラミングという作業なのだ。
こうやって出来上がった「当たり前」を組み合わせてプログラムを考えていく。
システム開発が終わってみると、複雑に絡み合った「当たり前」の連鎖が無数に連なっていることに気が付いて驚く事がある。
それは、その人にしか通じない独自の言葉を話していることとさほど変わらないのだ。 考えてみれば恐ろしい状況である。 自閉症で独自の不思議な言葉を話すようになってしまい誰ともコミュニケーションをとることが出来なくなってしまった可哀想な子供を彷彿させる。
もちろん、経験をつんだ優れたプログラマは、そういう膨大問題解決の連鎖にパターンを見出す事ができる。どんなシステムでも意外と似たような問題に対する典型的な解決の連鎖であることに気が付くのだ。 だが、残念ながら、これには、相当な経験と才能が要求される。
だが、案外とその才能とはと自分の努力で得られる。 必要な才能とは、自分の中の「当たり前」をどこまで破壊できるか、というセンスのことなのだ。 自分が当たり前だと思っている事を破壊するというのは、ある種の度量を要する。 自分の当たり前を破壊することにどこまで執着できるのかという事なのだ。 これは、 生まれ付きの才能とは違う。 努力によってのみ得ることが出来る。
------------------------------------------------
*何でプログラマは説明が下手なのか
人はよく、「一言でわかりやすく説明してくれ」と言う。 確かに、手短に必要な点だけを要領よく話すということは、合理的で正しい基準だ。
だが、システム開発だけに関しては、そう一筋縄ではいかない。 結果だけを聞くと、非常に意外で奇抜ですらある場合が多いからだ。 実際に順を追って理由を聞いてみれば、なるほどと理解することが出来る。だが、状況によってはその作業に非常に時間を要することも多い。
ソフトウェア開発のコストの話などが典型例ではないだろうか。 ものすごい大量の機能を持った高性能で応用性の高い優れたソフトウェアの方が、汎用性が無い低機能なソフトウェアよりも開発コストがかからないというケースは、そうまれなことではない。 極論してしまうと、ほとんどの場合そうだ。
最初の段階である程度しっかりとコストをかけておいた方が、プロジェクト全体としてみると安上がりだ。 良くあるように、最初の段階で手を抜いて作ったプロトタイプをだましだまし使っていると、2~3年後にはちょっとした機能追加にも目の玉が飛び出るほどの費用がかかるようになる。 というのもよくある話だ。
だが、これが何でそうなってしまうのかを一言で説明することは非常に困難だ。
例えるならば... 怠惰に手を抜いて作られた整理収納のない事務所で複雑な事務処理をすると、年月と共に徐々に仕事が遅くなり、しまいには書類を出すのもしまうのも2~3日かかるようになって仕事にならなくなってしまう、という状況と似ている。
だからこそ、複雑な事務処理をしなければいけないときは、みんなオフィスのシステム化にお金をかける。それが、後々になって大きなコストダウンにつながるということが良く知られているからだ。 だが、システム開発では、何故か誰もそれをやらない。 後になってお金がかかるようになってから、ようやく大騒ぎになる。
都合の良いことに、プログラマの仕事というのは他の人には見えない。だからそんな怠惰の結果、無茶無茶に散らかった事務所を他人に見られることは無い。こうして、営業担当がバナナの叩き売りよろしく豊かな創造性を駆使してあらゆる理由を作り出し、お客さんからお金を掠め取っていく。 正直、僕はそんなシステム屋に仕事を頼みたくない。
これらは例え話なので、もっともらしく簡単に聞こえるが、実際にはもっと多くの要因が絡み合っている場合が多い。判りやすいように最初から順を追って説明していくと、説明が終わった頃には最初に説明したことを忘れているという、志村ケンのコントの様な状況に陥る。
これは、システムと言うもの自体が、大量の「単語」と同じような「当たり前」が連鎖で出来上がっているからだ。 これを短期記憶で片付けようとするからこそ、志村ケンのおばあちゃんのコントの様な状況に陥ってしまうのだ。
そんな問題を回避するためには、まず、話し合っている人同士で同じ言葉を共有するところからはじめなければいけない。言葉の定義...何故その言葉が必要なのか、その言葉はどういう意味なのか...について話し合うという気の長い、根気の要る作業が必要なのだ。
実は、こうも言える。プログラマはミクロ的に細かい問題を大量に扱っている。 だから、一般ユーザーのようにマクロ的見方をすると、プログラムが組めなくなってしまう。 だからこそ、またもや説明が下手であるという評判を受けてしまう。
ミクロ的視点、マクロ的視点の両方とも同時に出来るプログラマというのは現時点では非常に貴重なのだ。 そのことに気が付かない限り、これらの問題は解決しない。
------------------------------------------------
*僕が今作っているプログラムについて
実は、プログラムを作る人(プログラマ)と使う人(ユーザー)は 、同一人物であるのが最高に理想的なのだ。 何故ならば、これまで見てきたように、プログラマとユーザーとのコミュニケーションが非常に困難だからだ。
開発でかかる半分以上の時間がここで費やされるといっても過言ではない。 プログラマとユーザーが同一であるということは非常に生産性の高いことなのだ。
そういえば、80年代前半ではプログラマのことをユーザーと呼んだ時期があった。 80年代に当時としては非常に珍しいコンピューターグラフィックを駆使した「トロン」という映画が流行った。あの映画の中でははっきりと今のプログラマのことをユーザーと呼んでおり、ストーリー上重要なキーワードを占めていた。
当時はまだコンピューターが一般的ではなかったから、当時コンピューターのユーザーといえば、プログラムを組む人でしかありえなかったのかも知れない。 だが、それだけではないとおもう。なんといっても、当時はプログラミングが、今よりはるかに簡単だったのだ。 誰でもプログラムを書くことが出来たのだ。 だからこそ、ユーザーは全員プログラマだった。
大体、当時のコンピューターは電源を入れた直後にプログラムを組み始めることが出来た。 そして、すぐに実行結果を表示することが出来た。だから、当時は僕みたいな子供でも簡単にプログラミングを楽しめた。 --- 今では夢の様な話だ。
今のプログラミング環境は規模が巨大で要素が多過ぎるため、とてもではないけど初心者が簡単にプログラミングを楽しめる状況ではない。
もしも、プログラミングという作業自体があらゆるプログラミング上の制約から解放されており、思考ツールとしての要素を完全に満たしている、つまり思いついたことを思いついたように書くだけで思い通り動く、ということが現時点で実現できたなら、恐らくソフトウェアの生産性は飛躍的に向上するだろう。
僕は、今ではエンドユーザーと呼ばれている人達にもっとプログラミングの楽しさを知って欲しい。
僕が今作っているのはそういうシステムだ。
コメント一覧
mishi 2005年10月06日 03:44
組込系ですが、ちょっと面白いモノを見つけました。
ハード動かす系では珍しくないアプローチなのですが、先日行ってきたCEATECで、実物を見ました。
http://www.sunhayato.co.jp/products/details.php?u=1166&id=02017
http://www.necel.com/micro/product/sc/78k0s/appliletez-pl.html
これだってプログラミングです。簡単は簡単。
これがネットワークにつながれば面白いんじゃないかと思いました。
個人的には、Wiki上でプログラミング&実行できれば面白いんだけどなあ、とか思ってます。
ハード動かす系では珍しくないアプローチなのですが、先日行ってきたCEATECで、実物を見ました。
http://www.sunhayato.co.jp/products/details.php?u=1166&id=02017
http://www.necel.com/micro/product/sc/78k0s/appliletez-pl.html
これだってプログラミングです。簡単は簡単。
これがネットワークにつながれば面白いんじゃないかと思いました。
個人的には、Wiki上でプログラミング&実行できれば面白いんだけどなあ、とか思ってます。