図1●プログラミングに必要な知識。アプリケーションの種類や規模によってはこれ以外にも様々な知識が必要になる
図1●プログラミングに必要な知識。アプリケーションの種類や規模によってはこれ以外にも様々な知識が必要になる
[画像のクリックで拡大表示]

 プログラミングに必要な知識にはどのようなものがあるでしょうか。「そんなの挙げたらきりがない」なんて思う方もいらっしゃるでしょうね。とりあえず,ここでは最低限必要な知識を四つほど考えてみましょう(図1[拡大表示])。

 まず一つ目は,C,C++,Java,C#など何らかのプログラミング言語についての知識が挙げられます。ここでいう言語についての知識とは,文法を覚えていることはもちろん,その言語の特徴を生かしたコードを書くことができるだけの知識も含みます。

 二つ目は,WindowsのAPI(Application Programming Interface)やJDK,.NET Frameworkのクラスライブラリなど,プラットフォームについての知識でしょう。C/C++やJavaなどの最近の言語は,言語仕様をできるだけコンパクトにするために,言語側で入出力などの機能を用意しないのが普通です。これらの言語でできるのは,メモリーから値を読み込んで計算し,結果をメモリーに書き込むことだけで,ユーザーからの入力を受け取ったり,結果を画面に表示することさえできません。C/C++の場合,コマンドプロンプト上での入出力くらいならprintfやscanfなどの標準ライブラリ関数(言語とは別個のものです)を利用しても実現できますが,ウィンドウを表示する,ネットワークにアクセスする,といった場合にはWindows APIを呼び出すなどの手続きが必要になります。JavaやC#の場合も,JDK,.NET Frameworkが用意するクラスを利用する必要がある点は同じです。

 三つ目は,データ構造とアルゴリズムについての知識です。C++のSTL(Standard Template Library)やJDKなど最近のライブラリの多くは,動的配列やリンクリストなどのデータ構造を用意しているため,こうした知識は不要と思う人もいるかもしれません。しかし,仮に自分でコードを書く必要がないにしても,どんなデータ構造があり,それぞれどんな特徴を持っているかだけは理解しておかなくてはなりません。データ構造には「ランダム・アクセスは高速だが挿入/削除は遅い」「挿入/削除は高速だがランダム・アクセスができない」など,それぞれ得手不得手があります。こうした点を理解しておかないと,状況に応じて適切なデータ構造を選ぶことすらできないでしょう。

 加えて,多くの書籍が基本的なデータ構造やアルゴリズムの知識を前提としていることにも注意してください。これらの知識がないと,本を読んで理解することすら難しくなるのです。アルゴリズムの知識は10年以上たってもさびないので,ぜひ身に付けておきたいものです。

 プログラミングに必要な四つ目の知識として,OSやハードウエアについての知識など「一般教養」と呼べるものが挙げられます。こうした知識はプログラムを組むのに直接必要になるとは限りませんが,あればいろいろな局面で役に立ちます。さらに,読みやすいコードを書く方法,といったプログラミングの「作法」のようなものも一般教養の部類に入れてもいいしょう。

文法とAPIを先に学んで早めに実践に進もう

 では,これらの知識をどのような順序で学んでいけばいいのでしょうか。筆者がお勧めする基本的な手順は以下の通りです。

(1)まず何か一つの言語の文法を覚える
(2)基本的なAPI/クラスライブラリを学ぶ
(3)基本的なデータ構造とアルゴリズムを理解する
(4)OSの知識など一般教養を身に付ける

 この順番は「できるだけ早くある程度のプログラムが組めるようになる」ことを念頭においています。よく言われるように,プログラミングは自分でコードを書かなくては決して上達しません。そのためには,自分で作りたいと思えるようなプログラムを作れるだけの知識を早めに身に付けるのが一番です。でも,ちょっとしたフリーソフトを作ろうとすると,ウィンドウや各種のGUI部品を表示したり,ファイルを読み書きしたり,といった機能がどうしても必要になります。そこで,文法を覚えたらすぐ次にAPI/クラスライブラリの知識を学ぼうというわけです。この順番なら(2)まで学んだ時点でとりあえず簡単なソフトが作れるようになります。あとは学習と実践を並行して進めていけばいいでしょう。

 もちろん,作成するアプリケーションの種類によっては,別の知識が必要になります。C/C++でメール・ソフトを作るなら,TCP/IPやPOP3などのプロトコルについての知識とそれを利用するためのAPI(WinSock,WinInet)の知識がなくてはなりません。JavaでWebアプリケーションを作るなら,Servlet APIなどについての知識,場合によってはデータベースについての知識も必要です。ゲームを作るなら,Windowsのマルチメディア用APIセットであるDirectX,さらに当たり判定,経路探索などの様々なアルゴリズムを理解していなくてはなりません。

 アプリケーションの規模がある程度以上になると,設計についての知識も要求されるようになります。ちょっとしたユーティリティを作るなら経験と多少の試行錯誤だけでも何とかなるかもしれませんが,規模が大きくなってくると,設計に関する体系的な知識無しではどうにもならなくなってきます。このほか,ソフトウエア開発全体で考えるなら,開発プロセスやテストなどについての知識も重要になるでしょう

 これからわかるように,プログラミングに必要な知識は,専門的になるにつれてどんどん細かく枝分かれしていく「木」のようなものです。これらをたどってすべてを身に付けることなど,一生かかってもできません。したがって基本的には作成するアプリケーションの種類やキャリアパスなどに応じて,必要になった時点で学習するというのが現実的な姿勢です。ただ,どのような道筋を選ぶにせよ必ず必要になる知識というものがあります。それが,先ほど上げた四つの分野というわけです。

 以下Part1では,すべてのプログラマが知っておくべき基礎知識,つまり先に挙げた「言語」「API/クラスライブラリ」「データ構造とアルゴリズム」「一般教養」の四つを身に付けるための書籍を紹介します。いわばプログラミング大学の「教養課程」のようなものです。Part2以降の「専門課程」では,目的別に読むべき書籍を紹介していきます。JavaでWebアプリケーションを開発したい人はPart2を,C/C++でシステム周りのプログラムやゲームなどの高度なアプリケーションを作成したい人はPart3を,分析/設計に強くなりたい人はPart4を読んでください。