2022年1月25日に開催された銀座Rails#41で『銀座Rails版「Rubyプログラミング問題にチャレンジ!」公開コードレビュー』という発表をしてきました。
当日使ったスライドはこちらです。
どんな発表だったの?
この発表は事前に募集していたプログラミングのお題を参加者のみなさんに解いてもらい、それを僕がレビューするという発表でした。
この発表で使ったお題は「点字メーカープログラム」です。上のスライドでもこのお題の仕様を説明しています。
当日は「一番コード量(バイト数)が少ないプログラム」ということで、pofkumaさんのコードをレビューさせてもらいました。
また、Qiitaのアドベントカレンダーでも同じようにこの「点字メーカープログラム」で自分が書いたコードと解説記事を書いてもらう、という企画をやっていました。
この企画でTop Contributor賞(僕が一番いいと思ったコードを選んだ賞)を取った、はるぐちさんのコードも紹介させてもらいました。
僕の模範解答も紹介しました
さらに、僕が書いた模範解答も紹介&解説しました。今回僕が書いたコードはこんな感じです。
# lib/tenji_maker.rb require_relative 'tenji' class TenjiMaker def to_tenji(text) tenji_list = text.split(' ').map { |romaji| Tenji.new(romaji) } join(tenji_list) end private def join(tenji_list) tenji_list .map { |tenji| tenji.to_s.split("\n") } .transpose .map { |row| row.join(' ') } .join("\n") end end
# lib/tenji.rb class Tenji DAN = { 'A' => 0b100000, 'I' => 0b101000, 'U' => 0b110000, 'E' => 0b111000, 'O' => 0b011000, } GYO = { 'K' => 0b000001, 'S' => 0b000101, 'T' => 0b000110, 'N' => 0b000010, 'H' => 0b000011, 'M' => 0b000111, 'Y' => 0b010000, 'R' => 0b000100, } def initialize(romaji) @romaji = romaji end def to_i case @romaji.chars in ['Y' => gyo, 'A' | 'U' => dan] then GYO[gyo] | (DAN[dan] >> 4) in ['Y' => gyo, 'O' => dan] then GYO[gyo] | (DAN[dan] >> 2) in ['W', 'A' => dan] then DAN[dan] >> 4 in [gyo, dan] then GYO[gyo] | DAN[dan] in ['N'] then 0b000111 in [dan] then DAN[dan] end end def to_s sprintf('%06b', to_i).tr('01', '-o').scan(/../).join("\n") end end
僕の模範解答のポイントは以下のとおりです。
- ローマ字→点字の変換ルールはTenjiクラスにカプセル化した
- 点字は6ビットの2進数として扱った(ドットの番号は横読みに置き換えた)
- 母音(段)と子音(行)の各数値をビット演算の論理和で合成した
- ローマ字を母音と子音に分解する際の条件分岐をパターンマッチで実装した
詳しい話は冒頭に載せたスライドで解説しています。
モブプロならぬ、モブコードレビュー!?
公開コードレビューということで、当日は僕があれこれ意見を述べるだけでなく、Twitter上で参加者のみなさんにも「このコード、好き!」とか「僕だったらこう書くなあ」といった観戦ツイートを積極的に投稿してもらうようにお願いしました。
pofkumaさんのコード、直感的で読みやすい #ginzarails
— igaiga (@igaiga555) 2022年1月25日
ロジックが綺麗だ! #ginzarails
— はるぐち ゆうま (@haruguchiyuma) 2022年1月25日
コード書く時に2進数に落とし込めるかとか
— U.Torval@ハッカーズチャンプルー (@utorval) 2022年1月25日
右ビットシフトと論理和使えるかとか考えた事なかった#ginzarails
パターンマッチすごい!! #ginzarails
— siro (@siroemk) 2022年1月25日
当日のみなさんのツイートはこちらのページにまとめてあるので、こちらもあわせてご覧ください。
動画もあります
当日の発表の様子はYouTubeで公開しています。当日参加できなかった、という方はこちらの動画をチェックしてみてください。
さらに:提出してもらったコードを全部レビューしてみました
当日は時間が限られていたため、pofkumaさんのコードしかレビューできませんでしたが、後日、他のみなさんのコードもレビューしてみました。
以下のページでみなさんに提出してもらったプルリクエストに僕がコメントを入れています。
すでにノスタルジー?すごく懐かしい気持ちになった懇親会
本編も興味深い発表がたくさんあったのですが、今回僕にとって一番楽しかったのはもしかすると本編後の懇親会だったかもしれません。
本編と同様、懇親会も当然オンラインだったのですが、他の登壇者のみなさんを中心に「privateメソッドを一段インデントするのはアリ?」とか「メソッドチェーンを書くときは最初に改行する?しない?」みたいな些細なテーマで「あーだこーだ」と延々とおしゃべりしてました。
懇親会を終えた後「そういや、コロナ禍以前はピザか何かを突っつきながらこんなふうに技術ネタを話してたなー。懐かしいなー」という思い出がよみがえってきました。
コロナ禍続きでそんなことをやってたのをずっと忘れてた。ちょっとノスタルジックな気分になった。いつになったらかつての日常は戻ってくるのだろうか・・・みたいなことをふと考えてしまいました。
まとめ
というわけで、このエントリでは銀座Rails#41で発表した『銀座Rails版「Rubyプログラミング問題にチャレンジ!」公開コードレビュー』について、いろいろ書いてみました。
去年はコロナだったり、チェリー本の執筆だったりでほとんど登壇してなかったので、(事前準備がほとんどいらないパネルディスカッションへの参加はいくつかあったものの)きっちりスライドを作り込んでお話しする登壇はかなり久しぶりでした。
そのせいか、発表の仕方やスライドの作り方の「勘」を取り戻すのにちょっと時間がかかりましたが、なんとか無事に終えることができてほっとしました。
当日参加してくださったみなさん、どうもありがとうございました。
ちなみに、イベントページを見ると参加者数が252人になっていて、あまりの多さにビックリしました!
運営の @morimorihoge さんにも感謝します。
おかげさまで当日はオンラインでもスムーズに発表することができました。
どうもありがとうございました。
いつになるかわかりませんが、そのうちまたRSpecやRubyMineの発表でもできたらな〜と思っています。
そういった機会があれば、ぜひみなさん参加してやってください😄
PR:「プロを目指す人のためのRuby入門 改訂2版」を読めば模範解答のコードが全部わかる!
当日の発表でも宣伝しましたが、僕の模範解答は去年発売された「プロを目指す人のためのRuby入門 改訂2版」を読めば、全部理解できる内容になっています。
とくに、僕のコードの中で重要な役割を果たしたパターンマッチについてはかなり詳しく説明しています。
まだ読んでいない方はぜひチェックしてみてください!