Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SpotBugs(FindBugs)による 大規模ERPのコード品質改善

8,008 views

Published on

Java開発を助けてくれるSpotBugs(FindBugs)について、大規模ERP開発でどのように使い生産性を高めているか話します。
静的解析ツールはコード品質の底上げに役立ちますが、実行が遅かったり用途が直感的でなかったりと開発プロセスに組み込むうえでの難しさがあります。その難しさといかに向き合ってきたか、実例を交えて紹介します。
また社内フレームワーク・社内ライブラリの正しい使い方を広めるためのプラグインの実装方法についても紹介します。

Published in: Engineering
  • Be the first to comment

SpotBugs(FindBugs)による 大規模ERPのコード品質改善

  1. 1. © Works Applications Co.,Ltd.#ccc_f3 2017 May/20th, JJUG CCC 2017 Spring SpotBugs(FindBugs)による 大規模ERPのコード品質改善 1
  2. 2. © Works Applications Co.,Ltd.#ccc_f3 Agenda 自己紹介  2017年5月現在のJava静的解析ツール機能・動向比較  大規模ERPのコード品質が抱える問題とその解決  開発している組織とその製品  行っている工夫と今後の展望 2
  3. 3. © Works Applications Co.,Ltd.#ccc_f3 このセッションで得られるもの  大規模開発にて運用可能なコード品質改善手法  グローバルで大規模なJava開発において必須となる 「コード品質の底上げ」の実践的な手法  社内FWやライブラリの使い方を広める手法として 活用できる静的解析ツールプラグインの開発手法 3
  4. 4. © Works Applications Co.,Ltd.#ccc_f3 突然のQuiz 4
  5. 5. © Works Applications Co.,Ltd.#ccc_f3 JJUG CCCのCCCとは? 1. クラス・チョット・コンパイルデキル 2. 超・コーディング・コンテスト 3. クロス・コミュニティ・カンファレンス 5
  6. 6. © Works Applications Co.,Ltd.#ccc_f3 自己紹介 ✤ https://github.com/KengoTODA/ ✤ ㈱ワークスアプリケーションズ 研究開発エンジニア ✤ ゲームが作りたくてHSP2に 手を出し、フリーソフトウェア 作家を経て、入社しR&Dに ✤ SpotBugsの中の人 JVM Simulator Maven3 ebook 6
  7. 7. © Works Applications Co.,Ltd.#ccc_f3 1. 2017年5月現在の Java静的解析ツール機能・動向比較 7
  8. 8. © Works Applications Co.,Ltd.#ccc_f3 静的解析ツールの良いところ ✤ 使い手に経験や深い知識がなくても、 ✤ レビュー前やデプロイ前など早い段階で、 ✤ 問題を発見できる 8
  9. 9. © Works Applications Co.,Ltd.#ccc_f3 比較対象Java静的解析ツール  Checkstyle  PMD  FindBugs / SpotBugs  Checker Framework  Google error-prone 9
  10. 10. © Works Applications Co.,Ltd.#ccc_f3 Checkstyle  ソースコード解析なのでコンパイルなしで実行できる  多彩なIDE・ビルドツールに対応  コーディング規約の確認が主目的  プラグイン実装に必要な知識が少ない  http://checkstyle.sourceforge.net/ 10
  11. 11. © Works Applications Co.,Ltd.#ccc_f3 PMD  ソースコード解析なのでコンパイルなしで実行できる  多彩なIDE・ビルドツールそして言語に対応  CPD(コピペ検出)機能も搭載  プラグイン実装はわりと複雑  https://pmd.github.io/ 11
  12. 12. © Works Applications Co.,Ltd.#ccc_f3 FindBugs  バイトコード解析なのでコードにない情報(親クラス、 依存先、アノテーション等)もCLASSPATHから補完できる  多彩なIDE・ビルドツールに対応  プラグイン実装にはJVMやバイトコードの知識があると良い  https://spotbugs.github.io/ 12
  13. 13. © Works Applications Co.,Ltd.#ccc_f3 SpotBugsとは?  FindBugsの開発がしばらく止まっていた (3.0.1は2年弱前のリリース)  3.1.0リリース準備&コミュニティ形成中  FindBugsコミュニティにおける例の件の顛末、 そしてSpotBugsとは何か 13
  14. 14. © Works Applications Co.,Ltd.#ccc_f3 参考:JSR305アノテーションの今  javax.annotation パッケージに含まれる @Nonnull や@Untaintedなどのアノテーション  JSR305がDormantとなった後もFindBugsが配布していた  SpotBugsによるメンテナンス予定無し  型パラメータに使うこともできないので 今後穏やかに置き換えられていくのでは 14
  15. 15. © Works Applications Co.,Ltd.#ccc_f3 Checker Framework  Java8のJSR 308 (Annotations on Java Types) を利用する  多彩なIDE・ビルドツールに対応  JDKに含まれるクラスの振る舞いをデータベースに持つ  https://checkerframework.org/ 15
  16. 16. © Works Applications Co.,Ltd.#ccc_f3 Google error-prone  コンパイル時に解析するのでコードにない情報も拾いやすい  ソースコードの自動修正を当初から意識している?  Eclipse非対応(com.sun.* パッケージに依存のため)  色々モダンでプラグイン実装もしやすい  Google社員以外からのPRは(実績として)受け付けてない  http://errorprone.info/ 16 Refs: http://dl.acm.org/citation.cfm?id=2486877
  17. 17. © Works Applications Co.,Ltd.#ccc_f3 今使うならどのツール? 17 \ Target Standard Rules Note Checkstyle 7.7 AST 152 checks coding規約 PMD 5.6.1 AST 287 rules (PMD Java) 多言語対応 SpotBugs 3.1.0−RC2 Bytecode 453 patterns (+9 experimentals) plugin豊富 Checker Fw 2.1.11 AST (Compiler拡張) 19 checkers JSR308対応 error-prone v2.0.19 AST (Compiler拡張) 145 patterns (+61 experimentals) 将来に期待
  18. 18. © Works Applications Co.,Ltd.#ccc_f3 今使うならどのツール?  とにかく数を出したい  SpotBugs + Checker Framework  Type Annotationを使えばSpotBugsに見つけられない問題も 炙り出せる可能性がある  解析に時間をかけたくない  error-proneでコンパイル時チェック  PMDをコンパイラと並列実行 18
  19. 19. © Works Applications Co.,Ltd.#ccc_f3  Javaスキルの高い開発者が揃っている  アノテーションの利用を促進しChecker Frameworkを活用する  定期的なSpotBugsで細かい問題も炙り出す  開発者のJavaスキルにばらつきがある  Checkstyleで最低限の読みやすさを担保する  CPDでコピペに警告をする(節度のあるコピペを促す)  動作を軽くしたPMDやSpotBugsをこまめに回し最低限のミスを防ぐ 19 今使うならどのツール?
  20. 20. © Works Applications Co.,Ltd.#ccc_f3 Agenda  自己紹介  2017年5月現在のJava静的解析ツール機能・動向比較  大規模ERPのコード品質が抱える問題とその解決  開発している組織とその製品  行っている工夫と今後の展望 20
  21. 21. © Works Applications Co.,Ltd.#ccc_f3 2. 大規模ERPのコード品質が 抱える問題 21
  22. 22. © Works Applications Co.,Ltd.#ccc_f3 株式会社 ワークスアプリケーションズとは ✤ ERPパッケージの開発を行っている企業 ✤ シンガポール、中国、インド、アメリカ等にも拠点 ✤ コンシューマアプリのようなユーザビリティと スピードを持つERP「HUE(AI WORKS)」を 開発・提供 22
  23. 23. © Works Applications Co.,Ltd.#ccc_f3 HUEの実装 ✤ 脱RDBするなど速度にこだわっていて、 ✤ MSAしないと死ぬ程度には山ほどサービスがあり、 ✤ 徳島に研究所作るレベルで自然言語処理に本気で、 ✤ 100ms達成のためにAWS Lambdaを導入するなど 新しいことも色々やっている。 23
  24. 24. © Works Applications Co.,Ltd.#ccc_f3 HUEの実装を支える人 ✤ 非常に多彩で長所も多い ✤ 東京・大阪・チェンナイ・上海・シンガポールなどに 開発拠点が分散している ✤ 受けた教育や常識からして大きく違う ✤ フロントエンド、フレームワーク、モバイル、機械学習、 バッチ、分散処理といった様々な専門家が共存 ✤ スキルのない新人が増え続けている状態 24
  25. 25. © Works Applications Co.,Ltd.#ccc_f3 HUEの実装を支える人 ✤ 非常に多彩で長所も多い ✤ 東京・大阪・チェンナイ・上海・シンガポールなどに 開発拠点が分散している ✤ 受けた教育や常識からして大きく違う ✤ フロントエンド、フレームワーク、モバイル、機械学習、 バッチ、分散処理といった様々な専門家が共存 ✤ スキルのない新人が増え続けている状態 25 問: 高速に増えていく 開発者のキャッチアップを 少ないコミュニケーションで どのように助けるか?
  26. 26. © Works Applications Co.,Ltd.#ccc_f3 なぜSpotBugsか ✤ 社内の人材と資産 ✤ 内部実装に明るい複数の開発者 ✤ プラグイン実装経験の蓄積 ✤ Eclipse連携 ✤ HUEはEclipseを標準IDEとしている ✤ Java8サポート ✤ FindBugs 3.0.1はLambdaの扱いに 問題がある 27
  27. 27. © Works Applications Co.,Ltd.#ccc_f3 Agenda ‣ 自己紹介 ‣ 2017年5月現在のJava静的解析ツール機能・動向比較  大規模ERPのコード品質が抱える問題とその解決  開発している組織とその製品  行っている工夫と今後の展望 28
  28. 28. © Works Applications Co.,Ltd.#ccc_f3 3. HUEが行っている工夫と 今後の展望 29
  29. 29. © Works Applications Co.,Ltd.#ccc_f3 過去の失敗 ✤ デフォルト設定のままFindBugsやCheckstyleを ローカルビルドやプレマージビルドに導入し、 生産性を大きく下げた ✤ プレマージビルドが1時間近くかかってしまった ✤ mvn -Dfindbugs.skip や <findbugs.skip>true </findbugs.skip> が当たり前になってしまった 30
  30. 30. © Works Applications Co.,Ltd.#ccc_f3 過去の失敗 ✤ デフォルト設定のままFindBugsをEclipseに導入し、 生産性を大きく下げた ✤ ワークスペースに10を超えるプロジェクトを常時 用意して開発する人が多かった ✤ Eclipse Pluginにパフォーマンス上の欠陥があった 31
  31. 31. © Works Applications Co.,Ltd.#ccc_f3 そもそも、 ✤ MSAを目指しているのに組織横断な解析は必要か? ✤ 各サービス開発者が好きにやればいいのでは? ✤ 自治できる活動を開発効率を低下させてまで 横断的にやる? 33
  32. 32. © Works Applications Co.,Ltd.#ccc_f3 MSAで組織横断な解析は必要か? ✤ 必要 ✤ 静的解析はnice to haveではなくmust to have ✤ それぞれ異なる人材・工数を持っているので 完全に自治に任せるといつ実施されるのか不明瞭 ✤ 開発効率を下げない方法を探す必要がある 34
  33. 33. © Works Applications Co.,Ltd.#ccc_f3 優先度 網羅性 (メリット) 失敗を踏まえて ✤ 開発効率に妥協しない ✤ 極力開発者の日常業務を ブロックしない手法を探す ✤ 効率低下を納得させられる 価値を出す ✤ ちゃんと中身を理解して使う ✤ 結局はバッチプログラムなので 慣れた手法でプロファイル可能 開発効率 (納得) 35
  34. 34. © Works Applications Co.,Ltd.#ccc_f3 調査:なぜFindBugsは遅いのか? ✤ 10数年前の常識にもとづいた実装 (SpotBugs 3.1.0-RC1で解消) ✤ Mapを使った String#intern() 相当の自前処理 ✤ Listインスタンスを使いまわすための計算処理 ✤ Eclipse GUIを頻繁に更新しすぎる (SpotBugs 3.1.0-RC2で解消) ✤ 解析対象が変わるたびにUIを更新 ✤ シングルスレッド(コアを使い切れない) 36
  35. 35. © Works Applications Co.,Ltd.#ccc_f3 調査:環境変更で高速化できる? ✤ ほぼできない ✤ FindBugsはCPU boundだがシングルスレッドなバッチ ✤ 複数コアを食い切っているのはJITコンパイラのスレッド (-XX:CICompilerCountで増減可だが速度にほぼ寄与なし) ✤ OOMEやGC stormを起こさない程度のメモリを与えれば あとはCPUコア増やしてもメモリ増やしても変化なし 37
  36. 36. © Works Applications Co.,Ltd.#ccc_f3 調査:Guava v19.0解析のマイクロベンチ (4 CPU cores) 38 128m 256m 512m 1g 2 (Default) OOME 18.2s 18.0s 18.2s 3 OOME 19.2s 18.2s 18.0s 4 OOME 24.8s 24.7s 23.6s -XX:CICompilerCount -Xmx & -Xms refs: https://github.com/spotbugs/spotbugs/pull/128
  37. 37. © Works Applications Co.,Ltd.#ccc_f3 調査:Guava v19.0解析のマイクロベンチ (2 CPU cores) 39 2g Default 26.0s G1GC 28.7s G1GC + UseStringDeduplication 29.1s GC設定(Java8) -Xmx & -Xms refs: https://github.com/spotbugs/spotbugs/pull/128
  38. 38. © Works Applications Co.,Ltd.#ccc_f3 調査:設定でfindbugs-maven-pluginを 高速化するには ✤ onlyAnalyzeで対象クラスを削り、 visitorsで利用Detectorを削ることで高速になる ✤ 発見したいバグに優先度をつけることが肝要 ✤ ExcludeFilterで対象ファイルを削っても速くならない ✤ Filterは処理の結果に対して影響するため 40
  39. 39. © Works Applications Co.,Ltd.#ccc_f3 調査:effortの効果(TBU) 41 ACCUR ATE_EX CEPTIO NS MODEL _INSTA NCEOF TRACK_ GUARA NTEED_ VALUE _DEREF S_IN_N ULL_PO INTER_ ANALY SIS TRACK_ VALUE _NUMB ERS_IN_ NULL_P OINTER _ANAL YSIS INTERP ROCED URAL_ ANALY SIS INTERP ROCED URAL_ ANALY SIS_OF_ REFERE NCED_ CLASSE S CONSE RVE_SP ACE SKIP_ HUGE _MET HODS min ✓ ✓ less ✓ ✓ ✓ default, more ✓ ✓ ✓ ✓ ✓ ✓ max ✓ ✓ ✓ ✓ ✓ ✓ Refs: FindBugs.java
  40. 40. © Works Applications Co.,Ltd.#ccc_f3 以上を踏まえて 42
  41. 41. © Works Applications Co.,Ltd.#ccc_f3 方針 ✤ 速度重視の粗い解析と、網羅性重視の解析を 組み合わせる ✤ プレマージビルドでは変更されたクラスだけを解析 ✤ 拾い漏れる問題は日次の解析で発見・報告 43
  42. 42. © Works Applications Co.,Ltd.#ccc_f3 重く網羅性の高い解析(概要) ✤ Jenkins + SonarQubeで開発が活発でない時間帯に実施 ✤ 重大でないレベルのルールも含めて実施 ✤ 開発者がいつでもアクセスできるSonarQubeを提供 ✤ Readmeやプロジェクト一覧ページにBadgeを表示し 一覧性とSonarQubeへの導線を確保 44
  43. 43. © Works Applications Co.,Ltd.#ccc_f3 重く網羅性の高い解析(結果) ✤ 50のプロジェクトから3,000の問題を見つけ、 1ヶ月でうち900を解消した ✤ String.format() や logger.info() のフォーマット異常 ✤ マルチスレッドプログラミングアンチパターン 45
  44. 44. © Works Applications Co.,Ltd.#ccc_f3 素早く粗い解析(概要) ✤ 重大な問題を中心に調査 ✤ 独自Mavenプラグインでfindbugs-maven-pluginを ラップ ✤ 変更された.javaファイル一覧から更新された可能性 のあるclassファイルの一覧をSpotBugsに渡す 46
  45. 45. © Works Applications Co.,Ltd.#ccc_f3 素早く粗い解析(結果) ✤ SpotBugsにかかる時間を平均93%削減 ✤ 大きなリポジトリでも1分以内に解析を終えられる ✤ 拾いきれない問題は必ず出る ✤ 例:@NonNullをインタフェースに追加した場合 47
  46. 46. © Works Applications Co.,Ltd.#ccc_f3 今後の展望 ✤ さらに多くのリポジトリへの導入 ✤ Type Annotationを段階的に導入する ✤ 技術にこだわりの強い、共通モジュール開発者に 協力を依頼する 48
  47. 47. © Works Applications Co.,Ltd.#ccc_f3 4. 社内FW支援のための SpotBugsプラグイン実装方法 49
  48. 48. © Works Applications Co.,Ltd.#ccc_f3 大まかな流れ ✤ 要件の明確化 ✤ プロジェクトの作成 ✤ JUnitで稼働確認しながら実装 ✤ Messageの作成 50
  49. 49. © Works Applications Co.,Ltd.#ccc_f3 要件の明確化 51 ✤ 要件に応じて拡張すべき親クラスが変わる ✤ OperandStackの状態を追う→OpcodeStackDetector ✤ アノテーションを確認する→AnnotationDetector
  50. 50. © Works Applications Co.,Ltd.#ccc_f3 プロジェクトの作成 52 $ mvn archetype:generate ¥ -DarchetypeGroupId=com.github.spotbugs ¥ -DarchetypeArtifactId=spotbugs-archetype ¥ -DarchetypeVersion=0.1.0 Refs: https://github.com/spotbugs/spotbugs-archetype
  51. 51. © Works Applications Co.,Ltd.#ccc_f3 JUnitで動作確認しながら実装 53 ✤ 「バグとして見つけたい状態」を実装 ✤ 「バグとして見つかるべきでない状態」を実装 ✤ classファイルをテスト実行前に生成
  52. 52. © Works Applications Co.,Ltd.#ccc_f3 54 Refs: https://github.com/spotbugs/spotbugs/tree/master/test-harness
  53. 53. © Works Applications Co.,Ltd.#ccc_f3 Messageの作成 ✤ src/main/resources/messages.xmlの改変 ✤ 「何が問題か」だけでなく「どう修正できるか」も 指南することが望ましい 55 Refs: http://dl.acm.org/citation.cfm?id=2486877
  54. 54. © Works Applications Co.,Ltd.#ccc_f3 Live demo 56
  55. 55. © Works Applications Co.,Ltd.#ccc_f3 5. まとめ 57
  56. 56. © Works Applications Co.,Ltd.#ccc_f3 大規模開発におけるコード品質改善 ✤ プロジェクトの数と規模が大きいMSAでは運用の 難度が上がる ✤ 各サービス開発者が静的解析ツールのメリットを 享受できる環境の構築が必要 58
  57. 57. © Works Applications Co.,Ltd.#ccc_f3 大規模開発におけるコード品質改善 ✤ FindBugs/SpotBugsのクセを理解すれば 大規模開発でもサクサク利用できる ✤ パラメータの変更で実行ルールと対象コードを 絞り込む、差分解析とバッチ実行を分ける 59
  58. 58. © Works Applications Co.,Ltd.#ccc_f3 大規模開発におけるコード品質改善 ✤ SpotBugsプラグインを開発すれば社内フレームワーク 固有の問題も静的解析ツールで発見できる ✤ 実装には必ずしもJVMやバイトコードの知識は必要 としない 60
  59. 59. © Works Applications Co.,Ltd.#ccc_f3 6. 採用情報 61
  60. 60. © Works Applications Co.,Ltd.#ccc_f3 世界を目指すエンジニアを 募集しています 62
  61. 61. © Works Applications Co.,Ltd.#ccc_f3 具体的な話を聞きたい方へ ✤ 発表後に私に聞きに来てください! ✤ CI、MSA、マイグレーション、開発プロセス、 多拠点開発は専門なので色々お話できます. 63
  62. 62. © Works Applications Co.,Ltd.#ccc_f3 Thank you! ご清聴ありがとうございました! 64
  63. 63. © Works Applications Co.,Ltd.#ccc_f3 7. 参考資料 65
  64. 64. © Works Applications Co.,Ltd.#ccc_f3 参考情報  ソースコードの品質向上のための効果的で効率的な コードレビュー  https://www.slideshare.net/MoriharuOhzu/ss- 9224836 66
  65. 65. © Works Applications Co.,Ltd.#ccc_f3 参考情報  ラムダ式やストリーム API や新しい日時 API だけじゃない! Java8 のタイプ・アノテーションあの手この手  http://waman.hatenablog.com/entry/2014/05/08/063959 67
  66. 66. © Works Applications Co.,Ltd.#ccc_f3 参考情報  Type Annotation for Static Program Analysis  https://www.slideshare.net/skrb/type-annotation- for-static-program-analysis 68
  67. 67. © Works Applications Co.,Ltd.#ccc_f3 参考情報 ✤ G1: from garbage collector to waste management consultant ✤ https://blogs.oracle.com/java-platform- group/g1%3a-from-garbage-collector-to-waste- management-consultant 69
  68. 68. © Works Applications Co.,Ltd.#ccc_f3 参考情報 ✤ G1 GC おさらいと #jjug_ccc で発表した話 ✤ http://cco.hatenablog.jp/entry/2015/12/01/011223 70
  69. 69. © Works Applications Co.,Ltd.#ccc_f3 参考情報 ✤ The Google FindBugs fixit ✤ http://dl.acm.org/citation.cfm?id=1831738 71

×