Toyama.rbで「オフラインリアルタイムどう書く」をやってみたらとても良かった

Toyama.rb #30のイベントとして、「オフラインリアルタイムどう書く」というのをやった。

toyamarb.connpass.com

とても楽しかったし、参加者の方からも好評だった。

オフラインリアルタイムどう書く

横浜へなちょこプログラミング勉強会さんで実施されているものがオリジナルのイベントです。

趣旨としては、主催者の出した問題を皆で解きましょう!といったもの。

先日のRubyKaigi AfterPartyで@yanchaさんと同じテーブルになる機会があり、そのときに「勉強会のネタに困ってるんですよね〜」という話をしたところ、オリジナルのイベントについて教えていただいた。

Toyama.rbではもくもく会を中心に活動しているが、たまにはテーマを決めてコードを書きたいな〜とも思っていたので、内容的にもピッタリで、とても楽しそうなのでやってみることにした。

当日の流れ

基本的な流れは

  1. 問題を参加者に共有
  2. 同時に、1時間のタイマーを全員が見える形でスタート
  3. 1時間後、トランプを配る
  4. 数の小さい人から発表。解けてなくても、どう挑んだか?みたいなとこを発表する
  5. 「解けた!」という人は最後に発表してもらう

といった感じにした。

2問用意し、だいたい1問につき2時間半程度でやった。

オリジナルである横浜へなちょこプログラミング勉強会さんで開催されている際の流れでは、最後に主催者側が事前に用意していた解答例を最後に解説する形とのこと。

ただ、私自身も楽しみたい!!!という思いから、問題自体は過去問題を利用させていただき、そのかわりに、解けた人に最後に発表してもらう形としてみた。

1時間で誰も解けなかったら少し延長しようかな?と考えていたものの、2問用意していたが、2問ともに1時間できっちり解ける参加者が現れたので、とてもちょうどよかった。

1問目 / フォークじゃない

フォークじゃない 〜 横へな 2014.2.1 問題

1問目は

  • (ほぼ)全員が初挑戦
  • 勝手がよくわからないで戸惑いそう
  • 解ける、あるいは解けそうな感じが見える

のほうが良いかな〜と思っていた。

過去問題には、主にテキストのみで出題されているものと、イメージ・図形が絡む問題のざっくり2種類があった。テキストのみのほうが簡単なのかな?と思い、その中でもスーパーのレジを題材にしている問題がキャッチーな感じだったので利用させていただいた。

結果

1名のみ時間内に完成した。

私はあるバグにハマってしまい、ギリギリ間に合わなかった。その後の発表の最中で気づき、1行だけ追加したら全部通ったのでめっちゃ惜しかった、くやしい。

ちなみに、私が書いたのはこんな感じになった。

2018/7/14 Toyama.rb #30 オフラインリアルタイムどう書く · GitHub

1問目の所感

そもそも「文章の理解にめっちゃ時間が..!!」みたいになってて面白かった。

問題文自体を理解するまでがまず最初の課題だった。

また、コードを書く順番も人によって全然違っていて、一気に作ろうと思うとハマる要素が多かった。

この問題については、

  • 1-9 が来たらレジに並ぶ
  • . が来たらレジが処理をする
  • x が来たらそいつは後ろの客をせき止める

といった形で、段階的に機能追加が可能だったので、そこに気付いてTDD的に作っている参加者がわりと惜しいところ、あるいは正解まで辿り着いていたように見えた。

ただ、どんな言語でもレジに並んでいる人数を算出・計算する部分が少しややこしくなるようで、私も作ってて混乱した。

唯一解けた人は、レジの人数を数値で保持するのではなく、例えば5人なら nnnnn といった形でその分の文字を確保することで、単純に文字列長を見るだけでレジ人数が取れるようになっていた。

1時間という制約の中ではまったく思いつかなかったので、聞いてて素直に「ほ〜〜なるほど〜〜」となっていて、同じ問題でこうも違う解き方になるんだなぁと、聞いてて楽しかった。

あと、Rubyが強い。

Array周りの標準ライブラリの充実度が半端ではないので、配列操作が絡んだときのコードの簡潔さは圧倒的だった。

2問目 / 積み木の水槽

積み木の水槽 〜 横へな 2013.9.6

2問目は、画像が使われてる問題を利用させていただいた。

なんの根拠もないが、画像が絡んでるとそれだけで難しそうに見えたので、「最悪全員解けないのも面白いかな」ということで、この問題にした。

結果

当日は7名の参加者がいて、そのうち1名が中学生プログラマだったのだが、その方のみが鮮やかに解答し、その他普段お金をもらってコードを書いてる大人の皆さん全員が解けないという楽しい結果になった。私自身も1問目とは異なり、もう全然だめだった。

一応、私の書いた無残なコードを残しておく。

2018/7/14 Toyama.rb #30 オフラインリアルタイムどう書く · GitHub

2問目の所感

めっちゃ難しかった!

やってて難しいと思ったポイントは、

  • そもそもどうアプローチしていいかわからない
  • 配列のインデックスがわけわからなくなる

だった。

まず、何をどう考えたらいいのかがわからず、コードを書き始めるまでに15分くらい要してしまった。もうこの時点で私の勝敗は決していた感がある。

また、Webサービスのためにコードを書いている中では、実際のところ二次元配列をX/Y軸を意識しながらゴリゴリに回しながら操作するというのは、そこまで登場頻度は高くはないと思う。

コードを書きながら「あぁ、昔こんな感じにJavaテトリス作ったな..」と懐かしい気持ちになりつつ、完全に混乱していた。

なお、こちらの問題は、1問目よりもさらに他の人の発表を聞くのが楽しかった。

1問目よりも人によってアプローチの差異が大きく、

  • 水が入る場所を1列単位で考えて割り出す人(正解者)
  • 水が入らない死んでいる空間を割り出して、水が残る箇所を逆算しようとする人(私)
  • 全空間に水を入れてから、ライフゲーム的に水を流動させようとする人

と、多種多少だった。最後のライフゲーム的に動かすというのは微塵も思いついてなかったので、すげーなーと思いつつ、実際に完成したものがグラフィカルに描画されるのを見てみたかった。

感想

とても楽しいイベントで、かなり盛り上がった。

2問目で中学生の方が見事に正解コードを書いたあとに、コードの内容に興味津々な大人達が質問しまくって説明してもらって「おー、なるほど!!」となっていて、年齢とか仕事とか関係なくワイワイやれてる感じがあってとても良かった。

そして大人の自分としては「精進せねば...!!!」という気持ちになった。

参加者の方からも「たのしかった!」という声が聞けたので、ぜひともまた開催したいな〜と思う。

その時は、今度はオリジナルの問題を用意したいところだ。


最後に、イベントについてご紹介していただいた@yanchaさん、そして、当日の進め方等について教えていただいた鍋谷さん、ありがとうございました!