Contenu connexe
Similaire à SpotBugs(FindBugs)による 大規模ERPのコード品質改善 (20)
Plus de Works Applications (11)
SpotBugs(FindBugs)による 大規模ERPのコード品質改善
- 1. © Works Applications Co.,Ltd.#ccc_f3
2017 May/20th, JJUG CCC 2017 Spring
SpotBugs(FindBugs)による
大規模ERPのコード品質改善
1
- 2. © Works Applications Co.,Ltd.#ccc_f3
Agenda
自己紹介
2017年5月現在のJava静的解析ツール機能・動向比較
大規模ERPのコード品質が抱える問題とその解決
開発している組織とその製品
行っている工夫と今後の展望
2
- 3. © Works Applications Co.,Ltd.#ccc_f3
このセッションで得られるもの
大規模開発にて運用可能なコード品質改善手法
グローバルで大規模なJava開発において必須となる
「コード品質の底上げ」の実践的な手法
社内FWやライブラリの使い方を広める手法として
活用できる静的解析ツールプラグインの開発手法
3
- 5. © Works Applications Co.,Ltd.#ccc_f3
JJUG CCCのCCCとは?
1. クラス・チョット・コンパイルデキル
2. 超・コーディング・コンテスト
3. クロス・コミュニティ・カンファレンス
5
- 6. © Works Applications Co.,Ltd.#ccc_f3
自己紹介
✤ https://github.com/KengoTODA/
✤ ㈱ワークスアプリケーションズ
研究開発エンジニア
✤ ゲームが作りたくてHSP2に
手を出し、フリーソフトウェア
作家を経て、入社しR&Dに
✤ SpotBugsの中の人
JVM Simulator
Maven3 ebook
6
- 8. © Works Applications Co.,Ltd.#ccc_f3
静的解析ツールの良いところ
✤ 使い手に経験や深い知識がなくても、
✤ レビュー前やデプロイ前など早い段階で、
✤ 問題を発見できる
8
- 9. © Works Applications Co.,Ltd.#ccc_f3
比較対象Java静的解析ツール
Checkstyle
PMD
FindBugs / SpotBugs
Checker Framework
Google error-prone
9
- 10. © Works Applications Co.,Ltd.#ccc_f3
Checkstyle
ソースコード解析なのでコンパイルなしで実行できる
多彩なIDE・ビルドツールに対応
コーディング規約の確認が主目的
プラグイン実装に必要な知識が少ない
http://checkstyle.sourceforge.net/
10
- 11. © Works Applications Co.,Ltd.#ccc_f3
PMD
ソースコード解析なのでコンパイルなしで実行できる
多彩なIDE・ビルドツールそして言語に対応
CPD(コピペ検出)機能も搭載
プラグイン実装はわりと複雑
https://pmd.github.io/
11
- 12. © Works Applications Co.,Ltd.#ccc_f3
FindBugs
バイトコード解析なのでコードにない情報(親クラス、
依存先、アノテーション等)もCLASSPATHから補完できる
多彩なIDE・ビルドツールに対応
プラグイン実装にはJVMやバイトコードの知識があると良い
https://spotbugs.github.io/
12
- 13. © Works Applications Co.,Ltd.#ccc_f3
SpotBugsとは?
FindBugsの開発がしばらく止まっていた
(3.0.1は2年弱前のリリース)
3.1.0リリース準備&コミュニティ形成中
FindBugsコミュニティにおける例の件の顛末、
そしてSpotBugsとは何か
13
- 14. © Works Applications Co.,Ltd.#ccc_f3
参考:JSR305アノテーションの今
javax.annotation パッケージに含まれる
@Nonnull や@Untaintedなどのアノテーション
JSR305がDormantとなった後もFindBugsが配布していた
SpotBugsによるメンテナンス予定無し
型パラメータに使うこともできないので
今後穏やかに置き換えられていくのでは
14
- 15. © Works Applications Co.,Ltd.#ccc_f3
Checker Framework
Java8のJSR 308 (Annotations on Java Types) を利用する
多彩なIDE・ビルドツールに対応
JDKに含まれるクラスの振る舞いをデータベースに持つ
https://checkerframework.org/
15
- 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. © 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. © Works Applications Co.,Ltd.#ccc_f3
今使うならどのツール?
とにかく数を出したい
SpotBugs + Checker Framework
Type Annotationを使えばSpotBugsに見つけられない問題も
炙り出せる可能性がある
解析に時間をかけたくない
error-proneでコンパイル時チェック
PMDをコンパイラと並列実行
18
- 19. © Works Applications Co.,Ltd.#ccc_f3
Javaスキルの高い開発者が揃っている
アノテーションの利用を促進しChecker Frameworkを活用する
定期的なSpotBugsで細かい問題も炙り出す
開発者のJavaスキルにばらつきがある
Checkstyleで最低限の読みやすさを担保する
CPDでコピペに警告をする(節度のあるコピペを促す)
動作を軽くしたPMDやSpotBugsをこまめに回し最低限のミスを防ぐ
19
今使うならどのツール?
- 20. © Works Applications Co.,Ltd.#ccc_f3
Agenda
自己紹介
2017年5月現在のJava静的解析ツール機能・動向比較
大規模ERPのコード品質が抱える問題とその解決
開発している組織とその製品
行っている工夫と今後の展望
20
- 22. © Works Applications Co.,Ltd.#ccc_f3
株式会社
ワークスアプリケーションズとは
✤ ERPパッケージの開発を行っている企業
✤ シンガポール、中国、インド、アメリカ等にも拠点
✤ コンシューマアプリのようなユーザビリティと
スピードを持つERP「HUE(AI WORKS)」を
開発・提供
22
- 23. © Works Applications Co.,Ltd.#ccc_f3
HUEの実装
✤ 脱RDBするなど速度にこだわっていて、
✤ MSAしないと死ぬ程度には山ほどサービスがあり、
✤ 徳島に研究所作るレベルで自然言語処理に本気で、
✤ 100ms達成のためにAWS Lambdaを導入するなど
新しいことも色々やっている。
23
- 24. © Works Applications Co.,Ltd.#ccc_f3
HUEの実装を支える人
✤ 非常に多彩で長所も多い
✤ 東京・大阪・チェンナイ・上海・シンガポールなどに
開発拠点が分散している
✤ 受けた教育や常識からして大きく違う
✤ フロントエンド、フレームワーク、モバイル、機械学習、
バッチ、分散処理といった様々な専門家が共存
✤ スキルのない新人が増え続けている状態
24
- 25. © Works Applications Co.,Ltd.#ccc_f3
HUEの実装を支える人
✤ 非常に多彩で長所も多い
✤ 東京・大阪・チェンナイ・上海・シンガポールなどに
開発拠点が分散している
✤ 受けた教育や常識からして大きく違う
✤ フロントエンド、フレームワーク、モバイル、機械学習、
バッチ、分散処理といった様々な専門家が共存
✤ スキルのない新人が増え続けている状態
25
問:
高速に増えていく
開発者のキャッチアップを
少ないコミュニケーションで
どのように助けるか?
- 26. © Works Applications Co.,Ltd.#ccc_f3
なぜSpotBugsか
✤ 社内の人材と資産
✤ 内部実装に明るい複数の開発者
✤ プラグイン実装経験の蓄積
✤ Eclipse連携
✤ HUEはEclipseを標準IDEとしている
✤ Java8サポート
✤ FindBugs 3.0.1はLambdaの扱いに
問題がある
27
- 27. © Works Applications Co.,Ltd.#ccc_f3
Agenda
‣ 自己紹介
‣ 2017年5月現在のJava静的解析ツール機能・動向比較
大規模ERPのコード品質が抱える問題とその解決
開発している組織とその製品
行っている工夫と今後の展望
28
- 29. © Works Applications Co.,Ltd.#ccc_f3
過去の失敗
✤ デフォルト設定のままFindBugsやCheckstyleを
ローカルビルドやプレマージビルドに導入し、
生産性を大きく下げた
✤ プレマージビルドが1時間近くかかってしまった
✤ mvn -Dfindbugs.skip や <findbugs.skip>true
</findbugs.skip> が当たり前になってしまった
30
- 30. © Works Applications Co.,Ltd.#ccc_f3
過去の失敗
✤ デフォルト設定のままFindBugsをEclipseに導入し、
生産性を大きく下げた
✤ ワークスペースに10を超えるプロジェクトを常時
用意して開発する人が多かった
✤ Eclipse Pluginにパフォーマンス上の欠陥があった
31
- 31. © Works Applications Co.,Ltd.#ccc_f3
そもそも、
✤ MSAを目指しているのに組織横断な解析は必要か?
✤ 各サービス開発者が好きにやればいいのでは?
✤ 自治できる活動を開発効率を低下させてまで
横断的にやる?
33
- 32. © Works Applications Co.,Ltd.#ccc_f3
MSAで組織横断な解析は必要か?
✤ 必要
✤ 静的解析はnice to haveではなくmust to have
✤ それぞれ異なる人材・工数を持っているので
完全に自治に任せるといつ実施されるのか不明瞭
✤ 開発効率を下げない方法を探す必要がある
34
- 33. © Works Applications Co.,Ltd.#ccc_f3
優先度
網羅性
(メリット)
失敗を踏まえて
✤ 開発効率に妥協しない
✤ 極力開発者の日常業務を
ブロックしない手法を探す
✤ 効率低下を納得させられる
価値を出す
✤ ちゃんと中身を理解して使う
✤ 結局はバッチプログラムなので
慣れた手法でプロファイル可能
開発効率
(納得)
35
- 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. © Works Applications Co.,Ltd.#ccc_f3
調査:環境変更で高速化できる?
✤ ほぼできない
✤ FindBugsはCPU boundだがシングルスレッドなバッチ
✤ 複数コアを食い切っているのはJITコンパイラのスレッド
(-XX:CICompilerCountで増減可だが速度にほぼ寄与なし)
✤ OOMEやGC stormを起こさない程度のメモリを与えれば
あとはCPUコア増やしてもメモリ増やしても変化なし
37
- 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. © 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. © Works Applications Co.,Ltd.#ccc_f3
調査:設定でfindbugs-maven-pluginを
高速化するには
✤ onlyAnalyzeで対象クラスを削り、
visitorsで利用Detectorを削ることで高速になる
✤ 発見したいバグに優先度をつけることが肝要
✤ ExcludeFilterで対象ファイルを削っても速くならない
✤ Filterは処理の結果に対して影響するため
40
- 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
- 41. © Works Applications Co.,Ltd.#ccc_f3
方針
✤ 速度重視の粗い解析と、網羅性重視の解析を
組み合わせる
✤ プレマージビルドでは変更されたクラスだけを解析
✤ 拾い漏れる問題は日次の解析で発見・報告
43
- 42. © Works Applications Co.,Ltd.#ccc_f3
重く網羅性の高い解析(概要)
✤ Jenkins + SonarQubeで開発が活発でない時間帯に実施
✤ 重大でないレベルのルールも含めて実施
✤ 開発者がいつでもアクセスできるSonarQubeを提供
✤ Readmeやプロジェクト一覧ページにBadgeを表示し
一覧性とSonarQubeへの導線を確保
44
- 43. © Works Applications Co.,Ltd.#ccc_f3
重く網羅性の高い解析(結果)
✤ 50のプロジェクトから3,000の問題を見つけ、
1ヶ月でうち900を解消した
✤ String.format() や logger.info() のフォーマット異常
✤ マルチスレッドプログラミングアンチパターン
45
- 44. © Works Applications Co.,Ltd.#ccc_f3
素早く粗い解析(概要)
✤ 重大な問題を中心に調査
✤ 独自Mavenプラグインでfindbugs-maven-pluginを
ラップ
✤ 変更された.javaファイル一覧から更新された可能性
のあるclassファイルの一覧をSpotBugsに渡す
46
- 45. © Works Applications Co.,Ltd.#ccc_f3
素早く粗い解析(結果)
✤ SpotBugsにかかる時間を平均93%削減
✤ 大きなリポジトリでも1分以内に解析を終えられる
✤ 拾いきれない問題は必ず出る
✤ 例:@NonNullをインタフェースに追加した場合
47
- 46. © Works Applications Co.,Ltd.#ccc_f3
今後の展望
✤ さらに多くのリポジトリへの導入
✤ Type Annotationを段階的に導入する
✤ 技術にこだわりの強い、共通モジュール開発者に
協力を依頼する
48
- 48. © Works Applications Co.,Ltd.#ccc_f3
大まかな流れ
✤ 要件の明確化
✤ プロジェクトの作成
✤ JUnitで稼働確認しながら実装
✤ Messageの作成
50
- 49. © Works Applications Co.,Ltd.#ccc_f3
要件の明確化
51
✤ 要件に応じて拡張すべき親クラスが変わる
✤ OperandStackの状態を追う→OpcodeStackDetector
✤ アノテーションを確認する→AnnotationDetector
- 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. © Works Applications Co.,Ltd.#ccc_f3
JUnitで動作確認しながら実装
53
✤ 「バグとして見つけたい状態」を実装
✤ 「バグとして見つかるべきでない状態」を実装
✤ classファイルをテスト実行前に生成
- 52. © Works Applications Co.,Ltd.#ccc_f3 54
Refs: https://github.com/spotbugs/spotbugs/tree/master/test-harness
- 53. © Works Applications Co.,Ltd.#ccc_f3
Messageの作成
✤ src/main/resources/messages.xmlの改変
✤ 「何が問題か」だけでなく「どう修正できるか」も
指南することが望ましい
55
Refs: http://dl.acm.org/citation.cfm?id=2486877
- 56. © Works Applications Co.,Ltd.#ccc_f3
大規模開発におけるコード品質改善
✤ プロジェクトの数と規模が大きいMSAでは運用の
難度が上がる
✤ 各サービス開発者が静的解析ツールのメリットを
享受できる環境の構築が必要
58
- 57. © Works Applications Co.,Ltd.#ccc_f3
大規模開発におけるコード品質改善
✤ FindBugs/SpotBugsのクセを理解すれば
大規模開発でもサクサク利用できる
✤ パラメータの変更で実行ルールと対象コードを
絞り込む、差分解析とバッチ実行を分ける
59
- 58. © Works Applications Co.,Ltd.#ccc_f3
大規模開発におけるコード品質改善
✤ SpotBugsプラグインを開発すれば社内フレームワーク
固有の問題も静的解析ツールで発見できる
✤ 実装には必ずしもJVMやバイトコードの知識は必要
としない
60
- 61. © Works Applications Co.,Ltd.#ccc_f3
具体的な話を聞きたい方へ
✤ 発表後に私に聞きに来てください!
✤ CI、MSA、マイグレーション、開発プロセス、
多拠点開発は専門なので色々お話できます.
63
- 64. © Works Applications Co.,Ltd.#ccc_f3
参考情報
ソースコードの品質向上のための効果的で効率的な
コードレビュー
https://www.slideshare.net/MoriharuOhzu/ss-
9224836
66
- 65. © Works Applications Co.,Ltd.#ccc_f3
参考情報
ラムダ式やストリーム API や新しい日時 API だけじゃない!
Java8 のタイプ・アノテーションあの手この手
http://waman.hatenablog.com/entry/2014/05/08/063959
67
- 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. © 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. © Works Applications Co.,Ltd.#ccc_f3
参考情報
✤ G1 GC おさらいと #jjug_ccc で発表した話
✤ http://cco.hatenablog.jp/entry/2015/12/01/011223
70
- 69. © Works Applications Co.,Ltd.#ccc_f3
参考情報
✤ The Google FindBugs fixit
✤ http://dl.acm.org/citation.cfm?id=1831738
71