Exercism.ioでプログラミングを学ぶ

f:id:ninoseki:20141011095204p:plain

Exercism.ioは、

  • 演習問題を解く
  • コードレビューを受ける
  • コードを修正する

というフィードバックループを通してプログラミングを学ぶためのWebサイトです。

Clojure, CoffeeScript, C++, C#, Elixir, Erlang, F#, Go, Haskell, JavaScript, Lua, Objective-C, OCaml, Perl 5, Python, Ruby, Scala, Swiftといった言語の演習問題が用意されています。

今回は、Windows上でExercism.ioを使ってRubyを学ぶ方法を説明します。

なお、前提条件としてGitHubアカウントは取得済みであるものとします。

アカウントの作成

http://exercism.io/ にアクセスし、「Log in via GitHub」をクリックします。

これで自動的にアカウントが作成されます。

CLIのインストール

Exercism.ioでは、演習問題の取得・提出はCLIを用いて行われます。

Windows用のパッケージ管理システムChocolateyを使用してインストールしましょう。

  1. (Chocolateyをインストールしていない場合)コマンドプロンプト上で以下のコマンドをコピペして実行し、Chocolateyをインストールします。
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object  net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
  1. 新しくコマンドプロンプトを開き、以下のコマンドを実行しExercism CLIをインストールします。
$ choco install exercism-io-cli

演習問題の取得

まずコマンドラインツールの設定を行います。

$ exercism configure --key=YOUR_API_KEY --dir=/path/to/exercises

keyはExercism.ioのAccountで確認できます。

dirには演習問題の保存先フォルダへのパスを指定します。指定しない場合、%USERPROFILE%(C:\Users\ユーザー名 )になります。

設定完了後、Rubyの演習問題を取得しましょう。

$ exercism fetch ruby

dir で指定したフォルダ(指定しなかったは場合はC:\Users\ユーザー名)配下のexercism\rubyというフォルダに演習問題がダウンロードされます。


演習問題を解く

1問目は「hamming」と題されたハミング距離を計算する問題です。

ruby.
└─hamming
      hamming_test.rb
      README.md

README.mdが問題の説明、hamming_test.rbがminitestのテストケースです。

問題の説明を読み、テストケースをパスするコードを書くことが演習となります。


hamming_test.rb

require 'minitest/autorun'
require_relative 'hamming'

class HammingTest < MiniTest::Unit::TestCase
  def test_no_difference_between_identical_strands
    assert_equal 0, Hamming.compute('A', 'A')
  end
  # 以下略
end

このテストケースから、hamming.rbにクラスメソッドcomputeを定義したHammingクラスを実装すればいいことがわかります。

実装後、

$ ruby hamming_test.rb

ですべてのテストケースをパスすることを確認後、解答を提出しましょう。

$ exercism submit hamming.rb

コードレビューしよう/されよう

こちらからhammingの解答一覧を参照できます。

他のユーザーの解答をレビューし、気になる点があればコメントしましょう。

または自分の解答にコメントがあった場合、コメントで指摘された点を修正して解答を再提出してよりよいものに作り変えていきましょう。


例えば、3問目の「Rna Transcription」で以下のコードを提出しました。

class Complement
  @dna_to_rna = {
    'G' => 'C',
    'C' => 'G',
    'T' => 'A',
    'A' => 'U'
  }

  def self.of_dna(strand)
    convert strand, @dna_to_rna
  end

  def self.of_rna(strand)
    convert strand, @dna_to_rna.invert
  end

  private
  def self.convert(strand, table)
    strand.split("").map { |chr|
      table[chr]
    }.join("")
  end
end

このコードに以下のコメントがあったので、指摘された点を修正した修正版を提出し直しました。

f:id:ninoseki:20141011094345p:plain


まとめ

このような流れでExercism.ioでプログラミングを学ぶことができます。

Rubyの演習問題は約70問ほど用意されているので、初~中級者がプログラミングを学ぶ場として優れているのではないかと思います。Enjoy!