単純な言語ほどバグが少ない?

  • 36
    Like
  • 2
    Comment

私がこの話題を知ったのは、@mattn_jpさんのツイートがきっかけでした。

曰く、静的な型のあるなしはバグの発生頻度に関係がなく、単純な言語ほどバグが起きにくいという結果になっている、ということでしたが、元のページ

https://labs.ig.com/static-typing-promise

をみると、データそのものは面白いものの、考察としてはひどいものでした。まず、言語群を「進んだ静的型システムを持った言語」「古い静的型システムを持った言語」」「動的型付き言語」に色分けして、GitHub上でのリポジトリのバグの数("bug"というラベルが張られたissueを元に推定)を言語別に比較したというもののようです1

しかし、そもそも各々の言語が同じ問題に対して適用されているかわからないのに、単純にバグ数を比較することに意味があるのか疑問ですし、利用者層のレベル差が大きくなるほどバグの数は増えるであろう、といった一般的な傾向に関しても注意を払っていないという点で、近似として使えないものになっています。

また、"bug"とラベルが張られたissueがそのリポジトリのバグの数の近似として使えるかという点についても疑問です。

この記事の著者は、静的型と動的型の差に関する証拠は得られなかった一方、単純さに注力した言語ほどよりバグが少ないとして

  • 手動のメモリ管理をしない
  • ミューテックスを使って並行性を管理しない
  • クラスがない
  • 継承がない
  • 複雑な型システムがない
  • マルチパラダイムでない
  • 多くの構文がない
  • アカデミックなものでない

といった要素を単純な言語に見られる特徴としています。

しかし、単純な言語ほど良い結果になるのなら、(100スターより多いリポジトリにおいて)RubyがPythonより良い結果が出ているのを説明できませんし、Scalaの方がJavaより良い結果が出ている理由も説明できません(Pythonの方がRubyよりは言語として単純だし、Javaの方がScalaより言語として単純だろう2ということを前提にしています)。また、Scalaの方がJavaScriptより良い結果が出ている(100スターより多いリポジトリにおいて)ことも、単純さでは説明がつきません。

そもそも、単純な言語に見られる要素として挙げたものも、著者が恣意的に選んだものですし、(不完全であっても)統計的な調査としてはあまりにもいい加減過ぎると断じざるを得ません。

結果として、データの取り方がとても雑であり、背後にある言語のシステムとは直接関係しない要素(言語のユーザ層、その言語が主に使われている領域)を見落としている上に、結論も実際のデータをうまく説明し得ていません。つまり、この記事は何事も説明し得ていない、というツッコミどころが非常に多い記事であるといえます。というより、自分が好む結論に合うようにデータを解釈してさえいます。

個人的に、反面教師として、こういう結論ありきの記事を書かないでおこうと思うのでした。

なお、自分が思うところでは、Clojure、Go, Erlangは利用者層のレベルが高い、という要素が(普及度が一定以上低い言語においては)あり、それが影響している可能性があるかもしれません(これはあくまで感想であり、強い根拠はありません)。


  1. ほとんどスターがついていないリポジトリを使わないことでノイズを減らしたといったことが述べられていますが、不十分に思えます 

  2. 構文要素としてScalaの方が複雑とは一般には言えませんが、型システムは(Javaも複雑ではありますが)、Scalaの方がより複雑であるように思います