58
リーダブル リーダブル リーダブルコード リーダブルコード 2012年7⽉6⽇ ⾓ 征典 [email protected] 1/58

20120706-readablecode

Embed Size (px)

Citation preview

Page 1: 20120706-readablecode

リーダブルリーダブルリーダブルコードリーダブルコード

2012年7⽉6⽇⾓�征典

[email protected]

1/58

Page 2: 20120706-readablecode

御礼2012年7⽉5⽇�10:47�KOU�Keiko�<[email protected]>�Wrote:

2週間2週間⾜らずで4刷4刷というのはすごいスピードです。

2/58

Page 3: 20120706-readablecode

Ebook版は秋ごろ予定

3/58

Page 4: 20120706-readablecode

お詫び

4/58

Page 5: 20120706-readablecode

⾃⼰紹介

@kdmsnr

5/58

Page 6: 20120706-readablecode

⾃⼰紹介�訳書�(1/2)Martin Fowler's Bliki (2003) ↓『アジャイルレトロスペクティブズ』 (2007) ↓スクラムガイド (2010) ↓『メタプログラミングRuby』 (2010) ↓『ウェブオペレーション』 (2011) ↓『Facebookマーケティング』 (2011) ↓

6/58

Page 7: 20120706-readablecode

⾃⼰紹介�訳書(2/2) ↓『Clean Coder』 (2012) ↓『リーダブルコード』 (2012) ←【イマココ】 ↓『Service Design Patterns』 (2012) ↓『Seven Databases in Seven Weeks』 (2012) ↓『Running Lean』 (2012) ↓『...』(2012?)

7/58

Page 8: 20120706-readablecode

The�Art�of�Readable�Code

8/58

Page 9: 20120706-readablecode

『リーダブルコード』これはもう「翻訳放棄翻訳放棄」と⾔ってもよ

いレベルですねぇ。⾮道過ぎます⾮道過ぎます。

http://twitter.com/ytaniike/status/211060068035207170違うよ。全然違うよ。

9/58

Page 10: 20120706-readablecode

リーダブルコードの理由理由タイトルは、あえて『リーダブルコーリーダブルコー

ドド』にした。これは「リーダブルコードリーダブルコード」という聞きなれない⾔葉にすることで、読んだ⼈に「リーダブルコードリーダブルコード」というものについて注意して欲しいからだ。

http://www.clear-code.com/blog/2012/6/11.html

10/58

Page 11: 20120706-readablecode

続�リーダブルコードの理由理由「リファクタリングリファクタリング」という⾔葉を使

っていて、「コードをよくすること」がより当たり前になっている。それと同じように、読みやすいコードを⾒たら「リーダリーダブルでいいね!ブルでいいね!」ということが⾃然に⾔われるようになるといい。

http://www.clear-code.com/blog/2012/6/11.html

11/58

Page 12: 20120706-readablecode

名前名前重要リーダブルコードは本のタイトルで勝本のタイトルで勝

ちちだよなぁ。(中略)どんなコード⽬指しどんなコード⽬指してるかてるかすぐわかるし。

http://twitter.com/chiastolite/status/219793852087808003誰だか知らないけどありがとう!!!!

12/58

Page 13: 20120706-readablecode

じゃあ、どんなコード?リーダブルコードの基本定理

コードは他の⼈が最短時間で理解最短時間で理解できるように書かなければいけない。(p.3)

13/58

Page 14: 20120706-readablecode

ハァ?なんで?「コードのよさは重要だ」は危うい危うい前提

読むに耐えないコードが⼤⾦を稼いで読むに耐えないコードが⼤⾦を稼いでいる場⾯を散々⽬にしてきたのでいる場⾯を散々⽬にしてきたので、商業的に成功したり、広く活⽤されたりするうえで、コードの品質が必要だとも、それさえあれば⼗分だとも思えないからだ。

『実装パターン』Kent�Beck14/58

Page 15: 20120706-readablecode

でもやるんだよ!……誇りの持てない仕事で無駄にする

時聞はない。よいコードを書くこと⾃体がよいコードを書くこと⾃体が喜び喜びであり、そのコードを他の⼈が理解し、評価し、使⽤し、拡張してくれれば、さらに喜びは増す。

『実装パターン』Kent�Beck

15/58

Page 16: 20120706-readablecode

2章�名前に情報を詰め込む2章�名前に情報を詰め込む

16/58

Page 17: 20120706-readablecode

名前をつけるのは難しい簡単に誤解・誤読されちゃう!

変数の名前を決定する際には、最初の最初の⼦供の名前を決めるときと同じくらい⼦供の名前を決めるときと同じくらいの配慮が必要なのです(Jim�Cope)

『Clean�Code』Robert�C.�Martin

17/58

Page 18: 20120706-readablecode

本章のアドバイス明確で具体的な単語を選ぶ汎⽤的な名前は避ける単位や情報を名前に追加するスコープの⼤きさを考慮するフォーマット規約を使う

18/58

Page 19: 20120706-readablecode

最も基本的なこと式は⾃分で⾳読⾳読するつもりで書こう。

『プログラミング作法』Brian�Kernighan,�Rob�Pike

発⾳可能発⾳可能な名前を使⽤する。

『Clean�Code』Robert�C.�Martin

19/58

Page 20: 20120706-readablecode

retval(何て読むの?)汎⽤的な名前を避ける(p.12)

var eulidean_norm = function(v) { var retval = 0.0; for (var i = 0; i < v.length; i += 1) { retval += v[i] * v[i]; } return Math.sqrt(retval);}

20/58

Page 21: 20120706-readablecode

[ネタ]詠太2で⾳読するhttp://www.justsystems.com/jp/products/ichitaro/feature6.html

※Windowsじゃないと動きません。

21/58

Page 22: 20120706-readablecode

読み⼿のことを考える相⼿を意識したときに、よい⽂章が⽣

まれるように、よいプログラムも読み⼿をよいプログラムも読み⼿を意識したときに⽣まれる意識したときに⽣まれる。

『実装パターン』Kent�Beck

22/58

Page 23: 20120706-readablecode

とは⾔っても、難しいよ

23/58

Page 24: 20120706-readablecode

5章�コメントすべきこと5章�コメントすべきこと

24/58

Page 25: 20120706-readablecode

必要なことはコードに書く私はだらしのないプログラマなので、

⾃分が担当したコードが、どのように書かれていたのかまったく覚えていませんまったく覚えていません。……私は常に、覚えておくべき情報をコードコード内に書き込んでおく内に書き込んでおくことにしているので、わざわざ覚える必要がないのです。

『リファクタリング』Martin�Fowler

25/58

Page 26: 20120706-readablecode

コードコードがドキュメントだ※写真はイメージです。

26/58

Page 27: 20120706-readablecode

でも、ないないものは⾒えないコミットする前のコード使わなかった選択肢却下された要望や提案これからやること

27/58

Page 28: 20120706-readablecode

監督コメンタリー監督コメンタリーp.60

映画DVDの特典のように説明・思い・裏話をコメントに書くうまくいかなかったことも書く疑問を先回りして埋めておく

28/58

Page 29: 20120706-readablecode

理由理由重要⼈に何かを頼み事をするときには理由

を添えた⽅が成功しやすくなる

『影響⼒の武器[第⼆版]―なぜ、⼈は動かされるのか』

29/58

Page 30: 20120706-readablecode

理由は何でもいいらしい◯◯�すみません……急いでいるのでので、先にコピーをとらせてくれませんか?××�すみません……先にコピーをとらせてくれませんか?『影響⼒の武器[第⼆版]―なぜ、⼈は動かされるのか』

30/58

Page 31: 20120706-readablecode

「なんとなく」が⼀番困る「どうしてこうなってるんですか?」「なにがですか」「ここのコードが」「ああ、なんとなくですよ」「えっ」「えっ」「……」「……」

31/58

Page 32: 20120706-readablecode

こじつけでも、つじつまが合えばそれにこしたことは

ない!!

32/58

Page 33: 20120706-readablecode

思考の断⽚断⽚を刻む場所(コードコードではないかもだけど……)

コミットの情報須藤先⽣の「解説」も参考にチケット駆動開発(Ref,�Fix,�Close)

ドキュメントReVIEW(ステマ)http://github.com/kmuto/reviewSphinx

33/58

Page 34: 20120706-readablecode

たいせつなTODO.mdTODO.md多くのデベロッパは、この種の観察作

業のために簡単なto�doリスト簡単なto�doリストを作っている。

『テスト駆動JavaScript』Christian�Johansen

34/58

Page 35: 20120706-readablecode

TODO.mdTODO.mdの例# 商品関連* 在庫のトランザクション。楽観的ロックでいいの?

# 管理画⾯* Admin::ApplicationControllerにBasic認証* Twitter Bootstrap使うかもしれない* ■ Deviseのカスタマイズ → できたけど微妙

# 画像リサイズ* ■ RMagicでやる → できた!

35/58

Page 36: 20120706-readablecode

ドキュメント読まれないしそれでも「ポステルの法則」を参考に

受信するものには寛容に、送信するものには慎重に

http://ja.wikipedia.org/wiki/ジョン・ポステル

36/58

Page 37: 20120706-readablecode

12章�コードに12章�コードに思いを込める思いを込める

37/58

Page 38: 20120706-readablecode

アインシュタインの⾔葉p.158

おばあちゃんおばあちゃんがわかるように説明できなければ、本当に理解したとは⾔えない本当に理解したとは⾔えない。

38/58

Page 39: 20120706-readablecode

テディベアやアヒルちゃんに説明してみる(p.165)

『プログラミング作法』や『達⼈プログラマ』にも記述がある

39/58

Page 40: 20120706-readablecode

説明内容をコメントに書く(すごく⼿続き的だけど)

# originalディレクトリのhtmlファイルから

# code.literalの要素を削除する# (ってか、Nokogiriの使い⽅わからねえ)

# それから、ファイルをテキスト形式に置き換えて

# ワード数を数える

40/58

Page 41: 20120706-readablecode

その下にコードを書く# originalディレクトリのhtmlファイルからDir.glob("original/*.html").each do |html| doc = Nokogiri.HTML open(html) # code.literalの要素を削除する # (ってか、Nokogiriの使い⽅わからねえ)→できた doc.search("//code[@class='literal]").remove # それから、ファイルをテキスト形式に置き換えて text = doc.css("body").text # ワード数を数える wc = text.split.sizeend

41/58

Page 42: 20120706-readablecode

整形するdef count_word_in_html_files word_count = 0 Dir.glob("original/*.html").each do |html| doc = Nokogiri.HTML open(html) doc.search("//code[@class='literal]").remove text = doc.css("body").text word_count = text.split.size end return word_countend

42/58

Page 43: 20120706-readablecode

説明とコードを可逆可逆にあまり⼤きなリファクタリングはしない

読む側の少し上少し上を⾏くのはよいが、ああまり複雑すぎると、相⼿にされなくなってまり複雑すぎると、相⼿にされなくなってしまうしまう。

『実装パターン』Kent�Beck

43/58

Page 44: 20120706-readablecode

例:本体のないif⽂p.159

// 権限があるのは、以下の2つ// 1) 管理者// 2) ⽂書の所有者(⽂書がある場合)// その他は、権限がない。

44/58

Page 45: 20120706-readablecode

例:本体のないif⽂p.159

// 権限を確認するif (is_admin_request()) { // 1) 管理者は権限あり} else if (...) { // 2) ⽂書の所有者は権限あり(⽂書がある場合)} else { // その他は、権限がない。 return not_authorized();}

45/58

Page 46: 20120706-readablecode

⾃分の⾃分の思いを込める前にその分野ですでにどんなことが解明さ

れているかを調べてみなければならない。さもないと、優れた⼿法がすでに存在す優れた⼿法がすでに存在するるのに、⾃⼰流の下⼿なやり⽅⾃⼰流の下⼿なやり⽅を考案するのに時間を無駄にするはめになるからだ。

『プログラミング作法』Brian�Kernighan,�Rob�Pike

46/58

Page 47: 20120706-readablecode

例えば、どういうふうに?

47/58

Page 48: 20120706-readablecode

13章�短いコードを書く13章�短いコードを書く

48/58

Page 49: 20120706-readablecode

APIをぜんぶ読むp.172

yuguiyugui:�Javaを覚えるとき『プログラミング⾔語Java』を読んで、それからリファリファレンスマニュアルを頭から全部読みましレンスマニュアルを頭から全部読みましたた。

http://www.atmarkit.co.jp/news/200907/24/ruby2.html

49/58

Page 50: 20120706-readablecode

不要な要求を削除するp.168

DO�or�DO�NOT.�There�is�no�TRY.やるか、やらぬかじゃ。試しなどいらん試しなどいらん。

ヨーダの⾔葉(『Clean�Coder』Robert�C.�Martin)

50/58

Page 51: 20120706-readablecode

[余談余談]試しにやってみる「試しにやってみる」は前向きな感じ

がする。でも、それで何か「できた」のであれば、それまで⼒を温存していたことになる。

『Clean�Coder』Robert�C.�Martin

51/58

Page 52: 20120706-readablecode

あれ?だんだん

コードの話から離れてきた

52/58

Page 53: 20120706-readablecode

名著を読もう!p.218

53/58

Page 54: 20120706-readablecode

リーダブルコードもよろしくお願いします。

54/58

Page 55: 20120706-readablecode

ぼくのかんがえたぼくのかんがえたさいきょうのさいきょうの

リーダブルコードリーダブルコード

55/58

Page 56: 20120706-readablecode

やり⽅やり⽅1.� みんなでコードについて話し合う2.� 須藤先⽣の「ぼくならこう書く」3.� 質疑応答

※これを3ラウンド繰り返します。※これを3ラウンド繰り返します。

56/58

Page 57: 20120706-readablecode

お題お題0. github.com/dproject21/yaruo_tdd_triangle1. github.com/mataki/fast_spork_runner2. github.com/randym/axlsx3. github.com/todesking/okura

※「0」のお題でやり⽅を説明します。※「0」のお題でやり⽅を説明します。

57/58

Page 58: 20120706-readablecode

ENJOY!!

58/58