RubyとGoの思想を比較して思うこと

僕は主にRubyとGoを書く。この2つを使っていると、「(Rubyに比べて)Go辛いなあ」と思うことがあるのだが、なんで辛いのかはよくわかってなかった。 最近仕事にGoを使い始めたRubyistが社内ブログでGoのPros/Consを書いていたんだけど、そのConsも自分が辛い理由には該当しなかった。

今日Go ConferenceでRob Pike先生がGoの設計思想について話をしていて、思うところがあったので書いてみる。

書き方が1つだと冗長な書き方を迫られることがある

Robは、「すでにできることのための機能の追加は行わない。genericsはinterfaceとかぶるから、genericsを入れるならinterfaceを取り除き標準ライブラリを全てgenericsで実装し直す」 というようなことを言っていた。 この思想が徹底されることによりコードの可読性を担保できるという。

一方でこれは、「シンタックスシュガーや用途が限られたリッチな構文が導入されないこと」とのトレードオフだと思う。

文字列操作全般がつらい

文字列操作の比較表: RubyとGo言語という鵜飼さんの記事がある。

可読性は個人の好みだと思う(僕はRubyのほうが読みやすいです)が、書きやすさに関しては明らかにGoのほうが文字数が多く書くのに手間がかかる。
文字列操作をするのが本当に疲れるので、Webアプリケーションを作るのには向かないと思う。

書き方が1つだけだと読みやすい

一方で、方法が制限されていることにより得られるメリットもある。

Robは、「書き方がたくさんあると、どちらで書けばいいのか迷って時間を無駄にするし、読むときもなぜその方法が選ばれたのかわからない」というようなことを言っていた。 これは実際そうだと思っていて、Rubyだと書き方がたくさんあるので困るということが実際ある。

例えば、

def hoge_foo
  hoge.foo
end

def hoge_bar
  hoge.bar
end

のようなコードは

[:foo, :bar].each do |method|
  define_method(:"hoge_#{method}") do
    hoge.send(method)
  end
end

と書き直すことができる。

僕は多くの場合「前者のほうが可読性が高いと思っているので」意図的に前者の冗長な書き方をするし、 Ruby2.2になったら「Symbol GCが効くから」前者を使うべきみたいな人も出るかもしれないが、 これらの意図はコードを読んでも多分伝わらないので、なぜそういう書き方をしたのか考えるコストが発生する。 どちらの書き方も良い点悪い点あるため、その時の状況によって迷うことになる。

Rubyのコードレビューを見ていると、個人の書き方の好みや統一のための指摘が結構多くて、時間を無駄にしていると思う。

まとめ

みんな違ってみんな良い