たなかこういちの開発ノート

システム開発に携わる筆者が、あれこれアウトプットするブログ

そのプログラミング言語、Simpleですか?Easyですか?

ScalaMatsuri 2019 Unconference Day 16時からC会場で開かれました「From Go To Scala Easy vs Simple」セッションを受けて、自分としてのまとめを記します。
 
※当日のツイートまとめました。→ https://togetter.com/li/1371467
 
 
まず、私はかつてDSLを作ろうとして「プログラミング言語とは?」といったお題をある程度深く考えたことがある経緯もあって、元来次のような考えをもっていましたが、このセッションを経てそれを強化することとなった次第です。
 
(主張A) たぶん、「Simple」というのは、言語のSemanticsとして構成要素が十分に少なくて、それでいてどんなに複雑な構造物や機能をも応用的に組み立てられるようなことをいう。言語の構文として覚えるべきことは少ない。十分に少ない構成要素で、十分に広い応用が可能となっているとき、その言語を「Simple」という。
 
(主張B) 一方、「Easy」というのは、その言語を全く知らないその言語のソースコードの初見者でも、ソースコードを構成している英単語モドキから、ある程度の機能性や意味論を推し量ることができるとき、その言語を「Easy」という。つまり、たぶんどちらかというとSyntaxの問題と思われる。(※この観点からは、ベースの英単語から意味を推し量れない記号キーワードや、暗黙系の機構は最も嫌われる言語要素となります。)
 
私は、昔C++大好きだったのですよ。何が良かったかというと、演算子オーバーロードと暗黙キャストで、これらを駆使することでいろいろなカラクリを作り込むことができるわけです。Scalaにも、メソッドに記号を用いることを許していたり、implicit conversionがあったり、C++の特性と同じ面があるわけです。しかしながら、C++を"反面教師"として作られたJavaでは、演算子オーバーロードも記号メソッドも暗黙変換も、全て落とされました。これは、JavaをC++より「Easy」にしたかったから、なのだといえると思っています。
 
水島氏を筆頭に、「Scalaは「Simple」である」とScala勢は主張します。これはおそらくそうなのでしょう。しかし、決して「Easy」ではない、ということになるでしょう。(C++が決して「Easy」ではないように。)
 
水島氏曰く「KotlinはあきらかにScalaを元に作られています。ソースコードリポジトリに証拠が残ってます。」とのこと。「Kotlinは、Javaを元に、関数型アプローチを加えた(Scalaとは異なる系統の)もの」というより、「KotlinはScalaを元にして「Easy」さを目指したもの(もしかしたら「Simple」さを犠牲にしたとしても)」という捉え方が(やはり)妥当なのでしょう。
 

 
「Easy」というのが、上記(主張B)の通りだとしたら、その新言語に接したプログラマーの既存の知識から、その新言語の構成がどれほど隔たっているか、という距離感が「Easy」さの感覚へ大きく影響するだろう、という意見がありました。言われてみれば全くその通りですね。「Easyとは学習コストの低さのことである」と再定義できます。
 
 
となるとさらに言えそうなのは、「その新言語の開発者たちは、実際、どういったプログラマーを"顧客"として想定しているのか?」という点が極めて重要になります。プログラミング言語といっても工業製品であり、セグメンテーションとターゲティング、つまりマーケティングの問題から切り離して考えることはできないでしょう。私もこの認識はありましたが、水島氏もセッションの中で言及されていました。この観点からみると、Kotlinは明確にJavaプログラマーを意識していると言える、と。対してScalaはどうなのでしょう?セッション中に意見はでませんでしたが、もしかしたらScalaはHaskellを見てるのでしょうか?
 
セッションはもともと「Go vs Scala」で始まりました。セッション中の意見では、「Goは、Simpleとはいえない。Easyではある。」という方向だったようです。ちなみに、Go言語に対する完全な私見として、「Go言語は、Web API呼び出し用シェルスクリプトとしての範囲で用いるのが適当」という意見をもっています :-)
 
 
まとめると、大切なのは「誰目線での評価か?」ということになりそうです。
 
(0) まず、「Simple」と「Easy」は独立した評価軸である。
 
(1) 言語開発者からみれば、設計された言語がいかに「Simple」かという点こそが言語に対する評価ポイントとなる。もしかしたら「Easy」さは二の次。
 
(2) パワープログラマーからみたら、(C++のように)「Simple」とか「Easy」とかはどうでもよく、Hackしがいがあるかどうかが評価点かもしれない。(ただし、一般に単にEasyさを目指しただけではHackingポイントが少なくてつまらないし、上手に「Simple」に作られた言語はHackingポイントが多数あって楽しめる言語になり得る、という傾向はありそう。)
 
(3) 一般プログラマーからみたら、初見での敷居の低さ(=おそらくは学習コストの低さ)を感じられる「Easy」さが評価観点となる。
 
さらに、
 
(4) 「一般プログラマーへの普及」を考えるならば、、その一般プログラマーというのが具体的にどういう人たちであり、その人たちに如何に「Easy」さを訴求するかというマーケティング上の戦略が大切。(「Simple」は一般プログラマーへは訴求しない。)
 
となります。
 
おまけとして、、
 
・「C++はSimpleでもEasyでもない!」

 
・「SwiftのOption相当機能は、極めてEasyだが、相当に非Simple」

 
など。
 
 
普及についていうと、Kotlinは明らかにAndroidプラットフォーム用開発用途として普及している面を無視できない、という話がでました。
 
プラットフォームと言語の普及について、以前以下のような記事を書きました。
 
今回のScalaMatsuriでも何名かから「脱Play→Web APIサーバーとしてのAkka-Http」というお話を伺いました。ChatworkさんやTISさんの事例から「高トランザクショナル要件に対してのAkka Clusterの適用」、という一つの典型ケースも確立されつつあるかなー、と思いました。
 
◆以上