#jjug_ccc #ccc_m71
古のJavaを使うということ#ccc_m71JJUC CCC 2016 Spring ぜろゆ
View Slide
#ccc_m71目次* 自分について - これは誰ですか?* 出会い - これはJavaですか?* コメント - これは消せますか?* テスト - これは直せますか?* 周りに広める - これは使えますか?* 古のJava - これは変えられますか?
#ccc_m71自分について - これは誰ですか?* ぜろゆ* 文系出身・プログラミング(ほぼ)未経験で就職* 社会人3年目* Twitter:@zer0_u
#ccc_m71出会い - これはJavaですか?* Javaで「Hello,World!」できる程度で入社 「Java完全にマスターした」* 研修で「動くものをつくる」魅力にはまる → 自分でもコードを書くように* よりよいものを作るために勉強&写経 * JUnit実践入門 * リーダブルコード などなど
#ccc_m71出会い - これはJavaですか?* 配属!* 知ってるコードを書くとコンパイルエラーが出る → (o・д・)???* どうやらJavaにはバージョンというものがあるらしい* じゃあ、この現場で使ってるJavaは?
#ccc_m71出会い - これはJavaですか?>>> J2SE1.4 の気配を察知 <<<
#ccc_m71J2SE1.4 - これはバージョンアップできますか?* 諸般の事情によりバージョンアップ不可* この現場にいる限り逃げられない↓ このときのぜろゆ(o・д・) 。○(とはいえ書けるものが少ないだけでしょ?)
#ccc_m71出会い - これはJavaですか?↓ いまのぜろゆ(o・д・) 。○(そう簡単な話でもなかったんだよなぁ)
#ccc_m71コメント - これは消せますか?* 業務 - 保守(不具合修正)が9割 * 自分がゼロからコードを書くことはまずない * 誰かの書いたコードを読んで修正・追加がメイン* 状況 * バージョン管理あり * コードレビューあり
#ccc_m71
#ccc_m71コメント - これは消せますか?(o・д・)「うわぁ、コメントアウトめっちゃいっぱいある」(o・д・)「バージョン管理してるし消しちゃえ」(o・д・)「小手先で直すとコード汚くなるな...」.....(o・д・)「できた! コードレビューお願いします!」
#ccc_m71コメント - これは消せますか?(*‘∀‘)「ここ何で消したの?」(o・д・)「え? コメントアウト邪魔じゃないですか?」(*‘∀‘)「修正範囲は最低限だって言ったよね?」
#ccc_m71コメント - これは消せますか?* 用語「修正範囲」 * 限りなく狭いほうがよいとされているもの * 同じ問題を解決できる複数の手法がある場合、 修正されるコードの行数が少ないほうが良い
#ccc_m71コメント - これは消せますか?* 用語「修正範囲」 * 限りなく狭いほうがよいとされているもの * 同じ問題を解決できる複数の手法がある場合、 修正されるコードの行数が少ないほうが良い * 特に既存の部分を(コメントも含め)削除することは できる限り避けるべきである
#ccc_m71コメント - これは消せますか?(o・д・) (とはいえこれ半端に手を入れても意味なさそうだが)(o・д・)「わかりました、やりなおします」(o・д・) (どうする?)
#ccc_m71コメント - これは消せますか?(o・д・) (どうする?) 1. 先輩のいうことを受け入れる 2. 強行突破する(同じ主張を繰り返して折れるのを待つ) 3. 何か素敵な策を思いつく
#ccc_m71コメント - これは消せますか?(o・д・) (・・・!)(o・д・) (修正範囲を妥当に見せかければあるいは)・・・(o・д・)「できました!もう一度レビューお願いします!」
#ccc_m71コメント - これは消せますか?* ここで取った作戦 * 「できる限り不具合を酷く見せる」 * 史上最悪の不具合に見せかけるためにひたすら 発生条件を増やし続けて1週間 * 修正しても致し方ないと思える範囲を広げれば コメントアウトの削除も許されるはず…! * 一部コメントアウトの削除はあきらめる→ コメントアウト部分の削減に成功!
#ccc_m71コメント - これは消せますか? (まとめ)* 最善のコードを書くためには被害状況を盛ることも大事* コメントアウト一つといえど舐めてかかってはならない* 現状のコードにはそれなりの理由があって成り立っている ことがわかった* とはいえJavaDoc形式でコメントアウトするのはやめろ* Javaっぽい話はこの次から →
#ccc_m71テスト - これは直せますか?* 業務 * 誰かの書いたコードを読んで修正・追加がメイン* 状況 * バージョン管理あり * コードレビューあり * テストコードなし * 仕様ほぼなし (都度ベストな対応を考える)
#ccc_m71テスト - これは直せますか?* 用語「動作確認・保証」 * 画面上で操作を行い、不具合が修正されているか・ 別の不具合が起きていないか・過去に修正した 不具合が再発していないかを確認すること* 開発者でも同じように動作確認・保証を行う
#ccc_m71テスト - これは直せますか?(o・д・)「画面ぽちぽちするの面倒」(o・д・)「JUnitとかいうのあるんでしょ?」(o・д・)「テストコードが大事って知ってるもん」(o・д・)「テストファースト!」
#ccc_m71テスト - これは直せますか?プライバシーに配慮して一部に目隠しを施しています
#ccc_m71テスト - これは直せますか?_人人人人_> ない < ̄Y^Y^Y ̄
#ccc_m71テスト - これは直せますか?(o;・д・)「な、なければ書けばいいんだよ」
#ccc_m71テスト - これは直せますか?_人人人人人人人人_> 突然のJ2SE1.4 < ̄Y^Y^Y^Y^Y^Y^Y ̄
#ccc_m71テスト - これは直せますか?* JUnit (基礎知識) * 現在の主流はJUnit4 * アノテーションを使って簡易に記述できることが特長* アノテーションが利用できるのはJ2SE1.5から
#ccc_m71テスト - これは直せますか?_人人人人人人人人_> しかしJ2SE1.4 < ̄Y^Y^Y^Y^Y^Y^Y ̄
#ccc_m71テスト - これは直せますか?(o;д;)「今からJUnit3勉強しても間に合わない...」(o;д;)「関連オブジェクト多くてテストできない...」
#ccc_m71テスト - これは直せますか?(o・д・)「...!」
#ccc_m71テスト - これは直せますか?(o・д・)「テストしたいコード部分は1クラスのみ」(o・д・)「確かCSVファイルをDBっぽく使えるものがある」(o・д・)「この部分だけ抽出してテストを書けないか?」
#ccc_m71テスト - これは直せますか?* 書けたhttp://bit.ly/1srLofN
#ccc_m71テスト - これは直せますか?* やったこと(概要) * JDK8が有効になっているeclipseを別で用意 * DBUnit+MySQLでDB接続を再現 * テスト対象コードは本番に載せるものをほぼコピー (o・д・)「後方互換バンザイ」
#ccc_m71テスト - これは直せますか?* 周囲への説明 (o・д・)「これがあれば開発者の画面テストがほぼ不要」 (*‘∀‘)「ほんとに?デグレ起こさない?」 (o・д・)「これが(修正前)→こうだったのが(赤) →こうして(修正後)→こうじゃ(緑)」 (*‘∀‘)「まぁ最初のテストとしてはよさそうだね...」 (o・д・) (お、まずまずの感触)
#ccc_m71テスト - これは直せますか?* 結果 * 当該不具合についてはテストコードで修正の妥当性を 確認できるようになった * 周囲にJUnitの存在と有用性を少しアピールできた * 継続して実行する基盤を作る前に異動...
#ccc_m71テスト - これは直せますか?(まとめ)* 「テストが大事」という金科玉条にこだわると進めない* できる範囲のことで全力を尽くす * JDK8が有効な開発環境を用意する * 自分が触るコードだけでもテストを書く* 疑う人には実演が効果的 * 画面ぽちぽちにかかる時間を計っておくとなおよし
#ccc_m71ここまでのまとめ - これはJavaですか?(o・д・)「少しずつコードも読みやすくなってきた」(o・д・)「(自分のところだけとはいえ)テストコードも書いて デグレが起きづらくなってきた」(o・д・)「この取り組みを広めたら製品はよりよくなるはず」
#ccc_m71ここまでのまとめ - これはJavaですか?_人人人人人人人人人人人人人人_> そううまくいくわけがない < Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y
#ccc_m71周りに広める - これは使えますか?* ここまででわかったこと * 製品をよりよくするためにはコードの改善も必要 * 不要なコメントアウトの削除 * テストコードの追加 など * 一部ではなく全体的な改善が製品の品質向上に 役立つはず * とはいえいちいち前提を説明して回るのは面倒
#ccc_m71周りに広める - これは使えますか?(o・д・)「これをほかの人にも広めたい」(o・д・)「ちょうどいい機会(略)あるし伝えてみようか」・・・(o・д・)「ということで、一気にとはいわずとも少しずつ 改善していくと全体の効率が云々」
#ccc_m71周りに広める - これは使えますか?(´ー`)「それ、お客様の業務にとっては どんなメリットがあるの?」(o・д・)「直接は関係ありませんが、何か不具合が見つかった 際に修正する効率が上がります」(´ー`)「それ別にコードを書かなくても達成できるよね?」
#ccc_m71周りに広める - これは使えますか?(o・д・) (そうだけどさぁ)(o・д・)「コードを書く手間はありますが 自動で確認できる以上は活用しない手はないかと」(´ー`)「動作確認は最悪外部の人に依頼できるし、 開発者は不具合修正に集中してほしい」
#ccc_m71周りに広める - これは使えますか?(o・д・) (そういう)(o・д・) (話じゃ)(o・д・) (ないんだ)(o・д・) (YO!!!!!!!)(o・д・) (とはいっても通じないんだろうなぁ)(o・д・)「はい、わかりました」
#ccc_m71周りに広める - これは使えますか?(o・д・)「自分1人だと効果アピールが弱いのかな」(o・д・)「仲間を増やして全体が効率化していることを 示せばさすがに認められるはず」
#ccc_m71周りに広める - これは使えますか?* また別の日(o・д・)「こうすると開発が早くなるんだよー」('ω') 「でもこれ書けるようになるまで時間かかるでしょ」(o・д・)「そんなにかからんよ、普段書いてるコードと ほとんど同じだし」('ω') 「であれば目視確認のが早いんじゃない?慣れてるし... それにテストコードが間違ってたらどうするの?」(o・д・) (Oh...)
#ccc_m71周りに広める - これは使えますか?(o・д・)「もういいや...自分のとこだけがんばろ」
#ccc_m71周りに広める - これは使えますか?(まとめ)* コードを書いて品質を向上させるという考え方は 意外と少数派* まずは自分の行動で範を示すしかない (その前に異動したけど)* 仲間を増やすにはわかりやすい実績が大事かもしれない
#ccc_m71古のJava - これは変えられますか?* 古いJavaのままでも「製品として成立させる」ことは可能 * セキュリティの話は省略* Javaを使っている製品のライフサイクルなども考慮して バージョンについて話す必要がある * サポートが切れそうな製品のJavaを無理に上げる 必要があるか?
#ccc_m71古のJava - これは変えられますか?* 開発者個人として古のJavaに出会ったときに打てる手(1) * 現行のJDKベースの開発環境を確保 * 製品に必須ではない部分(テストコード等)は 現行のJDKベースで書く * 必須でないところは最低限の手間で書く * IDEの設定でコメント部はできる限り薄い色にする * 見えなければどうということはない * だからJavaDoc形式でコメントアウトはやめろと
#ccc_m71古のJava - これは変えられますか?* 開発者個人として古のJavaに出会ったときに打てる手(2) * 実績を積む * 自分が手を入れた部分でデグレを起こさない * 修正にかかるコスト(工数)の可視化
#ccc_m71古のJava - これは変えられますか?* 開発者個人として古のJavaに出会ったときに打てる手(3) * 最善を学び続ける * 取るべき手段をできるだけ増やす * そのまま適用できるケースはないが 状況の中で最善を尽くすには最善を知るしかない
#ccc_m71古のJava - これは変えられますか?(まとめ)* 正しい製品を正しく作るために * 今まで作り上げたものを直視する * コメントアウトにも相応の事情がある * コードを使って品質を向上させる手段があることを示す * まずは自分のところからテストを書く * 仕様はテストコードで示す勢い * 最善を学び続ける
Thank You!#ccc_m71