4.9K Views
October 25, 24
スライド概要
JJUG CCC 2024 fallのセッション資料です
ミニチュアシュナウザーです。
ハッシュタグ: #jjug_ccc #jjug_ccc_f ソースコードの読み方を理解 してコーディングを楽しむ (20分セッション、入門者向け) JJUG CCC 2024 fall つりーべる @tada_suzu
ハッシュタグ: #jjug_ccc #jjug_ccc_f 自己紹介 • 生まれつきの難聴者 • 発音が不明瞭なところがあったら申し訳ありません • 話すことはほぼスライドに書きました。 • 2002年4月 某Sier入社 • 2024年5月 某Sier退職 • 2024年5月 金融サービス会社に入社 転職したばかりなので、これからお話しすることはほとんど前職 の経験から思ったことがベースになっています。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 最初にお詫び セッション概要に書いたことは 主語がでかすぎたかも・・・ 20分セッションなのでお昼ご飯何に しようかなと考えながら気楽に聞い てください。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 質問とかご意見は 20分しかないので時間内のQAタイムは無しです。 質問、ご意見ありましたら、ハッシュタグ(右上 に記載)を付けてX(旧Twitter)でつぶやいてく ださい。あとで確認して回答します。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 話すこと • 「ソースコードを読む」とは • 「ソースコードを読む」手順 • 個人的に読んでほしいソースコードの紹介(紹介したいだけ) • Stringクラス編 • StringUtils編 • まとめ ※20分セッションなのでかなり端折っています。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 話さないこと フレームワークのソースを読んで完 全に理解する方法 例えばSpringフレームワークを完全 に理解するには、どんな考え方・方 針で作られているのかも知る必要が ある。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 最終的なゴール 明日からちょっとだけいろいろな ソースを読んでみようかなと思って もらえること
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」きっかけ • お仕事で、これから作る機能のサンプルとして紹 介された。 • 仕事、または趣味でプログラムを書いていて、こ れから呼ぼうとしているこの処理ってなにをする んだろう?と疑問に思った。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」きっかけ • プログラミングしてテストをしたらエラーが出て、 原因究明のために泣きながら読んでいる。 • 読書っぽい流れで、時間があるからちょっとプロ グラムを読んでみようと思った。 きっかけはいろいろ
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」とは ざっくり言うと・・・ ※個人の見解です
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」とは • このプログラムはどんな役割なのかを知る。 • どんな機能(≒メソッド)があるのかを知る。 ⇒自分がこれから作る、直す機能を実装するため に必要な情報を得る。 ⇒情報を得ることで、コーディングを楽にする。 (欲しかった機能、情報がないことがわかって頭を抱えることもある)
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」とは 「仕様を知りたいならググって出てくるAPI一覧のページと か、ドキュメントを読めば十分では?」 ⇒それはそう。 ただ、コーディング中にブラウザを開いて検索するのは面倒。 すぐそばに仕様がわかるソースがあるのだから、それを読ん だほうが早い。(こともある) 見つけたドキュメントの記述が不十分で、ソースコードを読 まざるを得ないこともありますね・・・。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」とは 今、目の前にあるプログラムが「本来想定している仕様」と は限らない。 ソースコードから得られるのは、あくまでもいま動いている 状態の実装だけであることに注意は必要。 ⇒バグってるかもしれない。 ⇒動きが変だな?と思った時もソースコードを読む。 ⇒黒魔術を使っていない限り、普通のJavaプログラム。 (読むのが辛いプログラムもあるけど…)
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」手順 シンプルに考えると・・・ 1. GitHubなどをブラウザで開いて、ブラウザからソースコードを読む。 2. GitHubなどからソースコードをダウンロードして、メモ帳、サクラエ ディタなどで読む。 3. GitHubなどからソースコードをダウンロードして、慣れているIDE (Eclipse、IntelliJ IDEA、 Visual Studio Code、NetBeans・・・)で読む。 ⇒1や2は面倒くさい大変なのでお勧めできない。 3のIDEで読むのがお手軽。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」手順 1. IDEでプロジェクトを開く。 • 直近の開発はMavenとかGradleで管理されているはず 2. 読みたいソースコードをIDEの機能を使って開く。 3. ソースコードの中で使われているメソッドや呼ばれているクラス を開いていく。 ⇒普段の開発でソースコードを読む手順と同じ。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」手順 外部から呼ばれる、publicなメソッドを優先して読んでいきましょう。 publicなメソッドで大体どんなことをしているのかがわかれば、やっ ていることの大枠は掴めるはずです。 privateなメソッドは後回しにしましょう。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」手順 開発中に、Javaそのもの(StringクラスとかArrayListクラスとか)や 各種ライブラリの実装を読むときも手順はそんなに変わらない。 • Javaのソースは基本、インストール時に一緒についてくる。 • 各種ライブラリのソースはMavenリポジトリなどからライブラリを ダウンロードする時に一緒についてくる。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」 基本、読むための準備は難しくない。 必要なのは、読んでみようと思う勇 気、気持ち、最初の第一歩。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」手順 一気に全部を把握しようとしない。 まずは自分が知りたいメソッドの動 きを把握できればOK、くらいの気 持ちでよい。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」手順 興味がわいてきたら他のクラス、メ ソッドも読んでみる。 よくわからない処理(黒魔術系)が あったらすぐに撤退する。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 「ソースコードを読む」手順 ライブラリ系ならJavaDocコメント も参考になります。 英文はChatGPTに渡して翻訳して もらいましょう。
このへんで10分経過してるは ず? ハッシュタグ: #jjug_ccc #jjug_ccc_f
ハッシュタグ: #jjug_ccc #jjug_ccc_f 個人的に読んでほしいソースコードの紹介 みんなお世話になるjava.lang.Stringクラスはおすすめ • 行数:約5000行 • publicなメソッドの数:70から80 • JavaAPIサイトの記述を読めば、大体のメソッドは仕様が把握 できる。
ハッシュタグ: #jjug_ccc #jjug_ccc_f 個人的に読んでほしいソースコードの紹介 みんなお世話になるjava.lang.Stringクラス とはいえ、5000行は長すぎる・・・。 ⇒まずは気になるメソッドから読んでいけばいい。 例として、文字が設定されているかの判断に使えそうな、 isBlank()メソッドとisEmpty()メソッドを読んでみましょう。
ハッシュタグ: #jjug_ccc #jjug_ccc_f Stringクラスをチョット読んでみる まずはStringクラスのAPIを読んでみよう。 String (Java SE 21 & JDK 21) (oracle.com) なるほど、仕様を完全に理解。
ハッシュタグ: #jjug_ccc #jjug_ccc_f Stringクラスをチョット読んでみる JJUG CCCに参加されるような Javaエンジニアとしては実装が 気になりますね? (もう読んだ、とか言わない)
ハッシュタグ: #jjug_ccc #jjug_ccc_f Stringクラスをチョット読んでみる まずはisEmpty()メソッドから。 とてもシンプルなメソッド。
ハッシュタグ: #jjug_ccc #jjug_ccc_f Stringクラスをチョット読んでみる 次にisBlank()メソッド。 indexOfNonWhitespace メソッドって何???
ハッシュタグ: #jjug_ccc #jjug_ccc_f Stringクラスをチョット読んでみる 謎のindexOfNonWhitespaceメソッドは・・・ なんかまだメソッドがある ⇒面白そうですよね???? 読み進めていくだけで 20分は溶けそうなのでこの辺で。
ハッシュタグ: #jjug_ccc #jjug_ccc_f Stringクラスをチョット読んでみる isEmpty()メソッド、isBlank()メソッドはなんか便利そう。 ⇒致命的な欠点が! NullPointerException
ハッシュタグ: #jjug_ccc #jjug_ccc_f Stringクラスをチョット読んでみる isBlank()メソッドやisEmpty() メソッドを安全に使うには、 nullかどうかの判定を自分で 行わないといけない。 ⇒面倒くさい!
ハッシュタグ: #jjug_ccc #jjug_ccc_f NullPointerExceptionの対策 NullPointerExceptionの対応にみんな大好き、StringUtils.java。 とりあえずStringUtils.javaのisBlank()っぽいメソッドを探そう。 ⇒どうやって探すか? ① Googleでググる。 ② ChatGPT先生に聞く。 ③ IDEからソースを読んで探す。 ⇒コーディング中だったら、手っ取り早いのはもちろん③ですね? (今は②かも・・・)
ハッシュタグ: #jjug_ccc #jjug_ccc_f StringUtils.javaをチョット読んでみる StringUtils多すぎ問題。
ハッシュタグ: #jjug_ccc #jjug_ccc_f StringUtils.javaをチョット読んでみる org.apache.commons.lang3.StringUtils なるほどねー。
ハッシュタグ: #jjug_ccc #jjug_ccc_f StringUtils.javaをチョット読んでみる io.micrometer.common.util.StringUtils ちょっと違う。 (そもそも普通はこのパッケージのStringUtilsは使わないはず) ※SpringBootを使うと付いてくる。 Apache commonsと同じメソッド名なので import文をミスりがち
ハッシュタグ: #jjug_ccc #jjug_ccc_f StringUtils.javaをチョット読んでみる org.junit.platform.commons.util.StringUtils とてもシンプル! ただし、パッケージがjunit。 このクラスもメソッド名がapache commonsと同じ なのでimport文をミスりがち
ハッシュタグ: #jjug_ccc #jjug_ccc_f StringUtils.javaをチョット読んでみる org.springframework.util.StringUtils ⇒isBlankメソッドはない。isEmpty()メソッドはあるが… 違うメソッドを使ってね、 と案内がある。
ハッシュタグ: #jjug_ccc #jjug_ccc_f StringUtils.javaをチョット読んでみる org.springframework.util.StringUtils ⇒違うメソッドを使ってね、と誘導されたhasLength() とてもシンプル!
ハッシュタグ: #jjug_ccc #jjug_ccc_f StringUtils.javaをチョット読んでみる Nullまたは空文字の判定をするだけならどの StringUtilsクラスを使ってもよい。 たいていは他に使いたいメソッドがあるかどうかで 使うStringUtils.javaが定まってくるはず。 独自で作りたいメソッドがあるなら、独自の StringUtils.javaを作るのも一つの方法。 ⇒StringUtils.javaの実装を読んだからできる判断
ハッシュタグ: #jjug_ccc #jjug_ccc_f ちょっとしたぼやき 個人的には、NULL対応で標準でjava.lang.Objects クラスを用意してくれるんだったら、NULL対応 をしたjava.lang.Strings も用意してほしい! ※Objects.isNull()メソッドとか普通に使ってます よね・・・?
ハッシュタグ: #jjug_ccc #jjug_ccc_f ちょっとしたぼやき 参考) Objects.isNull()メソッド 個人的には 「== null」を書かなくていいので好き
ハッシュタグ: #jjug_ccc #jjug_ccc_f そろそろまとめ ちょっとソース読む面白さがわかってきた頃 残念ながら時間が迫ってきているはず
ハッシュタグ: #jjug_ccc #jjug_ccc_f まとめ • 他の人が書いたソースコードを読むとこういう書き 方もできるのかと視野が広がる。 • ライブラリの特定のメソッドの実装を知っていると、 メソッドを使うときの注意点もわかる(かも) • この実装は便利だけど、ライブラリそのものは使う ほどじゃないな、というときにおいしいところをつ まみ食いしたオレオレUtilsを作るという発想も出 てくるかも • Utilsという言葉はあまり好きじゃないけどいい用語がない
ハッシュタグ: #jjug_ccc #jjug_ccc_f まとめ • Javaエンジニアとして楽しむには好奇心が大事。 • もちろん好奇心で中をのぞいたら闇なときもある。 • 辛くなる前に勇気ある撤退も時には視野に。 • 一度に全部把握しようとは思わないで、少しずつ読んでい けばOK • ソースコードを読んで何か面白い発見をしたらぜひ次の JJUG CCCに応募を! • 今日10/27も「ArrayListの仕組みと実装」の話がありますね。
ハッシュタグ: #jjug_ccc #jjug_ccc_f