DIVE INTO CODE

2019年04月20日

【初心者向け】Rubyコードの読み方は3ステップ学習法でマスターせよ!

Aws4 request&x amz signedheaders=host&x amz signature=3c79c307dd52090da0eb98d11c616620ceb948b019df2756ee9ff179a264a3f2

プログラミングの初心者や初学者は一体どこから手をつけたら良いのでしょうか。その不安を取り除くには、漠然とコードの大海原へ飛び込む前に大まかなルートと通過点を知ることです。そのために、「Rubyコードの読み方をマスターするまでの学習法」をお伝えします。
DIVE INTO CODEで教えているRubyを習得する前提で話を進めますが、他の言語でもほぼ共通した学習法ですので参考にしてみてください。

【こんな方におすすめ】
・未経験からのエンジニアを目指している方
・プログラミングスクールを検討している方
・プログラミングの勉強で悩んでいる方

【目次】
1.学習法は「プロセス」と「要素」が大事
2.「プロセス」で押さえるべき3つのポイント
・プログラムを書いて動かす
・作ってみる
・説明を理解する
3.「要素」で押さえるべき3つのポイント
・プログラムが実行される順番のイメージを持つこと
・関数(メソッド)のイメージを持つこと
・オブジェクト指向を理解する

■話し手
DIVE INTO CODE 代表 野呂 浩良
■聞き手
StartGate 永田 拓也

学習法は「プロセス」と「要素」が大事

いきなりですが、コードの読み方って……何ですか?

ファイルに書かれている、文字やコンピューターへの命令文の集合体をコードと呼びます。「コードの読み方」というのはとても大事なんです。「Rubyコードを読む」というのはRubyのコード、つまりRubyで書かれているプログラムの意味を理解する、ということなんです。
「コードを読めることが大事」という意味を理解することはすごく重要になります。もしプログラマーとしてどこかの会社に配属されたら、最初はほとんどの場合は誰かが作ったコードを見なければなりません。ゼロから作れるのは起業家ぐらいしかいないんです。

確かに。

起業家以外の99%以上の人は、誰かが作ったシステムのメンテナンスをするところから仕事が始まります。あるいは、誰かが作ったコードを参考にして学習することになる訳です。
つまり、他人の書いたコードを読めなければいけない。それが「Rubyコードの読み方」の話につながる訳です。

なるほど、そういうことですね。誰かと一緒に仕事をしたり元からあるものを自分で触ったりするには、まずはコードを書ける前に読めないと何もできないということですね。

その通りです。

Rubyコードを読めるようになった先に、「マスターする」というのはどういう状態になったときを指すんですか?

マスターする道のりというのは非常に長い時間がかかると思います。「完璧にできる」とはなかなか言えないですし、プログラミングを深く知れば知るほど軽々しく「できる」とは言わなくなるものです。
その上で、ある一定のレベルで自立自走ができると言える状態になるためには、「プロセス」と「要素」をそれぞれ押さえる必要があるんです。

「プロセス」で押さえるべき3つのポイント

コードの読み方を習得して読めるようになるプロセスの中で、私が大事だと思っている3段階のポイントがあります。

1. プログラムを書いて動かす

「こう書くとこう動くんだ」と実際に手を動かして試してやってみること。

2. 作ってみる

次に、ただ単純に動かすだけではなく、何か目的を持ったものを1つ作ってみること。たとえば、

  • ファイルを検索するシステム
  • インターネットにブログを投稿する
    などのような集合体を何か作ってみよう。

3. 説明を理解する

世の中には言語の説明書やフレームワーク、あるいはRuby on Railsの説明書というものがある。それを見ながら、自分が作って書いたコードがなぜそういう動きをするのか、どんなプログラムの集合体なのかを確認し、発見し、理解していってその感動をどんどん増やしていこう。

この3つを常に意識して繰り返していくことが大事だと思います。

逆に、そういうコードの読み方を分からないままでプログラムを作れちゃうものなんですか……?

はい。単に既存のプログラムをコピペするだけでも動かせるんですよ。
一方で「プロセス」というのは、コードを読めるようになるためにまず体験しておくべき内容のことを指しています。たとえば、家電製品の説明書を読むと「こんな機能あったの?」って発見することがありますよね。

あります! 実は便利なんじゃんって(笑)。

購入して1年後とかに発見することも。似たような体験がプログラミングにもたくさんあって、それが楽しいんです。あの気持ちです。

たとえば洗濯機を買ったばかりだったら、服の洗濯すらまだできていない状態では毛布や洗濯槽の洗い方まで知りたいとは思わないですよね。そのために何百ページもある説明書を読みたいと思わない。

そういうことです。だから経験が溜まっていくと説明書を読みたくなり、気づきや知的好奇心が尽きることなく増えて限界が見えなくなっていく。

ちなみにコードとういうものは無限にあるってことですか?

GitHubというコードを保管しておく場所があるんですが、そこでは何百万人というユーザーが使っている。そんな量のコードは一生をかけても読みきれないですよね。

その中で、コード同士が被ったりはしないんですか?

重複はありますし似たようなようなシステムというのはある。そうでありながらも、企業同士が競っていることなどが関わってくるので、すべてのプログラミングがオープンに最適化や合理化される方向には向かいません。

では、コツコツと理解していくしか無いですか?

そうですね。無限大の世界なので地道にコードを知っていく必要があるし、職場が変われば異なるコードが書いてあるのが常です。

公開されているものもあれば、その職場にしか無いものもある訳ですね。

その通りです。

一生、学習しなければならないと。

たとえば書籍ならそれぞれの文体やスタイル、手法がありますが、コードも同様に書く人によって変わります。日本語の意味は共通ながらも、回りくどい言い回しやシンプルな文などさまざまな表現があることを知っていくと、文章力が付くじゃないですか。それと似ています。

コードの書き方のことで盛り上がってるエンジニアさん、いますよね。

そのシーンはよくありますね。ここのコードがかっこいいねとか話したりして。

そこまでいけたら楽しめますね。

その位置まで到達すればこのプロセスは成功ですし、プログラミングの楽しさが分かるようにもなります。

「要素」で押さえるべき3つのポイント

これからお伝えする3つのポイントは、どの言語を習得する場合でも必ず押さえたほうがいいです。その際は1から順番にレベルアップしていきましょう。

1. プログラムが実行される順番のイメージを持つこと

ファイルって普通、日本語でも英語でも上から順番に読むじゃないですか。当たり前ですけど下から上には読まない。
ファイルを上から読むのはコンピューターも同じです。人間なら、箇条書きで手順の内容が書かれてあればその通りに読みますよね。プログラムも書いた命令文は上から順に読まれて、もしおかしなコードだったら「理解できません」と返ってくる。
1行ずつ実行されるイメージを持ち、1行ずつ手順の命令を書いていくことが大切です。たとえば「買い物に行ってください」と命令するとします。
・スーパーに付いたら卵を買ってください
・もし牛乳の在庫があったら5つ買ってください
このように買い物の命令を詳しく箇条書きにします。ここでのポイントは、毎回スーパーへ買い物に行くたびにそれを全部伝えますか? という話なんですよ。

毎回伝えるのはめんどくさいと感じますね。同じ内容なんだから分かってほしい。

プログラムも同じなんです。一度「買い物に行ってください」と書いたら、次からは買い物へ行く内容が同じように実行されるんです。

2. 関数(メソッド)のイメージを持つこと

要素を共通化して、あるプログラムの文章にまとめたものを「関数」あるいは「メソッド」と言います。

型にしちゃうんですね。

そうです。関数を呼び出せば中に書いてあるものを実行してくれる。この関数では、入力と出力というイメージがとても大事です。
そもそも「買い物に行ってきて」と言わないと関数は実行されないんですが、言うときに前提の情報を伝えるときがありますよね。たとえば買い物に行くプロセスは同じでも、「卵だけを買ってきて」と言われたら卵しか買ってこない。つまり、関数自体は同じ「買い物に行く」でも、「卵だけ」と言われたら卵だけを買ってくる。このように共通化できる部分を関数にしておくと、入力する情報、つまり前提条件を渡せるようになる。それが入力です。

方程式ならば、f(x)=…… のxところに「卵」って入力されたら「買い物に行く」が実行されてスーパーに行って卵を買ってきてくれるということ?

そうです。すると手元に卵が返ってくる。入力値を渡すと、関数が実行されて出力として返ってくる。この一連のイメージが大事です。今の開発言語なら概ねこれが鉄則になります。このイメージを持てるだけでだいぶプログラムを書くことができるようになるというくらい、初心者にとって大事です。

今のたとえはとても分かりやすかったです。

・入力して関数を実行すること……「呼び出す」
・与える情報、この場合は卵……「引数(ひきすう)」
・戻ってくる卵……「戻り値」
と言います。
戻り値を見て、ちゃんとプログラムが実行されているかを確認する訳ですね。

はい。工程のコードを毎回同じように書くよりも共通化したほうが粋だし、行数も少なくまとめられます。

3.オブジェクト指向を理解する

オブジェクト指向を今日中に伝え切るのはかなり難関で、イメージすることも難しい概念です。関数よりもさらに抽象化をして、コンピューターの世界の中にモノ(オブジェクト)があるんです。プログラム自体が役割を持つというイメージで、職場の中の人や役割に近いかもしれません。
具体的には「どのプログラムにどんなことをさせたいのか」ごとに、ファイルを分けるんです。関数とは異なり、関数をさらにまとめ上げる性質があります。

うーん、関数の中にさらに関数があるというイメージとも違いますか?

それとも違うんですね。(入れ子構造で)中に関数があるというのはたとえば、あくまで「買い物に行ってください」という「行く行為だけ」を示す。一方で、オブジェクト指向というのは「買い物に行く人自体」も表すものなんですよ。
「この人は買い物に行くことができる」というものをプログラムとして作ることで、重複したものを作らずに何度も同じことを書かなくて済むようにできるメリットがあります。また、前提条件を作ってこの人しか実行できないものとして定義することで、変なところから呼び出されずに、他のプログラムへ影響が及ばないようにすることもできます。

たとえば「賞味期限切れの卵を買わない」という人を作れる?

はい。その人は「賞味期限切れの卵を買わない」と任された基準を持っているので、絶対に買いません。その前提条件を置くことで毎回、そのことを伝えなくて済み、自動で実行するようになるんですね。
最初は難しいんですが、実世界と一緒だと思います。プログラミングの仕組みを作っているのはけっきょく人間なので、普段行っていることをプログラム上でも実現している訳です。そういうイメージを持つことが大事だと思います。
たとえば社内のベテラン社員同士で打ち合わせをしましょうと言えば「打ち合わせってなんですか」「手順はどうするんですか」とはならない。テーマさえ与えられたら、経験に基づいて打ち合わせが実行される。プログラムではそれがオブジェクトになっているんです。いちいち命令しなくて済むしできないことはやらない。それと似ています。
そこまで理解できるとプログラミングが楽しくなるし、だんだん分かってきたと言えると思います。

日常の中でもそういう考え方ができますよね。

そうですね。たとえば家族の中に兄と弟がいて、先に兄が掃除をしていたのにまた弟が掃除を始めると、重複していますよね。掃除当番の役割を振り分ければシンプルできます。それに近いです。
プログラムでも、余計なことをしないことが重要なんです。

まとめ

「プロセス」で押さえるべき3つのポイント
1.プログラムを書いて動かす
2.作ってみる
3.説明を理解する

「要素」で押さえるべき3つのポイント
1.プログラムが実行される順番のイメージを持つこと
2.関数(メソッド)のイメージを持つこと
3.オブジェクト指向を理解する

DIVE INTO CODEのことをもっと知ってみませんか?