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

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

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