初めて学ぶプログラミング言語は何が良いか

定期的にタイトルのような質問を見るが、たいてい、回答者の好みで「XXXXやれば?」という解にただりつきがちだ。

私は「初めて学ぶ言語は何が良いか」という問いに答えることは不可能だと思う。なぜか。プログラミングと一口に言っても様々な分野があり、そのどれもが異なるからだ。そしてどの分野でも通用する言語というものは今のところ無い(でもPythonが最も近いとは思う)。であるから回答は不能である。

例えばゲームを作ってみたいと思う人が上記のような質問をして、「初めてならC言語かな」と言われたとする。それに従ってC言語を始めたとする。変数aに1+2の結果を入れる、printfで文字を出力する、ビープ音を鳴らす、メモリ操作を覚える、ソートアルゴリズムを書く…。画面の中をキャラクターが走り回るのはいつになるだろう?そういう事をやっているうちに興味が尽きて飽きてしまう。それは本人にとっても業界にとっても好ましくない。メモリ操作を学ぶことは重要であると思うが、最初に勉強しなくてもいいはずだ。

というわけで、ここでは「やりたいこと」別に適した初めて学ぶ言語は何か、を検討してみた。一部初心者向けで無いような記述も含まれるが、キーワードを知るだけでも有益だという思いで書いている。

ブラウザゲームを作りたい

JavaScriptでしょう。ただし、生のJavaScriptを使って一から作るのはしんどいので、JavaScriptをある程度勉強した後はenchant.jsCreateJSなどのCanvas操作系ライブラリを勉強することになるだろう。

昔はFlashが全盛で、いまも艦これなどFlashで成功しているゲームもあるが、技術的には未来は無いので今からFlash(ActionScript)を覚える理由はあまり無い。

3D(2D)ゲームを作りたい

C#がおすすめ。昔は3Dゲームを作るときはC++/DirectX、OpenGLなどの3D描画ライブラリという組み合わせにほぼ限られていたが、C++やDirectXというのは初心者には敷板が高い。C#とUnityならばずっと簡単になる。Unityならばマルチプラットフォームなので多様なデバイスで動作できるという利点もある。

ただ、3Dを扱うという事自体が本質的に難しいため、モチベーションを保ち続けるためには2Dなゲームから始めるのが良いと思う。Unityは2Dゲームを作ることもできる。

iOS / Androidアプリを作りたい

Swift(iOS)、Java(Android)になる。Objective-Cでも良いかもしれないが、一から勉強するならばSwiftの方が良いだろう。ただ、Javaは個人的には言語仕様が古くてモダンな設計(&コーディング)が難しいので、慣れてきたらScalaやKotlin、もしくはXamarinを使ってC#で開発(お金が掛かるけど)してみても良いかもしれない。GoogleはOracleとの裁判で結局ほぼ負けてるので、Android開発は非Javaへ移行する可能性は非常に高いし、そうなってほしいと願うユーザーも多い。このような状況でJavaを勉強するか?というのは少し微妙だが…。

Webサービスを作りたい

何かアイディアがあってWebサービスを作りたい…(初心者がそう考えることはあまり無いかな?)という場合には数多の選択肢がありこれというものはない。以下に思いつくものを列挙するので参考にしてほしい。

C# / ASP.NET : MS製なのでWindowsとの親和性が高い。エンタープライズ向けで良く使われる。Windowsログインユーザー情報を読み取ってシングルサイオンするなど、普通のWebアプリでは難しいようなことがあっさりできてしまう。

Ruby / Rails: 爆発的な人気を誇る言語・フレームワーク。scaffoldや「設定より規約」の哲学、Rubyという動的言語のパワーによって少人数でも素早くアプリケーションを構築することが可能。こういう特徴があるのでスタートアップ企業などが採用する例が多い。

PHP:セキュリティ的にまずいと言われ続けて何だかんだで未だに採用例が多い。個人的にはこれから勉強するには避けたほうが良いのではと思う。しかし求人はいまだに多い。

Node.js / Express: 最近にぎわい始めているプラットフォーム。言語的にはJavaScriptということになるのだろうか。ただ速度や開発速度などといったごく一部の領域にフォーカスしたようなものであると思う。Node.js / Expressだけですべてのことが出来るかと言われれば出来ると思うが、たぶんそれはとりあえずパッと作ってみる、という用途の限られ、ほとんどは何か他の仕組みと組み合わせて使うのではないだろうか。そういう意味では初めて学ぶ言語(プラットフォーム)としてはふさわしくないと思う。が、一応書いてみた。

Scala / Play Framework: 最近よく話題に上る言語・フレームワーク。Scalaは難解で難しいという意見が多いが、個人的には難しいと言うのは既存の言語の常識にとらわれてしまっているからであって、一から覚える言語としては実は悪くないのではという気がする。

また、いずれの場合においてもフロントエンドではJavaScriptを使う事になるだろう。JavaScriotの次はCoffeeScriptを勉強してみても良いかもしれない(ES6が普及するのはまだまだ先だろう)。

組み込みをやりたい

電子工作と組み合わせてマイコンで簡単なデバイスを制御したい。そういう場合は私はC言語をお勧めする。C言語で開発可能なマイコンは多い。C言語は古い言語で書籍や参考情報も多く、またアセンブラに比べたらずっとわかり易い。勉強した制御構文は他のほとんどの言語でも共通している。

ただし、最近は組み込み分野もCPU性能の向上がめざましい。Raspberry PiなどのARMやx86系CPUが載ってLinuxを動かしているようなものを使ってデバイスの制御を行いたいという場合はC言語でやるメリットはあまり無く、それよりもシェルスクリプトPythonなどを勉強したほうが良いかもしれない。

特に目的は無い/その他

Pythonが良いのではないでしょうか。Pythonはライブラリが非常に豊富で、大体なんでもできてしまう。ゲーム、機械学習(人工知能)、データマイニング、分析、データ変換、AR...etc...。Pythonはプログラミングそのものの入門用の言語としてもわかり易いと思う。さらに色々なアプリケーション(Libre Office, Blender, Inkscapeなど)の拡張機能やプラグイン開発にも利用できるため、応用範囲も非常に広い。

そしてC言語

ここまで述べた言語は「最初に勉強すべき言語」ですが、同時に各々の分野において「最も適した言語・フレームワーク(の一つ)」であるとも言えます。それは、やはり私としては「適してない言語を勉強していくうちにモチベーションが下がる」という状況を回避してほしいと言う強い気持ちがあるからです。

しかしながらモチベーションがずっと続くのであれば、できればマシン語からアセンブラ、C、C++…とコンピュータがたどってきた道筋を順番に理解するのが一番であると思います。その過程で得た知識は今後もずっと応用できるでしょう。反対に、C#で得た知識は数年後に陳腐化している可能性もあります。

なにかプログラミング言語を勉強して、メモリ管理や並列プログラミング、低レベル処理などで壁に当たったころ、ぜひC言語を一度勉強してほしいと思います。ソートアルゴリズムを実装する程度で良いです。その過程で、なぜStackoverflowになるのか、なぜ動的にメモリを確保しなければならないのか、なぜ最初に変数を宣言しなければならないのか、なぜ配列のサイズを決めるときに変数から読み取った値を指定できないのかというあたりに注目してほしい。そしてメモリ管理の面倒くささを実感してほしい。そこがコンピュータの本質であると思います。

※GNU Cなら出来ちゃいますが

また、言語はたくさん覚えていた方が良いという人もいますが、個人的にはむやみに手を伸ばす必要は無いと思います。結局英語と同じで、必要になったときに勉強をし始めるのが良いとの考えを持っています。人に言われるがまま選んだ言語を勉強してもモチベーションが上がらないし、自分が本当にやりたいことに適していない可能性もあります。

ただ、一方で真逆の事を言うようですが、プログラマをずっと続けていくのであれば1年に1つくらいは何か新しい言語を勉強したほうが良いでしょう。基本的には後発の言語のほうが優れていますし、脳のトレーニングにもなります。ずっとお気に入りの言語しか使わないようなことが続くことはあらゆる面で好ましくありません。

Javaに対して厳しすぎないか

本ページでJavaを冷遇しているのは主に私がJava嫌い(≠JVM嫌い)ということもありますが、実際問題、Javaには数々の問題があります。

まずJavaは良くも悪くもメジャーになりすぎました。あらゆるデバイスで動き、あらゆるプロジェクトがJavaを採用しています。すると新機能を取り込むことがどんどん難しくなり、保守的になりがちです。なぜならば後方互換性を崩す危険性があるからです。Java7で導入するとされていたProject Lambdaも伸ばし伸ばしになってようやくJava8で導入され、それを活用したライブラリが充実してくるのはまだ先になるでしょう。しかし他の言語では関数オブジェクトなどずっと昔から使用されてきたのであり、軸足は関数型プログラミングへと移ろうとしているのです。

昔は大規模なWeb開発ではJava一択と言われていた時期もありますし、モバイルアプリもJavaでないと開発できないという時期もありました。それは事実だと思います。しかし今はJava以外にもたくさん選択肢があり、その多くは言語仕様のレベルでJavaよりも優れています(今よりも良いものを作ろうとして新たな言語を作るのですから、後発の言語の方が優秀であるのは当たり前です)。

Javaが果たしてきた役割は決して小さなものではありませんでした。多くの人がJavaでオブジェクト指向の基礎を学びました。GCの恩恵をありがたく受け止めました。しかし時代が進むにつれ、Javaにも限界が見えてきたのではないでしょうか。いつまでもゆりかごの中で過ごすわけにも行きません。そろそろJavaは卒業すべき時期でしょう。