give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

みんなで作ろう、変なカレンダー!! 第5回スキルアップ勉強会「コードレビューライブ 〜伊藤淳一からの挑戦状 part2〜」を開催します #sgtech

お知らせ

またまたやります、コードレビューライブ!
というわけで、弊社ソニックガーデン主催の 第5回スキルアップ勉強会「コードレビューライブ 〜伊藤淳一からの挑戦状 part2〜」 のお知らせです。

sonicgarden.connpass.com

開催日時は2024年12月9日(月) 20時です。
今回もオンライン開催ですので、みなさんどうぞお気軽にご参加ください!

「コードレビューライブ」って何なん?

コードレビューライブは、

  1. 僕がプログラミングのお題を出し、
  2. 参加者のみなさんがそのお題を解いて提出し、
  3. 当日僕がその場でコードレビューする、

そんな勉強会です!

コードレビューを通じて、良いコードを書く上で大事な考え方や実践的なフィードバックをみなさんに提供できればと考えています。

ちなみに、コードは書かずに当日勉強会に参加してコードレビューの様子を眺めるだけ、でもOKです。
ですが、自分で事前にコードを書いておいた方が、当日の学びが100倍アップすると思います!

今回のお題は「変なカレンダー生成問題」です

今回の勉強会では、みなさんに「見にくくてあまり実用性のない、変なカレンダー」を生成してもらいます。
ちょっと難しいかもしれないので、挑戦者のレベルにあわせて3つのパターンを用意しました。

レベル1: 横向きに出力

レベル1では年を指定すると、横向きのカレンダーが1年分出力されます。

calendar = SgStrangeCalendar.new(2024)
puts calendar.generate

上のプログラムを実行して、以下のようなカレンダーが出力できれば完成です。
いやあ、とても見にくいですね、実用性ゼロ!(苦笑)


レベル2: 今日の日付を強調

「そんなの簡単、簡単!」という人はレベル2へ。
レベル2では今日の日付を[ ]で囲んで強調表示します。

以下は今日の日付が2024年12月9日だった場合のコードと、その出力例です。

calendar = SgStrangeCalendar.new(2024, Date.today)
puts calendar.generate

ちょっとわかりにくいかもしれませんが、12月9日の"9"が[9]になっています。


レベル3: 縦向きに出力

「レベル2も余裕でしたけど?」という人はレベル3にチャレンジ!
レベル3はレベル2の縦向きバージョンです。 行と列を入れ替えてカレンダーを出力します。

calendar = SgStrangeCalendar.new(2024, Date.today)
puts calendar.generate(vertical: true)

generateメソッドにvertical: trueオプションを渡しているので、カレンダーは下のように縦向きで出力されます。
12月9日の日付が[9]になっている点にも注目してみてください。


「よっしゃ、チャレンジしたる!」という人はプルリクを送ってね😘

プログラム仕様の詳細や解答の方法については以下のGitHubリポジトリで説明しているのでこちらをご覧ください。

github.com

上記リポジトリをフォークし、コードを書いてプルリクエストを作成すれば提出完了です!

なお、予めテストコードが用意してあるので、問題が解けたかどうかはテストが全パスするか否かで判断できます。

↓こんなふうにテストが全パスすればOKです。

$ ruby test/sg_strange_calendar_test.rb --no-plugins
Run options: --seed 16463

# Running:

.........

Finished in 0.001414s, 6364.9222 runs/s, 6364.9222 assertions/s.

9 runs, 9 assertions, 0 failures, 0 errors, 0 skips

レベル3は必須ではありません。
レベル1で提出してもらっても良いですし、腕に自信がある人はレベル2、レベル3と進んでもらってもOKです。
みなさんが「ここまでならできそう」というレベルまで完成したら、解答コードを提出してください。

前回のコードレビューライブの様子や反響など

前回のコードライブでは「ローマ数字変換プログラム」をお題として出していました。

romanizer = SgRomanizer.new

# アラビア数字 → ローマ数字
romanizer.romanize(1) #=> "I"
romanizer.romanize(2) #=> "II"
romanizer.romanize(3) #=> "III"
# ...
romanizer.romanize(3999) #=> "MMMCMXCIX"

# ローマ数字 → アラビア数字
romanizer.deromanize("I")   #=> 1
romanizer.deromanize("II")  #=> 2
romanizer.deromanize("III") #=> 3
# ...
romanizer.deromanize("MMMCMXCIX") #=> 3999

こんな感じで、僕が画面共有しながら、RubyMine上で提出されたコードにコメントしたり、リファクタリングしていました。


Image:あなたのコードをその場でレビュー&リファクタリング!「コードレビューライブ - 株式会社ソニックガーデン

当日のXのポストから、参加者のみなさんのコメントをいくつか紹介させていただきます。

参加してくださったみなさん、どうもありがとうございました!

まとめ

というわけで、今回は2024年12月9日(月)に開催するオンライン勉強会「第5回スキルアップ勉強会・あなたもチャレンジ!コードレビューライブ 〜伊藤淳一からの挑戦状 part2〜」についてお知らせしました。

前回参加した人も、そうでない人も、ぜひご参加ください。
あなたの書いたコードをお待ちしています!😄

sonicgarden.connpass.com

みんなが書いたコードをLIVEでレビューします!(第4回スキルアップ勉強会 2024/10/28) #sgtech

お知らせ

僕が所属している株式会社ソニックガーデンでこんな勉強会をやります。
題して「あなたもチャレンジ!コードレビューライブ 〜伊藤淳一からの挑戦状〜」です!

sonicgarden.connpass.com

開催日時は2024年10月28日(月)20時です。
どこからでも参加できるオンライン勉強会なので、みなさんぜひご参加ください〜😄

どんな勉強会なの?

ざっくり3行で説明するとこんな感じです。

  • 僕がプログラミングのお題を出すので、みなさんに解答してもらいます。
  • 当日僕がみなさんの書いたコードをその場でレビューします。

以上。あれ、2行だったw

そう、みなさんが書いたコードを僕がレビューし、よいコードを書く上で大事な考え方や実践的なフィードバックを提供する、そんな勉強会(になる予定)です。

ちなみに、コードは書かずに当日勉強会に参加してコードレビューの様子を眺めるだけ、でもOKです。
でも、自分で事前にコードを書いておいた方が、当日の学びが100倍アップすると思います!

プログラミングのお題ってどんなの?

みなさんに作成してもらうプログラミング問題はこちら、「ローマ数字変換プログラム」です。

romanizer = SgRomanizer.new

# アラビア数字 → ローマ数字
romanizer.romanize(1) #=> "I"
romanizer.romanize(2) #=> "II"
romanizer.romanize(3) #=> "III"
# ...
romanizer.romanize(3999) #=> "MMMCMXCIX"

# ローマ数字 → アラビア数字
romanizer.deromanize("I")   #=> 1
romanizer.deromanize("II")  #=> 2
romanizer.deromanize("III") #=> 3
# ...
romanizer.deromanize("MMMCMXCIX") #=> 3999

プログラム仕様の詳細や解答の方法については以下のGitHubリポジトリで説明しているのでこちらをご覧ください。

github.com

上記リポジトリをフォークし、コードを書いてプルリクエストを作成すれば提出完了です!

なお、予めテストコードが用意してあるので、問題が解けたかどうかはテストが全パスするか否かで判断できます。

↓こんなふうにテストが全パスすればOKです。

$ ruby test/sg_romanizer_test.rb --no-plugins
Run options: --seed 629

# Running:

..

Finished in 0.039555s, 50.5625 runs/s, 202199.4691 assertions/s.

2 runs, 7998 assertions, 0 failures, 0 errors, 0 skips

プログラミング初心者ですが私にも解けますか?

うーん、どうでしょう?
プログラミングを始めてまだ数ヶ月、という人にはちょっと難しいかもしれません。
でも、プログラミング歴が1年ぐらいあれば解けそうな気がします。
仕事でコードを書いてる人は若手、ベテランを問わず、全員解けてほしいですね!

ちなみに僕は問題を思いついて自分で解いたところ、30分ぐらいでできました。

この問題を解く上で一番大事なのはロジック力です。
今回、対象の言語はRubyに限定していますが、高度な言語知識はいりません。
拙著「プロを目指す人のためのRuby入門(通称チェリー本)」の知識があれば(特に5章までの知識がメイン)、十分解ける問題になっているはずです。

🚨カンニングはなしでお願いします!🚨

みなさんが自力で考えたロジックをレビューするのがこの勉強会の一番の醍醐味です。
やろうと思えば、

  • ネットで公開されている既存の変換ロジックを参考にする
  • ChatGPTに解いてもらう(たぶん一発で解いてくるはず💧)
  • 他の人が提出したプルリク(解答)を見る

等々の方法でカンニングできちゃいますが、それはなしでお願いします!

あと、注意してほしいのはGitHub CopilotのようなAIコード支援機能です。
これが有効のままコードを書き始めると結局AIに解いてもらったことになりかねないので、問題を解く間はオフにするようにしてください 🙏

まとめ

というわけで、今回は2024年10月28日(月)に開催するオンライン勉強会「第4回スキルアップ勉強会・あなたもチャレンジ!コードレビューライブ 〜伊藤淳一からの挑戦状〜」についてお知らせしました。

「面白そう、私も解いてみたい!」「伊藤さんにぜひコードレビューしてもらいたい!」というみなさんからの積極的なご参加をお待ちしています!!😄

sonicgarden.connpass.com

【書評】生成AIに何でも聞ける時代に「Ruby コードレシピ集」をあえて読む価値とは?

はじめに

技術評論社さんから「Ruby コードレシピ集」をご恵贈いただきました。
どうもありがとうございます!

本書の概要を公式サイトから抜粋します。

最新Ruby 3.3に対応。Rubyでやりたいことがすぐにわかる,逆引きレシピ集の決定版。


Rubyの基礎知識や実践ですぐに役立つテクニックを,目的別にまとめた逆引きレシピ集です。文法/データ操作/正規表現/文字列操作/テスト/エラー処理といったRubyの基本から,RubyGems/データベース操作/データ処理といった実践的な開発に役立つテクニックまで,やりたいことをすぐに逆引きできるように整理しました。繰り返し参照しやすい形式で構文やコードをわかりやすく掲載。駆け出しエンジニア,Web開発者,ホビープログラマー,Rubyを使うすべての方にお届けします。Ruby 3.3に対応。

Ruby コードレシピ集:書籍案内|技術評論社

ちなみにページ数は672ページで、拙著「プロを目指す人のためのRuby入門 改訂2版」の568ページよりもさらに分厚いです。

さっそく読んでみたので、感想を書いてみたいと思います。

プルではなくプッシュでRubyのテクニックを学ぶ、という価値

正直に言います。

逆引き系の技術書は20年前にはとても重宝しました。
しかし、現在ではネット上に必要以上の情報があふれ、ここ数年でChatGPTに代表される生成AIも台頭し、コードの書き方で迷うことがあれば「ググる」もしくは「ChatGPTに聞く」でほとんどの問題は解決します。

なので、「Ruby コードレシピ集」が発売されることを聞いたとき、「こんな時代に逆引きレシピ集なんて出しても、あまり意味がないのでは?」と心配になりました。

しかし、本書を読み進めていくうちに、僕は「ああ、本を読むというのはググったりAIに聞いたりするのとは違うんだな」と感じるようになりました。

具体的に何が違うのか?
それはググったりAIに聞いたりする体験はプルで、読書はプッシュである、ということです。

本はあなたに向かって知識をプッシュする

ネットやAIの情報はこっちから聞かないと情報が出てきません。
つまり、自分の中に「これが知りたい」という動機がないと情報が引き出せないのです(=プル)。

一方、本を読むと、本が自分に対して「これ知ってる?」とか「こんなこともできるんだよ」と話しかけてきます。
つまり、「これが知りたい」という動機がなくても、本が自分に対して知識を送り込んできてくれるのです(=プッシュ)。

プル型の知識は受け身の姿勢で待ち続けているとまったく自分の中に落ちてきません。
一方、プッシュ型であれば「本を読む」というアクションさえ起こせば、様々な知識がどんどん落ちてきます。

生成AIに何でも聞ける時代に「Ruby コードレシピ集」を読むのは、このように技術的な知識を自分の中に強制的にインストールできるところにその価値があるんじゃないだろうか?と僕は感じました。

Ruby初心者は逆引きではなく、あえて頭から順番に読もう

公式サイトでは「逆引きレシピ集の決定版」と説明されているので、本書の典型的な使い方はおそらく「やりたいことがあればその都度本書を参照する」という逆引きのスタイルなんだと思います*1

ですが、Ruby初心者(だいたいRuby歴が2年未満の人)はぜひ本書を最初から順に読んでいってほしいと思います。
そして、本書との対話を楽しんでほしいです。

たとえば「025 ヒアドキュメントで文字列を書きたい」であれば、本書が「ヒアドキュメントって知ってる?ちゃんと使いこなしてる?」とあなたに問いかけてると考えてください。

「ヒアドキュメントぐらい知ってるよ!」という場合はOKです。
ただし、本当に自分の知識は合っているのか、実は今まで知らなかった応用的な使い方がないか、といった観点で本文をチェックしましょう。

一方、「ヒアドキュメント、全然知らなかった」とか「そういや昔やったけど、完全に忘れてたわ」という人は、新しい知識を習得するチャンスです!
ここでしっかりヒアドキュメントについて学びましょう。

・・・と、こんな具合で最初から順に読んでいくと、本書を読み終わる頃にはいい具合にRubyに関する知識やコーディングテクニックを吸収できているはずです。

1日10トピックずつ読み進めれば1ヶ月で読み終えられるはず!

前述のとおり、本書はかなり分厚い本です。
ですが、各トピックはほとんどが1〜2ページにまとまっています。
説明も簡潔で大変わかりやすいです。

全部で290のテクニックが載っているので、1日10トピックずつ読み進めれば約1ヶ月で本書を読み終えることができます。
毎朝仕事を始める前に、もしくは通勤の電車の中で、気軽な読み物として一定のペースで読み進めるといいんじゃないかなと思いました。


チェリー本とあわせて読めばもう完璧!?

本書の内容は拙著「プロを目指す人のためのRuby入門 改訂2版(通称チェリー本)」と被る部分も多いです。

なので、チェリー本を何度も読み直す代わりに、Ruby コードレシピ集を読んで復習する、という使い方もありかもしれません。
(あっこれ、チェリー本に載ってたのに忘れてしまってたわ〜、みたいな感じで)

ちなみに、チェリー本とRuby コードレシピ集の主な違いは以下の通りです。

  • チェリー本の対象バージョンはRuby 3.0、Ruby コードレシピ集はRuby 3.3なので、Ruby コードレシピ集の方が内容が新しい
  • チェリー本は「素のRubyの知識」にこだわっているが、Ruby コードレシピ集はgemのインストールを前提とした話題も多い
  • チェリー本はテストコードの説明にminitestを使っているが、Ruby コードレシピ集はRSpecを使っている

このほかにも、チェリー本執筆時に「ページ数が多くなり過ぎるからこれはカットせざるを得ないな」と思った内容もRuby コードレシピ集にはたくさん載っています。
具体的に挙げると、日時データの扱いやファイル操作に関するライブラリの使い方などです。

なので、チェリー本とRuby コードレシピ集を両方読めばRubyに関する知識はかなり広範囲に網羅できると思います!

まとめ

というわけで、このエントリでは「Ruby コードレシピ集」を読んでみた僕なりの感想を書いてみました。

現在Rubyを勉強中のそこのあなた!

本書を毎朝10トピックずつ読んでいきましょう。
そうすれば1ヶ月で知らなかったテクニックや忘れていた知識を効率良く吸収できるはずです💪

あわせて読みたい

著者の一人である id:kymmt90 さんと Shimoju さんによる「Ruby コードレシピ集」の紹介ブログです。
こちらもあわせてどうぞ!
blog.kymmt.com
shimoju.jp

*1:ただし、冒頭の「はじめに」では「本書は学習用途で1章から順に読むのでも、実務用途でやりたいことに応じて必要なところから読むのでもかまいません」と書いてあります。