Tatehitoの技術メモ

ソフトウェアエンジニアです。いろいろ書きます。

SonicGarden伊藤さんのブログを読んでRubyのプログラミング問題に取り組んでみた

業務ではJavaを扱っていますが、プライベートではRuby(on Rails)の学習をしています。

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)』(チェリー本)を終え、Railsチュートリアルを1周し、RailsのWebアプリをつくったり、挫折したり、つくったり壊したり、、、を繰り返しています

アプリ制作を始める前に取り組んでいたのが、チェリー本の著者である伊藤さんのブログで紹介されていた「Ruby初心者向けのプログラミング問題」です。

blog.jnito.com

Ruby基礎力の確認のために取り組んでみたのですが、そこで学んだことが現在行っているアプリ制作にものすごく活きています。というか、これらのプログラミング問題を行ったことで、アプリ制作のモチベーションが湧いてきたといっても過言ではありません。

Ruby学習中の方は是非やってみてください。チェリー本片手に取り組めば、自力で解くことができる難易度のものばかりです。

ということで、今回のエントリでは「Ruby初心者向けのプログラミング問題」に取り組んで学んだこと・わかったことを整理して紹介したいと思います。

取り組んだプログラミング問題

全部で10問の問題が紹介されていますが、その中でも以下の特徴の問題に優先して取り組みました。

  • テストコードが事前に書かれている問題

業務でテストコードを書いたことがなく、書籍やQiitaでRSpecの学習をしている段階だったので、回答フォーマットに初めからテストコードが用意されている問題に取り組むことにしました。

結果、テストコードの書き方の実例を見ることができて勉強になりました。

テストコードが用意されている問題は、以下の2つです。(他にもあるかも?)

blog.jnito.com

blog.jnito.com

  • 模範回答がある問題

自分が書いたコードを、伊藤さんや他の方が書いたコードと比べてみたかったので、模範解答が用意されている問題に取り組みました。

「ビンゴカード作成問題」では70行ほどのコードを書いたのですが、模範解答やベストコードとして紹介されていたコードは10~20行ほどと、あまりの差に驚きました......。(苦笑)

ただそのおかげで、後述する「学び」を得ることができました。

学んだこと・わかったこと

標準APIを使いこなすべし

「ビンゴカード作成問題」で書いた70行のコードは、模範解答を参考にリファクタリングをしたところ、15行までコード量が減りました。コード量が増えていた原因のほとんどが、Rubyの標準APIを使っていなかったからです。

例えば、配列からランダムで要素を取得する「sample」や文字列を右詰にする「rjust」といった標準APIを、僕は自前で実装していました。いわゆる「車輪の再発明」というやつです。

簡潔で読みやすいコードを書くには「標準APIを知っているか」「標準APIを調べられるか」がとても重要です。

そのためにも、普段から「プログラミング言語 Ruby リファレンスマニュアル」に目を通したり、Qiitaなどで情報収集したり、プログラミング問題に取り組んだり、他の方のコードを読んだりなどして、知識を増やしていくべきだと感じました。

qiita.com

irbを使いこなすべし

Rubyには標準で「irb」という、手軽にRubyのプログラムを動かすことができるツールが備わっています。チェリー本でもirbが使われていましたし、存在はもちろん知っていたのですが「実際そんなに使うのかなあ」なんて思っていました。

......が、めっちゃ使いました。メソッドの動きをちょっと確認したいときなど、ものすごく便利です。irbでいろいろ試すの大事です。

正規表現を使いこなすべし

今回取り組んだ問題の中には、正規表現を使うとうまく処理できる部分があったのですが、僕には正規表現を扱った経験がほとんどなく、苦労しました。

同時に「勉強しなきゃマズイ。。。」と感じました。

特に正規表現はテストコードを書くのに便利そうなので、これからテストコードを書いていくつもりなら正規表現もセットで学ばなければならないな、という印象を受けました。

qiita.com

リファクタリングが気持ちいい

テストコードパスする→リファクタリングがめちゃくちゃ気持ちいいです。

これまでテストコードを書く習慣を持っていなかったので、初めての体験でした。テストコードに守られつつ、コードが綺麗になっていくのが最高に気持ちいい。

テストコードを書いておけば、後でリファクタリングすればいいので、最初の実装は雑に書けるというのも良いですね!

チェリー本最高!

問題を解く上で、何度も参照しました。改めてチェリー本の分かりやすさを知りました(笑)アプリ制作にもとても役立っています。

あとがき

今回、問題に取り組んだことでRuby基礎力、プログラミング基礎力の確認になりました。

「効率的にプログラミングを学ぶには何かを作ること!」とよく言われますが、いきなりアプリやWebサービスを作り始めるのではなく、まずはこういったプログラミング問題に取り組んでみるのも良いのではないでしょうか。

ひとつひとつの分量も、一日あればやり切れるくらいなので、アプリ制作と違って挫折もしづらいですし、おすすめです。

伊藤さん、プログラミング問題のご紹介ありがとうございました!

※いくつかの問題の回答はGitHubにコミットしました。 github.com