ユカシカド エンジニアブログ

体の栄養状態を把握する検査サービス VitaNoteを開発するエンジニアのブログ

西脇.rb & 東灘.rb:ペアプログラミング in Action にいってきました

X61は80℃こえてました
※写真はイメージです

最近更新が滞ってしまいました。
6回目の勉強会にいってきました!しかも念願のペアプログラミングです!
余談ですが、当日の三日前にMacが故障!!急遽、Lubuntu on Thinkpad X61をセットアップして参戦しました。

会場は小野市!初めての小野市!緑豊かで無人駅がたくさんあって、1両編成でドアは手動でICOCAは使えなくてイロイロ衝撃でしたが、ちょっとした旅行気分で気分転換にもなりました。

概要

Wiki

Pair Programming In Action 1st 2013.09.21

課題

お題は@jnchitoさんが持ってきてくださった、CodeBreakerという数字当てゲームのプログラムでした。
詳細:
book-rspec-codebreaker / features / codebreaker_submits_guess.feature

感想など

初めてのペアプログラミングの感想

これがペアプロってやつか!同僚にプログラマーの人がいるとこんなことができるのかと大変羨ましく思いました。
今回、私は@spring_akiさんとのペアだったのですが、ペアプロの作法はともかくとして、問題に対してどう解くか考えるのに時間がかかってしまって、@spring_akiさんに頼りっぱなしになってしまいました。
しかし、ペアでプログラミングするというのは発見が多く、なるほどと思うことが多いです。 どんな意図で実装しているのかその場で共有できるので自分のよう初学者にとっては学習効率が高くなる実感がありました。
目指すは学習効率だけではなく、ペアだから実装も効率よくできた、という境地です。

同じ課題にチャレンジしているので他のペアの発表からも"意図と実装"について共有できたのは大きな収穫となりました。

帰ってから

勉強会中では全然追いつかなかったので帰ってから自分でコードも書いてみました。 こんな時ありがたいのは"西脇.rb & 東灘.rb"はyouRoomでトピックを共有し、アドバイスをいただけることです。帰って最初に書いたコードは一見動いているように見えたのですが、指摘してもらったことでまずいコーディングと致命的な欠陥(自分で用意したテストに漏れがあった)があることがわかり、ウンウン悩んで書いてみたコードが以下の怪しいコードです。

https://github.com/aq2bq/CodeBreaker

class CodeBreaker
  def initialize answer
    @answer = answer.to_s.chars
  end

  def guess guess
    @mark = ''
    guess_ary = guess.to_s.chars
    removed_answer_ary, removed_guess_ary = remove_exact_match_and_update_mark guess_ary
    partial_match_and_update_mark removed_answer_ary,removed_guess_ary
    @mark
  end


  private

  def remove_exact_match_and_update_mark guess_ary
    removed_answer_ary = [], removed_guess_ary = []
    guess_ary.zip(@answer) do |guess_char, answer_char|
      if answer_char == guess_char
        @mark << '+'
      else
        removed_answer_ary << answer_char
        removed_guess_ary << guess_char
      end
    end
    [removed_answer_ary, removed_guess_ary]
  end

  def partial_match_and_update_mark(removed_answer_ary, removed_guess_ary)
    removed_answer_ary.each do |n|
      if removed_guess_ary.include? n
        @mark << '-'
        removed_guess_ary.delete_at(removed_guess_ary.index n)
      end
    end
  end
end

怪しい点というのは、これも指摘指定いただいたところの、〜_and_update_markメソッドが複数の責務を負っているという点です。これについてはかなり悩んでみたものの、根本から設計を改めないとできないなと、発表会での皆さんの発表を追体験するような結論になりました。 その後、スマートかつ新しい実装をかなり悩んで思いつかず現在に至ります。

ということで、自分の力不足と向き合うこともありながらも、面白い課題で、ペアプログラミングは多くの学びがあったので今後もどんどんやりたいと強く思ったしだいです。