© 2023 NTT DATA Corporation
OpenJDKのコミッタってどんなことしたらなったの?
解決してきた技術課題の事例から見えてくる必要な知識と技術
2023年6月4日 JJUG CCC 2023 Spring
株式会社NTTデータ 技術革新統括本部 技術開発本部
阪田 浩一
© 2023 NTT DATA Corporation 2
発表者
• 株式会社NTTデータ 所属
• OpenJDKコミッタ
• Javaチャンピオン
• Oracle ACE Pro (Java分野)
Koichi Sakata
阪田 浩一
jyukutyo
© 2023 NTT DATA Corporation 3
最初の疑問
Javaは 誰が
作っているの?
© 2023 NTT DATA Corporation 4
前提として
多くのJDKがベースとする
OpenJDKを取り上げると…
© 2023 NTT DATA Corporation 5
ちょっと待って
OpenJDKって
何なの?
© 2023 NTT DATA Corporation 6
OpenJDK[1]とは何か
 OpenJDKはオープンソースのJava SE 仕様の実装と
その関連製品を開発する場
 そのソースコードはGitHubにある[2]
[1] https://openjdk.org/
[2] https://github.com/openjdk/
© 2023 NTT DATA Corporation 7
OpenJDK[1]とは何か
 OpenJDKはオープンソースのJava SE 仕様の実装と
その関連製品を開発する場
 そのソースコードはGitHubにある[2]
 バイナリは提供しない
• 自分でビルドする もしくは他の誰かがビルドしたバイナリを利用する
• 多くのJDKはOpenJDKをベースとして作成したものである
[1] https://openjdk.org/
[2] https://github.com/openjdk/
2006 2023
Javaオープンソース化発表
Java 6リリース
Java 20
リリース
© 2023 NTT DATA Corporation 8
改めて最初の疑問
Javaは 誰が
作っているの?
© 2023 NTT DATA Corporation 9
JDK 11から最新20までの課題解決数の割合(組織別)
https://blogs.oracle.com/java/post/th
e-arrival-of-java-20
© 2023 NTT DATA Corporation 10
Java(OpenJDK)は誰が作っているのか
 さまざまな企業と個人
• 企業が開発に参画している
• 個人として参画している人も多くいる
© 2023 NTT DATA Corporation 11
次の疑問
OpenJDK開発って
何をするの?
© 2023 NTT DATA Corporation 12
OpenJDKの開発
 一般的なOSSの開発と内容は同じ
• 新機能追加
• 機能拡張 改善
• バグ修正
 提案や意見交換はメーリングリスト[1]
 開発はGitHub上[2]
[1] https://mail.openjdk.org/mailman/listinfo
[2] https://github.com/openjdk/jdk
© 2023 NTT DATA Corporation 13
OpenJDKの内容物
 Java APIの実装
 Javaコンパイラ
 Java仮想マシン(JVM)
• ガベージコレクタ JITコンパイラなど
 各種ツール
• JDK Flight Recorder jcmd jhsdbなど
[1] https://mail.openjdk.org/mailman/listinfo
CAFE
BABE
0000
クラスファイル
クラスローダー サブシステム
実行時データエリア
ヒープ … …
実行エンジン
インタ
プリタ
JIT
コンパイラ
ガベージ
コレクタ
© 2023 NTT DATA Corporation 14
実装プログラミング言語
大まかに述べると
 JVM : C++
 JVM以外 : Java
© 2023 NTT DATA Corporation 15
突然の提案
あなたもJava、
今すぐ開発しませ
ん?
© 2023 NTT DATA Corporation 16
それじゃあ
私にも Javaの開発が
できるの?
© 2023 NTT DATA Corporation 17
誰でもOpenJDK(Java)の開発に参加できる
 色々なレベルの開発者がいる
• すごい開発者だけ ではない
 必要な能力はほんの少し
• やり抜く力
• 継続する力
 以下の能力は想像よりも重要ではない
• 技術力
• 英語力
© 2023 NTT DATA Corporation 18
開発に貢献する動機は何だっていい
 技術力を高めたい
 Javaに恩返ししたい
 ワールドワイドで活動したい
 JVMになりたい
 ...
© 2023 NTT DATA Corporation 19
貢献方法はいろいろある
1. プルリクエストを出す
2. リリース前の機能を試す
3. アイデアを提案する
4. 議論に参加する
5. イベントで登壇する
6. ブログに投稿する
7. ...
© 2023 NTT DATA Corporation 20
貢献方法はいろいろある
1. プルリクエストを出す
2. リリース前の機能を試す
3. アイデアを提案する
4. 議論に参加する
5. イベントで登壇する
6. ブログに投稿する
7. ...
今日はこれ!
© 2023 NTT DATA Corporation 21
ところで
JVMとかJavaのAPIのバグって
よく遭遇しますか?
© 2023 NTT DATA Corporation 22
普通に使っていてもそんなにバグに遭遇しない
 Java APIのバグ JVMのバグ
• まったく遭遇したことがない人も多いと思う
© 2023 NTT DATA Corporation 23
疑問
プルリクエストを出す題材は
めったに見つけれらない?
© 2023 NTT DATA Corporation 24
私もそうでした
 当初の考え方: バグを見つけたら修正に挑戦しよう
• 機会が運の問題になってしまう
 発想の転換: 自分で見つけて直す
• どうすれば修正対象を見つけられるか?
© 2023 NTT DATA Corporation 25
じゃあ
今までと違う使い方を
してみよう!
© 2023 NTT DATA Corporation 26
今までと違う使い方をしてみる
 異常系でするようなやり方で使ってみる
 使ったことがないもの(API ツール)を使ってみる
 異なる条件でビルドして使ってみる
© 2023 NTT DATA Corporation 27
異常系でするようなやり方で使ってみる
 私が修正した例: UL(Unified Logging)
-Xlog[:[selections][:[output][:[decorators][:output-options]]]]
© 2023 NTT DATA Corporation 28
異常系でするようなやり方で使ってみる
 私が修正した例: UL(Unified Logging)
-Xlog[:[selections][:[output][:[decorators][:output-options]]]]
// Java 15以前
$ java -Xlog::::::foo:::::::
// とくに警告もなく実行できる
5つ目以降のコロンは無効なので
警告を出した方がいいのでは
// Java 16以降
$ java -Xlog::::::foo:::::::
[0.003s][warning][logging] Ignoring excess -Xlog options:
":foo:::::::"
// 実行はする
© 2023 NTT DATA Corporation 29
使ったことがないものを使ってみる
 ツールやAPI
 私が修正した例: jcmd
© 2023 NTT DATA Corporation 30
使ったことがないものを使ってみる
 ツールやAPI
 私が修正した例: jcmd
ドメイン 内容
VM JVMの実行情報取得 ログ設定など
Compiler JITコンパイラ関連
GC ガベージコレクション関連
Thread 現状スレッドダンプのみ
JVMTI JVM Tool Interface関連 エージェントのロードなど
JFR フライトレコード関連
ManagementAgent JMXエージェント関連
使い方: jcmd <pid> command ドメイン.操作
jcmdはとても多機能
© 2023 NTT DATA Corporation 31
あれ?この機能ちゃんと動いてない
 Java 16以前
 実行中にjcmdでULログの設定変更をする
 変更が成功したとメッセージが出るが
実際には変更されていない
© 2023 NTT DATA Corporation 32
Java 16でのjcmdにおけるULログ設定バグ
© 2023 NTT DATA Corporation 33
あれ?この機能ちゃんと動いてない
 Java 16以前
 実行中にjcmdでULログの設定変更をする
 変更が成功したとメッセージが出るが
実際には変更されていない
 そもそもこれは変更できない設定項目
なので成功ではなく 変更しないというメッセージを出すべき
© 2023 NTT DATA Corporation 34
修正してみた
© 2023 NTT DATA Corporation 35
Java 17でのjcmdにおけるULログ設定
© 2023 NTT DATA Corporation 36
異なる条件でビルドして使ってみる
 OSやライブラリなどを変えてビルドする
 バージョンを最新などに変えてビルドする
© 2023 NTT DATA Corporation 37
ビルド?
OpenJDKって
どうやってビルドするの?
© 2023 NTT DATA Corporation 38
デモ: OpenJDKのビルド
© 2023 NTT DATA Corporation 39
OpenJDKのビルド[1]
 LinuxやmacOSは簡単
 Windowsは少し手間がかかるかも
• (数年前に一度やっただけでうろ覚え)
• WSLでもできる
 ネット上に多く関連投稿がある
• 日本語でも
[1] https://github.com/openjdk/jdk/blob/master/doc/building.md
© 2023 NTT DATA Corporation 40
異なる条件でビルドして使ってみる
 OSやライブラリなどを変えてビルドする
 バージョンを最新などに変えてビルドする
© 2023 NTT DATA Corporation 41
バージョンを最新などに変えてビルドする
 私が修正した例
• GCC 10がリリースされたとき GCC 10でビルドしてみた
© 2023 NTT DATA Corporation 42
バージョンを最新などに変えてビルドする
 私が修正した例
• GCC 10がリリースされたとき GCC 10でビルドしてみた
In file included from /home/jyukutyo/code/jdk/src/hotspot/share/classfile/systemDictionary.hpp:31,
from /home/jyukutyo/code/jdk/src/hotspot/share/classfile/javaClasses.hpp:28,
from /home/jyukutyo/code/jdk/src/hotspot/share/precompiled/precompiled.hpp:35:
In member function 'void Symbol::byte_at_put(int, u1)',
inlined from 'Symbol::Symbol(const u1*, int, int)' at
/home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.cpp:55:16:
/home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.hpp:130:18: error: writing 1 byte into a region of size 0
[-Werror=stringop-overflow=]
130 | _body[index] = value;
| ~~~~~~~~~~~~~^~~~~~~
(omitted)
以前は出ていなかった
警告が新たに3つ出た
© 2023 NTT DATA Corporation 43
警告の内容を確認する
 抜粋
/home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.hpp:130:18: error:
writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
130 | _body[index] = value;
| ~~~~~~~~~~~~~^~~~~~~
/home/jyukutyo/code/jdk/src/java.base/share/native/libfdlibm/k_standard.c:743:19:
error: 'exc.retval' may be used uninitialized in this function [-Werror=maybe-
uninitialized]
743 | return exc.retval;
| ~~~^~~~~~~
/home/jyukutyo/code/jdk/src/java.base/unix/native/libnet/NetworkInterface.c:974:13:
/usr/include/x86_64-linux-gnu/bits/string_fortified.h:106:10: error:
'__builtin_strncpy' output may be truncated copying 15 bytes from a string of length 15
[-Werror=stringop-truncation]
106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
© 2023 NTT DATA Corporation 44
GCC 10での変更点
GCC 10 Release Series — Changes, New Features, and Fixes https://gcc.gnu.org/gcc-10/changes.html
© 2023 NTT DATA Corporation 45
どうしても自分で
題材を見つけられないとき
何か他の方法はある?
© 2023 NTT DATA Corporation 46
 JBS(JDK Bug System) [1]
バグトラッキングシステムを見てみる
[1] https://bugs.openjdk.java.net/projects/JDK/issues/
© 2023 NTT DATA Corporation 47
JBS
 各PRには対応するJBSのイシューがある
• というよりも JBSのイシューが先にあり それにPRを出すということ
 イシューのラベル starterやclean-up は初級者向け
• それらを題材にする
© 2023 NTT DATA Corporation 48
題材を見つけたとして
誰でも修正できる?
© 2023 NTT DATA Corporation 49
JavaからC++へ
 私の場合
• 社会人歴 ≒ Java Webアプリの運用開発だった
• JVMのコードが初C++だった
© 2023 NTT DATA Corporation 50
誰でも修正できる
 言語面はなんとかできる
• 他者が書いたコードを直すという意味では普段と同じ
 低レイヤに関する知識が要求されることもある
• OS CPU メモリ ネットワーク 場合によってはアセンブリ言語
• 調べればなんとかなることも多い
© 2023 NTT DATA Corporation 51
ところで
どういう風に
開発するの?
© 2023 NTT DATA Corporation 52
エディタ IDE
 お好みで 何でもよい
 私の場合
• IDEを使っていたこともあったが
今はそのマシンにあるプレーンなエディタを使うだけ
• 加えてfindとgrepでほとんどの場合いけてしまっている
© 2023 NTT DATA Corporation 53
デバッグツール
 printデバッグでもほとんどの場合いける
 GDB
 CLion
• JetBrainsのC++用有償IDE
© 2023 NTT DATA Corporation 54
テスト
 jtreg
• Javaコードの独自テスティングフレームワーク
• JDK用リグレッションテストハーネス
 Google Test(gtest)
• C++コード用のテスティングフレームワーク
© 2023 NTT DATA Corporation 55
デモ: jtregのテスト実行
© 2023 NTT DATA Corporation 56
これで開発は
できそうだ…!
© 2023 NTT DATA Corporation 57
ところで
プルリクエストは
英語で出すんですよね?
© 2023 NTT DATA Corporation 58
英語力
 PRにはそれほど必要ない感じ
• 高校1,2年の内容が思い出せれば十分そう
• DeepL Google翻訳などを活用する
 提案 議論では長文が要求される
• このときはがんばる
© 2023 NTT DATA Corporation 59
仕事でPRは書いているけれど…
そもそもPRに
どんなことを書いたらいいの?
© 2023 NTT DATA Corporation 60
動くようにする ≠ 大規模OSSでPRをマージまで持っていく
 PRはすんなりマージされない
• レビューコメントはいくつもつく
• やりぬく力がいる
© 2023 NTT DATA Corporation 61
動くようにする ≠ 大規模OSSでPRをマージまで持っていく
 PRはすんなりマージされない
• レビューコメントはいくつもつく
• やりぬく力がいる
 OpenJDKは巨大なプロダクトである
• 修正が想像もしなかった部分に影響すると指摘されることもある
• 症状 修正方法 テスト内容 を文化が異なる国にいる
初対面のエンジニアに詳細に説明しなければならない
 PRで 何度も修正したりより詳しい説明を求められる
ことはよくある
© 2023 NTT DATA Corporation 62
何をしたのか ではなく なぜそうしたのか
 すべてをさらけ出すことになる
• この点はWebアプリ運用開発のときより厳しさを感じる
 バグなら再現手順を確立する
• 手順は余分なものを削ぎ落とし 可能な限りシンプルな手順にする
© 2023 NTT DATA Corporation 63
PRマージのイメージ
(Omitted)
© 2023 NTT DATA Corporation 64
継続しよう
 PRを出せば出すほど Javaのことがよりわかる
• 同時にまだまだ知らないことがたくさんあることがわかる
© 2023 NTT DATA Corporation 65
継続しよう
 PRを出せば出すほど Javaのことがよりわかる
• 同時にまだまだ知らないことがたくさんあることがわかる
 何よりもまずコードを書いていこう
• 読むだけよりももっと楽しい
• そのためにも修正 改善の題材を探すことが重要
 やり抜くことを継続すると ふと気づいたとき
思ってもいなかった場所にたどり着いている
© 2023 NTT DATA Corporation 66
質問
どんなことをしたら
コミッタになるの?
© 2023 NTT DATA Corporation 67
OpenJDKにおけるコミッタの定義
 コミッタ認定基準はOSSごとに異なる
 OpenJDKの開発者ロール
• レビュワ + コミッタで世界に300人+
コミッタ
Author
コントリビュータ
バグ登録権限など
開発者権限を保持
OpenJDKコミュニティにおける開発者ロール
レビュワ
© 2023 NTT DATA Corporation 68
 コミッタ = 無条件にすごい ではない
• もちろんコミッタにはすごい人も多いけれど
 コミッタ = 修正を最後までやり抜き それを何度もやった人
• すごいことをやる必要はない
• 言い換えると どんな人にもなれるチャンスがある
コミッタってすごいの?
© 2023 NTT DATA Corporation 69
コミッタ認定の流れ
 基準クリア -> 推薦 -> 投票 -> 認定
• 基準: コードに対して意味のある修正を 8回以上実施する
• 推薦: コミッタ以上が候補者をメールで推薦する
• 投票: コミッタ以上がメールで賛成か反対の票を入れる
• 認定: 反対票がなければコミッタ認定
© 2023 NTT DATA Corporation 70
コミッタ認定の流れ
 基準クリア -> 推薦 -> 投票 -> 認定
• 基準: コードに対して意味のある修正を 8回以上実施する
• 推薦: コミッタ以上が候補者をメールで推薦する
• 投票: コミッタ以上がメールで賛成か反対の票を入れる
• 認定: 反対票がなければコミッタ認定
 私の場合
• PRが14回マージされていた
• 何度かレビューしてくれていた米オラクル社の人から
突然推薦するとメールが来た
• 投票を経て2月に認定
© 2023 NTT DATA Corporation 71
そうは言っても…
1人で全部進められるか
不安…
© 2023 NTT DATA Corporation 72
メンタになってもらう
 OpenJDK開発は多人数 ワールドワイド 英語使用 難解
• 独力でやり遂げられる人は多くないはず
- 私はやりたい思いがありつつ 長年始められなかった
© 2023 NTT DATA Corporation 73
メンタになってもらう
 OpenJDK開発は多人数 ワールドワイド 英語使用 難解
• 独力でやり遂げられる人は多くないはず
- 私はやりたい思いがありつつ 長年始められなかった
 コントリビュート経験者に相談する
• このCCCにコミッタ以上のロールを持つ人は何人も来ている
• 1度F2Fで話しておけばソーシャルメディアでも相談しやすい
© 2023 NTT DATA Corporation 74
(私に限らず)
気になったセッションの
発表者に話しかけてみましょう!
© 2023 NTT DATA Corporation 75
私の場合: JavaカンファレンスとTwitterでのやり取り
 後に師匠となる人のセッションを聞き 衝撃を受ける
• Javaのことなのにセッションの半分が理解できない
 以降 師匠のセッションがあればそのイベントに出向く
• 当時関西在住 東京まで出てくる
© 2023 NTT DATA Corporation 76
私の場合: JavaカンファレンスとTwitterでのやり取り
 後に師匠となる人のセッションを聞き 衝撃を受ける
• Javaのことなのにセッションの半分が理解できない
 以降 師匠のセッションがあればそのイベントに出向く
• 当時関西在住 東京まで出てくる
 海外カンファレンスで師匠と実際に話す
 OpenJDKについてブログ投稿やツイートをすると
Twitterで助言をもらえるように
 転職し 師匠と同僚になる
• メンタになってもらう
© 2023 NTT DATA Corporation 77
コントリビュートして コミッタになって よかったこと
 Javaの歴史に自分も痕跡を残せたうれしさがある
© 2023 NTT DATA Corporation 78
コントリビュートして コミッタになって よかったこと
 Javaの歴史に自分も痕跡を残せたうれしさがある
 コミッタ向けイベントに参加できる
• OpenJDK Committer's Workshop
 OpenJDK開発者と知り合えた
• 日本語話者の開発者とも
 新しい技術領域に踏み出せた
© 2023 NTT DATA Corporation 79
まとめ
© 2023 NTT DATA Corporation 80
見えてきた必要な知識と技術とは
 知識も技術もあとからついてくる
 やり抜く力と継続する力こそが大切
 言い換えればどんな人だって歩き続ければ
そこにたどり着ける!
• そこはきっと自分が思い描く場所
© 2023 NTT DATA Corporation 81
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)

  • 1.
    © 2023 NTTDATA Corporation OpenJDKのコミッタってどんなことしたらなったの? 解決してきた技術課題の事例から見えてくる必要な知識と技術 2023年6月4日 JJUG CCC 2023 Spring 株式会社NTTデータ 技術革新統括本部 技術開発本部 阪田 浩一
  • 2.
    © 2023 NTTDATA Corporation 2 発表者 • 株式会社NTTデータ 所属 • OpenJDKコミッタ • Javaチャンピオン • Oracle ACE Pro (Java分野) Koichi Sakata 阪田 浩一 jyukutyo
  • 3.
    © 2023 NTTDATA Corporation 3 最初の疑問 Javaは 誰が 作っているの?
  • 4.
    © 2023 NTTDATA Corporation 4 前提として 多くのJDKがベースとする OpenJDKを取り上げると…
  • 5.
    © 2023 NTTDATA Corporation 5 ちょっと待って OpenJDKって 何なの?
  • 6.
    © 2023 NTTDATA Corporation 6 OpenJDK[1]とは何か  OpenJDKはオープンソースのJava SE 仕様の実装と その関連製品を開発する場  そのソースコードはGitHubにある[2] [1] https://openjdk.org/ [2] https://github.com/openjdk/
  • 7.
    © 2023 NTTDATA Corporation 7 OpenJDK[1]とは何か  OpenJDKはオープンソースのJava SE 仕様の実装と その関連製品を開発する場  そのソースコードはGitHubにある[2]  バイナリは提供しない • 自分でビルドする もしくは他の誰かがビルドしたバイナリを利用する • 多くのJDKはOpenJDKをベースとして作成したものである [1] https://openjdk.org/ [2] https://github.com/openjdk/ 2006 2023 Javaオープンソース化発表 Java 6リリース Java 20 リリース
  • 8.
    © 2023 NTTDATA Corporation 8 改めて最初の疑問 Javaは 誰が 作っているの?
  • 9.
    © 2023 NTTDATA Corporation 9 JDK 11から最新20までの課題解決数の割合(組織別) https://blogs.oracle.com/java/post/th e-arrival-of-java-20
  • 10.
    © 2023 NTTDATA Corporation 10 Java(OpenJDK)は誰が作っているのか  さまざまな企業と個人 • 企業が開発に参画している • 個人として参画している人も多くいる
  • 11.
    © 2023 NTTDATA Corporation 11 次の疑問 OpenJDK開発って 何をするの?
  • 12.
    © 2023 NTTDATA Corporation 12 OpenJDKの開発  一般的なOSSの開発と内容は同じ • 新機能追加 • 機能拡張 改善 • バグ修正  提案や意見交換はメーリングリスト[1]  開発はGitHub上[2] [1] https://mail.openjdk.org/mailman/listinfo [2] https://github.com/openjdk/jdk
  • 13.
    © 2023 NTTDATA Corporation 13 OpenJDKの内容物  Java APIの実装  Javaコンパイラ  Java仮想マシン(JVM) • ガベージコレクタ JITコンパイラなど  各種ツール • JDK Flight Recorder jcmd jhsdbなど [1] https://mail.openjdk.org/mailman/listinfo CAFE BABE 0000 クラスファイル クラスローダー サブシステム 実行時データエリア ヒープ … … 実行エンジン インタ プリタ JIT コンパイラ ガベージ コレクタ
  • 14.
    © 2023 NTTDATA Corporation 14 実装プログラミング言語 大まかに述べると  JVM : C++  JVM以外 : Java
  • 15.
    © 2023 NTTDATA Corporation 15 突然の提案 あなたもJava、 今すぐ開発しませ ん?
  • 16.
    © 2023 NTTDATA Corporation 16 それじゃあ 私にも Javaの開発が できるの?
  • 17.
    © 2023 NTTDATA Corporation 17 誰でもOpenJDK(Java)の開発に参加できる  色々なレベルの開発者がいる • すごい開発者だけ ではない  必要な能力はほんの少し • やり抜く力 • 継続する力  以下の能力は想像よりも重要ではない • 技術力 • 英語力
  • 18.
    © 2023 NTTDATA Corporation 18 開発に貢献する動機は何だっていい  技術力を高めたい  Javaに恩返ししたい  ワールドワイドで活動したい  JVMになりたい  ...
  • 19.
    © 2023 NTTDATA Corporation 19 貢献方法はいろいろある 1. プルリクエストを出す 2. リリース前の機能を試す 3. アイデアを提案する 4. 議論に参加する 5. イベントで登壇する 6. ブログに投稿する 7. ...
  • 20.
    © 2023 NTTDATA Corporation 20 貢献方法はいろいろある 1. プルリクエストを出す 2. リリース前の機能を試す 3. アイデアを提案する 4. 議論に参加する 5. イベントで登壇する 6. ブログに投稿する 7. ... 今日はこれ!
  • 21.
    © 2023 NTTDATA Corporation 21 ところで JVMとかJavaのAPIのバグって よく遭遇しますか?
  • 22.
    © 2023 NTTDATA Corporation 22 普通に使っていてもそんなにバグに遭遇しない  Java APIのバグ JVMのバグ • まったく遭遇したことがない人も多いと思う
  • 23.
    © 2023 NTTDATA Corporation 23 疑問 プルリクエストを出す題材は めったに見つけれらない?
  • 24.
    © 2023 NTTDATA Corporation 24 私もそうでした  当初の考え方: バグを見つけたら修正に挑戦しよう • 機会が運の問題になってしまう  発想の転換: 自分で見つけて直す • どうすれば修正対象を見つけられるか?
  • 25.
    © 2023 NTTDATA Corporation 25 じゃあ 今までと違う使い方を してみよう!
  • 26.
    © 2023 NTTDATA Corporation 26 今までと違う使い方をしてみる  異常系でするようなやり方で使ってみる  使ったことがないもの(API ツール)を使ってみる  異なる条件でビルドして使ってみる
  • 27.
    © 2023 NTTDATA Corporation 27 異常系でするようなやり方で使ってみる  私が修正した例: UL(Unified Logging) -Xlog[:[selections][:[output][:[decorators][:output-options]]]]
  • 28.
    © 2023 NTTDATA Corporation 28 異常系でするようなやり方で使ってみる  私が修正した例: UL(Unified Logging) -Xlog[:[selections][:[output][:[decorators][:output-options]]]] // Java 15以前 $ java -Xlog::::::foo::::::: // とくに警告もなく実行できる 5つ目以降のコロンは無効なので 警告を出した方がいいのでは // Java 16以降 $ java -Xlog::::::foo::::::: [0.003s][warning][logging] Ignoring excess -Xlog options: ":foo:::::::" // 実行はする
  • 29.
    © 2023 NTTDATA Corporation 29 使ったことがないものを使ってみる  ツールやAPI  私が修正した例: jcmd
  • 30.
    © 2023 NTTDATA Corporation 30 使ったことがないものを使ってみる  ツールやAPI  私が修正した例: jcmd ドメイン 内容 VM JVMの実行情報取得 ログ設定など Compiler JITコンパイラ関連 GC ガベージコレクション関連 Thread 現状スレッドダンプのみ JVMTI JVM Tool Interface関連 エージェントのロードなど JFR フライトレコード関連 ManagementAgent JMXエージェント関連 使い方: jcmd <pid> command ドメイン.操作 jcmdはとても多機能
  • 31.
    © 2023 NTTDATA Corporation 31 あれ?この機能ちゃんと動いてない  Java 16以前  実行中にjcmdでULログの設定変更をする  変更が成功したとメッセージが出るが 実際には変更されていない
  • 32.
    © 2023 NTTDATA Corporation 32 Java 16でのjcmdにおけるULログ設定バグ
  • 33.
    © 2023 NTTDATA Corporation 33 あれ?この機能ちゃんと動いてない  Java 16以前  実行中にjcmdでULログの設定変更をする  変更が成功したとメッセージが出るが 実際には変更されていない  そもそもこれは変更できない設定項目 なので成功ではなく 変更しないというメッセージを出すべき
  • 34.
    © 2023 NTTDATA Corporation 34 修正してみた
  • 35.
    © 2023 NTTDATA Corporation 35 Java 17でのjcmdにおけるULログ設定
  • 36.
    © 2023 NTTDATA Corporation 36 異なる条件でビルドして使ってみる  OSやライブラリなどを変えてビルドする  バージョンを最新などに変えてビルドする
  • 37.
    © 2023 NTTDATA Corporation 37 ビルド? OpenJDKって どうやってビルドするの?
  • 38.
    © 2023 NTTDATA Corporation 38 デモ: OpenJDKのビルド
  • 39.
    © 2023 NTTDATA Corporation 39 OpenJDKのビルド[1]  LinuxやmacOSは簡単  Windowsは少し手間がかかるかも • (数年前に一度やっただけでうろ覚え) • WSLでもできる  ネット上に多く関連投稿がある • 日本語でも [1] https://github.com/openjdk/jdk/blob/master/doc/building.md
  • 40.
    © 2023 NTTDATA Corporation 40 異なる条件でビルドして使ってみる  OSやライブラリなどを変えてビルドする  バージョンを最新などに変えてビルドする
  • 41.
    © 2023 NTTDATA Corporation 41 バージョンを最新などに変えてビルドする  私が修正した例 • GCC 10がリリースされたとき GCC 10でビルドしてみた
  • 42.
    © 2023 NTTDATA Corporation 42 バージョンを最新などに変えてビルドする  私が修正した例 • GCC 10がリリースされたとき GCC 10でビルドしてみた In file included from /home/jyukutyo/code/jdk/src/hotspot/share/classfile/systemDictionary.hpp:31, from /home/jyukutyo/code/jdk/src/hotspot/share/classfile/javaClasses.hpp:28, from /home/jyukutyo/code/jdk/src/hotspot/share/precompiled/precompiled.hpp:35: In member function 'void Symbol::byte_at_put(int, u1)', inlined from 'Symbol::Symbol(const u1*, int, int)' at /home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.cpp:55:16: /home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.hpp:130:18: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] 130 | _body[index] = value; | ~~~~~~~~~~~~~^~~~~~~ (omitted) 以前は出ていなかった 警告が新たに3つ出た
  • 43.
    © 2023 NTTDATA Corporation 43 警告の内容を確認する  抜粋 /home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.hpp:130:18: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] 130 | _body[index] = value; | ~~~~~~~~~~~~~^~~~~~~ /home/jyukutyo/code/jdk/src/java.base/share/native/libfdlibm/k_standard.c:743:19: error: 'exc.retval' may be used uninitialized in this function [-Werror=maybe- uninitialized] 743 | return exc.retval; | ~~~^~~~~~~ /home/jyukutyo/code/jdk/src/java.base/unix/native/libnet/NetworkInterface.c:974:13: /usr/include/x86_64-linux-gnu/bits/string_fortified.h:106:10: error: '__builtin_strncpy' output may be truncated copying 15 bytes from a string of length 15 [-Werror=stringop-truncation] 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • 44.
    © 2023 NTTDATA Corporation 44 GCC 10での変更点 GCC 10 Release Series — Changes, New Features, and Fixes https://gcc.gnu.org/gcc-10/changes.html
  • 45.
    © 2023 NTTDATA Corporation 45 どうしても自分で 題材を見つけられないとき 何か他の方法はある?
  • 46.
    © 2023 NTTDATA Corporation 46  JBS(JDK Bug System) [1] バグトラッキングシステムを見てみる [1] https://bugs.openjdk.java.net/projects/JDK/issues/
  • 47.
    © 2023 NTTDATA Corporation 47 JBS  各PRには対応するJBSのイシューがある • というよりも JBSのイシューが先にあり それにPRを出すということ  イシューのラベル starterやclean-up は初級者向け • それらを題材にする
  • 48.
    © 2023 NTTDATA Corporation 48 題材を見つけたとして 誰でも修正できる?
  • 49.
    © 2023 NTTDATA Corporation 49 JavaからC++へ  私の場合 • 社会人歴 ≒ Java Webアプリの運用開発だった • JVMのコードが初C++だった
  • 50.
    © 2023 NTTDATA Corporation 50 誰でも修正できる  言語面はなんとかできる • 他者が書いたコードを直すという意味では普段と同じ  低レイヤに関する知識が要求されることもある • OS CPU メモリ ネットワーク 場合によってはアセンブリ言語 • 調べればなんとかなることも多い
  • 51.
    © 2023 NTTDATA Corporation 51 ところで どういう風に 開発するの?
  • 52.
    © 2023 NTTDATA Corporation 52 エディタ IDE  お好みで 何でもよい  私の場合 • IDEを使っていたこともあったが 今はそのマシンにあるプレーンなエディタを使うだけ • 加えてfindとgrepでほとんどの場合いけてしまっている
  • 53.
    © 2023 NTTDATA Corporation 53 デバッグツール  printデバッグでもほとんどの場合いける  GDB  CLion • JetBrainsのC++用有償IDE
  • 54.
    © 2023 NTTDATA Corporation 54 テスト  jtreg • Javaコードの独自テスティングフレームワーク • JDK用リグレッションテストハーネス  Google Test(gtest) • C++コード用のテスティングフレームワーク
  • 55.
    © 2023 NTTDATA Corporation 55 デモ: jtregのテスト実行
  • 56.
    © 2023 NTTDATA Corporation 56 これで開発は できそうだ…!
  • 57.
    © 2023 NTTDATA Corporation 57 ところで プルリクエストは 英語で出すんですよね?
  • 58.
    © 2023 NTTDATA Corporation 58 英語力  PRにはそれほど必要ない感じ • 高校1,2年の内容が思い出せれば十分そう • DeepL Google翻訳などを活用する  提案 議論では長文が要求される • このときはがんばる
  • 59.
    © 2023 NTTDATA Corporation 59 仕事でPRは書いているけれど… そもそもPRに どんなことを書いたらいいの?
  • 60.
    © 2023 NTTDATA Corporation 60 動くようにする ≠ 大規模OSSでPRをマージまで持っていく  PRはすんなりマージされない • レビューコメントはいくつもつく • やりぬく力がいる
  • 61.
    © 2023 NTTDATA Corporation 61 動くようにする ≠ 大規模OSSでPRをマージまで持っていく  PRはすんなりマージされない • レビューコメントはいくつもつく • やりぬく力がいる  OpenJDKは巨大なプロダクトである • 修正が想像もしなかった部分に影響すると指摘されることもある • 症状 修正方法 テスト内容 を文化が異なる国にいる 初対面のエンジニアに詳細に説明しなければならない  PRで 何度も修正したりより詳しい説明を求められる ことはよくある
  • 62.
    © 2023 NTTDATA Corporation 62 何をしたのか ではなく なぜそうしたのか  すべてをさらけ出すことになる • この点はWebアプリ運用開発のときより厳しさを感じる  バグなら再現手順を確立する • 手順は余分なものを削ぎ落とし 可能な限りシンプルな手順にする
  • 63.
    © 2023 NTTDATA Corporation 63 PRマージのイメージ (Omitted)
  • 64.
    © 2023 NTTDATA Corporation 64 継続しよう  PRを出せば出すほど Javaのことがよりわかる • 同時にまだまだ知らないことがたくさんあることがわかる
  • 65.
    © 2023 NTTDATA Corporation 65 継続しよう  PRを出せば出すほど Javaのことがよりわかる • 同時にまだまだ知らないことがたくさんあることがわかる  何よりもまずコードを書いていこう • 読むだけよりももっと楽しい • そのためにも修正 改善の題材を探すことが重要  やり抜くことを継続すると ふと気づいたとき 思ってもいなかった場所にたどり着いている
  • 66.
    © 2023 NTTDATA Corporation 66 質問 どんなことをしたら コミッタになるの?
  • 67.
    © 2023 NTTDATA Corporation 67 OpenJDKにおけるコミッタの定義  コミッタ認定基準はOSSごとに異なる  OpenJDKの開発者ロール • レビュワ + コミッタで世界に300人+ コミッタ Author コントリビュータ バグ登録権限など 開発者権限を保持 OpenJDKコミュニティにおける開発者ロール レビュワ
  • 68.
    © 2023 NTTDATA Corporation 68  コミッタ = 無条件にすごい ではない • もちろんコミッタにはすごい人も多いけれど  コミッタ = 修正を最後までやり抜き それを何度もやった人 • すごいことをやる必要はない • 言い換えると どんな人にもなれるチャンスがある コミッタってすごいの?
  • 69.
    © 2023 NTTDATA Corporation 69 コミッタ認定の流れ  基準クリア -> 推薦 -> 投票 -> 認定 • 基準: コードに対して意味のある修正を 8回以上実施する • 推薦: コミッタ以上が候補者をメールで推薦する • 投票: コミッタ以上がメールで賛成か反対の票を入れる • 認定: 反対票がなければコミッタ認定
  • 70.
    © 2023 NTTDATA Corporation 70 コミッタ認定の流れ  基準クリア -> 推薦 -> 投票 -> 認定 • 基準: コードに対して意味のある修正を 8回以上実施する • 推薦: コミッタ以上が候補者をメールで推薦する • 投票: コミッタ以上がメールで賛成か反対の票を入れる • 認定: 反対票がなければコミッタ認定  私の場合 • PRが14回マージされていた • 何度かレビューしてくれていた米オラクル社の人から 突然推薦するとメールが来た • 投票を経て2月に認定
  • 71.
    © 2023 NTTDATA Corporation 71 そうは言っても… 1人で全部進められるか 不安…
  • 72.
    © 2023 NTTDATA Corporation 72 メンタになってもらう  OpenJDK開発は多人数 ワールドワイド 英語使用 難解 • 独力でやり遂げられる人は多くないはず - 私はやりたい思いがありつつ 長年始められなかった
  • 73.
    © 2023 NTTDATA Corporation 73 メンタになってもらう  OpenJDK開発は多人数 ワールドワイド 英語使用 難解 • 独力でやり遂げられる人は多くないはず - 私はやりたい思いがありつつ 長年始められなかった  コントリビュート経験者に相談する • このCCCにコミッタ以上のロールを持つ人は何人も来ている • 1度F2Fで話しておけばソーシャルメディアでも相談しやすい
  • 74.
    © 2023 NTTDATA Corporation 74 (私に限らず) 気になったセッションの 発表者に話しかけてみましょう!
  • 75.
    © 2023 NTTDATA Corporation 75 私の場合: JavaカンファレンスとTwitterでのやり取り  後に師匠となる人のセッションを聞き 衝撃を受ける • Javaのことなのにセッションの半分が理解できない  以降 師匠のセッションがあればそのイベントに出向く • 当時関西在住 東京まで出てくる
  • 76.
    © 2023 NTTDATA Corporation 76 私の場合: JavaカンファレンスとTwitterでのやり取り  後に師匠となる人のセッションを聞き 衝撃を受ける • Javaのことなのにセッションの半分が理解できない  以降 師匠のセッションがあればそのイベントに出向く • 当時関西在住 東京まで出てくる  海外カンファレンスで師匠と実際に話す  OpenJDKについてブログ投稿やツイートをすると Twitterで助言をもらえるように  転職し 師匠と同僚になる • メンタになってもらう
  • 77.
    © 2023 NTTDATA Corporation 77 コントリビュートして コミッタになって よかったこと  Javaの歴史に自分も痕跡を残せたうれしさがある
  • 78.
    © 2023 NTTDATA Corporation 78 コントリビュートして コミッタになって よかったこと  Javaの歴史に自分も痕跡を残せたうれしさがある  コミッタ向けイベントに参加できる • OpenJDK Committer's Workshop  OpenJDK開発者と知り合えた • 日本語話者の開発者とも  新しい技術領域に踏み出せた
  • 79.
    © 2023 NTTDATA Corporation 79 まとめ
  • 80.
    © 2023 NTTDATA Corporation 80 見えてきた必要な知識と技術とは  知識も技術もあとからついてくる  やり抜く力と継続する力こそが大切  言い換えればどんな人だって歩き続ければ そこにたどり着ける! • そこはきっと自分が思い描く場所
  • 81.
    © 2023 NTTDATA Corporation 81 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。