初心者に勧めるプログラミング言語は何か

僕は、プログラムをやりたいという人に出会ったら、JavaScriptを必ず勧めている。

以下では僕がこれまでに扱ったことのある言語について、なぜそれを初心者に勧めないのかを列挙する。

 

なおここで初心者と書いたのは、全くの初心者を表す。メールやウェブサイト閲覧はしているが、キーボードで文章やフォーム以外のものを入力した経験がない人を指す。

 

そして、目標は「どれかの言語でオブジェクト指向プログラミングをできるようにすること」である。そのため、LISPは不本意な扱いをしている。

 

C++

  • コンパイルの存在
    この理由だけで全く以て初心者には適さない。「人間が書いたものを、複数の翻訳を繰り返して、ついに機械が読める命令にまで変換する」という事実は、初心者の理解には全く適さない。
     彼らにまず覚えてもらうべきなのは、そのような物理的な現実ではない。「人間が書いた命令を機械が行なってくれる」という仮想的な図式である。そのために、初心者が学ぶ言語はインタプリタ言語であること、もしくは実行時コンパイラの使用が可能であることが必須である。

     この図式は、プログラムを書く上で絶対に必要になることである。なぜかと言えば、自分が指示した命令を機械が行なってくれることに興味を抱く人格(それが「これは役に立つ」という純粋に実利的なものだろうと、「面白いな」という実利を度外視した好奇心だろうと)が自分の中に生まれない限り、その人は講義をやめたら二度と書かないからである。

 

Ruby

  • オブジェクト指向プログラミングの強制
     少なくとも規模が1000行を超えるまでは、絶対にオブジェクト指向プログラミングを教えてはならない。なぜかと言えば、それはコードが大規模になってきたから必然的に生まれた考え方であって、それらがなくても代入や再帰などの文法は教えられるからだ。10行規模のコードを書いている段階の初心者に、絶対にオブジェクト指向プログラミングの話はしてはならない。

     ただし、Rubyの場合はC++よりはまだ推奨でき、もし最終目的が文字列処理であればJavaScriptではなくRubyが最善手となると思う。なぜならオブジェクト指向プログラミングを強制すると言っても、数十行段階のコードで扱うのはどうせnewだけだからだ。これはおまじないと言えば、あとはいくらでも大事なことを教えることができる。そしてRubyは、その「大事なこと」が非常に直観的な記法で書ける。 10.times do とか[1,2,3,4].eachとか、これ以上わかりやすいイテレータは存在しないんじゃないかというほどだ。

     ただしその場合も、Matzが書いたRubyの公式ドキュメントはクラスやインスタンスや継承といったオブジェクト指向プログラミングの用語ばかりでまずもって読めないため、苦戦を強いられるだろう。

  • UNIXの知識を前提とされる
     これはドキュメントを読む際に、上記の「オブジェクト指向プログラミングの用語ばかり」なことと相まって、Rubyの理解を難しくさせている。

Lisp

  • 制御構造がオブジェクト指向プログラミングの学習に連続しない
     と思う。ここらへんは勉強不足なので言及できない。

 

HTML:

  • プログラミング言語だ」と思えるまでの道筋、長すぎ
    すなわち、<img id="dog_img">や<p class="paragraphTitle">のように、class名やid名を用いて、JavaScriptCSSからそれらを変更する、DOM操作の段階に至るまでに覚えることが多すぎる。その段階に至れば十分プログラミングらしいことができるが、それまでは殆ど何も大切なことを伝えられない。

     ただし当人が好きでいじってみたいというのであれば止める必要は全くないだろう。最終的にどこかで触れるようになっておくべき言語なので無駄ではない。

CSS

  • LESSなどを用いない限りただの設定ファイルに過ぎない

Java:

  • おまじないが最初は多すぎる

Python

  • PythonRubyはどれくらい初心者に勧められるかといえば、同じくらい勧められる。しかしどちらがより日本人には勧められるかと考えた場合、やはりRubyに軍配が上がる。

     Ruby言語開発者であるまつもとゆきひろは、自分の作ったRubyの文法に関するエッセイを執筆している(『コードの未来』など)。これが自国の言語である日本語で読める、という利点は破壊的に大きい。

     プログラミングを続けていれば、いずれ英語で内容を理解するしかない時がいやでも必ず訪れる。だがだからこそ、現存する日本語資料でどこまで理解できるのかが大事になってくる。

     英語で理解したことは検算・暗記保持・伝達が容易でない。論文を読んで理解したと思っても、それを試すためにはテストコードを書かなければ怪しい。間違って理解している可能性は日本語よりよほど高い。加えて文面を覚えておくことも日本語よりよほど難しい。キーワードを思い出すのは、英語よりも日本語のほうが圧倒的に早い。この言語の要点を3つにまとめると?とか、この文法を使ってはいけないのはどんな局面?とかいう、読書中に何度も出てくるような疑問に、英語を読んでいるときに答えるのは至難の業である。そして理解したことを他人に「これ読むと分かるよ!」と言っても、他人が読めない場合が生じる。
     英語で理解することは、翻訳されていない情報を得られる利点とともに、かなり大きな欠点を持っているということは、あまり口にして語られない(たぶんあまり意識されていない)。


 それはあまり初心者のプログラミングの勉強とは関係ない。
 いつか解かれるべき「サブ問題」として、後回しにすべきだ。


『コードの未来』は非常に面白い。クロージャや、イテレータオブジェクト指向プログラミングをなぜするかなど、開発者の悩んだ末の知見は、文法を学ぶ意欲をもう一度立ち直らせてくれる。僕が読んだことあるのはC++の開発者の本とRubyの開発者の本だけだが、他の言語開発者の本も同様な意欲を与えてくれるものだと信じている(C++の開発者ストラウストラップはデンマーク人だが、この本は翻訳が良い)。

 

 

以上を踏まえて、僕が初心者に勧める言語は、JavaScriptである。

JavaScriptは上記の要件を多く満たす。

インタプリタ言語であり、実行時コンパイルが可能、オブジェクト指向プログラミングを強制されず、初心者は最初は手続型プログラミングで思い思いの100行プログラムを書ける。そして1000行を超えたぐらいでデータの管理がもはや自分の力量を超えていることを悟り、オブジェクト指向に開眼する…という筋立てである。

加えてJavaScriptには以下の利点もある。

 

  • 環境構築が不要なほぼ唯一の言語
    InternetExplorer、GoogleChrome、マックならSafariと、とにかくブラウザさえ開けば学習環境が完結する。最初の1時間はテキストエディタすら必要がない。JavaScriptコンソールは偉大すぎる。
  • 学習結果の公開が容易
     たとえばこんなプログラム作ったよ!と動かさせるのは、RubyPythonだと相手がプログラマでも無い限り難しい。JavaScriptであればJsFiddleや無料レンタルサーバーでいくらでも公開が可能である。

 

 

ということで、僕はJavaScriptを勧めている。ここまで内容を整理してきて、いくつかのことに気付いた。

 

 

  • 僕は結局、手続型プログラミングとオブジェクト指向プログラミングの2つのパラダイムしかまともに経験していない。LispはN-queenのプログラムを一度書いた程度なので、関数型プログラミングを知っているとは口が割けても言えない。
  • 同時に、手続型プログラミングはオブジェクト指向プログラミングより前に経験されるべきだ、という信念にも似た主張を持っている。というか、手続型プログラミングであれば、日常感覚から連続させて理解してもらえると思っているようだ。たとえば、

     1+1 = 2;
        2+2 = 4;
        4 +4 = 8;
    と書いていて、
       function doublize(n) { return n + n; }
    を思いついて、
       doublize(1)
       doublize(2)
       doublize(4)
    と書くことが、
      1+1 = 2;
        2 - 2 = 0;     /// ミス
        4 +4 = 8;
    のような、「不必要なミス」を減らせるなど。抽象化を概念から説明しないでも、日常生活で使っているのだからそれを指させばよい。
  • 非構造化プログラミングや逐次型プログラミングは一瞬で通り過ぎるものと考えているよう。たとえば上の例で3行で終わったように。
  • 文法を理解することを比較的重視している。これはいまC++を書いていることもあって、「この文法を理解していないとこの機能が実現できない」という局面にしょっちゅう出くわすからだと思う。JavaScriptを習っていたときの僕はもっと、「いけいけどんどんとりあえず動けばそれでよし」にやっていたはずだ。これもまたオブジェクト指向プログラミングへの変更の兆しの一つなのかもしれない(1000行を超えると「動けばそれで」な姿勢だと数時間かかるようなデバッグが連続して開発意欲が激減する)。
  • 全員がプログラミングに興味を持つことはないと納得している。昔の僕はもうすこし「みんな興味を持つはずだ!」と思っていた。しかし学習が進むにつれて、自分でも興味を持てないような内容が頻出することに気付き、これは一部の好きな人がやるものだなと思うようになっていった。まあ、最初は興味がなかったことに、自然に興味がわき出すのが、ひとつプログラミングの面白いところではあるのだろうけど。リンカについて勉強したいと思うようなことなんて、1年前の僕だったら絶対になかっただろう。

     

ちなみに、JavaScriptで1000行オーダーを超えたら?と言われれば、速度重視ならC++、効率重視ならRubyを勧めるだろう。

 

主張をまとめる。

 

  • 初心者が覚えるべきは「人間が書いた命令を機械が実行してくれる」という図式
  • その図式に興味が生じない限り、その人がプログラミングを続けることはないし、それならそれでよい
  • その図式を最も端的に伝えるのはJavaScript
  • オブジェクト指向は1000行のオーダーになるまでは絶対に使わせないこと
  • オブジェクト指向になったら、RubyC++を検討するとよい