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++は後発の言語より実行速度が早い

    本ブログの予定

    LLを中心としたプログラム開発

     本ブログ最初のエントリなので、これからどのような方向性で記事を書いていくのか、説明しておきます。
     本ブログは「LLを中心としたプログラム開発」の記事を書いていくつもりです。以下、くわしく述べます。

    LLとは何か?

     「LL」とは「Lightweight Language」を略した英語*1であり、「軽量言語」を意味する。

     たとえると、自動車でいう「軽自動車」とか、音楽でいう「軽音楽」、
    あるいは小説における「ライトノベル(軽小説)」のようなものだろうか。

     LLのメリットは、(とくに小規模での)開発の負担が軽いことにある。
    逆にデメリットは、プログラム自体の実行速度がたいてい遅いことだ。

    なぜLLなのか?

     LLでない、たとえばJavaC++のような言語も、いちおう私は読み書きできる。
    しかし、ブログで気軽に読み書きするのには向かないのではないか、と考えている。

     そもそもインターネット上のWebで流通するコンテンツは一般的に軽薄である。
    小説でいえばライトノベルのような、軽いコンテンツのほうが流通しやすいのではないか。

     もちろん私がLLを選んだ理由は、こんな軽薄なものだけではない。
    しかし、LLを選ぶ理由自体を、このブログのコンテンツにしたいので、
    本格的な説明は後回しにしたい。お楽しみは後に取っておくことにしよう。


    LLで何を開発するのか?

     LLが得意な分野にWebアプリの開発がある。しかしあまりにもありふれており、差別化が必要だ。
     いっぽう、はてなの技術系ブログやはてなブックマークで今流行している開発テーマが、機械学習

     そこで機械学習を利用したアプリを作ろうと考えている。ただ、それは残念ながら今のところ公開予定はない。
     オープンソースでソフトを開発して、そのソフトのことを書くのは理想だが、諸般の事情でそううまくいかない。

     だからけっきょく、ブログ上で公開するコードは、ユーティリティ的なツールやTIPSが多くなると思う。
     ただ断片的なTIPSだけでなく、機械学習のような大きなテーマにもたまには触れたいと考えている。

    LLでどのように開発するのか?

     開発手法としては、LLにはアジャイルが適している。
     私がつねに採用するわけではないが、テストファーストといった手法がある。

     設計とテストは開発においてかなりの比率を占めるので、少しは触れたいと思う。
     デバッガ、フレームワーク、データベース、ツール、サイトなども機会があれば触れる。

    どのLLなのか?

     代表的なLLには、JavaScriptPerlPHPPythonRubyといった言語があり、それぞれ一長一短の特徴がある。
    さしあたりは、JavaScriptを中心に扱おうかと考えている。というのは、JavaScriptは今人気の言語だからだ。
    サンプルコードを書いたときに、読者が読める、知っている確率が一番高いだろうから、ブログに書くのにも向いているだろう。
    もうひとつメインの言語にしたいのは、Ruby。これは読み書きのしやすさといった理由から。

     しかし、もっとマイナーな言語も扱っていきたい。たとえば?
     たとえば、Smalltalkとか、Lispとか。マニアックだが、洗練された言語だ。
    もっとも、これらがLLかどうかは微妙だし、需要があるかどうかも分からない。
    しかしメジャー言語だけ扱っても、他のブログと差別化できないから、たまには触れていきたい。

    LLの可能性

     以上でブログで扱いたいことの概要をざっと説明したが、
     技術系ブログが扱うテーマとしては、ありきたりな印象を与えてしまったかもしれない。
     まあブログを続けていくうちにだんだん深堀りしていくので、今はこの程度でよい。

     しかし先回りして少しだけ言っておくと、
    ここで言及したSmalltalkLispRuby。この三者に共通するものがある。なんだろうか?

     それはDSL

     「DSL」とは「Domain Specific Language ドメイン特化言語」。
    この三者の言語は、DSLが作りやすい言語として挙げられる。

    DSLの可能性

     私は、LLの先にある可能性をDSLに見ている。

    ブログのタイトルを「LL」じゃなく「DSL」にしようかとも少し思ったくらいだ。
    ブログのテーマはあるていど一般的でないと、更新が苦しくなりそうだから止めてしまったが。

     DSLは、オブジェクト指向設計の一手法である「DDD Domain Driven Design ドメイン駆動設計」だとか、
    あるいは先にも言及した機械学習ともやがて結びついてくる。

     DSLの可能性については、ブログでいずれ触れよう。

    *1:和製英語」→「英語」に訂正。和製英語かと思っていたが、もともと英語圏の言葉のようだ。ただ、初出がどこなのか、本当にそこなのか、確認する作業が必要なので、確信できるまで注釈に回した。