目的指向なプログラミング学習

プログラミング学習の理想像

最近ちょっと嬉しいことがありました。といっても自分のことではないんですけどね。クラスの友達のプログラミング初心者2名が自分で作りたいものを見つけて、楽しそうにプログラムを書いている様子を見るのがなんとも嬉しいです。これは、funnyだしenjoyableだしinterestingな喜びです。


2人ともプログラムの経験は1年のときの情報基礎の授業でC言語のプログラムを少しかじっただけで、そのあとも特にばりばり書いていたということはなく今の1年生とほとんど変わらないと思います。


1人は英語の勉強のために単語帳を作って勉強していたのですが、最近それが面倒になったようでプログラムを作り始めました。ファイルに書いてある英単語をランダムで出し、意味がわからなかった場合は特定のキーを押して意味を表示するという簡単なコンソールプログラムをすでにほぼ完成させています。でき具合はなかなか満足なようで、さっそく使っているようです。


もう1人は同じ研究室の友人でとりあえず東方好きな友人です。研究室ではC++LuaPythonが必須ということで、僕が一緒にシューティングゲーム作ってPythonの勉強しようかと言ったら、そりゃ面白そうだと乗ってきてくれました。早速キャラの表示の仕方や動かし方を覚えて、今日はすでに凛を表示して動かしていました。次はライダーを凛の後ろにくっつかせて動かすんだと意気込んでいます。


この2例からプログラミング言語を学ぶ際の理想像をかいま見ることができると思いますが、今プログラミング言語を勉強している方はどう思われるでしょうか。以下に自分の経験と照らし合わせて目的指向なプログラミング学習について書いてみます。ちなみに目的指向=Object Oriented=オブジェクト指向とかけてみました。

挫折する理由はなんなのか

プログラミングを勉強しようとして挫折した人はまず、なんのためにプログラミングを勉強しようとしたのかをよく考えて欲しいです。ちなみに僕がはじめてプログラミングに触れたのは高3のときです。家にあった新C言語入門スーパービギナー編(林晴比古著)の本を見て、プログラムって作れるとなんかカッコよさそうと思い、テキスト通りやってみて1週間で挫折しました


今ならその原因はよくわかります。プログラミングそのものが目的でそれ以外の目的がなかったからです。ぶっちゃけプログラミングそのものを勉強しても全然楽しくありません。学校でやる勉強は強制的に教えられるからそのことに目的がなくてもなんとなくやっていけますが、自分でやろうと思ったことにはそこに喜びを見出すか確固たる目的がなければなかなか続けることはできません。


逆に言えば目的が見つかればどんどん進んでいけるということです。しかし、そのやる気を起こさせる自分のレベルにあった目的を見つけるのはなかなか難しいです。しかも、もしなにかやりたいことが見つかったとしてもそれが自分の力ですぐに実現できるものなのか、やる気を継続できるレベルのものなのかといった判断は困難です。実現困難な目的に突き進むとき、力が湧いてくる人もいるでしょうが逆に意気消沈してしまう人もいるはずです。

目的を見つける前提条件

そもそもプログラミングで何を実現できるのかもわからない状態では目的を見つけ出すのはできないでしょう。普段パソコンで操作しているアプリケーションは全て実現可能なのですが、どんなことができるのかという想像を広げるためにもまずはパソコン操作全般を知ることが前提条件です。この条件に合致するかどうかの判定も難しいところですが、「自分から必要性を感じてフリーソフトを見つける」ことは目的を見つけ解決する第一歩になると思います。


いろんなツールやゲームをやることでどんなことができるのかがわかってきます。あれとあれを組み合わせたらもっと便利なものができるんじゃないかと思えればしめたものです。

目的を見つけるまでの2通りの方法

上の前提条件を満たした上でいろいろやっていればたいていやりたいことが見つかると思います。僕の経験によると2通りの目的の発生のしかたがあります。

  1. ツールやゲームをしながらこれこれの機能が欲しいという思う。
  2. CやPythonなどの言語に備わった機能を見てこれこれができるんじゃないかと思う。

普通の人はまず1番目で目的が見つかると思います。これは非常に重要なことですべてのソフトウェアの原点だと思います。しかし、初めてやるには難しい問題であることが多く、前の日記の言葉で言えば想像する到達点までの空白が大きすぎて埋められない可能性が高いです。


2番目の方法で目的が見つかった人はラッキーで、言語に備わった機能すなわち関数やクラスの使い方を調べるだけでやりたいことが実現できます。基本的にこういう方向で目的が見つかればスムーズに上達できるのではないかと思います。


まずはそのプログラミング言語に備わっている基本機能(すぐに実現できること)の概要を見てみること、そして自分が実現したいことを思い浮かべる。基本機能は複数の機能で構成される集合であり、目的もまた潜在的には複数存在する集合のはずです。この2つが重なり合う部分がないかを探すこと、これが目的発見の良い方法ではないかと僕は考えます。

プログラミング言語の選択

普通の人はそれぞれのプログラミング言語に備わっている機能なんて知ったこっちゃないでしょう。上の項では言語に備わっている概要を調べろと書きましたがプログラミング言語は複数あります。どの言語を選べばよいのかは論争にもなりうる大きな問題です。そして、大学ではCやJavaなどを押し付けてきます。まずは接する機会のあった言語の概要を調べてみるのが良いと思います。初めの友人の例ではC言語でやりたいことを実現する方法を見つけることができました。


しかし、僕が思うに欲求は高いレベルで生じるものです。2人目のシューティングゲームはまさにその通りです。文字列の操作がどうとかメモリの取得開放といった低レベルな機能は目的となかなかマッチングしにくいのです。そして、言語には低いレベルのことしか実現できないものから高いレベルのことが実現できるものまでさまざまな種類が存在します。


高いレベルのことができる言語は遅く、低いレベルのことができる言語は速いと言われたりもしますが、パソコンの高速化から目的達成において問題になることはないと思います。むしろいたずらに速度を気にするせいで低級言語に挑戦して敗れ去ることが多い気がします。今後の経験としては良いと思いますが、そのまま戻ってこれない可能性もあるので注意が必要ではないかと思います。*1


要するに高いレベルのことが最初から実現できる言語をお勧めするということです。プログラミング学習で重要なのはハードウェアの基礎構成や動作原理を理解することではなく、やりたい目的にマッチしやすい機能を持っている言語を選択することなのです。

コンパイル言語とスクリプト言語

コンパイル言語
C,C++,Delphi,Fortranなど
スクリプト言語
Perl,PHP,Python,Ruby,Luaなど

僕は最近PythonにはまっていますがPythonに限らずスクリプト言語をお勧めします。「スクリプト言語は言語にあらず」なんて言う人はいないと思いますが、スクリプト言語というとなんとなく安っぽい感じがするのも確かです*2。それで本当に大丈夫なの?と。しかし、プログラミングの概念を理解することができるし、すぐにいろんなことができます。そしてもちろんスクリプト言語で学んだ概念はコンパイル言語でも役に立ちます。なによりいろいろな企業で業務に使われているという事実もあります。


スクリプト言語にも複数ありますが、

  • 近くにその言語を使っている人がいる
  • 本屋で良さそうな解説書が見つかった言語

といった適当な理由で選んでよいと思います。どれを選んでもたいてい似たような機能はそろっていますし、一つ学んでしまえばほかのスクリプト言語に移行することは難しいことではありません。

入門用書籍について

僕は本で勉強するタイプなので、たいてい入門用の本を買って勉強しています。しかし、律儀に最初からじっくりやっていく必要はないと思います。気負えば気負うほど圧迫感が付きまとうばかりです。ぱらぱら見てどんな機能が備わっているかを確認するためのものだと思って買ってみればよいのじゃないでしょうか。

結論

  1. パソコンがある程度使える
  2. スクリプト言語を一つ見つける
  3. 適当な本を一冊買ってみる、あるいは入門サイトを見つける
  4. 全体の機能概要を確認
  5. やりたいことが基本機能で実現できないか考える
  6. 作りたいものをじゃんじゃん作る

おまけ

ということで、LuaでラグナロクのホムンクルスのAIを書くというのはとても良い学習目的になりうると思います。大学の授業でもCなぞ教えなくていいから、みんなでホムンクルスのAIを書かせて誰がもっとも役に立つものを書けたか競わせれば楽しそうです。

*1:言語や高級言語というのはこういったことを表したものですが、C言語を低級言語といったり高級言語と言ったり、Pythonは超高級言語と言ったりと結構いい加減ですが簡単な参考にはなります。

*2:僕だけでしょうか?