Apache Arrowの開発に参加している須藤です。現時点でapache/arrowのコミット数は1位です。私はRubyでデータ処理できるようになるといいなぁと思ってApache Arrowの開発に参加し始めました。同じような人が増えるといいなぁと思うので、最近の活動を紹介して仲間を増やそうと試みます。
今回はapache/arrowリポジトリーでやっているリポジトリーの分割について紹介します。
背景
Apache Arrowはいろんな言語で使える!というのもウリの一つなので、たくさんの言語での実装があります。もともとapache/arrowリポジトリー内に各種言語の実装があったのですが、最近はそれを言語ごとに別のリポジトリーに分割しはじめています。
別のリポジトリーへの分割は最近になって始まったことではありません。2021年にRust実装をapache/arrow-rsに分割したり、Julia実装をapache/arrow-juliaに分割したりしてきました。しかし、それらは開発スタイルの違いが分割の理由で、最近の分割の理由とは違いました。
それから数年は分割していませんでしたが、この1-2年でまた分割が始まっています。Go実装とJava実装は分割済みで、C#実装とJavaScript実装が分割中で、Swift実装はもうしばらくすると始まる予定です。
分割の理由
以前の分割の理由は開発スタイルの違いでしたが、最近の分割の理由はリリースです。具体的には次の2つの点が重要です。
- apache/arrowのリリースコストの削減(リリース対象が減るとリリースが楽になる)
- 分割対象の実装のメジャーバージョンアップを減らしたい
前者は、「まぁ、やることが増えれば大変になるのはそうだよね。。。」というのでなんとなくわかると思うので追加の説明はしませんが、後者は少し補足します。
apache/arrowは3-4ヶ月に1回のペースでメジャーバージョンアップリリースをしています。毎回メジャーバージョンアップなのは「今の開発ペースだと3-4ヶ月も開発すれば非互換な変更はまず入っているよねー」という判断からです。apache/arrowはセマンティックバージョニングを採用しているので、非互換な変更が入っている場合はメジャーバージョンアップにしなければいけません。
apache/arrowのすべての実装は同時に同じバージョンでリリースしているため、少なくとも1つの実装に非互換の変更があるとメジャーバージョンアップをしなければいけません。たとえば、C++実装には非互換があったけどC#実装には非互換がなかった、という場合でも、C#実装もメジャーバージョンをあげないといけません。
セマンティックバージョニングを採用している場合、メジャーバージョンアップをすれば非互換の変更でも許される(?)という考えをしている人がいる気がしますが、現実はそうではありません。非互換の変更があると多くのユーザーは困ります。頻繁にメジャーバージョンアップを繰り返すと、ユーザーは変更に追従できなくなり、古いバージョンを使い続けたりします。実際は非互換のないメジャーバージョンアップでも、メジャーバージョンアップに身構えるユーザーは多いです。
そのため、不要なメジャーバージョンアップはできるだけ避けたいのです。
実現方法
apache/arrow内で各種実装が同居したまま別々にリリースできるようにすることもできますが、いろいろ面倒そうだったので、リポジトリーを分割して各実装ごとに独立して管理・リリースすることにしました。
各実装ごとに似たようなCIやらissue/pull requestテンプレートやらを整備しないといけないとか面倒なところはありますが、考えることが減ってシンプルな実装になりやすいので、まぁ、割に合っているとは思っています。
まとめ
最近取り組んでいるリポジトリーの分割を紹介しました。リポジトリーの分割はまだまだ道半ばでやることはたくさんあります。Apache Arrowの開発に興味がでてきた人はRed Data Toolsのチャットに来てください。その人に合わせてどのあたりからやるとよさそうかを提案します。
それはそうとして、apache/arrowコミット数1位の私にApache Arrow関連のサポートを頼みたいという場合はクリアコードのApache Arrowサービスをどうぞ。