日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年5月21日木曜日

「プログラミング言語」習得への道

プログラミング言語を「言語」ととらえれば、

プログラミング言語を習得するということは、新たな言語を使えるようになるという事だ。

英語やフランス語といった自然言語との違いは、
●話す言語ではない。
●相手は機械(コンピュータ)である。
●コミュニケーションは一方通行である。
●コミュニケーションされる内容は、論理的に整理された情報のみ。

異論はあるかもしれない。
たとえばエンジニア同士でプログラムやコマンドを口頭で説明することはあるではないか?という人もいるだろう。
口頭で説明したとしてもそれはコミュニケーションをするためにプログラミング言語を用いているわけではない。
プログラミング言語だけで、コミュニケーションをする人はいない。(もしかしたら例外的にいるかもしれないがw通常はいない)
よって話すための言語ではないし、プログラミング言語を使う相手は人間ではない。

プログラミングしているときに、コンピュータはエラーを返してくることもある。
これは相互のコミュニケーションであり、一方通行ではないという人もいるだろう。

エラーを返してくるとき、それはどこでどんな障害があるかを人間の言語、もしくは単語の羅列で返してくる。
単語の羅列のときに、プログラミング言語の文法で返してくることは少ないのではないかと思う。
プログラミング言語の文法でうまく動作しなかった場所や、内容を単語の羅列で返してくるだけである。
これは広義のコミュニケーションととらえることもできるがプログラミング言語の範疇には含まれないので、同じ言語でのコミュニケーションではない。

またコンピュータとプログラミング言語で無駄話をする人はいないだろう。
通常は、論理的に整理し、すべての整合性を考え、流れをよく考えたものが最終的なコミュニケーションとして成立する。


これらが最初にあげた自然言語との違いを説明してくれると思う。


-----------
ある言語、たとえば英語を他者とコミュニケーションできるレベルまで習得したら、その人の世界は広がることは誰にでもわかる。
プログラミング言語を、そのコミュニケーションが成立するレベルにまで修得すれば、当然その人の世界は広がることは容易に想像できる。

誤解があることを前提で、簡単な月並みな言い方をすれば「機械と話すことができるようになる」のだからすごいことだ。

これをCGという仕事の世界に当てはめて考えてみれば、今までよりもより多くのCGの領域を体験することができるようになるということだ。


プログラミング言語には多くの種類と入門書があるので、どれから手をつけるべきか迷うこともあるし、いくつかの言語を並行して学習するほうが効果的ではないかという疑問も出てくる。
MELスクリプト
C言語
Renderman言語
Python
Java
そのほかソフトウエア独自の言語。


これらの言語はどれも独自の入門書が出ており、文法も異なる。
CGの世界を見ると、多くの言語がつかわれており、TDには複数の言語を使うことが求められることもある。
一つを習得してから、別の言語を習ってと考えるといったい何年かかるのだろうと途方に暮れることもある。

しかしながら、よく言われるようにある言語を習得した人はほかの言語を習得するのも早い。
そういった人と入門者や初学者のつきあたる壁は異なるように感じる。
あきらかに壁の高さや厚さが違い、まったくの初心者は、畏敬の念を感じると共に、不公平を感じざるをえない。


この壁の違いはなんだろうか?


----------
多くの入門者はプログラミング言語のような独自のスタイルをもった言語になれていない。
そしてそれは先にのべた自然言語と異なる点である。
この、すべてのプログラミング言語に当てはまる部分がしっかりと感覚的に理解できていることが初学者を壁を破るためのポイントではないかと思う。

あるプログラミング言語を習得した人がほかの言語を習得するのが早いのはこの部分がクリアされているからだと思う。
プログラミング言語どうしの違いは、コマンド、記述の順番、記号の違いぐらいで、これらでさえ共通する部分は多々ある。
すこしダブルことだが、大きな違いをあげるとすればソフトウエアによる違いである。
レンダリングソフトと、Mayaなどの汎用3Dソフト。またそれらのソフトと汎用言語であるC言語では言語の目的としていることが異なるので、コマンドの数、種類が大きく異なることがある。といっても同じCGの範囲での作業なのである程度は相互に関連した知識に触れることはある。

記号の違いというのはたとえば変数の表記方法が言語によって違ったりすることである。
これは記号論で考えれば、「変数」という概念を扱う方法はかわっておらず、それを表記する「記号」が異なるだけである。


実際、プログラミング言語どうしの共通点は大きい。
●コマンドというものが存在する。
●変数がある。
●制御文がある。
●論理演算子や関数
これらを組み合わせて、プログラムをつくるのがどの言語にも共通する作業だ。

またプログラムを作成するときには、あることが終わってから次のことをする。
ある結果を出してからその結果を次のステップで使うという流れがあり、それを崩すことはプログラムが動作しなくなることをもある。

自然言語と違い、すべてが論理的に整然とまとめられておかなくてはならない。


これはアルゴリズムの部分だと思うが、プログラミング言語を使うときほど突き詰めて考えることは自然言語にはあまりない。
これがプログラミング言語に慣れていない人には結構つらいところである。



---------------
ここまでをまとめるとプログラミング言語の学習において、初学者の突き当る壁は、いろいろあるが特に入門者に言えることは
プログラミング言語と自然言語の違いではないかということだ。

その次に、コマンドや、変数といった具体的なことがくるのではないかと思う。


この自然言語との違いが感覚的に理解できたとき、多くのコマンドや文法を学ぶことがそれほど苦にならなくなるのだと思う。

しかしながら、言葉でそう書くことは簡単だが、実際にそれだけを分離してトレーニングできるのかどうかは疑問が残る。

「プログラムはたくさん読んで、書いて覚える」これはプログラミング言語習得への鉄則でもある。
そして英語などの自然言語でさえ、「たくさん読んで、たくさん使う」ことが習得への道とされている。
しかも、どちらも言われていることは「近道」はないし、山あり谷ありの険しい道だ。

今、考えているのは、それをなだらかな斜面にして、その道を一つ一つステップを踏んで行けば自然に習得できるドリルのようなもの。
ドリルを自分で作るのか、それとも既存のものを利用するのかまでは考えていない。
いつ完成するのか、そもそも完成させることができるのかもわからない。


でも、自分がステップを登っていくときに注意深く周りを観察し、記録を取っておくことはできる。
そしてそのステップを作るための設計図を描くことにトライし続けることもできるのではないかと思う。


---------
いま考えられることは
1)自然言語とプログラミング言語との違いを感覚的に身につける。
コマンドと言葉の違いという意味ではない。そんなものは見ればわかるし頭では誰でもわかっている。
このステップでの重要点は、自然言語との思考方法の違いを身につけること。

たとえば、「プログラミング言語は完結していないといけない」とか、そういったことが考えたり意識しなくても身に付いているということ。
プログラミング言語が一方通行であることから考えていけばなんらかの方法が見つかるような気がする。

 また、コンピュータは数学の世界からきていることからも数学のなんらかの勉強によって、この感覚を身につけることができると思う。
自分の経験では、コンピュータの歴史でアーキテクチャーの変遷を知り、論理演算をかじることでその機械的特徴を垣間見ることができた。

もし可能であればだが、アルゴリズム的な考え方をプログラムを勉強する前に身につけることができれば理想的。

多くの人は、コンピュータと人間が同じようなものと考えているように思う。
これは広く一般的にコンピュータを理解する上で間違った教育が用いられたからではないかと思っている。
そしてそのことがコンピュータに対する誤解と、ストレス、不適切な感情を生み、コンピュータやプログラミングができることをまるで、すごいことのように見せたり、学習するのをあきらめることに一役買っているのではないかと思う。

本当に違いがわかっていれば、コンピュータは思考する機械ではないことがわかり、操作しなくては動作しないことがわかるはずだ。
そしてそれはプログラミングができない段階でもその感覚を身につけることができるはず。


2)プログラミング言語の正確な文法を学ぶ。
これはコマンドを勉強したり、制御構文を習うということ。


今のところ思いつくのはこのぐらいだが、プログラミング言語を習得するのは、それほど難しくなく、志した人がだれでもある程度のものは作れるようになる。
そんな時代にこれからはなっていくべきだと思う。

 

0 件のコメント:

コメントを投稿