2月28日(土)、Java読書会BOF主催のJava読書会「Javaコードアンチパターン」を読む会の第1回を開催しました。
- 「 」(Tagir Valeev著、柴田芳樹訳、インプレス刊)
著者のTagir氏は、IntelliJ IDEAなどのプログラミングツールを開発・販売しているJetBrains社のエンジニアでJavaチームに所属、IntelliJ IDEAの静的解析機能の開発をしています。
Java読書会BOFの読書会恒例で、書籍の表紙、表紙のそで(折り返し部分の記述)から、推薦の言葉、目次、序文、まえがき、謝辞、著者紹介、本書についてをしっかりと朗読して第1章に入りました。
本書の第1章コード品質の管理 では、コードスタイル、静的解析ツール、テスト、カバレッジなどに触れられており、最近の主要な静的解析ツールの紹介も記載されています。カバレッジではミューテーションカバレッジにも言及しています。
読書会の議論では、IntelliJ IDEAを使っているなら個人環境で静的解析ツールを入れなくても強力なサポートが得られるから、CD・CIでサーバーでビルドするときに静的解析ツールのチェックを入れるのではといった話や、ミューテーションカバレッジとはどういう振る舞いをして、どのような効果が得られるのかという話、動的解析で言及のあるjavapathfinderは、名前から察したとおりNASA謹製で、利用経験のある参加者からはものすごい計算機リソース(メモリ)と時間を費やすとの経験談もありました。
1.3.2項 静的解析ツールの活用 では、int値に対するビットシフトで32bit左にシフトするという誤った記述の検査について、
int y = x << 32; 本文では クイックフィックスとして x << 0 に変更することが提案されています。これはコードの動作は変えないものの、問題の解決にはならないでしょう。
とあり、また訳注18では
int値を32ビット、・・・シフトさせようとすると元の値自身が返される
とありますが、Java言語仕様で、int値のビットシフトにおいては、右オペランドの値の下位5ビットしか使われないとの規定があることに気づかされました。非常に含蓄ある書籍と皆感じていました。
1.4節 自動テスト では、Clonableインタフェースの実装について例示していましたが、普段ほとんどClonableの実装を書くことはしていないので、ちょっと理解に時間を要しましたが、ここであらためてJavaの基本的な仕様を学ぶことができました。
とても些細なことですが、参加者の一人から、p.7の図1.2 Eclipseの画面キャプチャにおいてタイトルバーのアイコンがIntelliJのものになっているように見えるね、と気づきがありました。MacOS上の画面キャプチャですが、拡張子.javaがIntelliJに結びついている場合にあり得るのではということのようです。
と、この1章だけでもとっても濃い内容でした。
第2章では、Apache Avroという割と著名なオープンソース製品のコード記述でビットシフト演算子を用いて値を25%(4分の1)とするコード例が演算子の優先順位で誤っている例の紹介がありました。CPUの命令実行では除算演算よりもビットシフトが圧倒的に速いので、最適化を意図して記述したもののバグを持ち込んでしまったということです。ここで書籍では
最新のJVMで使われるJIT(Just-In-Time)コンパイラやAOT(Ahead-Of-Time)コンパイラは、機械コードを生成する際に乗算や除算をシフト演算子に書き換えられるので
とありましたが、本当にそうなの?ということで本読書会ではこれを実際に確認することが宿題となりました。
次回は、3月28日(土)開催です。 参加案内は、Webページ Java読書会BOF に掲載されております。