どうも、solaです。
今回は私の経験を元に、プログラミングを独学で身に付けるためのヒントなんかを語ってみようと思います。
初心者に向けた内容となっています。特に、プログラミングの勉強に一度は挫折してしまったけれど、それでも独学で身につけたいと思っている方(過去の自分のことです)やUnityなどのゲームエンジンをひと通り触っているが、プログラミングについてはよく分かってないので勉強したい方は是非ご一読を。
ちなみに、私のプログラミングとの付き合い方ですが、あくまでゲーム制作が目的であってプログラミングはその手段でしかありません。車輪の再発明はしませんし、面倒だったり難しい処理はライブラリ頼りです。テクニカルなコーディングは苦手で愚直な感じで組んでます。シミュレーションや解析、AI、昨今の3D技術、高度なアルゴリズムなんかも、さっぱりわかりません。スタンドアロンのゲーム制作において、処理(移動とか当たり判定とか、メッセージの文字送りとか、セーブとか……)について設計し実装することにおいてはほぼ問題ない程度のスキルレベルという自己評価です。
実際、どんなものを作ってきたのかというと、C++とDirectXで2DRPGやノベルゲーム、VBやC#+.NETでマップツール・アニメーションツールなどのゲーム制作関連ツール、それから現在公開しているモバイル向け3Dゲームが代表的な作品です。
前置きが長くなりましたが本題に入ります。
■プログラミング学習の段階
まずは、プログラミングを学ぶ段階を挙げてみます。最終目的はゲームプログラミングです。
1.プログラミング入門
プログラミングがどういうものかを学ぶ段階。
2.任意のプログラミング言語の文法、プログラミングの構築手法(手続き型や構造化やオブジェクト指向など)の習得
任意のプログラミング言語仕(変数、制御文、構築手法毎の文法(手続き型における関数、オブジェクト指向におけるメソッドなど))についてひと通り学ぶ。
3.一般的なアルゴリズム、プログラミング関連知識の習得(ハード、API、ライブラリなどなど)
4.ゲーム制作のためのプログラミング技法の習得
ライブラリの仕様、ゲームエンジンの仕様(クラス設計)、ゲームアルゴリズムの習得、デザインパターン(オブジェクト指向)、数学
今回の記事では、1と2をメインに、初心者向けの独学法について解説します。ちなみに、2,3,4は実際には平行して勉強を進めることが多いと思います。
■初心者に向けたプログラミング学習のヒント
1.まずはプログラミング言語を選択する。
日本語や英語、フランス語など世界中にたくさんの言語が存在するように、プログラミング言語にも様々な種類があります。C++、C#、Java、JavaScript……とにかくたくさん存在します。
個人的な見解ですが、初心者こそプログラミング言語を決めて勉強をはじめるべきだと思っています。プログラミング以前の概念的な知識、論理的思考の基礎知識、下地となるハード寄りの知識なども重要なのですが、それらを学ぶのは後回しにしたほうがいいです。
概念や小難しい前提技術の勉強はつまらないですし(人によりますが)、ある程度プログラミングを知らないと身につかないことも多いです。最初はとにかく、実際にコードを書いて動かしてみることが重要です。
では、どんな言語を選ぼうかということですが、これからプログラミングの世界に入るのであれば、C#をオススメしておきます。ちなみに、すでにゲームエンジンを使っていてこれからも利用し続ける予定ならば、そのエンジンに対応した言語を選ぶべきです。
ぶっちゃけてしまえば、言語なんてひとつ覚えてしまえば、他も比較的簡単に身につくので、メジャーなものであれば適当に選んでいいんじゃないかとも思っています。
2.プログラミングなんて簡単なものなので気楽に構えること。
研究やビジネスで最先端の技術を追いかけるとか、プログラミング技術自体でご飯を食べていくとか、そういうレベルのものはここでは除外します。ゲーム制作が目的でかつ面倒な部分はゲームエンジン(それから、ゲームエンジンより面倒ですがDirectXなどのライブラリ)にまかせる場合、プログラミングを修得するのにセンスや高度な勉強はとくに必要ありません。
ゲームや一般的なツールを作るためのプログラミング言語は、人間に分かりやすく設計されています(主にアメリカで発展してきたので英語ですが)。プログラミングというと、PCの画面に向かってなんだかよくわからん呪文のような言葉を書き連ねているイメージがあるかもしれませんが、しっかりと勉強すれば誰でも修得できるスキルなので、気楽に構えましょう。
3.まずは書籍で勉強を開始する。
プログラミング学習の入口にはインターネットではなく書籍をおすすめします。特に初心者のインターネットでの学習においては、以下のような問題が考えられます。
・情報が氾濫しすぎていて取捨選択が難しい。
・更新が途絶えていたり特定情報に偏っていたりで一貫した学習がしにくい。
・プログラミング言語の仕様について網羅しているサイトの場合、講座ではなく辞典としての情報提供である場合が多い。
もちろん、初心者向けの有用な講座もたくさんあります。また、頻繁に更新のあるツールや最新IT技術については、書籍が出た時にはすでに情報が遅れていることが多く、インターネットにはかないません。
ただし、プログラミング言語に関しては、基本的にそこまで頻繁に更新されるものではないので、書籍で問題ありません。もちろん、プログラミング言語にもバージョンはあるので、あまりにも古い書籍を選択する場合はご注意を(とはいえ、基本を学ぶのであればそこまで気にするものでもありません)。
全くの初心者の方は、以下の基準で選んでみてください(あえて書籍の紹介はしません)。
・ページ数が少なめであること。どこでも読めるように。
・辞書的でないこと。プログラミングをするための準備(開発ソフトのインストールや設定)から説明されていること。
・とにかくまずは作ってみようという形式のもの。ただし、コードがどんな意味を持つのかがわかりやすく解説されているもの(こう書けばこう動く!だけでろくな解説がないものは避ける)。
・著者が日本人のもの。翻訳物は(最近はマシですが)内容自体はよくても表現や文章が微妙なものがあります。
注意事項ですが、「入門書」というタイトルの書籍には、プログラミング初学者ではなく、他の言語を習得済みでその言語について初めて学ぶ人向けのもの(つまりプログラミング自体は知っていることが前提)が結構あるので、中身をよく確認して「プログラミング自体がはじめて」の人向けの書籍を選んでください。
そうして、プログラミングにある程度慣れた当たりで、プログラミングの文法について解説している本を読みましょう。これも好みだとは思いますが、C#の場合、以下は個人的に必読だと思っています。
4.わからない部分はとりあえず飛ばす。
いわゆる文法書、文法講座を読みこなす場合は、絶対に最初のページから理解していかなければならないんだ!と思い込まずに、縦横無尽に飛ばしたり戻ったりを繰り返してみてください。特に、オブジェクト指向に関する部分などは、実際にコーディングしてはじめて理解できるものも多いです。
詰まってしまった場合、他の書籍やインターネットで調べても良く分からなければ、その部分はとりあえず飛ばして次に行ってしまうのが得策です。
後のページの解説を読んだら詰まっていた部分が解消したなんてこともよくありますし。これだけは確実に言えますが、あきらめさえしなければいつか絶対に理解できます。
5.手を動かしながら勉強する。
ただ書籍を読むだけでは身につきません。現状の知識内で構わないので、実際にコードを書いてください。むしろ、コーディングをしながら本を読むくらいの態度が重要です。
6.それでもプログラミングがよく分からない場合(その1)
ここまでプログラミングは簡単だと言ってきましたが、やっぱり一筋縄でいかない部分もあります。私自身も、ある程度自由にプログラミングできるようになるまでに、何度か挫折を味わっています。例えば書籍では解説されずにいきなり出てきた専門用語(ハードやIT技術の前提知識)がわからずに詰まってしまうこともありました。そんなときにおすすめするのが↓です。プログラミング以前の基礎知識についての解説本で、初心者のころにかなりお世話になりました。
7.それでもプログラミングがよく分からない場合(その2)
勉強に詰まってしまった場合、他のプログラミング言語に浮気するのもひとつの手だと思います。私は、”Java(挫折)→C(挫折)→VisualBasic(理解できた!)”という過程を経て再びC言語に戻りました。Javaはオブジェクト指向に挫折(解説本の説明が概念的なものに終始しており具体的なコードを書けなかった)、その次に選んだC言語では、コンソール上でのプログラミングはできましたが、ウィンドウアプリケーション(ウィンドウの表示)がよく分からず(WindowsAPIやMFC辺りまで知識が及びませんでした)挫折。どうしようもなくなってVisualBasic(VB)に手を出しました。
VBはデフォルトでウィンドウアプリケーションの開発が可能です(面倒なコーディング抜きでウィンドウを表示できます)。そんなわけでVBを使うことで現代的なウィンドウズアプリケーションを簡単に実装し、ゲームを制作することができるようになりました。肝心のゲームアルゴリズムに注力することができたのです。一度理解してしまえば、他の言語にも応用できるので、過去に挫折したC言語に戻ったわけです。
今の時代であれば、入門で利用する統合開発環境の多くがウィンドウアプリケーションに対応していると思いますので、私のような挫折はないかもしれません。
ただし、例えばC#がよく分からなければ、似たような仕様ながら簡素なJavaScriptに乗り換えてみることもありだと思いますし、例えばオブジェクト指向が難しければ手続き型言語であるC言語を勉強してみるのもいいかもしれません。
8.とりあえず概要だけ知っておく。詳細は使うときに調べればいい。
勉強を進めていくと、コンストラクタ、キャスト、インターフェース、デリゲートなどなど、難しい単語がたくさんでてきます。解説を読んでとりあえずどういうものかはわかっても、実際どういう時に使うのかさっぱりわからないことが多々あると思います。そんなときは、とりあえずその言葉と概要だけ覚えておいてください。いずれその機能が必要なときがきたら、詳細について調べればいいんです。最初から何もかも覚えようとしないほうが勉強も捗るかと思います。
ちょっと脱線して具体的な話をしますが(言葉の意味は分からなくて大丈夫です)、C#にはデリゲートという機能があります。機能自体は理解しやすいのですが、実際にどんな場面で使うかまで想像することは難しいと思います。このデリゲート機能、Unityにおいて、スクリプトからゲームオブジェクトのコンポーネントにアクセスする場合に多用します。コンポーネントにアクセスしたければこう書くんだと覚えてしまってもいいのですが、デリゲートについての知識があれば応用もききますし実際の使用例にあたることで、自分でクラスを設計するときに利用することもできるようになります。つまり、とりあえずそういうものがあるということだけ知っておき、実際に使用する(出会った)時に詳細を調べることでマスターすることが可能になるというわけです。
9.動けばいいんだくらいに思っておく。
プログラミングの学習を続けていると、アルゴリズムというものに行き着きます。アルゴリズムとは直訳で「解法」のことです。よく使われる処理について、こういう風にコーディングするべきだというお約束だと考えておいてください。ものによってはテクニカルなコーディングになるので、ぱっと見では何をやっているのかよくわからないこともあります。よく分からなければ飛ばしてしまいましょう。とある機能のための実装(=コーディング)は千差万別なのです。
とにかく、書籍やインターネットで「◯◯な機能を実装するために☓☓のようにコーディングする」というような解説があっても、絶対にそれに従わなければならないわけではありません。自分なりに設計して実装し、動けばいいんだくらいに思っておくと気楽な場合があるかもしれません。
10 コピペからは早々に脱出する。
「最初のうちは、意味がわからなくても他人のソースコードをコピペして動けばいい」という意見をよく目にします。これについて反対するわけではありません。ただ、何をやっているのか理解する努力をしながらコピペするべきです。
現在、インターネット上には様々なソースコードが存在しています。正直、コピペしてしまえば何の苦労もなく動いてしまうのですが、これに慣れてしまうと自分の足を引っ張ることになります。応用がきかなくなってちょっとした機能の追加で詰まってしまったり、参考となるソースコードがないと何も作れないなんてことにもなりかねません。
汚くてもいいので、自分なりに設計(その機能のためにどういう風にプログラムを組むか考えること)し実装(設計に合わせてコードを書く)していく作業に、できるだけ早い段階から慣れていってください。
※ちなみにですが、コピペについては著作権に注意してください。基本的に、講座やTipsとして公開しているソースコードはOKのはずです(NGだと意味がないので)。
11.目的を見誤らない。
あくまで「ゲームを作る」ことが目的であることを忘れないで下さい。たとえ難しいアルゴリズムを取り入れようと、テクニカルなコーディングにこだわろうと、車輪の再発明(すでに組み込まれている処理をわざわざ書く)をしようと、同じように動くのであればユーザには分かりません。むしろ、ゲームデザインやテストのほうに時間をかけるべきです。※ただし、綺麗な設計、綺麗な実装は、今後のメンテナンスに有用です。
もちろん、プログラミング自体が目的だというのは悪いことではありませんし、そういう方たちの日々の研究のおかげで今の技術があります。
さて、ちょっと脱線した部分や相反する部分もありますが、とりあえずこんなところで切り上げたいと思います。
別の機会に、オブジェクト指向やゲームプログラミングの具体的な解説もしたいなあと思っています。
それでは。
<コンピュータゲームの仕組み : オブジェクト指向について>