Rubyによるプログラミングに関する世界観(戯言)です。Rubyも参照のこと。
Rubyを学ぶのは、入門者にとって一番いいと僕は思います。
Rubyと比べて、ほかに優れた言語はたくさんあります。人工知能ならPythonですし、クライアントサイドからサーバーサイドまでひとつの言語でできるのはJavaScriptやTypeScriptです。
しかしながら、そうした、相対的な理屈をつけて、「この点では他の言語が優れている」ということは、プログラミング入門者にとっては、意味がないのです。
なぜなら、プログラミング入門者にとって、必要なのはひとつの言語でプログラミングの基本を習得することです。別の言語がその点で優れているという「相対的な特徴」は、プログラミング言語を、たとえばRubyを学習し終えた時点で、意味のないものとなります。そうした相対的な長所や短所は、学習をし終えると残りません。残るのは、プログラミング言語の詳細を知った上で分かる、「自分にとってはこのプログラミング言語が好き・嫌い」という、相対的ではなく絶対的な、個人の経験になります。そして、この絶対的な個人の「この言語が好き」ということが明らかになる段階で、もっとも人々の好む言語はRubyです。
また、プログラミング言語の本を、C/C++からLispまで全部揃える意味はありません。ひとつの言語に決めたら、別の言語に気移りして、「やっぱりPythonにしようかな」と考えないべきです。すなわち、「Rubyと決めたら絶対にRubyで自分の書きたいソフトウェアを書くべき」だからです。
プログラミング初心者には、Rubyが一番です。そして、Rubyを学んで習得した上で、Railsのアプリケーションを作ったりできるぐらいの技術力をつけてから、PythonやJavaやC/C++を学びましょう。それが、もっとも正しい成功するプログラミング言語の習得の道です。
Rubyは、日本人であるまつもとゆきひろ氏によって生まれた言語です。
C++/Javaのような言語が、パフォーマンスやオブジェクト指向的な機能性を目指して作られているのとは違い、「コードを書く楽しさ」のために作られています。
Rubyでは、動的スクリプト言語としてのオブジェクト指向の仕様と、ブロックやMix-inのような使いやすい記法から、美しく、機能的で、短いコードを簡素に書くことができます。
Perlを参考にした言語であり、「パール(真珠)ではなくルビー」という名前になっていますが、記法の過度な自由や美しくない記法の多いPerlに比べて、書き方が制限されている代わり自然で「このように書きたい」というニーズを満たした言語仕様になっています。
ライバルはPythonで、アメリカなどでPythonが流行っているのと逆に、日本ではRubyが流行っています。
また、最近ではRuby on Railsという革命的なWebフレームワークで採用されたことで、日本だけではなくグローバルに普及しました。ここまで流行っているのは、Railsの功績が大きいです。
ですが、ブロックの終わりに「end」というキーワードを使うとか、ブロック(無名関数)の引数を「|~|」で囲んだり、インスタンス変数を「@name」のようにアットマークで示すなど、独自のありえない記法がたくさんあります。ですが、その多くは自然で、使い慣れるとプログラミングの際にいつでもこの書き方をしたくなるほどシンプルかつ美しいです。
また、JavaやC++と比べて「本当のプログラマの言語ではない」と言われることもあります。Rubyエンジニアは、いつまで経ってもRubyとRailsしかできず、限界が来ると言われています。これは確かにそうかもしれません。型名や呼び出し規約をきちんと考えるJavaやC++に比べて、動的であまり考えなくても適当に動くRubyは、一流のハッカーになるためには少し簡単すぎるのかもしれません。高水準・高レベルすぎて、実際のCPUやメモリなどを中心に動いているコンピュータ・アーキテクチャが見えづらくなっている、ということはあると思います。
Rubyの特徴として言えるのが、「動的」な言語ということです。
C++やJavaなどが「型」の概念にとらわれるのに対して、(Rubyに型がないわけではありませんが)日常の利用で型という存在を別にしてコードを書くことができます。
C++やJavaなどでは、親クラスの型や派生クラスの型、インターフェースの型などを考えて書かなければなりません。あるいは、たくさんの型に対応しようとするならば、テンプレートを使ってジェネリックで行わなければなりません。それに加えて、C++ではポインタの考え方が入ってきます。動的な配列やメモリ確保を実現したり、あるいはスコープ外のオブジェクトにアクセスするための参照型として、ポインタを使う必要があります。
Rubyは、動的なスクリプト言語であるため、そうした静的型付けの考え方から「解放」されて、スクリプトを動的に書けます。Rubyの型は、あえて指定しなくても、その場その場の状況に応じて動的に決定されます。
動的であることは必ずしも良いことではなく、厳密に型付けされている方が良いことは多々ありますが、手軽で簡単に処理を実行できる言語であると言えます。大規模なプログラムはJavaで書いて、個人で使うバッチ処理にはRubyを使う、といったやり方をすれば良いと思います。
Rubyは、Web用途に使うと何でもできます。
従来はPerl/CGIやPHPのような言語で行われていたWeb業界は、最近は完全にRubyやRails、あるいはそれと同等のWebフレームワークを使って作るようになりました。
Twitterのような高度な「掲示板のようなSNSのようなコミュニケーションサービス」は、RailsやDjango(Python版のRails)で作ることができます。(最近はTwitterはRailsからScalaに変更されたらしい。)
Railsを使えば、超簡単に、また何でもできるWebサービスを作れます。PHPでPDOなどを使ってごりごりSQLを書かなくても、最低限の記述で簡単に管理できます。
そのため、Webエンジニアになりたいのであれば、まずはRubyを習得しましょう。
Rubyは良い言語で、優れた言語仕様と何でも簡単にできるライブラリ関数がありますが、GUIアプリケーションを作るのには向いていません。もともとはPerlのようなシステム管理のために使われることの多い言語ですが、簡単なスクリプト処理とWeb以外の分野ではあまり使われていません。そのため、C/C++やC#/VB/Javaなどと一緒に、Rubyを使って「Webサービスを作って何かやってやろう!」という気概を持って習得に励んでください。
Rubyの大きな特徴は、「複雑で高度なことを小さな記述で簡単にできる」ということ。
標準のデータ構造やブロックなどを使うことで、C/C++では何十行・何百行におよぶコードを、数行で記述することができます。
また、日本発の言語であるため、日本語のマルチバイト文字などの対応も優れています。PerlやPythonでは複雑になる日本語のテキストファイルの処理などを簡単に処理できます。
そのため、本当にバッチ処理の練習に向いています。練習だけではなく、Rubyを使うことで実用的なプログラミングを習得することができます。
最高のWebフレームワークの一つRuby on Railsで採用されたことから、Railsで使われる言語として良く使われる。
日本人が創始者であることから、日本の情報が多い。日本でのプログラミング学習用途として良く使われる。
Ruby作者の名前は日本人のまつもとゆきひろ。だが、日本人だけでなく外国人による開発者やコミッターも多いことから、まつもとは「厳密には国産とは言い切れない」と言っている。
直観的で、少ない行数でプログラムが書けることから、手動でやる代わりにRubyで作業を自動化する用途に良く使われる。
僕個人の意見を言えば、Rubyは動的型付けが間違っていると思う。
それは、なぜなら、「そのクラスが何なのか分からないままに、適当にメソッドを付けて操作することが多い」からである。
たとえば、関数の引数にオブジェクトを指定する場合。どんなクラスのオブジェクトをそこに渡すのか、ということを明記せず、適当にそのクラスのメソッドを使う。どんなクラスのインスタンスを引数に与えるのか、ということがあいまいなまま、適当に動いてしまう。
JavaScriptの方で「TypeScript」というものを作っているように、僕は「TypeRuby」というものを作ってほしい。おそらく、それがこの世界で一番最高の、理想のプログラミング言語になるだろう。
後日注記:動的型付け言語であることは必ずしも悪いことばかりではなく、「ダックタイピング」ができるなど良い点もある。ダックタイピングとは、「アヒルのように歩きアヒルのように鳴くものはアヒルに違いない」という考え方で、共通のメソッドを持つものは、たとえ型が違っていても同じように扱える、という考え方である。これが、Rubyに「似たような名前のメソッド」が多い理由でもある。継承やインターフェースやジェネリックに似たような考え方を、Ruby流に「手軽に実現」したものであると言える。
型も参照のこと。
あるんじゃないかと思っていたら、やっぱりありました。Rubyを静的型付けにするCrystalという言語があります。実行速度が速く、型安全である。
ただ、僕としては少し不満な点がある。型をきちんと書いて欲しい。この言語は効率的な機械語は作成できるようだが、Rubyと同じように型を省略するコードが目立つ。そうではなく、クラスなどの型を書いて欲しいのである。(言っていることが良く分からないかもしれないが、僕も型推論などの機能が良く分かっていないので、当たり前である。)
Rubyは、一部では日本人にも嫌われている。その理由は何か。
それは、「Rubyエンジニアはいつか限界が来る」からである。
Rubyでコードを書いていると、型名などの難しいことを考えなくても適当なコードで動いてしまい、いつまでもきちんとしたコンピュータの知識と技術が身につかないのである。
C++やJavaのプログラマには、そんなことはない。Rubyは確かにプログラマのベスト・フレンドだが、教育向けであると言う割に、教育にはふさわしくない。
よく、Rubyについて、「本物のプログラミング言語ではない」ということが言われることがあります。
つまり、「簡単なスクリプト処理には使えるが、C++やJavaのようにきちんとしたプログラマが使う、一流のプログラミング言語ではない」という意見です。
同様に、JavaScriptなども、「本物のプログラミング言語ではない」と言われることがあります。
しかしながら、Rubyに関して言えば、この意見は間違いです。
なぜなら、Rubyは「本物を超えたプログラミング言語」だからです。
Rubyには、独自の「Ruby道」があり、このRuby道を極めることこそ、Rubyでプログラムを書く理由です。
このRuby道の精神は「楽しさ」であり、同時に「自然に分かりやすいプログラムを書けること」をMatzは信念としています。
RubyはRuby on Railsという大作フレームワークを作りましたが、RailsではRuby道の極みを行っています。それは「なんでも簡単にできて、楽しくて、自然で、実用的だ」というポリシーです。
Rubyはまさに「本物を超えたプログラミング言語」、すなわち、どのプログラミング言語とも違う、「言語という概念を超越した言語」なのです。
2020年12月25日、クリスマスプレゼントとしてRuby 3.0.0がリリースされました。RubyコミュニティによってRubyがよりRubyらしい言語となっていくことを切に願っています。
Ruby 3.0.0がリリースされましたが、
今回のリリースの目玉は「三倍速くなった」「静的型解析ができるようになった」「並列処理」の3点だそうです。
特に、静的型解析については、RBSというツールが搭載され、TypeScriptのようにRubyの型を解析することができます。
また、TypeProfというツールを使うことで、一般的な型のないRubyコードから、自動的にコードの記述を解析して、型宣言ファイルを自動生成することができるようです。
これにより、Rubyの使われる場面(たとえば大規模開発の言語として採用される)が大幅に向上することが期待できます。
Rubyという名前のせいで、「パール(Pearl→Perl)のパクリではないか」と思われることの多いRubyですが、名前の由来は「真珠の次の月の誕生石がルビーだから」です。
Perlからの影響は確かにありますが、むしろ同じオブジェクト指向のスクリプト言語であるPythonに共通点が多く、よくライバル扱いされます。
また、作者のMatz(まつもとゆきひろ)は日本人ですが、日本人だけではなく多くの外国人の開発者と共同開発しているため、本人は「国産とはあまり言いたくない」と言っていたこともあります。
しかしながら、日本から生まれた言語であるため、日本人の開発者や日本語の情報はとても多いです。しかしながら、Ruby on RailsはデンマークのDHH(デイヴィッド・ハイネマイヤー・ハンソン)によって開発されたフレームワークであり、決して「日本ローカル」に閉じたソフトウェアではなく、海外にも多くの愛好者がいます。彼らはRubyの精神のことを「Ruby Way」とか「Rubyish Way」と呼びます。
Rubyの特徴として、「簡単すぎて逆に悪い」ということが言えます。
Rubyでは、「簡単に短いコードでプログラムが書ける」ということを目指しているため、プログラムを書く際に、必要最低限以上の長いコードを書く必要がありません。
また、RubyによるWebフレームワークであるRailsでは、やり方や作法が決まっており、Railsのやり方に従いながら、いくらかRubyを書くだけで、簡単にWebサービスが開発できてしまいます。
このため、Rubyエンジニアは、エンジニアという名前でありながら、「プログラミングのようなことをほとんどしなくてもプログラムが開発できる」という状況に陥ります。
すなわち、プログラマであるはずなのに、なんにもプログラミングをしていないのです。
そのため、「プログラミングセンスが身につかない」とか、「Rubyしかできないプログラマになる」とよく言われます。
このようなことは、ほかのRubyと似た性格を持つ言語でも同じで、たとえばPythonでも、既存のモジュールを使うだけで、自分でアルゴリズムをまったく書かなくても、どこかの誰かが作って提供しているモジュールを使うだけでプログラミングができてしまいます。(Gemsを使うのはRubyでも同じです。)
ですが、RubyとPythonには、決定的な考え方の違いがあると思います。
プログラミング言語の目指す未来として、僕は二つの考え方があると思います。
すなわち、一つ目が、「簡単にプログラミングができる」ということ、二つ目が、「高度なプログラミングがエレガントにできる」ということです。
そして、Rubyのような言語は、前者のように、「簡単にプログラミングができる」ということを目指しています。
ですが、Pythonのような言語は、後者のように、「高度なプログラミングが自由自在にエレガントにできる」ということを目指していると思います。
日本人は、ソフトウェアを開発する上で、工業製品を開発してきた経験から、「何も知らない利用者であっても、複雑なことを何も気にせず、できるだけ簡単に分かりやすく動くこと」を目指してしまいます。
ですが、僕がアメリカのIT技術の優れている点として、アメリカのIT技術者は、「もっと面白く、もっと高度に、もっとエレガントな方法でプログラミングを行うこと」を目指しているところがあると思います。
すなわち、アメリカのIT技術は、IT技術そのものを進歩させるために、新しいIT技術的な「思想」や「体験」を作ろうとしているのです。
僕は、そのような考え方が、RubyとPythonのはっきりとした境界線を作っていると思います。
Rubyは確かによい言語で、とても簡単かつ楽にプログラミングができますが、プログラミングにおいて重要なのは「簡単」や「楽」ということだけではありません。より高度に、エレガントに、スマートにプログラミングができるということ、そうした「思想」を作るということを、アメリカのIT技術者は目指していると思います。
2023.04.26