はじめに
自分はこの手の記事が苦手です。何故ならば目的・用途によって選ぶべき言語が違うからです。例えば、なるべく計算機と近い距離でプログラミングをしたい場合は、アセンブリ・C言語。真逆で計算機と大きく距離を置いて、数学的な観点からプログラムを書くHaskell。将来的にパフォーマンスやポータビリティが求められる現場で本格的に学びたいのであればGo言語。ブラウザを主体とした動きのプログラミングをしたい人向けのJavaScript・TypeScript。と言った感じで、プログラム言語には思想や使われる目的があり、世の中には無数に言語が存在します。その為、表面的な理由(カッコを書かなくて済む・コードが短くなる)に固執してプログラミングの勉強をスタートしても失敗するだけな気がします。まず、ハッキリ目的意識を持つことがプログラミングを学ぶ良いきっかけになると思います。
一つの選択肢としてのRuby
プログラミング初心者は、スタートアップ言語として特定の言語に固執する必要は無い・目的を持ちましょうということを述べました。しかし、目的が定まらない人もいるでしょうし、こういった記事で目的をしっかり定義してからプログラミング言語を紹介するのは、問題ないと思います。Rubyを以下のような理由でプログラミング初心者へオススメします。
- トライアル・アンド・エラーがしやすい機構
- オブジェクト指向が学びやすい
- すぐに有用なプログラムが書ける
- Web(今の世の中)の仕組みが把握しやすい
こちらをテーマに紹介をしていきたいと思います。
トライアル・アンド・エラーがしやすい機構
プログラミングは、とにかくコードを書かなければ身につきません。Rubyは、ファイルを用意してコマンド一つ実行すれば、即動いて結果を返してくれます。
$ cat hello.rb
puts "hello"
$ ruby hello.rb
hello
プログラミング言語には、コンパイル言語とスクリプト言語が存在します。Rubyはスクリプト言語のため、一度機械語(もしくは中間言語)に翻訳するコンパイル言語とは一段ステップが早く実行出来ます。コンパイル言語は悪ではありません。コンパイルをすることで、プログラムの間違いを指摘してくれたり実行速度が早くなるように最適化をしてくれるなど、多くの利点があります。しかし、とにかくコードを多く書き早く実行をしたいプログラミング初心者にとっては、スクリプト言語は強力な武器になると思います。
Rubyには、さらにirb
という対話的に文法を確認出来るREPL(Read Eval Print Loop 読み・評価・表示・繰り返し)が備えられています。※ 最近の言語には多く備えられていますが、古い言語や特にコンパイラ言語だと標準でREPLが備わっていないケースも存在します。
$ irb
> 1 + 1 # 電卓としても使える。
=> 2
> [1, 2, 3, 4].length # 新しく覚えた文法は、すぐ確認できる。
=> 4
これらの機構を利用して、多くプログラムを書き・多く失敗しましょう。
オブジェクト指向が学びやすい
オブジェクト指向は、良い設計を保つために必要なプログラミングの考え方の一つです。言語やプログラマによって、オブジェクト指向の在り方は様々です。そのため、オブジェクト指向をしっかり学ぶのは難しいですが、Rubyではオブジェクト指向が溶け込んでいるので自然で学びやすいです。
関数とオブジェクト
オブジェクト指向が一般に浸透する以前の手続き型言語の代表はC言語です。C言語では、関数を主体としたプログラミング方法で良い設計を保っていました。(C言語における)関数は手続き処理をまとめて、そこに0個以上の値を引数として渡して処理を実行したり結果を受け取ったりします。関数を使うプログラマは、あらかじめ関数について調べ、どのような値を渡せるかを把握しておく必要があります。しかし、目的の関数は何か、関数はどのような値を渡せるかを関数毎に考えるのは非常に面倒です。
strlen("abcd");
// => 4
strlen(4); // 数字は渡せる?
// => error
オブジェクト指向とは、データがどのような動き(メソッド)をするかあらかじめ定義しておいて、それを呼び出すような形でプログラムを記述します。オブジェクトについてメソッドを調べるのは、ドキュメントを見るという点では、関数を調べることと同じですが、
無数にある関数 -> 使い方(何が引数として渡せるか?)
オブジェクト -> メソッド一覧 -> 使い方(どのような動きをするか?)
と考えると調べる手間は、大きく変わります。
$ irb
> "abcd".class
=> String
> "abc".length
=> 3
> [1, 2, 3, 4].length
=> 4
> [1, 2, 3, 4].first
=> 1.length
> NoMethodError: undefined method `length' for 1:Fixnum
これを現実世界で喩えてみると、
「歩く」は、人間・猿ができる。
「泳ぐ」は、人間・魚・犬ができる。
「走る」は、紙ができる? (できない、エラー)
という動作(関数)から、適用出来る物(値)から探すよりは、
「人間」は、歩く・泳ぐ・走るができる。
「紙」は、折る・投げるができる。
のようにオブジェクト主体から動作を探ったほうが、楽だということがわかります。
オブジェクト指向の火付け役となったJavaは、プリミティブ型とオブジェクト型が混在しておりRubyのように純粋なオブジェクト指向ではありません。その為、オブジェクト指向を学ぶのに完全に適した言語とは言い難いです。
new Integer(1).toString()
// => "1"
1.toString()
// => error 1はプリミティブ型な為、メソッドを呼び出せない。
void hoge(){ // インスタンスメソッド、オブジェクトの動作
...
}
static void foo(){ // staticメソッドは、オブジェクト指向ではない。
hoge(); // error オブジェクト指向ではないメソッドでは、
// インスタンスメソッドは、呼び出せない。
}
綺麗なオブジェクト指向は、メソッドチェーンと呼ばれる書き方(オブジェクトのメソッドの戻り値も、またオブジェクトその為メソッド呼び出しが連鎖できる)が出来るため、自然言語のように抽象的に読みやすいのです。
# 1~5の整数配列から偶数だけを選んだ後の配列の長さは?
[1, 2, 3, 4, 5].select{|x| x % 2 == 0}.length
=> 2
これを
int len = 0;
int arr = {1, 2, 3, 4, 5};
// forはループ。ループとは何かを知る必要がある。
for(int i=0; i<5; i++){
// arr[i] は、i番目の配列の要素。配列について知る必要がある。
if(arr[i] % 2 == 0){
// 長さをカウントしていく。
len++;
}
}
len;
// => 2
ここで意識することは、単純にコードが短くなることではありません。メソッドにより上手く抽象化(処理に名前が付けられた)されたコードは、自然に読むことができ、結果的に短くなるということです。自然に読むことができないコードを書いてしまった場合は、オブジェクト指向が上手く書けていないことの指標にもなるのです。
すぐに有用なプログラムが書ける
すぐ動くものが欲しいと思うのは、初心者に限らずプログラマなら当然の欲求だと思います。元々スクリプト言語は、そういった目的で作られています。
例えば、様々なファイルが混在するファイルの中からtxtファイルを取り出し、サイズが10バイト以下のものだけを取り出して中身を確認したいとします。
$ ls
0.html 1.html 2.txt ls_short_text.rb
0.txt 1.txt 3.txt
そのような場合は、この様なプログラムを組みます。これぐらいであれば、書くのが苦ではなく、即席で実用性のあるプログラムが書けることがわかります。
ls_short_text.rb
puts Dir.glob("*").select{|path| /.txt$/ === path }.
select{|path| File.size(path) < 10 }.
map{|path| "#{path} #{File.read(path)}"}
$ ruby ls_short_text.rb
2.txt ccccc
このように、ちょっと困ったことを持てる知識でパッと解決出来ることは、学ぶモチベーションにも繋がると思います。
Web(今の世の中)の仕組みが把握しやすい
今の時代の世の中は、Webによって支えられていると言っても過言ではありません。スマホのアプリやSNS、今見ているこの記事だってWebを通して得られた結果です。この仕組を把握するには、Webフレームワークを覚えることが近道です。Rubyでは、Ruby on Railsが、有名なフレームワークです。しかし、個人的には機能過多で(開発という点では良い点です。しかし学習の点では、不向きともいえます)楽をするために多くの処理が隠蔽されています。Web(HTTP)の仕組みの基礎は、とてもシンプルです。URIの要求(リクエスト)に対して文字列(HTML, Json, バイナリ文字列)を返却してあげるだけなのです。私が、Webプログラミング初心者にオススメするのは、Sinatraというフレームワークです。機能を削ぎ落として、HTTPの仕組みが簡単に把握することができます。実際多くの言語でSinatraを真似たフレームワークは多く存在します。まずWebをシンプルに把握したい場合は、Sinatraを学んでみてはいかがでしょうか?
# http://localhost:9292/now にアクセスすると、現在時刻が見れる。
get '/now' do
Time.now.to_s
end
まとめ
いかがだったでしょうか? この記事を見てしっくり来ない場合は、あなたのプログラミングを学ぶ目的が違うと思います。特定の言語にとらわれず目的に沿った言語を選択しましょう。Rubyが目的に合っていて、わかりやすい・書きやすそう・試しやすそうと思ってもらえれば幸いです。