数学やプログラミングを通じて学ぶこと

2009/02/01

理学部情報数理学科 大西建輔

みなさん、勉強していますか?してるという人も、していないという人も、何を学べばいいのか困ることはありませんか?

例えば、積分の計算ができるようになったとか、行列の固有ベクトルが求められるようになったとか、なんとか動くプログラムが書けた等はこれまで出来なかったことが出来るようになったという一つの進歩です。

でも、それだけでいいのでしょうか?人によってはプログラミングなんて、一切必要がないかもしれません。日常生活で二次方程式が解けることが必要な人はあまりいないかもしれません。では、何のために数学やプログラミングの勉強をしているのでしょうか?

話は変わりますが、クラッシック音楽の世界では、楽曲分析(アナリーゼ)と呼ばれるものがあります。Wikipediaには次のように書かれています。

楽曲分析(がっきょくぶんせき)とは、その音楽がどう組み立てられているか調べる事である。アナリーゼ若しくはアナリシス(それぞれドイツ語のAnalyse(分析)、英語のanalysisからきている)ともいう。
(中略)
古典的な分析では、メロディーや動機の状態の説明から始め、次第にその発展や経過を言葉で説明し、必要があれば音譜を表に書いたり、グラフにしたりしてわかりやすく示す。
(http://ja.wikipedia.org/wiki/%E6%A5%BD%E6%9B%B2%E5%88%86%E6%9E%90 より)

つまり、作曲家がどのような状況で何を考えてその曲を作ったのか、その曲で何を伝えたかったのかなどを、いくつかの要素に分解していき、考えるということです。それにより、楽曲をどのように弾けば/歌えばいいのかということが理解していけるのです。

自分には関係ないと思う人もいるかもしれません。これが自分の好きな歌手だったらどうでしょう。単にいい曲だと感じるだけのこともあるでしょう。でも、歌詞や曲を深く理解していくことで、これまで分からなかったことも感じられるようになるのではないでしょうか。これは、音楽に限らず小説等でも同じです。何だか意味が分からないなぁと思うようなことで も、何年も経って再度読んでみると、ふと分かるときがくるのではと思います。

さて、話を数学やプログラミングに戻しましょう。数学やプログラミングを通じて学んで欲しいこととして、単なる計算能力やコーディング*1だけでなく、論理的能力があります。ここでいう論理的能力とは、物事を個々に分解し、それらの個々の事象の関係から何ができるのか/できないかを推測、または発見する能力です。

例えば、パソコンを使っているときに、ブラウザ*2が動かなくなったとしましょう。そんなときどうしますか?電源を切るのでしょうか。多くの場合はそれで動くかもしれません。でも、すぐに同じ状態に陥ることもあります。それでは堂々巡りなので、電源を切らずに何が動かないのかを考えます。つまり
1. OS(Windows, Mac OS, Linux等)が動作しなくなった,
2. ブラウザが動いていない,
のいずれであるかを調べます。1の場合、電源を切り再起動をするしかありません。同じ状態が何度も起こる場合は、OSを再インストールするのがよいでしょう。2の場合は、次のような理由を考えることができます。
a. ネットワークが繋がっていない。
b. ネットワークは繋がっているけど、サーバとの通信が終わらない。
c. サーバと通信は終わったが、ブラウザ内でソフトを立ち上げようとしている。

a.の場合は、LANの配線を確認します。無線LANの場合は、ルータまで繋げることができるかを調べます。さらに、学内は繋がっていても、学外との通信ができないという場合もあります。こういう場合は何もできません。自分が何かをしたからといって、ウェブをすぐに見られるようにはならないのです。b.の場合は、ブラウザが何も反応せずにじっと待っているような状態です。Flashですべて記述されたページなどの場合によく起こります。”Loading xx%”などと表示されることもあります。この場合も自分で何かをしたからといって状況が変わるわけではありません。c.の場合は、Javaアプレットが使われている場合に起こります。Java仮想マシンという実行環境を立ち上げるために、コンピュータのパワーが必要とされます。そのため、マシン全体が止まっているようにみえるのです。

a.からc.のどれにあたるかは、自分で判断することができます。a.の場合は、pingコマンドを使うことで、ネットワークに接続されているかどうかを判断できます。b.の場合は、ブラウザのどこかにどれぐらい読み込んでいるかを表示する部分がありますので、そこを確認します。あまりにも遅い場合にはエラーメッセージが表示されます。c.の場合は、HDDに頻繁にアクセスしているなどの症状がでます。

つまり、起こっている現象を見極め、何をすればいいのか/何もできないのかということを判断するということです。上の例では、コンピュータでの話をしましたが、一般の社会でも、このようなことは起こります。○月×日までにある仕事をしなければならない。でも、別な仕事が増えた。明日は子供の学校の運動会であるなんて状態になって、パニックに陥ってもしかたありません。それぞれの物事にどれだけの時間が必要かをよく考え、物事を一つずつ片付けていくしかないのです。

さて、こういう能力を身に着けるには、数学やプログラミングが役に立ちます。プログラムは自分が書いたソースがどう動くのかを考えられなければ動きません。最終的に必要となる結果を得るために、○○と××が必要で、ここで定義、初期化してということを理解する必要があります。試行錯誤だけでできるのは簡単なプログラムの場合だけです。また、数学の証明というのも同様です。あることを証明するために、道具を準備し、それぞれが今の状態で使えるかどうかを吟味し、組み合わせていくことで一つの証明が完成します。どちらも感覚だけでは、終わらないのです。

また、こういったことを行なうには最低限の知識は必要です。先ほどの例で話をすると、pingコマンドで何ができるかや、どう使うのかを知らなければ、使うことはできません。道具となるような部分は覚えるまたは調べるということができなければなりません。たとえ、調べても書いてあることが理解できなければ何の役にも立ちません。少なくとも、理解できる程度の知識は必要となってくるのです。

皆さんが基礎的な知識とそれを活用できる論理的能力を身につけて卒業していくことを切に願います。

*1 ここでのコーディングとは、プログラムの中で行うことがすでにわかっており、プログラミング言語に変換することを言う。
*2 ウェブサイトを見るためのプログラムをブラウザといいます。有名なブラウザに、Internet Explore, Firefox, Operaなどがあります。