ソースコード リーディング ワークショップ 2010に参加する

1/30(土)、キャンパスイノベーションセンタ 東京で開催された「ソースコード リーディング ワークショップ 2010」に参加してきた。

「ソースコードを読む力を鍛えよう」というテーマのもと、講演・ハンズオン・パネルディスカッションと盛りだくさんの内容。土曜の午後をJava読んで過ごす、というなかなかハードコアなイベントだった。

ちゃんと公式twitterアカウント(@src_ws)もハッシュタグ(#scr_ws2010)も準備されていたのだが、あまり会場からつぶやいている人はいなかった。私は自重せずtsudaり通したので、今回のレポートはそのlogを流用してしまおう。

文中敬称略にて失礼します。

13:04:09
ソースコード リーディング ワークショップ 2010 はじまります。イーモバつながったよかった。 http://bit.ly/cRRZ79 #scr_ws2010

講演

ワークショップ主旨説明

森崎 修司(奈良先端科学技術大学院大学)

13:06:37
「IBMさんから飲み物のプレゼントがあります。飲み物というとアルコールのようなイメージがありますが、ミネラルウォーターです。」w #scr_ws2010
13:13:52
「目的:開発者と研究者のエコシステムを作る。スウェーデン・ドイツでは一部で互助機能ができつつある。」 #scr_ws2010
講演「ソースコード理解と勉強会」

よしおか ひろたか氏(楽天 / カーネル読書会主宰)

13:14:44
「ソースコード理解と勉強会」よしおかさんキター! #scr_ws2010
13:18:50
「プログラマに必要なチカラ => ソース読む、デバッグ、テスト。学校では教えてくれない。現場でいきなり救命胴衣なしで荒海に放り出される。」 #scr_ws2010
13:27:08
「プログラムは思ったとおり動かない、書いたとおり動く→(コードリーディングは)コードからプログラマの意図を推定する作業」 #scr_ws2010
13:27:53
「コードはHOW、テストはWHAT、ドキュメントはWHY」 #scr_ws2010
13:31:15
「勉強会は有益な議論の場。IT勉強会カレンダーで検索。なければ勉強会を作る。」 #scr_ws2010
13:34:29
「モットー:コードは読むな、理解しろ〜」 #scr_ws2010
13:40:29
「ドキュメントを書く暇があったらテストを書け。テストとコードは1:1。テストのないコードは不完全。」 #scr_ws2010
13:44:31
Q:LLのデバッグは? A:よくわからない。「print文を入れる…」という話を聞くが、もう少し機械力を活用するべきでは。 #scr_ws2010
13:44:42
Q:作り直したい衝動とどう戦う? A:テストを書くと心が落ち着く。 #scr_ws2010
13:47:20
よしおかさんのお話 done。資料はのちほどslideshareあたりに上がるそうです。 #scr_ws2010
ハンズオン
概説
13:48:19
「ハンズオンの内容は一部2/19(デブサミ)までナイショにしてください(バイアスかかっちゃうから) => それ以降はどんどん喋ってください」 #scr_ws2010
13:52:39
会場の雰囲気とか。年齢層は広め。ドタキャン多かったっぽい。思ったより女性が多くてびっくり。ノートPC率が低い。電源は壁際に結構ふんだんにある。イーモバは快調。 #scr_ws2010
実施中
14:02:04
読み始めますよ。事前に読みかけてあわててやめたので、ほぼ初見の状態です。 #scr_ws2010
14:20:01
紙をめくる音しか聞こえません。みんな真剣そのもの。真剣すぎじゃね?www #scr_ws2010
14:43:26
ついリファクタの余地がある部分に目が行ってしまうなど。このswtich – caseはイケてないよな…とかw 本質はそこじゃないぞ。 #scr_ws2010
15:34:33
今日のワークショップに近い内容を2/19(金)の朝からデブサミ2010で行うそうです。興味のある方はぜひ。すげーためになると思うよ! #scr_ws2010
15:34:43
…やばやば時間足りない>< #scr_ws2010
グループディスカッション
16:55:20
グループディスカッションdone。なかなか実のあるお話ができた!続いてIBM細川さんの講演。 #scr_ws2010

講演

講演「レビュー専門家がこっそり教えるコード・リーディング・テクニック鉄則集」

細川 宣啓 氏(日本IBM)

16:57:04
「私、怒ってます。すごいハッカーを集めて、練りに練った題材で、しかも無料。なんでこれだけしか人が集まってないんでしょう?」www #scr_ws2010
16:59:02
「お題のコードは15分で全部読めた。ゼロ除算で落ちるところまで見つけた。なんでこんなに速く読めるか?そのテクニックを紹介します。」 #scr_ws2010
16:59:20
「twitter殺しの速度でやります」 #scr_ws2010
17:01:08
「人間は速く読もうとするとおかしいところを補正しながら読んでしまう」 #scr_ws2010
17:06:18
「書き手によってCOBOL風 / C風 / Java風のバグが混入する」 #scr_ws2010
17:08:07
「コメント率98%、行数1,500行 => 水増しを疑う」外注の世界は怖いなぁ… #scr_ws2010
17:09:53
「ソースをwordに貼る→ズームアウト。黒っぽいところ(=重い)、右に凹んだところ(=ネストが深い)などを注視。」 #scr_ws2010
17:11:01
「秀丸、ちゃんとカネ払ってくださいねw」 #scr_ws2010
17:13:10
「コードからタブを除去し、行単位でソートする。コメント部分を見る => コピペしやがったな!」 #scr_ws2010
17:15:54
「試験性を考慮してない仕様書をコメントとしてソースに貼り付け、そこにコーディングしたソースから分岐の網羅漏れが見えてくる」 #scr_ws2010
17:18:21
「処理を完全に分断してコード部分を眺めることで異常に気づく。ゼロ除算のケアしてるか?変数名が連続してないぞ?」 #scr_ws2010
17:19:16
「コメント(日本語)の表記揺れから後付けの修正箇所が浮かび上がってくる」 #scr_ws2010
17:21:22
「変数名に左右(LR)の要素を使わない方がいい。右利き / 左利きで始点がどっちか変わってくる」=>「気づかないうちに自分の主体性を盛り込んでしまう」 #scr_ws2010
17:22:10
コードをソートするってのはすごい手法だなー。今度やってみよう。 #scr_ws2010
17:23:26
「ソートしたコードの気になる行にマークをつける (行頭に++とか) => ソートを戻して検証」 #scr_ws2010
17:25:17
「コメントの句読点の入り方が全然違う。二人で書いたか、ひとりで書いたなら時間・場所などが決定的に違うはずだ」=>あたり=>SUGEEE!コードからプロファイリング。 #scr_ws2010
17:27:24
@furuhouse ソースコードをまるっと秀丸の「行ソート」とかしちゃって、似たような処理の部分、似たようなコメントで揺れてる部分を読むとか、怪しげなところにアタリをつけるとか、そういう手法のお話でした。 #scr_ws2010
( => @furuhouse )
17:28:11
なんかすごいお話だった。引き続きIBM Rationalのお話→パネルディスカッション。 #scr_ws2010
17:28:58
「お題のコードをRationalのアナライザにかけると3,300か所の指摘がある」強力すぎる>< #scr_ws2010

パネルディスカッション

パネルディスカッション「私ならこう読む」明日に活かすソースコード読解の戦略
モデレータ:
  • 新野 淳一氏 (Publickey)
パネリスト: (50音順)
  • 戸島 義徳 氏 (サン・マイクロシステムズ)
  • ひが やすを 氏 (電通国際情報サービス)
  • 細川 宣啓 氏 (日本IBM)
  • 森崎 修司 (奈良先端科学技術大学院大学)
  • よしおか ひろたか氏 (楽天、カーネル読書会主宰)
17:32:14
パネルディスカッション。以降敬称略で失礼します。 #scr_ws2010
17:32:22
ひが「コミッタが書いたコードを直接見ない。テストコードを見る」 #scr_ws2010
17:36:21
アジェンダ:リーディング / レビューのときどんなツール使ってる?コツや裏技は? #scr_ws2010
17:37:48
よしおか:emacs + gdb-mode,cscope on ubuntu。emacsはほとんど素のまま。 #scr_ws2010
17:39:50
ひが:eclipse。ctrl + clickでのジャンプ・リターンを多用。インストールが面倒なのでプラグインはほとんど使わない(svnくらい)。 #scr_ws2010
17:40:41
ひが:前は紙でレビューしてたけど、最近はプロジェクタにeclipseを投影して、とかやってる。 #scr_ws2010
17:43:41
戸島:cscope,vim,lxr。cscopeで概要を掴む。GUIのツールよりターミナルの方がレスポンスがいい。emacs非推奨の環境での仕事があったのでviに乗り換えた。ターミナルの方が集中できる。 #scr_ws2010
17:44:42
戸島:lxrで生成したクロスリファレンスをFirefox + vimperatorで読む。ターミナルっぽく読める。 #scr_ws2010
17:45:04
戸島:「時々NetBeansも使います」www
#scr_ws2010
17:46:30
細川:1,500本のソースコードとか読むので、印刷物を目で見る方が速い。メモ帳とボールペン。プリントアウトを壁一面に貼ったり、電車の中でデバッグしたり。紙の利点を活かしてる。 #scr_ws2010
17:53:02
森崎:今回の調査の意義とか傾向とか。ネタバレなので略。 #scr_ws2010
17:53:27
読むときのコツ・テクニック・裏技などは? #scr_ws2010
17:54:09
よしおか:「動かしながら読む、というパターンが多い。注目しているところにブレークポインタを置き、その周辺を読んで行く。」 #scr_ws2010
17:55:37
よしおか:「仮説を立て、gdbで検証していく。GUIアプリケーションではないので、単純に入力と出力が期待通りかどうかを調べて行く。期待に反した部分にバグがあるのでさらに調査する。」 #scr_ws2010
17:57:35
ひが:「デバッグの回数とか時間とか、どのぐらい?」よしおか:「問題の再現に一番時間がかかる、という印象」 #scr_ws2010
17:58:01
ひが:「人の書いたコードは読みたくない。疲れるから」w #scr_ws2010
17:59:34
ひが:「勉強のためにJBossなど読んだ。技術について知りたいときは、優れたプロダクトのソースコードを読むのが一番勉強になる。他人のソースコードをデバッグのために読むなんてことはやりたくない。」 #scr_ws2010
18:01:03
ひが:「ひとつのテストメソッドにたくさんケースが書いてあるよりは、テストメソッド名と中身がコンパクトに対応する方が意図を知るという意味でいいテストコードだと思う」 #scr_ws2010
18:01:46
よしおか:「定番の教科書がないからソースを読んでるんですか?」ひが:「年に2冊ぐらいしか技術書読まない。やはり一番の教材はソースコード。」 #scr_ws2010
18:03:53
戸島:「自分の中にイメージができるまで読む。ツールの力を借りて大きな構成を掴む。フローやスレッド・ロックなどの図を自分で手で書いてイメージを作る。」 #scr_ws2010
18:06:24
新野:「まだテクニックありますよね?」細川:「じゃマシン使わないヤツを。集中力が重要。コードの品質で大事故が起きたりするので、コンセントレーションのコントロールは意識している。」 #scr_ws2010
18:07:25
細川:「マインドマップ的にキーワードを残して行く。if多すぎ、変数多すぎ、など。その結果ソースコードの印象が掴める。」 #scr_ws2010
18:08:02
細川:「メモリマップを頭に描きながら読む。だから変数が多いコードは読みにくいのでは。」 #scr_ws2010
18:09:36
森崎:「コードや文章など読むときは、まず仮説を構築する。仮説の範囲以外考えないようにする。仮説が立てられるぐらいに俯瞰するのが重要。」 #scr_ws2010
18:10:42
よしおか:「集中力を持続させるコツは?」細川:「前日ちゃんと寝ることですw 半分ジョークですが、体調管理には気をつけてる。スプリントは長続きしないので、打ち切る勇気も重要。」 #scr_ws2010
18:11:54
よしおか:「どんなものをレビューしてますか?」細川:「品質がまずいと人が死んだりお金がまずいことになったりするプロダクト。どこでも仕事できる、という意味でメモ帳+ボールペン最強。」 #scr_ws2010
18:13:22
ひが:「長時間働くとよく働いた気分になって、翌日の生産性が下がったり。一日の仕事量を平均することで生産性を維持する。集中し続けるのは難しいので、コード+テストでサイクルを作り、短い集中力でせいかを出せるように。」 #scr_ws2010
18:15:42
細川:「戸島さん、神をどうやって降臨させますか?」www #scr_ws2010
18:17:50
細川:「トラブルシューター冥利ってありますか?」戸島:「4〜5人で競争。一番に見つけるととても嬉しい。」 #scr_ws2010
18:18:38
これよりQ&A。 #scr_ws2010
18:19:53
Q:「レビューなどについておすすめの本は?」細川:「レビューについての本は全部読んだけど、全て方法の話。何を見つけるか?という資料がない。レビュー標準を森崎先生と作るよ!」 #scr_ws2010
18:21:21
細川:「レビューのコツ:1回で済まそうとしない。重大なものなどテーマを決めてこまめに行う。組織が出しやすいバグを把握するのも大事。」 #scr_ws2010
18:23:00
森崎:「メンバーに得意な箇所を割り振るとスムーズに進み、縄張り争いなども起きにくい。」 #scr_ws2010
18:25:11
Q:「プログラムの全貌を見るのに効率的な手段は?」よしおか:「ブラックボックステスト。規模を把握する、ディレクトリ構成を見るなど。OSSに関してはいつもの作業が決まってる(README読むとか)。」 #scr_ws2010
18:26:46
細川:「コメントを見ず、最初の2〜3メソッドでこのクラスは何をしたいか?を抽象化して頭に描く。細部はそれから。」 #scr_ws2010
18:27:43
戸島:「理解したポイントを自分なりの方法で形に残す(UMLでも、オリジナルでも)。その理解が正しいかどうかを反復時て検証し、理解を深めていく。」 #scr_ws2010
18:28:15
細川:「コードと仕様書を行ったり来たりの独りリバースエンジニアリングも有効。」 #scr_ws2010
18:28:54
Q:「びっくりしたソース?少なくともこれだけは書いてほしい、ということ?」 #scr_ws2010
18:29:56
よしおか:「日本以外のエンコーディング変換のソースには衝撃を受けた。文字コードをリテラルで直書きとか、大変だな。近づきたくないな。というサプライズが。」 #scr_ws2010
18:31:28
戸島:「変数名も関数名も全部a,b,cとかなのに、組織でのメインに採用が決まっていた。コーディング規約大事。」 #scr_ws2010
18:32:17
森崎:「頼りにしてたOSSの中核に to be incremented… って書いてあった」www #scr_ws2010
18:34:28
ひが:「いい方にびっくりした。google juiceのコード。読んでみるべき。」 #scr_ws2010
18:35:41
細川:「perlの商用コード。AAのハートになってた。インデントを整えたらとても綺麗なコードだったけど、体育館裏に呼び出してシメた」(一部誇張ありw) #scr_ws2010
18:36:23
さいごにパネラーからひとこと。 #scr_ws2010
18:37:30
よしおか:「わたし自身も勉強になりました。レビュー標準も期待大だけど、それ以外のベストプラクティスをどんどん発表して共有しましょう。こういう機会を持ち続けたいですね。」 #scr_ws2010
18:39:40
ひが:「いいコードを書くにはいいコードを読むのが重要。無から有は生まれない。悪いコードを少し読むといいコードのよさがわかったりするので無駄ではない。そしてたくさんアウトプットしましょう。書いたものは晒しましょう。OSSは挑戦しがいがある。」 #scr_ws2010
18:41:14
戸島:「いろんなコードを読んで理解することで大きな学びが。これだけのソースコードがどんどん手に入る時代なので。どんどん読みましょう。」 #scr_ws2010
18:43:03
細川:「インとアウト大事。入れるだけなら知識、出さないと技術ではない。出してるうちに善悪の判断がつくようになる。書くことで覚えるのが日本的。読むことは基礎体力、つけないと国際競争に負ける。継続しましょう。」 #scr_ws2010
18:44:01
森崎:「デブサミ版もよろしくね!twitterのオフィシャルアカウントもあります!」 #scr_ws2010
18:44:21
以上です!長々と実況失礼しました>< #scr_ws2010
22:11:08
あ、書き忘れてたけど勇気が出るひとこと。細川:「日本は品質の国。」 #scr_ws2010

感想

  • 実際のリーディングの内容は「デブサミ2010」まで伏せて欲しい、とのことだったのでナイショ。
  • その「デブサミ2010」でも近い内容のワークショップが行われる。大変ためになるので、ぜひ参加をお勧めする。
  • 今回は「動かさずに読む」という方式だったので、個人的にはなかなかキツかった。しかし、IBM 細川氏は「紙で読んでバグを探すのが仕事」とのこと。「プログラミングの知識」もずいぶん幅広いんだなーと再認識した。そして、自分の読解力にはかなりがっかりした…。
  • よしおかさんの「コードはHOW、テストはWHAT、ドキュメントはWHY」はホントに名言。そして、つぶやいたらものすごい数のRTがついてびっくりした。ござ先輩ありがとうございます!
  • IBM 細川氏は不勉強なことにこの日まで存じ上げなかったのだが、そのトークとリーディングのテクニックには圧倒された。いい勉強をさせていただいたことに感謝したい。
  • パネルディスカッションはものすごく豪華なメンツ。そして、豪華なだけじゃなくて組み合わせの妙もあったように思う。いいもの見せていただいた。
  • 「研究者と開発者のエコシステム」、ぜひ実現して欲しいと思う。まずはこのワークショップの第2回を期待したい。

Source Code Reading Workshop Japan 2010

http://se.naist.jp/events/srw2010.html

ソースコードリーディングワークショップ (src_ws) on Twitter

http://twitter.com/src_ws

ソースコードリーディングワークショップ2010に行ってきた。 | 2010-01-31 – 未来のいつか/hyoshiokの日記

http://d.hatena.ne.jp/hyoshiok/20100131#p1

すぐに使えるソースコードの読み方を指南 − @IT

http://www.atmarkit.co.jp/news/201002/02/code.html

ソースコード、読んでいますか – 記者の眼:ITpro

http://itpro.nikkeibp.co.jp/article/Watcher/20100202/344062/

ソースコード・リーディング・ワークショップ in デブサミ2010

http://www.seshop.com/event/dev/2010/timetable/Default.asp?mode=detail&eid=145&sid=836&tr=09%5F%83%8F%81%5B%83N%83V%83%87%83b%83v#836