Flutterのコミットを1ヶ月読んで
この記事はiPresence合同会社 Advent Calendar 2022 の12/1の記事です。
はじめに
1ヶ月ほど前(厳密には11/6)からGitHubのFlutterリポジトリ のmasterブランチに入るコミットを読んでnoteにまとめるという趣味をはじめました。
始めたきっかけは今までFlutterのコードリーディングはしていたのですが、
規模が大きく(FlutterのWidgetの実装,エンジンの実装、コマンドツールの実装etc etc)読み続けるのがしんどい、間があくとそこまで読んできた全体像がぼやけてしまう
などモチベーションの維持が出来なくなってきたため、Ruby on Railsのコミットを毎日読まれているなるようになるブログを参考に
全体のコードを読むことをやめその日に変更された内容だけ読むようにしてnoteにまとめるようにしてみました。
この1ヶ月弱コミットを読んで感じた事わかったことなどを少し書いていこうと思います。
コミットの種類
まず現在masterブランチに取り込まれているコミットにはいくつかパターンがあることがわかりました
そのパターンを紹介します
不具合の修正
これは言わずもがなFlutter全体にある不具合の修正をしたコミットです。
大体がissueに報告された不具合を修正してPRとして提案されたものがmasterに入っていきます
例: Fix iOS selectWordEdge doesn't account for affinity (#115849)
新機能の実装・アップグレード
これはこの1ヶ月だと大きな新機能の実装はありませんでした。
ですがあるWidgetに対して新しいパラメータが追加されかゆいところに手が届く様になったコミットがいくつかありました
デザインの追加・修正
これは主にMaterial Design の最新版 Material3 に対応するためのコミットが多いです。
Material3で新たに追加された要素に対してのWidgetの実装や Material2からデザインが変わった内容の修正だったりします。
個人的にこのパターンのコミットがコードを読んでて一番わかり易いです(Widgetのデザイン対応なため)
例: Add Material 3 support for Slider - Part 2 (#114624)
flutter toolの更新・修正
これは flutter run
などflutterのコマンド周りの追加や修正をしたコミットが主です。
新しいオプションフラグの追加や出力内容の修正など様々な内容がありました。
例: https://github.com/flutter/flutter/commit/ac06523b74ff3368fd5d2b969a92d610545a1a81
CI/testの修正
更新され追いついていなかったテストの修正やciの設定の変更などがコミットされます。
主にCIの調整や特定の条件下で失敗するテストがあった際の条件追加などがあります。
例: [cirrus] Disable outside of tip of tree (#115774)
マージされたコミットの取り消し
masterに取り込まれたコミットを取り消すための修正が入ることがあります。
取り消される理由としてはテストの不備、実装で条件が満たせていない...など様々ですが
実装 → 取消 → 再実装 → 再度取消... など何回かその実装と取消のやり取りが続くことがあって読んでて楽しいです。
読んでいて感じたこと
コミット単位にすることで1度にコード読む範囲を絞れるので理解しやすくなる印象でした。
特に不具合修正などはissueに現在起こっている不具合の手順が示されているので、実際に手元で再現してみて現状を知ってから修正したコードを読むことで
どのような対応を どこのファイルにしたのかが明確にわかります。
また、今まで知らなかったコマンドのオプションやWidget、普段使っているWidgetの便利なパラメータの使い方なども知ることができる機会があり
普段コードを書くだけではわからないことを読むことで知ることもできました。
まとめ
みんなOSSのコードを読んでみよう。
特にユーザが多いOSSはメンテナンスが行き届いていてコードもきれいな状態が保たれていることが多いので
自分のコードを見直すいい機会にもなったり、今まで知らなかった使い方に出会えるかもしれません。
あわよくばそのままOSSへコントリビュートしてみるのもいいかもしれませんね(いつかやりたいと想いつつ私はまだできていない...)
自分のわかるところできるところからコードリーティングをはじめてみませんか?
明日はiPresence CTO の太田さんによる「PythonでGstreamerを使うためのOpenCV4.6.0のBuildについて」です。お楽しみに