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