ククログ

株式会社クリアコード > ククログ > Apache Arrowのリポジトリー分割

Apache Arrowのリポジトリー分割

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サービスをどうぞ。