このBlogは移転しました。今後は aish.dev を御覧ください。

プログラミングを学んでみたい人に

Twitterなんかをいろいろ眺めていると、もどかしくってたまらなくなってしまうことがある。プログラミングをやってみたいな〜と思いながらも、いつまでも最初の一歩を踏み出せない、そんな人を見たときだ。踏み出してはみたものの、自分の進路に自信を持てなくて先に進めなくなっている人も多い。見かけるたびに、もどかしさのあまり身もだえしている。

世の中にはいろんな技術があるが、プログラミングという技術はダントツに入門しやすい部類だ。必要な設備はパソコン一台だけだし、数学の知識も最低限で問題ないし、肉体的な鍛錬も必要ない。勘の良い人なら、1週間もあればそこそこ基礎を学べてしまう。その程度の勉強でも、それなりに実用的なプログラムを書けたりするのだ。まずは始めてみようよ、といつも思う。

実際にプログラミングを始められない理由として、最初に学ぶプログラミング言語の選択に迷っている人は多いみたいだ。確かに色々なプログラミング言語があり、それぞれに特徴があってどれを選んで良いか分からない、というのは理解できる。「プログラミング初心者へのお勧め」として候補に上がるプログラミング言語はいくつもあり、その中から選択すれば良いのだが、色々な意見もあって一つに決められないのだろう。

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

教科書的に言えば、プログラミングを学ぶ理由をしっかり見定め、目標を実現するのに適した言語を学ぶべし、以上。ということになるのだろうが、「しっかり見定め」とかできるんだったら苦労はない。多くの人はなんとなく「便利そうだから」とか「面白そうだから」という動機で始めるんだろうし、プログラミングというのはこのぐらいの軽いノリでスタートしても問題ない技術だ。

どうやってプログラミング言語を選べば良いのだろうか?とりあえず色々調べてみて、それでも迷うようなら、サイコロでも転がして決めてしまおう。サイコロ先生の判断力を信用できないだろうか?ハズレを引いたらどうしよう、と不安だろうか?

しかし、「ハズレ」ってなんだろう?実用性のない言語?将来性のない言語?難しすぎる言語?いやいやいや、初心者用として知られていて、ズブの素人がちょっと調べて名前が出てくるような言語でそんな大ハズレは無い。どの言語も、世界中に十万人単位のプログラマがいて、億単位のエンドユーザにアプリケーションやサービスを提供しているのだ。そういう巨大コミュニティの中には残念な人もいて、そんな困った人が特定の言語の悪口を書きまくったりするが、気にする必要はない。どれも十分に実用的であることは、もう必要以上に立証されつくされている。

とはいえ、サイコロ先生のお勧めに従って勉強を進めていくと、そのうち「ちょっと違うな」と思うことがあるかも知れない。知識が増えるにつれて視野も広がり、自分がやりたいことや好みが見えるようになるためだ。そうなったら、そこで選び直すなり、サイコロを振り直すなりすれば良いのだ。

これは決して回り道でも時間の無駄でもない。学習に必要なプロセスの一部であり、最初に学んだ知識は次の言語でも生きてくる。プログラミングという技術を学ぶ上で、プログラミング言語の習得というのはほんの一部の要素でしかない。いろんなOSの仕組みやインターネットの構造、開発技法など、知らなければならないことがたくさんあるのだ。立ち止まってはならない。恐れずに先に進もう。

TIOBE Index に惑わされるな

「TIOBE Index」とは、オランダのTIOBE Softwareが発表しているプログラミング言語の人気ランキングだ。興味深いデータではあるが、初心者の入門用言語を選ぶ場合には、細かい順位にそれほど意味はない。

プログラミング言語というのはそれぞれ特徴を持ち、開発の目的や手法によって選択されるものだ。「人気」とか「シェア」は言語の優劣だけで決まるのではなく、ソフトウエア開発全般のマーケットやトレンドにも大きく左右される。ブルドーザとショベルカーを比較して、ブルドーザの方がシェアが高ければショベルカーは不要、ということにはならないのである。

ベンチマークに惑わされるな

誰しも遅いプログラムを書きたくはない。どうせ書くなら速い方が良いに決まっている。そういう気持ちは理解できるが、最初はあまり気にしない方がよい。プログラムの速い遅いはプログラミング言語だけで決まるのではなく、処理内容やプログラマの技量が大きく影響するのである。

一般的にはC言語Javaのような言語で開発したプログラムの方が高速に動作し、PythonRubyは遅いとされているが、これもCを使いこなせればの話だ。プログラミングを始めて一年かそこらのヒヨっ子が書いたCプログラムより、私が書いたPythonプログラムの方が速くても別に不思議でもなんでもない。それどころか、ヒヨっ子が書いたCプログラムより、同じ程度のヒヨっ子が書いたPythonプログラムの方が速くても、それほど意外ではないのである。

もちろん、最初からC言語を学ぶのは良くないと言っているのではない。ベンチマークで良い成績を取っている、というだけの理由で言語を選択するのは意味がない、ということだ。

「基本は○○」に惑わされるな

初心者がプログラミング言語に迷っていると、どこからともなく「基本はC言語。本はK&Rだけで十分。」と言いたがる人が出てくる。確かにC言語は重要な言語であり、有名なOSやアプリケーションの多くはC言語で書かれている。プログラマの共通言語的な地位を占めており、そこそこ名前の通ったプログラマで、C言語を全く知らないという人はいないだろう。

だからといって、C言語は最初に学ぶプログラミング言語として最適か?というと、そうでもない。少々煩雑なところがあり、どちらかというと学習に手間取る部類の言語だ。C言語でしか出来ない事というのはあるので、そういう事をやりたい場合には最初からC言語を勉強し始めても良いが、そうでなければもうちょっと簡単な言語の方が良いかも知れない。

C言語だけでなく、「基本はLisp」と言いたがる人が現れる場合もある。なんにせよ、こちらの都合を無視していきなり押しつけてくる人には注意した方が良い。

プログラミング言語を「学ぶ」

これまで、プログラミング言語を「学ぶ」とか「学習」とか書いたが、実はこれはちょっと違う。プログラミング言語とはアプリケーションを実現するための「道具」であり、道具とは学ぶものではなく、使いこなすものだ。「訓練」と言った方が近いだろう。机上の学習はそこそこにしてパソコンに向かい、どんどんプログラムを書いていこう。

最初は単純なサンプルアプリケーションのようなものでもかまわない。同じようなアプリケーションを何度も作成しても良いだろう。頭で憶えるより、どんどん使い込んで目と手になじませよう。プログラミング言語の構文だけでなく、開発ツールの使い方などにも習熟し、開発・テスト・修正のサイクルを体に染みこませるためだ。

最初のうちは、慣れないエディタでソースコードを入力するのも大変だろう。コンパイラなどのツールの使い方も、テストの実行方法もよくわからないはずだ。なにをするにも面倒で時間がかかるだろう。しかし、これも何回も繰り返すうちに、いつの間にか自然に行えるようになるものだ。

これはフィジカルなトレーニングで、繰り返せば繰り返すほど上手になる。最初のうちはコンパイラが出力する大量のメッセージを見てうんざりするだろうが、慣れれば読む必要がある箇所だけが目に入り、不要な箇所は全く気にならなくなったりする。プログラミングとは、頭の中だけを使うのではなく、ちゃんと体も連携するものなのだ。

プログラミングの難しさの一つに、物事が思い通りに行かない時、なぜうまく行かないのか、その原因を自分で探らなければならない点があると思う。なにかがうまくいかない時、コンピュータは何も教えてはくれない。ぶっきらぼうなエラーメッセージを表示してくれる場合もあるが、そのメッセージを正しく理解するには、それなりの知識と経験が必要となる。自分で問題点を探し出し、解決策を考案する能力は、本を読むだけではなかなか得られない。自分でミスをおかし、自分でそのミスを特定し、自分でミスの修正方法を考える訓練が必要だ。

また、学習のこの辺の段階では、プログラミング言語の「欠点」にあまり目を向けすぎない方がよい。それぞれのプログラミング言語は目的があって色々な特徴を組み込んでいるが、なんらかのメリットを求めればその副作用としてデメリットもまた生まれてしまうものだ。
デメリットにとらわれるより、プログラミング言語の目的とメリットを正しく理解し、メリットを最大限に活用するように努めよう。そうすれば、なぜそのようなデメリットが生まれたのかを理解し、デメリットが欠点ではなくなるように使うことができる。これがプログラミング言語をマスターし、使いこなすと言うことなのである。