プログラミングを勉強するための基礎と応用を考える

はてなブックマークなどにこの系の記事がいろいろと出たので私もちょっと書いてみます。他の人の記事とはちょっと違うかもしれません。 個人的に「なぜ私がプログラムをうまく作れるのか教えてみないか?」のような話をされたこともありますが、そのあたりは自分が教師にでもなれたら考えます。 まあ、なったつもりでちょっと書いてみたいと思います。このあたりはさわりの部分で周りの部分は省きます。

 

どんな物事でも「基礎」を固めることが重要

プログラミングであっても基礎固めは重要です。他の勉強でもそうですが。プログラミングの場合はおそらく「自分が完全に使いこなせるプログラミング言語を一つ習得する」が基本だと思います。 私の場合は高専時代に勉強していたC言語になります。これだけは補助ライブラリでよく使う関数などもほぼ完全に頭に入っているので、たとえば入学試験や入社試験でライブラリの一部まで問われるようなものが出てきても回答できる自信はあります。 学生時代に試験など教師から問題を出される形式や実習などで数年間固めたものですので基礎としては完璧のレベルです。

これがなぜ重要かというと基礎となる構文構造は他のプログラミング言語であってもそこまで変わることはない、ということです。 わかりやすい例が制御構造です。ほとんどのプログラミング言語で「if~else(~endif)が出てくれば分岐処理」であるのはプログラムをやった人ならほとんどわかると思います。 プログラミング言語はおそらく自然言語よりはこの意味での差は少ないですので。

この手の「基礎」となる言語として

  • 言語が定義している構文が多くない
  • 言語の曖昧さが少ない(=言語の段階である程度警告やエラーがわかる)
  • 言語を使用しているユーザーが多い
  • 実際に会える人でその言語を十分に使える人がいる

を特徴として持つものは特にしやすいと思います。仕事で覚えるのであれば仕事で使っている言語をベースにするのも悪くはないと思います。
・・・基礎を固めていく段階でたま~に「変数名はこれしか使えない」とか変な思い込みをやる場合も多々あったり。その点Fortranの変数仕様はその特徴を持っているので驚きでした。

 

「問題を解く」ことで問題解決の手順を覚える

学生時代に勉強していた部分としてこの部分も有用だと思います。仕事でも勉強でも初めは上司や先輩、教師から「この問題を解け」と言われてプログラムを作るところが始まります。 まあ一発で十分に動くものが作れることはまずないでしょうが、このときに発生した問題をどうやって解決して次に進むか?に関わってくると思います。 「どこが間違いなのか」「なぜ間違いなのか」「どうすれば正常になるのか」を覚えていく、という行程を踏んでいくことで新たな問題に直面したときに解決の方法を考えることができると思います。 この手順が抜けると新たな問題が出てきたときに自分で問題点がどこにあるのか?を推察ができなくなるので質問をすることすらできなくなって疑問の範囲が広大になってしまいます。 基礎を固めていく中でこの繰り返しをある程度やっていった方がいいと思います。

なお、このことに関してはプログラミング以外の勉強や仕事でも同様だと思います。 特に記憶系ではないものはこの性質を持つことが多いです。数学は言うまでもないですが、ほかの科目でもこういう状態は多々発生します。 そのため、「何を問題としているのか」などを読み取る力は義務教育時代に身につけられれば問題はないのですが・・・。

 

「応用」は自分がやってみたいことを形にすること

私の場合は明確に「ゲームが作りたい」だったので進む方向が簡単でしたが・・・。 基礎が固まった後なら市販のゲームの作り方に関する本を読んでもサンプルからある程度は作ることもできると思います。 もちろん、自身が持っている基礎だけを使って簡単なもの(よくあるのは数当てゲーム、じゃんけん、しりとり、文字を使ってトランプを表現するなど)を作るのもいいです。 基礎が固まらないうちに作り方の本を読んでもその部分が何をやっているか推察すらできない状態になって「わからない」=>「できない」のコンボが成立する悲しい状態になると思います。 あとはやはりトライ&エラーですね。基礎を作る段階で「問題を解く」ことを何回もすることでこの応用部分で自分がしたいことをやってみて「実装」=>「エラー」=>「修正」=>「理解」が成立できるのではないでしょうか。

実際に私の場合、もう10年も前の話ですが、DirectDrawという2D描画に関するルーチンでゲームを作っている解説本を読んだときにとんでもない勘違いをしていたことがありました。 そのゲームの解説本ではDirectDrawで描画を行うサーフェイスをプライマリサーフェイス(実際の画面状態の管理)x1とオフスクリーンサーフェイス(画面に描画する前に裏で絵を合成する)x1しか作っていなかったので「サーフェイスは1種類に1つしか作れない」ということを思い込んでいたり。 テストコードとして作ってみればオフスクリーンサーフェイスは何枚でも作れることがわかるのですが・・・。

なお、ゲームのサンプルと言ってもだいたいは最小限のことしか書いていなかったり、いろいろとはしょっているものもありますのでそのあたりは(その系の本がいっぱいある)書店で流れ読みしてみて自分に合うかどうかを見てみる方がいいでしょう。 もちろん、付属のCDからコピーしてプログラムを作成、では意味はほとんど無いですよ。自分でコードを書いていくことでそのコードが何をしているのか(もしくは何のためにあるのか)をある程度理解することが重要です。 今の時代だと統合開発環境のおかげで各処理の引数の意味やその処理が何をやるものなのかを簡易的に表示するのでさらに参考になると思います。

 

自分だけの環境なら「デバッガで動きを追いかける」や「バグを作ってみる」のも逆によいこと

逆に「この値を与えたときにはどういう状態になるのか」を見るのも応用を考える上ではいいと思います。基礎の段階ではどうせ記述ミスなどでバグを作ってしまい、それを解決する、という手順をとりますが。 今時のWindowsならよほどのことをしないとOSそのものが吹っ飛ぶなんてことにはなりませんので間違えた結果を見てその状態を覚えることが別の問題を見たときにその問題を解決する糸口になることがあります。 昔はこのやり方をとれなかったんですよね。バグを出すとOSが一発でふっとぶもんだから・・・。

ただし、他者には絶対に迷惑をかけないという条件で、です。特にWebでのプログラムが多くなってきている関係でphpやJavaScriptなどをオープンな環境で使うと大変なことになります。 この場合はローカルな環境を構築してやりましょう。htmlやcssならローカル参照だけにすればよいですし、PCが1台あるなら仮想マシン内にサーバーを構築するなりWinXPを動かして見るなりしましょう。 たまにグローバルな環境でWebプログラムをテストしていると相手先に迷惑になったりセキュリティホールを一時的とはいえ作り出して・・・。

 

「基礎」は勉強、「応用」はやってみる

これがプログラミングをやるときの私の基本的な意見です。普通の勉強と同じ答えを書いただけのような気もしますが。 基礎となる部分を本などで勉強をすることが初めの段階では重要です。無意味に見えても章末なんかについている問題を自分でやってみることが良いですね。 一からプログラミングを勉強するときは「初心者向けとして評判がある」「練習問題がついている」本を選ぶと良いのではないでしょうか。

とはいっても「仕事で覚えろ」といわれているときはそんな余裕はなかったりします。プログラミングの基礎があれば難易度はだいぶ下がるのですが。

 


コメントを残す

メールアドレスが公開されることはありません。

*

この記事のトラックバック用URL