$30 off During Our Annual Pro Sale. View Details »

古のJavaを使うということ / JJUC CCC 2016 Spring

古のJavaを使うということ / JJUC CCC 2016 Spring

#jjug_ccc #ccc_m71

zer0-u

May 21, 2016
Tweet

More Decks by zer0-u

Other Decks in Programming

Transcript

  1. 古のJavaを使うということ
    #ccc_m71
    JJUC CCC 2016 Spring ぜろゆ

    View Slide

  2. #ccc_m71
    目次
    * 自分について - これは誰ですか?
    * 出会い - これはJavaですか?
    * コメント - これは消せますか?
    * テスト - これは直せますか?
    * 周りに広める - これは使えますか?
    * 古のJava - これは変えられますか?

    View Slide

  3. #ccc_m71
    自分について - これは誰ですか?
    * ぜろゆ
    * 文系出身・プログラミング(ほぼ)未経験で就職
    * 社会人3年目
    * Twitter:@zer0_u

    View Slide

  4. #ccc_m71
    出会い - これはJavaですか?
    * Javaで「Hello,World!」できる程度で入社
      「Java完全にマスターした」
    * 研修で「動くものをつくる」魅力にはまる
     → 自分でもコードを書くように
    * よりよいものを作るために勉強&写経
     * JUnit実践入門
     * リーダブルコード などなど

    View Slide

  5. #ccc_m71
    出会い - これはJavaですか?
    * 配属!
    * 知ってるコードを書くとコンパイルエラーが出る
     → (o・д・)???
    * どうやらJavaにはバージョンというものがあるらしい
    * じゃあ、この現場で使ってるJavaは?

    View Slide

  6. #ccc_m71
    出会い - これはJavaですか?
    >>> J2SE1.4 の気配を察知 <<<

    View Slide

  7. #ccc_m71
    J2SE1.4 - これはバージョンアップできますか?
    * 諸般の事情によりバージョンアップ不可
    * この現場にいる限り逃げられない
    ↓ このときのぜろゆ
    (o・д・) 。○(とはいえ書けるものが少ないだけでしょ?)

    View Slide

  8. #ccc_m71
    出会い - これはJavaですか?
    ↓ いまのぜろゆ
    (o・д・) 。○(そう簡単な話でもなかったんだよなぁ)

    View Slide

  9. #ccc_m71
    コメント - これは消せますか?
    * 業務 - 保守(不具合修正)が9割
     * 自分がゼロからコードを書くことはまずない
     * 誰かの書いたコードを読んで修正・追加がメイン
    * 状況
     * バージョン管理あり
     * コードレビューあり

    View Slide

  10. #ccc_m71

    View Slide

  11. #ccc_m71
    コメント - これは消せますか?
    (o・д・)「うわぁ、コメントアウトめっちゃいっぱいある」
    (o・д・)「バージョン管理してるし消しちゃえ」
    (o・д・)「小手先で直すとコード汚くなるな...」
    .....
    (o・д・)「できた! コードレビューお願いします!」

    View Slide

  12. #ccc_m71
    コメント - これは消せますか?
    (*‘∀‘)「ここ何で消したの?」
    (o・д・)「え? コメントアウト邪魔じゃないですか?」
    (*‘∀‘)「修正範囲は最低限だって言ったよね?」

    View Slide

  13. #ccc_m71
    コメント - これは消せますか?
    * 用語「修正範囲」
     * 限りなく狭いほうがよいとされているもの
     * 同じ問題を解決できる複数の手法がある場合、
      修正されるコードの行数が少ないほうが良い

    View Slide

  14. #ccc_m71
    コメント - これは消せますか?
    * 用語「修正範囲」
     * 限りなく狭いほうがよいとされているもの
     * 同じ問題を解決できる複数の手法がある場合、
      修正されるコードの行数が少ないほうが良い
     * 特に既存の部分を(コメントも含め)削除することは
      できる限り避けるべきである 

    View Slide

  15. #ccc_m71
    コメント - これは消せますか?
    (o・д・) (とはいえこれ半端に手を入れても意味なさそうだが)
    (o・д・)「わかりました、やりなおします」
    (o・д・) (どうする?)

    View Slide

  16. #ccc_m71
    コメント - これは消せますか?
    (o・д・) (どうする?)
     1. 先輩のいうことを受け入れる
     2. 強行突破する(同じ主張を繰り返して折れるのを待つ)
     3. 何か素敵な策を思いつく

    View Slide

  17. #ccc_m71
    コメント - これは消せますか?
    (o・д・) (・・・!)
    (o・д・) (修正範囲を妥当に見せかければあるいは)
    ・・・
    (o・д・)「できました!もう一度レビューお願いします!」

    View Slide

  18. #ccc_m71
    コメント - これは消せますか?
    * ここで取った作戦
     * 「できる限り不具合を酷く見せる」
      * 史上最悪の不具合に見せかけるためにひたすら
       発生条件を増やし続けて1週間
     * 修正しても致し方ないと思える範囲を広げれば
       コメントアウトの削除も許されるはず…!
     * 一部コメントアウトの削除はあきらめる
    → コメントアウト部分の削減に成功!

    View Slide

  19. #ccc_m71
    コメント - これは消せますか? (まとめ)
    * 最善のコードを書くためには被害状況を盛ることも大事
    * コメントアウト一つといえど舐めてかかってはならない
    * 現状のコードにはそれなりの理由があって成り立っている
     ことがわかった
    * とはいえJavaDoc形式でコメントアウトするのはやめろ
    * Javaっぽい話はこの次から →

    View Slide

  20. #ccc_m71
    テスト - これは直せますか?
    * 業務
     * 誰かの書いたコードを読んで修正・追加がメイン
    * 状況
     * バージョン管理あり
     * コードレビューあり
     * テストコードなし
     * 仕様ほぼなし (都度ベストな対応を考える)

    View Slide

  21. #ccc_m71
    テスト - これは直せますか?
    * 用語「動作確認・保証」
     * 画面上で操作を行い、不具合が修正されているか・
      別の不具合が起きていないか・過去に修正した
      不具合が再発していないかを確認すること
    * 開発者でも同じように動作確認・保証を行う

    View Slide

  22. #ccc_m71
    テスト - これは直せますか?
    (o・д・)「画面ぽちぽちするの面倒」
    (o・д・)「JUnitとかいうのあるんでしょ?」
    (o・д・)「テストコードが大事って知ってるもん」
    (o・д・)「テストファースト!」

    View Slide

  23. #ccc_m71
    テスト - これは直せますか?
    プライバシーに配慮して一部に目隠しを施しています

    View Slide

  24. #ccc_m71
    テスト - これは直せますか?
    _人人人人_
    > ない <
     ̄Y^Y^Y ̄

    View Slide

  25. #ccc_m71
    テスト - これは直せますか?
    (o;・д・)「な、なければ書けばいいんだよ」

    View Slide

  26. #ccc_m71
    テスト - これは直せますか?
    _人人人人人人人人_
    > 突然のJ2SE1.4 <
     ̄Y^Y^Y^Y^Y^Y^Y ̄

    View Slide

  27. #ccc_m71
    テスト - これは直せますか?
    * JUnit (基礎知識)
     * 現在の主流はJUnit4
     * アノテーションを使って簡易に記述できることが特長
    * アノテーションが利用できるのはJ2SE1.5から

    View Slide

  28. #ccc_m71
    テスト - これは直せますか?
    _人人人人人人人人_
    > しかしJ2SE1.4 <
     ̄Y^Y^Y^Y^Y^Y^Y ̄

    View Slide

  29. #ccc_m71
    テスト - これは直せますか?
    (o;д;)「今からJUnit3勉強しても間に合わない...」
    (o;д;)「関連オブジェクト多くてテストできない...」

    View Slide

  30. #ccc_m71
    テスト - これは直せますか?
    (o・д・)「...!」

    View Slide

  31. #ccc_m71
    テスト - これは直せますか?
    (o・д・)「テストしたいコード部分は1クラスのみ」
    (o・д・)「確かCSVファイルをDBっぽく使えるものがある」
    (o・д・)「この部分だけ抽出してテストを書けないか?」

    View Slide

  32. #ccc_m71
    テスト - これは直せますか?
    * 書けた
    http://bit.ly/1srLofN

    View Slide

  33. #ccc_m71
    テスト - これは直せますか?
    * やったこと(概要)
     * JDK8が有効になっているeclipseを別で用意
     * DBUnit+MySQLでDB接続を再現
     * テスト対象コードは本番に載せるものをほぼコピー
      (o・д・)「後方互換バンザイ」

    View Slide

  34. #ccc_m71
    テスト - これは直せますか?
    * 周囲への説明
     (o・д・)「これがあれば開発者の画面テストがほぼ不要」
     (*‘∀‘)「ほんとに?デグレ起こさない?」
     (o・д・)「これが(修正前)→こうだったのが(赤)
         →こうして(修正後)→こうじゃ(緑)」
     (*‘∀‘)「まぁ最初のテストとしてはよさそうだね...」
     (o・д・) (お、まずまずの感触)

    View Slide

  35. #ccc_m71
    テスト - これは直せますか?
    * 結果
     * 当該不具合についてはテストコードで修正の妥当性を
      確認できるようになった
     * 周囲にJUnitの存在と有用性を少しアピールできた
     * 継続して実行する基盤を作る前に異動...

    View Slide

  36. #ccc_m71
    テスト - これは直せますか?(まとめ)
    * 「テストが大事」という金科玉条にこだわると進めない
    * できる範囲のことで全力を尽くす
     * JDK8が有効な開発環境を用意する
     * 自分が触るコードだけでもテストを書く
    * 疑う人には実演が効果的
     * 画面ぽちぽちにかかる時間を計っておくとなおよし

    View Slide

  37. #ccc_m71
    ここまでのまとめ - これはJavaですか?
    (o・д・)「少しずつコードも読みやすくなってきた」
    (o・д・)「(自分のところだけとはいえ)テストコードも書いて
        デグレが起きづらくなってきた」
    (o・д・)「この取り組みを広めたら製品はよりよくなるはず」

    View Slide

  38. #ccc_m71
    ここまでのまとめ - これはJavaですか?
    _人人人人人人人人人人人人人人_
    > そううまくいくわけがない <
     Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y

    View Slide

  39. #ccc_m71
    周りに広める - これは使えますか?
    * ここまででわかったこと
     * 製品をよりよくするためにはコードの改善も必要
      * 不要なコメントアウトの削除
      * テストコードの追加 など
     * 一部ではなく全体的な改善が製品の品質向上に
      役立つはず
     * とはいえいちいち前提を説明して回るのは面倒

    View Slide

  40. #ccc_m71
    周りに広める - これは使えますか?
    (o・д・)「これをほかの人にも広めたい」
    (o・д・)「ちょうどいい機会(略)あるし伝えてみようか」
    ・・・
    (o・д・)「ということで、一気にとはいわずとも少しずつ
        改善していくと全体の効率が云々」

    View Slide

  41. #ccc_m71
    周りに広める - これは使えますか?
    (´ー`)「それ、お客様の業務にとっては
         どんなメリットがあるの?」
    (o・д・)「直接は関係ありませんが、何か不具合が見つかった
        際に修正する効率が上がります」
    (´ー`)「それ別にコードを書かなくても達成できるよね?」

    View Slide

  42. #ccc_m71
    周りに広める - これは使えますか?
    (o・д・) (そうだけどさぁ)
    (o・д・)「コードを書く手間はありますが
        自動で確認できる以上は活用しない手はないかと」
    (´ー`)「動作確認は最悪外部の人に依頼できるし、
         開発者は不具合修正に集中してほしい」

    View Slide

  43. #ccc_m71
    周りに広める - これは使えますか?
    (o・д・) (そういう)
    (o・д・) (話じゃ)
    (o・д・) (ないんだ)
    (o・д・) (YO!!!!!!!)
    (o・д・) (とはいっても通じないんだろうなぁ)
    (o・д・)「はい、わかりました」

    View Slide

  44. #ccc_m71
    周りに広める - これは使えますか?
    (o・д・)「自分1人だと効果アピールが弱いのかな」
    (o・д・)「仲間を増やして全体が効率化していることを
        示せばさすがに認められるはず」

    View Slide

  45. #ccc_m71
    周りに広める - これは使えますか?
    * また別の日
    (o・д・)「こうすると開発が早くなるんだよー」
    ('ω') 「でもこれ書けるようになるまで時間かかるでしょ」
    (o・д・)「そんなにかからんよ、普段書いてるコードと
        ほとんど同じだし」
    ('ω') 「であれば目視確認のが早いんじゃない?慣れてるし...
       それにテストコードが間違ってたらどうするの?」
    (o・д・) (Oh...)

    View Slide

  46. #ccc_m71
    周りに広める - これは使えますか?
    (o・д・)「もういいや...自分のとこだけがんばろ」

    View Slide

  47. #ccc_m71
    周りに広める - これは使えますか?(まとめ)
    * コードを書いて品質を向上させるという考え方は
     意外と少数派
    * まずは自分の行動で範を示すしかない
     (その前に異動したけど)
    * 仲間を増やすにはわかりやすい実績が大事かもしれない

    View Slide

  48. #ccc_m71
    古のJava - これは変えられますか?
    * 古いJavaのままでも「製品として成立させる」ことは可能
     * セキュリティの話は省略
    * Javaを使っている製品のライフサイクルなども考慮して
     バージョンについて話す必要がある
     * サポートが切れそうな製品のJavaを無理に上げる
      必要があるか?

    View Slide

  49. #ccc_m71
    古のJava - これは変えられますか?
    * 開発者個人として古のJavaに出会ったときに打てる手(1)
     * 現行のJDKベースの開発環境を確保
     * 製品に必須ではない部分(テストコード等)は
      現行のJDKベースで書く
      * 必須でないところは最低限の手間で書く
     * IDEの設定でコメント部はできる限り薄い色にする
      * 見えなければどうということはない
      * だからJavaDoc形式でコメントアウトはやめろと

    View Slide

  50. #ccc_m71
    古のJava - これは変えられますか?
    * 開発者個人として古のJavaに出会ったときに打てる手(2)
     * 実績を積む
      * 自分が手を入れた部分でデグレを起こさない
      * 修正にかかるコスト(工数)の可視化

    View Slide

  51. #ccc_m71
    古のJava - これは変えられますか?
    * 開発者個人として古のJavaに出会ったときに打てる手(3)
     * 最善を学び続ける
      * 取るべき手段をできるだけ増やす
      * そのまま適用できるケースはないが
       状況の中で最善を尽くすには最善を知るしかない

    View Slide

  52. #ccc_m71
    古のJava - これは変えられますか?(まとめ)
    * 正しい製品を正しく作るために
     * 今まで作り上げたものを直視する
      * コメントアウトにも相応の事情がある
     * コードを使って品質を向上させる手段があることを示す
      * まずは自分のところからテストを書く
      * 仕様はテストコードで示す勢い
     * 最善を学び続ける

    View Slide

  53. Thank You!
    #ccc_m71

    View Slide