LL開発記

「LL (Lightweight Language 軽量言語)」でプログラミングする開発マンのブログ

プログラミング言語の選択は開発効率を左右する

ポール・グレアム「普通のやつらの上を行け」

  • 普通のやつらの上を行け ---Beating the Averages---
  •  ポール・グレアム氏は「普通のやつらの上を行け」(上記参照)というエッセイで、言語の選択の重要性(とLisp推し)を述べている。

     かんたんにまとめておくと、彼の会社は開発言語にLispを採用したため、ライバル会社よりも高速にWebサービスをリリースでき、商業的に成功したという話だ。

     Lispは難解だが強力な言語で、ハッカー御用達の言語とよく言われる。難解で習得者が非常に少ないため、使用しているライバル会社がほとんどなかったわけだ。

     Lispを採用するかどうかはともかく、言語の選択が重要であることについては、私は完全に同意する。

     これは当たり前のことを言ってるようで、意外とそうではない。「どの言語でも、たいして変わらない」という認識もけっこう根強くある。

    最初の学習言語は何が良いか?

     たとえばそう、これからプログラミングを学ぼうとする人がいるとしよう。

     その人が機械語を読み書きしようとする選択肢はありえない。挫折率は100%近いだろう。外国語を覚えようとするときに、くさび形文字のような人類初期の言語から覚えようとする人はまずいまい。グレアムのエッセイにもあるように間違っている。やはり言語の選択は重要だ。

     最初の学習言語として、機械語を支持する人はいないが、「アセンブラからやれ」という人はたまにいる。しかし、今どきアセンブラから入るのはつらいだろう。感覚だけで言うが、挫折率80~90%くらいだろうか?

     アセンブラプログラミング言語が登場する順番に従っているから、理解しやすいだろうか? しかし学生は国語の後に古文を学ぶのであって、古文から日本語を覚えようとするのは回り道だろう。あるいは、英語を覚える前にラテン語から覚えようとするのも大変そうだ。

     どうしてそんな不条理なことが起こるかといえば、コンピュータやプログラミングの分野は歴史が短いため、古代言語*1がまだ現役だからだ。

     それでは、最初の学習言語は何が良いか? 私は昔ならC言語をすすめていただろう。もうすこし最近ならJavaをすすめていただろう。

     だが今ならJavaScriptをおすすめしたい。

     推薦の理由としては、Webはもちろん、WSHなど使える場所が意外に多く、覚えたことがムダになりにくい。またほかの言語では難しくなりがちなGUIの実装も、HTMLだからかんたん。さらにHTML5との組み合わせで注目が集まっており、将来性も十分だ。GoogleのV8エンジンの登場で、処理速度もLLの中ではダントツで早い。

     それから、実行環境(ブラウザ)がかんたんに用意できるのも、学習用言語としては大きい。新しい言語を習得するときに、開発環境の用意はストレスが溜まりやすいものだ。

     JavaScriptでなくてもよいが、習得者の人口が多い言語、とくにPHPRubyPythonなど、LL系の言語をおすすめする。挫折率が低いからだ。

     逆にLLでない重量級言語、たとえばC++の学習コストは高い。LLの何倍も高い。できることもそのぶん多いが、最初はそのメリットを享受している実感が湧かない。だからもしやるとしても、後回しでよい。

    二番目の学習言語は戦略的に選択せよ

     だれでも最初に学習する外国語は無条件に英語を選ぶだろう。いや、義務教育の中学校で英語を学ぶのだから、選択肢すら意識しなかっただろう。

     しかし、第二外国語は意識的に選択することだろう。マイナーな言語を選ぶ場合でも、それなりの理由があるだろう。もし外国語を利用した職業、たとえば通訳、翻訳家、貿易業者、海外投資家などを目指すような人なら、なおさら重要なのは分かるだろう。

     中国語とスペイン語では、道が大きく分かれている。プログラミング言語もそれと同じである。

     だから、二番目(以降)の学習言語は、戦略的に選択する必要がある。言語だけにこだわって成功するわけでもないが、それなりに考える必要はある。開発人生を有意義に過ごすためには。

     最初の言語は、無難なものがいい。外国語における英語のようなメジャーなものが良い。たとえばCやJavaJavaScriptが良い。最初からLispだと挫折率が高い。しかし、二番目は主体的に選択すべきだ。二番目以降のLispは選択肢としてありうる。

     二番目の言語をばくぜんと選んでしまうと後悔する。たとえば最初に学ぶ言語がCなのは良いとして、つぎにC++を学ぶのは、順番からいって当たり前のようで、じつは複雑すぎておすすめしない。代わりのおすすめはLLだ。Cができればどれも難しくない。

    言語は開発効率に直結し、ひいては開発費用に影響してくる

     言語に貴賤はないが、向き不向きは確実にある。あらゆる分野で最強の言語を探すのは時間のムダだが、ある目的に最適の言語を探すことには意味がある。言語も道具であり、手段である。だから、目的が何かに応じて、使う言語も決まってくるはずだ。

     職業プログラマの場合、採用や募集の際に言語を指定してくるから、重要なのは自明だ。が、個人開発の場合はどうか? 私は同じことだと考える。個人であっても経営的視点がなくなるわけではないからだ。

     なぜ、ソフト開発会社は、採用・募集時に言語を指定するのか。それは言語の選択が、たんなる机上の空論ではなく、開発効率や開発費用に関係してくるからだ。

     まさに冒頭のグレアムの話だ。別の例を出すなら、GoogleのGo言語やDartAppleSwiftのように、企業が独自言語を作ることもある。JavaだってSunが、JavaScriptだってネットスケープが開発した。もし開発効率とまったく無関係であれば、営利企業がわざわざコストをかけて新言語を開発するわけがないだろう。

     開発言語によって、同じ機能を実装するのにも、要するステップ数が違い、要する人月が違い、よって開発コストが違ってくる。また学習の難易度が採用のしやすさにつながり、人件費も異なってくる。これを逆の視点で見ればとうぜん、労働者側は就職・転職の難易度や給与が異なってくる。

     だからといってコストの安さだけでも選べない。OSのようなシステムプログラミングや、インタプリタの処理系、画像・映像処理など処理速度が重要な分野は、今でもC++が選ばれる。遅いLLでは実用にならない。

     これもやはり、外国語のたとえで考えれば分かりやすい。第二外国語の選択に、その国への渡航費用などのコストと、旅行なり投資なりのリターンが関係してくるのと同じことだ。

    言語自体よりコミュニティを見る

     では具体的にどうやって言語を選ぶのか?

     くわしくは別の機会にゆずるが、一言でいえば「コミュニティを見る」、ということをおすすめしたい。

     やはり外国語のたとえで考えると、外国語の言語自体で決めようとするのは、労多くして功少なしだと思う。いや言語仕様の話ははてブなどネットをにぎわせている。が、あるていど習得してから判断できるのであって、外部からは分かりにくい。

     外国語を学ぼうとするときに、大多数の人は言語構造で決めたりしないはずだ。旅行に行きたいとか、投資がしたいとか、できるようになることで決めるはず。そうすると言語の文法がどうとかよりも、治安とか為替といった言語使用国の事情のほうが重要だったりする。

     そういった情報を一言でかんたんに言ったのが、ここでの「コミュニティ」になる。言語のコミュニティ、たとえば公式サイトとか情報発信者のブログとか関連書籍とかから、自分の作りたい方向に沿っているかどうかを見ればよい。

     たとえば、Androidスマホアプリが作りたいからJavaRuby on RailsでWebアプリをかんたんに作れるからRubyHTML5やNode.jsでWebアプリを作れるからJavaScript、といったことだ。個人開発でなく職業プログラマの場合でも、けっきょく就職・転職したい企業が何を作るか、ということだ。

     軽薄なようだがそれでいい。もちろん、たとえばRubyPerlをはじめとしてLispSmalltalkの言語仕様に影響を受けている、といった言語自体の細部は語りたくなる(私もいずれ語りたい)けれど、それはあるていど習得してからの話だ。

    おわりに

     最後になるが冒頭の話に戻って、じつは私がLispを知って学ぼうと決めたのには、ポール・グレアムの存在が大きかった。

     エピソード自体が強力な説得力があるのと、彼自身がLispの解説書も書いているので、マイナー言語ではあるが飛び込むモチベーションができたのだ。

     そしてこれも「コミュニティを見よ」ということに沿っている。グレアムはLispコミュニティの代表的な伝道者だろうから。

    *1:ただ新しい言語がかならず機能的に上位だとも限らない。グレアムが推奨するLispも古代言語である。またC/C++は後発の言語より実行速度が早い