プログラミング言語『Ruby』が嫌いなワケ
ちょっと攻めたタイトルですが、Ruby プログラマーに喧嘩を売っているわけではありません。
私の経験として『Ruby のココが嫌いだな』と感じたことを、こんな意見があるんだ~的に Ruby が好きな方へもお伝えできたらと思って書いてみました。
Ruby on Rails での案件を納品した後に、感じたことを簡潔につづってみます。もちろん言語として尊敬した上でのおはなしです。
目次
なぜ Ruby が嫌いなのか
用途の狭さ
本記事で一番伝えたい部分です。が、シンプルに短くまとめました。
率直に Ruby on Rails(Web開発)以外で用いる事はあるでしょうか?あったとしても、コンソール分野で Python や C#、Java などに勝つことは無理でしょう。Web開発も PHP、Python、JavaScript というイケてるメンツがそろう中、Ruby をあえて選択する理由が私には見つけられませんでした。
業務上、複数の言語を扱う仕事をこなしていると、汎用性の低い手法に対しては、圧倒的に処理速度が優れているとか、その言語でしかできない強い魅力がないと資産になりにくいです。仮に、メインで使用しているプログラミング言語の上位互換がもし登場したら、私は今の技術は捨てられます。それぐらいの覚悟で毎回プログラミング言語と向き合っています。
まだ Ruby しか経験がないかたは、将来どんなエンジニアになりたいのか明確になるにつれ、Ruby を継続するか、他の言語に力を入れるべきか見えてくると思います!
直感的に Ruby のコードが受け入れられない
他言語から来たときに、直感的に読みにくかったのが『Ruby』でした。
プログラミングは一つ極めれば他の言語も雰囲気で読めるようになるといわれていますし、私の経験でもそうでした。C言語がベースにある私には、Ruby の表現は驚きが多かったですね。
# 戻り値が100ということかい…?
def getNum
100
end
# 呼び出しのカッコを忘れていないかい…?
puts getNum
# クラッシュしそう…
ary = ["aa", "bb", "cc"]
puts ary[-1]
# ちょっと何言ってるか分からない
unless not(1 == 1) then
puts "hello"
end
もちろん『慣れたら』というのはどのプログラミング言語にもいえることですが、広く読めることも大事だと思っている私にとっては、なかなか受け入れにくい言語でした。
例えば、『配列の添え字が -1』という表現は、Rubyプログラマーからすればきっと分かりやすいのでしょうが、C言語ではクラッシュするので私にとってはとても気持ち悪いプログラムでしたね。
こう書いておいてアレですが、表現が違う言語があることは幸せなことなんですけどね。
Rubyの関数のルール
第二のじんましんです。
『Ruby on Rails』で見る機会が多かったですが、感嘆符(!)と疑問符(?)が言語のルールとして存在していることが衝撃でした。
ary = [2, 5, 4, 1]
# 並び替えたのを返すよ!
v1 = ary.sort
p v1 # [1, 2, 4, 5]
p ary # [2, 5, 4, 1]
# 自分を書き換えちゃうよ!
ary.sort!
p ary # [1, 2, 4, 5]
こちらも Ruby プログラマーは直感的でわかりやすい!とお思いかもしれませんが、私(C++メイン)としては『!や?は式で用いられる』もので、初めて見たときは『関数名に?とか使っちゃってる』と本気で思いました。Ruby 言語のルールだと知ったときは驚きました。
また、関数に引数がない場合は、呼び出し時に()カッコが不要なのも嬉しくない仕様でした。これは、他言語で『カッコがあれば関数、無ければメンバ変数』みたいに私が判断しているからなのでしょう。私にとって、カッコはコードを読むうえで重要な判断要素だったのだと Ruby のおかげで初めて気がつきました。
C# のプロパティだと思えば、そこまで違和感はないんですけどね…
表記パターンの不統一性
Rubyで良い表現をするなら『自由に書きたいように書ける』ことですが、開発現場は初心者から熟練者まで入り混じることが多かったため『同じ目的を達成するための手段に、コア言語として手法が多いのは悪』と、実は今でも感じています。
ちなみにPython言語の思想は『文法が単純化されている』ことにより、表記が統一されやすい特徴がある言語ですね。イメージ的には Ruby は Python と真逆の存在ですね。
va1 = 123
va2 = 123
ans = 123
if va1 == ans && va2 == ans then
p "match1"
end
if va1 == ans and va2 == ans then
p "match2"
end
unless va1 != ans || va2 != ans then
p "match3"
end
unless va1 != ans or va2 != ans then
p "match4"
end
コードに多少の悪意はありますが、これらは全て同じ意味で同じ結果をもたらします。(この処理内では)
プログラミングは書く時間も多いですが、それ以上に読む時間が長くなることが多いので、コードの表記パターンに揺れがあると読みにくくなるものです。if文も自由に書かれがちで、否定の否定という「なくなくなくない?」みたいな読みにくいコードもよく見かけます。こういう表現が生まれにくい言語の方が、全体的にプログラムの質も高くなると私は考えています。
他にも様々な表記ゆれを見てきましたが、結局プロジェクト内で統一されず、個人個人の特徴が表れたソースになってしまいました。具体的なコードはもう覚えていません。とりあえず unless は撲滅させました。
ちなみに、そういった差異を小さくするために、複数人で作業する案件だと『コーディングルール』とか決めますね?C++も表現の自由度が非常に高いので、ちゃんとしたプロジェクトだとコーディングルールを決めていました。
Rubyが良いなと思ったところ
全てがオブジェクトという考え方
Rubyの特徴である『全てがオブジェクト』ならではの、コードの表現性・圧縮性は良いですね!
# 4回繰り返すよ!
4.times do |i|
p i
end
# 配列を全ループするよ!
["red", "green", "blue"].each do |color|
p color
end
# 文字数
p "hoge fuga piyo".length
Ruby on Rails では多くのメソッドチェーンを見かけました。処理が1行で表現できると、HTMLにコードを記述する際にスッキリするという強いメリットがあるのは確かですね!
他言語でいうところのリテラルではできない表記が可能なのは、Rubyの特徴が出ていて良いですよね。こういった表記は、書きやすく読みやすいコードだと素直に感じました。
どのプログラムを選ぶと良いの?
きっとこんな疑問を持つはずです。Ruby は決して悪くないプログラム言語ですが、サーバーサイドのプログラムはもちろん Ruby だけではありません。
それぞれの言語に特徴がありますが、私の経験でざっくりと紹介しておきます。
PHP
PHP を扱うメリットは、活用事例の多さでしょう。みんなが活用しているから~というのは正直つまらない理由ですが、案件が多いのは単純にメリットと認めざるをえませんね。
また、WordPress でも活躍できる機会があるのは強みでしょう。嫌いな人もいるでしょうが、利用者が多いのは事実なので、しばらく需要はあると思います。
Python
Python を扱うメリットは、Web ではない分野でも活躍できる点ですね。Web フレームワークはもちろん存在しますが、言語やライブラリがモリモリ成長しているので、言語の知識が広く活かせるという点でしょう。
もちろん違う畑には、そう簡単に引っ越しできるわけではないですが、基本文法を学ぶ手間が省けるのは良いですよね。
JavaScript
JavaScript を扱うメリットは、サーバーサイドとクライアントサイドのどちらもプログラミングできる点ですね。学ぶことが多い初学者にとっては特に嬉しい特徴でしょう。
これは熟練者にとっても確かにメリットです。ただ、私はサーバーサイドが JavaScript で作られている案件が回ってきたことがないので、新規の案件だと強みが活かせるのかなというのが感想です。
受注したRuby業務の話
フレームワークは『Ruby on Rails 5』を採用し、自治体のWebサイトを制作しました。当時は普通に会社勤務だったので、受注というよりは単なる業務の一環でという感じです。開発期間は約18ヵ月と、Webサイトの制作にしてはなかなかの長期間で、今思い返してもわりと大きな案件だったかなと感じます。
Rails の考えは確かに悪くはなく、実装の速度は出やすいフレームワークだと感じました。ただ、最適化しすぎたことにより暗黙的なルールも多く、フレームワークに使われている感により実装の面白さを削がれました。
で、この記事に至るという感じです。まぁ文句を言いながらも普通に納品しましたし、やっぱり業務で携われるのが一番の経験になりました。そういう意味では Ruby on Rails を経験させてくれたプロジェクトには感謝しています。
まとめ
Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (enjoy programming)
まつもとゆきひろ
Ruby 言語は思想どおりに成り立っていると感じます。少ないタイピングでサクサク実装でき、表現が多彩で、Rails と組み合わせることでよりパワフルになっているのは感じました。
一生懸命 Ruby を学習しているかたには、嫌な記事だったかもしれません。今後、どういったエンジニアになりたいかを考え、学ぶプログラミングを選択するきっかけになれば良いなと思っています。
以上、プログラミング言語『Ruby』が嫌いなワケでした。