Transcript
Page 1: CodeIQベストコード発表会 #sg_study

CodeIQベストコード発表会 最もエレガントにカラオケマシン問題を解いたのは誰だ?

株式会社ソニックガーデン

伊藤 淳一

SonicGarden Study #10

Page 2: CodeIQベストコード発表会 #sg_study
Page 3: CodeIQベストコード発表会 #sg_study

好評発売中!倉貫義人著「納品」をなくせばうまくいく

Page 4: CodeIQベストコード発表会 #sg_study
Page 5: CodeIQベストコード発表会 #sg_study

自己紹介

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

About me

伊藤 淳一Twitter: @jnchito

Blog: give IT a try

Lives in 西脇市

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

西脇市???

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

僕は今ココにいます。

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

リモートで働いてます

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

窓の外はこんな感じ

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

翻訳しました!

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

みなさんは今どこで 観ていますか?

#sg_study を付けてツイート!

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

SonicGarden Study?

• SonicGardenが主催するIT勉強会

• USTで役立つ技術情報をライブ配信

• 世界中どこからでも参加可能!

• 質問はTwitterから => #sg_study

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

本日のMenu

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

本日のMenu

• カラオケマシン問題 優秀賞の発表

• 模範解答の発表

• カラオケマシン問題の総評

• 良いコードとコードレビューの関係

• プレゼント本当選者発表

• Q&A

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

カラオケマシン問題

優秀賞の発表

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

そのまえに・・・

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

カラオケマシン問題?

https://flic.kr/p/6x9dpV

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

問題の説明• メロディ(文字列)のキーを変える問題

• ドレミ を +2 すると レミファ#

• 音階はアルファベットで表現

ドレミファソラシド = CDEFGABC

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

ミ + 2 =ファ# ??

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

お題: かえるのうた“C D E F |E D C |E F G A |…”

↓ +2

“D E F# G |F# E D |F# G A B |…”

• 空白 = 休符

• 縦棒(|) = 小節の区切り

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

要求仕様あれこれ• キーを上げたり

• キーを下げたり

• オクターブ(12音)を超えたり

• 元のメロディがC以外の音で始まったり

“F# G# A# B |A# G# F# …”

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

予めRSpec書きました

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

解答提出の条件• 解答テンプレートを使って提出

• クラス名やメソッド名を統一

• 全17パターンのテストをパスさせる

• 解答テンプレートはこちら

https://gist.github.com/JunichiIto/c548e39fed60bf4bd36a

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

優秀賞について• 挑戦者は全部で50名

• その中から優秀なコードを3本選出

• 3本の中で順位や優劣は付けない

• 自分で解いてから見るのがオススメ

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

というわけで

優秀賞の発表です!

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

優秀賞・その1

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

Muさん

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

About Muさん• Ruby歴 1年

• フリープログラマ

• 持ち帰り案件&スカウト募集中!

• こだわった点: 短く簡潔に

• 簡潔さ重視でハッシュの採用は見送り

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

優秀賞・その2

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

ttakuru88さん

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

About ttakuru88さん• Ruby歴 4年

• kray.jpのRailsプログラマ

• 吹奏楽を7年やっていた

• 音楽系プログラムに馴染みがあった

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

優秀賞・その3

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

hitokunさん

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

About hitokunさん• Ruby歴 なし

• web&アプリのバックエンド開発メイン

• 変換テーブルを作って処理を効率化

• gsubで置換する方が速い(はず)

• ググりながら1時間ぐらいで解答

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

優秀賞のみなさん

おめでとうございます!

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

つづいて

(最強の?)模範解答

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

出題者が解くと

こうなります。

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

じゃじゃん!

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

模範解答のポイント• 定数的な値は定数として定義する

• 標準APIを活用し変換用ハッシュを作成

• 標準API = rotate, transpose, to_h

• 正規表現を使って音符のみを抽出

• gsubにハッシュを渡してコード量削減

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

もう一度おさらい

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

解答の総評

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

総評・はじめに• 予想以上の反響で2回増枠!

• さらに50人全員がテストを全パス!

• 挑戦者のみなさん、ありがとう!!

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

簡単なメトリクス

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

コード行数の分布

空白行、コメント行、テストコードは除く

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

採点しながら感じた

良いコードの境界線

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

良いコードの境界線• 正規表現の活用

• Array, Hash, String等の標準APIの活用

• 定数やインスタンス変数の使い分け

• for/while/break/next等を避ける

• YAGNIなシンプル設計

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

勉強になりそうな

参考資料

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

標準APIを学ぶ• ruby-doc.orgを繰り返し読む

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

Rubyらしさを学ぶ• Qiita: リファクタリングに使えそうな~

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

また挑戦してね!

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

ところで

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

良いコードって

どんなコード?

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

ぱっと思いつく

特性を挙げてみる

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

良いコードは…• 短くて簡潔

• 重複がない (DRY)

• 壊れにくい

• わかりやすい

• 改修しやすい

• 再利用しやすい

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

悪いコードは…• 長くて冗長

• コピペコピペコピペ・・・

• もろくて壊れやすい

• 何をやってるのか全く理解できない

• 改修しにくい

• 再利用できない

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

良いコードの長所• 開発効率が上がる

• すぐに作れる、改造できる

• バグも原因がすぐわかる、すぐ直せる

• ストレスがなくなる

• むしろ作っていて気持ちいい

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

悪いコードの短所• 開発効率が下がる

• 全然作れない、改造もできない

• バグの原因を特定するだけで骨が折れる

• ストレスが溜まる

• Twitterに愚痴が増える

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

じゃあどうしたら

良いコードが書ける?

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

個人として• いろんな現場を経験する

• コードの良し悪しによる天国と地獄

• 技術書を読んで勉強する

• コードに対する飽くなき向上心を持つ

• リファクタリングの鬼になる

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

チームや組織として• 日常的にコードレビューをする

• 他人のコードをレビューする

• 自分のコードをレビューしてもらう

• コードレビューはお互い勉強になる

• 「良いコード」の共通認識を持つ

• 「良いコードとは?」を議論する

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

具体例で見る

コードレビューの効果

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

とあるRuby初心者さんのコード

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

レビュー前

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

レビュー前(1/6)

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

レビュー前(2/6)

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

レビュー前(3/6)

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

レビュー前(4/6)

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

レビュー前(5/6)

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

レビュー前(6/6)

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

コードレビューした

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

リファクタリング後

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

修正内容について

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

さらにコードレビュー

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

再リファクタリング

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

Before / After

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

レビュー前後の行数

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

良いコードを書くために• 自分でコードを書く

• 他の人が書いたコードを読む

• 書いたコードを読んでもらう

• 1人で書いてハイ終わり、じゃダメ!!

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

だからコードを書こう

コードを読もう

コードを読んでもらおう

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

たとえば

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

CodeIQに挑戦!

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

勉強会に参加!

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

教育プログラムを履修!• ソニックガーデンでは企業向け教育プログラムを準備中です。

• コードレビューできる人材を育成します。

• 詳細についてはお問い合わせください。

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

本日のまとめ

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

本日のまとめ• 同じ問題でも解き方は人によって千差万別

• 良いコードを書くためには

• 個人で勉強する

• チームや組織でコードレビューする

• コードを書く、読む、読んでもらう

• Webサービス、勉強会、教育プログラム

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

プレゼント本の

当選者発表

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

サイン入り本を贈呈!• 挑戦者の中から抽選で3名様に『「納品」をなくせばうまくいく』を贈呈

• 著者・倉貫義人のサイン入り!

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

Rubyで抽選しました

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

当選者一覧• m_utaさん

• たがみつさん

• みけCATさん

• さらに、優秀賞を獲得したMuさん、ttakuru88さん、hitokunさんにもプレゼントいたします!

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

当選おめでとうございます!

挑戦ありがとうございました!

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

Q&A#sg_study で受付中!

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

アンケートから・その1

• 設計/仕様レベルのレビューは難しい

• 些細な点の指摘に終始してしまう

Answer

• 設計レビューはみんなでじっくり

• リリース前は致命的な問題にフォーカス

• 仕様を把握するレビューは主に前者

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

アンケートから・その2• レビューするコード量や大きさは?

Answer

• 1stリリース前のレビューはコード全体

• 以後のリリースはpull request単位

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

アンケートから・その3• ネガティブにならないように気を遣う

• 顔文字で工夫したりするが、なかなか

Answer

• 良いコードに対する共通認識を確認する

• ネットのコーディング規則を活用する

• 「自分のことは棚に上げる」ルールにする

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

アンケートから・その4• 一人開発なのでレビューの機会がない

• 自分のコードに自信が持てない

Answer

• 勉強会に参加する(もしくは開催する)

• 教育プログラムに参加する

• オープンソースプロジェクトに参加する

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

アンケートから・その5• 人によって考え方が違う

• 例) Rubyでreturnを書くかどうか、等

Answer

• 良いコードに対する共通認識を確認する

• ネットのコーディング規則を活用する

• とりあえずreturnは書かない方が主流

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

アンケートから・その6• コピペや非構造化コードの指摘に困る

• 角を立てずに指摘するには?

Answer

• 良いコードに対する共通認識を確認する

• ネットのコーディング規則を活用する

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

アンケートから・その7• コードレビューの文化はどう作るのか?

Answer

• まずpull request方式を導入してみては?

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

アンケートから・その8• 好みと指摘の境界線が気になる

• 社内ルール化するのも自由がなくなる

Answer

• 良いコードに対する共通認識を確認する

• ネットのコーディング規則を活用する

• Hound CI等のツールを導入する

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

Q&A#sg_study で受付中!

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

次回予告

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

8月のSonicGarden

Studyは

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

いつまでクソコードを

書き続けるの? デキるプログラマだけが知っている

コードレビュー7つの秘訣

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

概要• 優れたプログラマになるための近道

= 優れたプログラマによる指摘!!

• レビューを上手に実践する秘訣を紹介

• 講師: 西見公宏(@mah_lab)

• 放送予定日: 8/11(月)

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

最後に

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

みなさんにお願い

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

アンケートにご協力を• 放送終了後、簡単なアンケートをメールでお願いしています。

• 今後のSonic Garden Studyを改善していくためにぜひご協力ください。

• よろしくお願いします!!

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

Thank you.

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

Top Related