SlideShare a Scribd company logo
1 of 112
Download to read offline
CodeIQベストコード発表会
最もエレガントにカラオケマシン問題を解いたのは誰だ?
株式会社ソニックガーデン
伊藤 淳一
SonicGarden Study #10
好評発売中!
倉貫義人著「納品」をなくせばうまくいく
自己紹介
About me
伊藤 淳一
Twitter: @jnchito
Blog: give IT a try
Lives in 西脇市
西脇市???
僕は今ココにいます。
神戸の北西約50km
Wikipedia
リモートで働いてます
窓の外はこんな感じ
翻訳しました!
みなさんは今どこで
観ていますか?
#sg_study を付けてツイート!
SonicGarden Study?
• SonicGardenが主催するIT勉強会
• USTで役立つ技術情報をライブ配信
• 世界中どこからでも参加可能!
• 質問はTwitterから => #sg_study
本日のMenu
本日のMenu
• カラオケマシン問題 優秀賞の発表
• 模範解答の発表
• カラオケマシン問題の総評
• 良いコードとコードレビューの関係
• プレゼント本当選者発表
• Q&A
カラオケマシン問題
優秀賞の発表
そのまえに・・・
カラオケマシン問題?
https://flic.kr/p/6x9dpV
問題の説明
• メロディ(文字列)のキーを変える問題
• ドレミ を +2 すると レミファ#
• 音階はアルファベットで表現
ドレミファソラシド = CDEFGABC
ミ + 2 =ファ# ??
お題: かえるのうた
“C D E F |E D C |E F G A |…”
↓ +2
“D E F# G |F# E D |F# G A B |…”
• 空白 = 休符
• 縦棒(|) = 小節の区切り
要求仕様あれこれ
• キーを上げたり
• キーを下げたり
• オクターブ(12音)を超えたり
• 元のメロディがC以外の音で始まったり
“F# G# A# B |A# G# F# …”
予めRSpec書きました
解答提出の条件
• 解答テンプレートを使って提出
• クラス名やメソッド名を統一
• 全17パターンのテストをパスさせる
• 解答テンプレートはこちら
https://gist.github.com/JunichiIto/c548e39fed60bf4bd36a
優秀賞について
• 挑戦者は全部で50名
• その中から優秀なコードを3本選出
• 3本の中で順位や優劣は付けない
• 自分で解いてから見るのがオススメ
というわけで
優秀賞の発表です!
優秀賞・その1
Muさん
About Muさん
• Ruby歴 1年
• フリープログラマ
• 持ち帰り案件&スカウト募集中!
• こだわった点: 短く簡潔に
• 簡潔さ重視でハッシュの採用は見送り
優秀賞・その2
ttakuru88さん
About ttakuru88さん
• Ruby歴 4年
• kray.jpのRailsプログラマ
• 吹奏楽を7年やっていた
• 音楽系プログラムに馴染みがあった
優秀賞・その3
hitokunさん
About hitokunさん
• Ruby歴 なし
• web&アプリのバックエンド開発メイン
• 変換テーブルを作って処理を効率化
• gsubで置換する方が速い(はず)
• ググりながら1時間ぐらいで解答
優秀賞のみなさん
おめでとうございます!
つづいて
(最強の?)模範解答
出題者が解くと
こうなります。
じゃじゃん!
模範解答のポイント
• 定数的な値は定数として定義する
• 標準APIを活用し変換用ハッシュを作成
• 標準API = rotate, transpose, to_h
• 正規表現を使って音符のみを抽出
• gsubにハッシュを渡してコード量削減
もう一度おさらい
解答の総評
総評・はじめに
• 予想以上の反響で2回増枠!
• さらに50人全員がテストを全パス!
• 挑戦者のみなさん、ありがとう!!
簡単なメトリクス
コード行数の分布
空白行、コメント行、

テストコードは除く
採点しながら感じた
良いコードの境界線
良いコードの境界線
• 正規表現の活用
• Array, Hash, String等の標準APIの活用
• 定数やインスタンス変数の使い分け
• for/while/break/next等を避ける
• YAGNIなシンプル設計
勉強になりそうな
参考資料
正規表現を学ぶ
• オライリー「詳説 正規表現 第3版」
標準APIを学ぶ
• ruby-doc.orgを繰り返し読む
Rubyらしさを学ぶ
• Qiita: リファクタリングに使えそうな∼
また挑戦してね!
ところで
良いコードって
どんなコード?
ぱっと思いつく
特性を挙げてみる
良いコードは…
• 短くて簡潔
• 重複がない (DRY)
• 壊れにくい
• わかりやすい
• 改修しやすい
• 再利用しやすい
悪いコードは…
• 長くて冗長
• コピペコピペコピペ・・・
• もろくて壊れやすい
• 何をやってるのか全く理解できない
• 改修しにくい
• 再利用できない
良いコードの長所
• 開発効率が上がる
• すぐに作れる、改造できる
• バグも原因がすぐわかる、すぐ直せる
• ストレスがなくなる
• むしろ作っていて気持ちいい
悪いコードの短所
• 開発効率が下がる
• 全然作れない、改造もできない
• バグの原因を特定するだけで骨が折れる
• ストレスが溜まる
• Twitterに愚痴が増える
じゃあどうしたら
良いコードが書ける?
個人として
• いろんな現場を経験する
• コードの良し悪しによる天国と地獄
• 技術書を読んで勉強する
• コードに対する飽くなき向上心を持つ
• リファクタリングの鬼になる
オススメの技術書
チームや組織として
• 日常的にコードレビューをする
• 他人のコードをレビューする
• 自分のコードをレビューしてもらう
• コードレビューはお互い勉強になる
• 「良いコード」の共通認識を持つ
• 「良いコードとは?」を議論する
具体例で見る
コードレビューの効果
とあるRuby初心者さん
のコード
レビュー前
レビュー前(1/6)
レビュー前(2/6)
レビュー前(3/6)
レビュー前(4/6)
レビュー前(5/6)
レビュー前(6/6)
コードレビューした
リファクタリング後
修正内容について
さらにコードレビュー
再リファクタリング
Before / After
レビュー前後の行数
良いコードを書くために
• 自分でコードを書く
• 他の人が書いたコードを読む
• 書いたコードを読んでもらう
• 1人で書いてハイ終わり、じゃダメ!!
だからコードを書こう
コードを読もう
コードを読んでもらおう
たとえば
CodeIQに挑戦!
勉強会に参加!
教育プログラムを履修!
• ソニックガーデンでは企業向け

教育プログラムを準備中です。
• コードレビューできる人材を育成します。
• 詳細についてはお問い合わせください。
本日のまとめ
本日のまとめ
• 同じ問題でも解き方は人によって千差万別
• 良いコードを書くためには
• 個人で勉強する
• チームや組織でコードレビューする
• コードを書く、読む、読んでもらう
• Webサービス、勉強会、教育プログラム
プレゼント本の
当選者発表
サイン入り本を贈呈!
• 挑戦者の中から抽選で3名様に

『「納品」をなくせばうまくいく』を贈呈
• 著者・倉貫義人のサイン入り!
Rubyで抽選しました
当選者一覧
• m_utaさん
• たがみつさん
• みけCATさん
• さらに、優秀賞を獲得した

Muさん、ttakuru88さん、hitokunさん

にもプレゼントいたします!
当選おめでとうございます!
&
挑戦ありがとうございました!
Q&A
#sg_study で受付中!
アンケートから・その1
• 設計/仕様レベルのレビューは難しい
• 些細な点の指摘に終始してしまう
Answer
• 設計レビューはみんなでじっくり
• リリース前は致命的な問題にフォーカス
• 仕様を把握するレビューは主に前者
アンケートから・その2
• レビューするコード量や大きさは?
Answer
• 1stリリース前のレビューはコード全体
• 以後のリリースはpull request単位
アンケートから・その3
• ネガティブにならないように気を遣う
• 顔文字で工夫したりするが、なかなか
Answer
• 良いコードに対する共通認識を確認する
• ネットのコーディング規則を活用する
• 「自分のことは棚に上げる」ルールにする
アンケートから・その4
• 一人開発なのでレビューの機会がない
• 自分のコードに自信が持てない
Answer
• 勉強会に参加する(もしくは開催する)
• 教育プログラムに参加する
• オープンソースプロジェクトに参加する
アンケートから・その5
• 人によって考え方が違う
• 例) Rubyでreturnを書くかどうか、等
Answer
• 良いコードに対する共通認識を確認する
• ネットのコーディング規則を活用する
• とりあえずreturnは書かない方が主流
アンケートから・その6
• コピペや非構造化コードの指摘に困る
• 角を立てずに指摘するには?
Answer
• 良いコードに対する共通認識を確認する
• ネットのコーディング規則を活用する
アンケートから・その7
• コードレビューの文化はどう作るのか?
Answer
• まずpull request方式を導入してみては?
アンケートから・その8
• 好みと指摘の境界線が気になる
• 社内ルール化するのも自由がなくなる
Answer
• 良いコードに対する共通認識を確認する
• ネットのコーディング規則を活用する
• Hound CI等のツールを導入する
Q&A
#sg_study で受付中!
次回予告
8月のSonicGarden
Studyは
いつまでクソコードを
書き続けるの?
デキるプログラマだけが知っている
コードレビュー7つの秘訣
概要
• 優れたプログラマになるための近道

= 優れたプログラマによる指摘!!
• レビューを上手に実践する秘訣を紹介
• 講師: 西見公宏(@mah_lab)
• 放送予定日: 8/11(月)
最後に
みなさんにお願い
アンケートにご協力を
• 放送終了後、簡単なアンケートを

メールでお願いしています。
• 今後のSonic Garden Studyを改善して

いくためにぜひご協力ください。
• よろしくお願いします!!
Thank you.
CodeIQベストコード発表会 #sg_study

More Related Content

Similar to CodeIQベストコード発表会 #sg_study

日本のゲーム開発,海外のゲーム開発
日本のゲーム開発,海外のゲーム開発日本のゲーム開発,海外のゲーム開発
日本のゲーム開発,海外のゲーム開発syamane
 
AKIBAX2010 新ブーム「電子工作」を体験しよう!
AKIBAX2010 新ブーム「電子工作」を体験しよう!AKIBAX2010 新ブーム「電子工作」を体験しよう!
AKIBAX2010 新ブーム「電子工作」を体験しよう!encafe
 
なぜピリカを作っているか?
なぜピリカを作っているか?なぜピリカを作っているか?
なぜピリカを作っているか?R. Ayakix
 
プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言Shigeru Kobayashi
 
20150912わんくま大阪-Firefox OSの「いま」と「これから」
20150912わんくま大阪-Firefox OSの「いま」と「これから」20150912わんくま大阪-Firefox OSの「いま」と「これから」
20150912わんくま大阪-Firefox OSの「いま」と「これから」Takahiro Uemura
 
Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!
Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!
Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!encafe
 
20201006 勉強会駆動開発
20201006 勉強会駆動開発20201006 勉強会駆動開発
20201006 勉強会駆動開発K K
 
ニコニコアプリ開発
ニコニコアプリ開発ニコニコアプリ開発
ニコニコアプリ開発jz5 MATSUE
 
岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回Shigeru Kobayashi
 
高専カンファレンス@OSC2009SpringTokyo
高専カンファレンス@OSC2009SpringTokyo高専カンファレンス@OSC2009SpringTokyo
高専カンファレンス@OSC2009SpringTokyoKuniaki Igarashi
 
木曜日は井戸端会議です。(BrigadeMeetup@金沢)
木曜日は井戸端会議です。(BrigadeMeetup@金沢)木曜日は井戸端会議です。(BrigadeMeetup@金沢)
木曜日は井戸端会議です。(BrigadeMeetup@金沢)Hiroshi Omata
 
21th知的生産シンポジウム(キックオフ)2share
21th知的生産シンポジウム(キックオフ)2share21th知的生産シンポジウム(キックオフ)2share
21th知的生産シンポジウム(キックオフ)2shareToru Takahashi
 
Jaws sonic 2020_yokohama_deepcomposer
Jaws sonic 2020_yokohama_deepcomposerJaws sonic 2020_yokohama_deepcomposer
Jaws sonic 2020_yokohama_deepcomposerAkifumi Niida
 
八子クラウド座談会 事前配布・趣旨説明  20170617
八子クラウド座談会 事前配布・趣旨説明  20170617八子クラウド座談会 事前配布・趣旨説明  20170617
八子クラウド座談会 事前配布・趣旨説明  20170617知礼 八子
 
Cocoa勉強会201203公開
Cocoa勉強会201203公開Cocoa勉強会201203公開
Cocoa勉強会201203公開Satoshi Oomori
 
つかえる!効果的なあしらいの選び方
つかえる!効果的なあしらいの選び方つかえる!効果的なあしらいの選び方
つかえる!効果的なあしらいの選び方K K
 
見える!「IoT」 NefryでJenkinsのXFD作ってみた
見える!「IoT」 NefryでJenkinsのXFD作ってみた 見える!「IoT」 NefryでJenkinsのXFD作ってみた
見える!「IoT」 NefryでJenkinsのXFD作ってみた Tone Blue
 
見える!「IoT」NefryでJenkinsのXFD作ってみた
見える!「IoT」NefryでJenkinsのXFD作ってみた見える!「IoT」NefryでJenkinsのXFD作ってみた
見える!「IoT」NefryでJenkinsのXFD作ってみたTone Blue
 
海外から見た東京 〜人生100年時代の働き方〜 #efsta56
海外から見た東京 〜人生100年時代の働き方〜 #efsta56海外から見た東京 〜人生100年時代の働き方〜 #efsta56
海外から見た東京 〜人生100年時代の働き方〜 #efsta56Hiro Yoshioka
 
kintone Café釧路vol.4 kintoneで変わる釧路のこれから
kintone Café釧路vol.4 kintoneで変わる釧路のこれからkintone Café釧路vol.4 kintoneで変わる釧路のこれから
kintone Café釧路vol.4 kintoneで変わる釧路のこれから琴絵 四宮
 

Similar to CodeIQベストコード発表会 #sg_study (20)

日本のゲーム開発,海外のゲーム開発
日本のゲーム開発,海外のゲーム開発日本のゲーム開発,海外のゲーム開発
日本のゲーム開発,海外のゲーム開発
 
AKIBAX2010 新ブーム「電子工作」を体験しよう!
AKIBAX2010 新ブーム「電子工作」を体験しよう!AKIBAX2010 新ブーム「電子工作」を体験しよう!
AKIBAX2010 新ブーム「電子工作」を体験しよう!
 
なぜピリカを作っているか?
なぜピリカを作っているか?なぜピリカを作っているか?
なぜピリカを作っているか?
 
プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言
 
20150912わんくま大阪-Firefox OSの「いま」と「これから」
20150912わんくま大阪-Firefox OSの「いま」と「これから」20150912わんくま大阪-Firefox OSの「いま」と「これから」
20150912わんくま大阪-Firefox OSの「いま」と「これから」
 
Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!
Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!
Gadget1 R2 ガジェットカフェでソーシャル電子工作を始めよう!
 
20201006 勉強会駆動開発
20201006 勉強会駆動開発20201006 勉強会駆動開発
20201006 勉強会駆動開発
 
ニコニコアプリ開発
ニコニコアプリ開発ニコニコアプリ開発
ニコニコアプリ開発
 
岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回岐阜スーパーものづくり講座:第8回
岐阜スーパーものづくり講座:第8回
 
高専カンファレンス@OSC2009SpringTokyo
高専カンファレンス@OSC2009SpringTokyo高専カンファレンス@OSC2009SpringTokyo
高専カンファレンス@OSC2009SpringTokyo
 
木曜日は井戸端会議です。(BrigadeMeetup@金沢)
木曜日は井戸端会議です。(BrigadeMeetup@金沢)木曜日は井戸端会議です。(BrigadeMeetup@金沢)
木曜日は井戸端会議です。(BrigadeMeetup@金沢)
 
21th知的生産シンポジウム(キックオフ)2share
21th知的生産シンポジウム(キックオフ)2share21th知的生産シンポジウム(キックオフ)2share
21th知的生産シンポジウム(キックオフ)2share
 
Jaws sonic 2020_yokohama_deepcomposer
Jaws sonic 2020_yokohama_deepcomposerJaws sonic 2020_yokohama_deepcomposer
Jaws sonic 2020_yokohama_deepcomposer
 
八子クラウド座談会 事前配布・趣旨説明  20170617
八子クラウド座談会 事前配布・趣旨説明  20170617八子クラウド座談会 事前配布・趣旨説明  20170617
八子クラウド座談会 事前配布・趣旨説明  20170617
 
Cocoa勉強会201203公開
Cocoa勉強会201203公開Cocoa勉強会201203公開
Cocoa勉強会201203公開
 
つかえる!効果的なあしらいの選び方
つかえる!効果的なあしらいの選び方つかえる!効果的なあしらいの選び方
つかえる!効果的なあしらいの選び方
 
見える!「IoT」 NefryでJenkinsのXFD作ってみた
見える!「IoT」 NefryでJenkinsのXFD作ってみた 見える!「IoT」 NefryでJenkinsのXFD作ってみた
見える!「IoT」 NefryでJenkinsのXFD作ってみた
 
見える!「IoT」NefryでJenkinsのXFD作ってみた
見える!「IoT」NefryでJenkinsのXFD作ってみた見える!「IoT」NefryでJenkinsのXFD作ってみた
見える!「IoT」NefryでJenkinsのXFD作ってみた
 
海外から見た東京 〜人生100年時代の働き方〜 #efsta56
海外から見た東京 〜人生100年時代の働き方〜 #efsta56海外から見た東京 〜人生100年時代の働き方〜 #efsta56
海外から見た東京 〜人生100年時代の働き方〜 #efsta56
 
kintone Café釧路vol.4 kintoneで変わる釧路のこれから
kintone Café釧路vol.4 kintoneで変わる釧路のこれからkintone Café釧路vol.4 kintoneで変わる釧路のこれから
kintone Café釧路vol.4 kintoneで変わる釧路のこれから
 

More from Junichi Ito

起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~
起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~
起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~Junichi Ito
 
About Nishiwaki.rb and Kobe.rb
About Nishiwaki.rb and Kobe.rbAbout Nishiwaki.rb and Kobe.rb
About Nishiwaki.rb and Kobe.rbJunichi Ito
 
田舎からリモートで働くという生き方
田舎からリモートで働くという生き方田舎からリモートで働くという生き方
田舎からリモートで働くという生き方Junichi Ito
 
How to upgrade your rails application to rspec3
How to upgrade your rails application to rspec3How to upgrade your rails application to rspec3
How to upgrade your rails application to rspec3Junichi Ito
 
give IT a try 読者向けオフ会
give IT a try 読者向けオフ会give IT a try 読者向けオフ会
give IT a try 読者向けオフ会Junichi Ito
 
なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)
なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)
なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)Junichi Ito
 
なぜ私はソニックガーデンのプログラマに転身できたのか?
なぜ私はソニックガーデンのプログラマに転身できたのか? なぜ私はソニックガーデンのプログラマに転身できたのか?
なぜ私はソニックガーデンのプログラマに転身できたのか? Junichi Ito
 
The FizzBuzz Programing Contest
The FizzBuzz Programing ContestThe FizzBuzz Programing Contest
The FizzBuzz Programing ContestJunichi Ito
 

More from Junichi Ito (9)

起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~
起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~
起業するっておもしろい!~子育て中の主婦が突然パン屋を始めました~
 
About Nishiwaki.rb and Kobe.rb
About Nishiwaki.rb and Kobe.rbAbout Nishiwaki.rb and Kobe.rb
About Nishiwaki.rb and Kobe.rb
 
田舎からリモートで働くという生き方
田舎からリモートで働くという生き方田舎からリモートで働くという生き方
田舎からリモートで働くという生き方
 
How to upgrade your rails application to rspec3
How to upgrade your rails application to rspec3How to upgrade your rails application to rspec3
How to upgrade your rails application to rspec3
 
give IT a try 読者向けオフ会
give IT a try 読者向けオフ会give IT a try 読者向けオフ会
give IT a try 読者向けオフ会
 
なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)
なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)
なぜ私はソニックガーデンのプログラマに転身できたのか?(Short ver.)
 
なぜ私はソニックガーデンのプログラマに転身できたのか?
なぜ私はソニックガーデンのプログラマに転身できたのか? なぜ私はソニックガーデンのプログラマに転身できたのか?
なぜ私はソニックガーデンのプログラマに転身できたのか?
 
Procon 20111031
Procon 20111031Procon 20111031
Procon 20111031
 
The FizzBuzz Programing Contest
The FizzBuzz Programing ContestThe FizzBuzz Programing Contest
The FizzBuzz Programing Contest
 

CodeIQベストコード発表会 #sg_study