BEAR.Sundayはロマンチックではなくセマンティック

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940/cfbec15d-d3dc-a57c-a090-313267ec0ba4.png" alt="bear sunday" width="50%">

2023年12月24日、今日はクリスマスイブ🎅🎄⭐です。

今年のクリスマスイブは日曜日、ホリデー、(BEAR)"Sunday"です！一年で一番ロマンチックなこの季節、皆さんも素敵でロマンチックな一日をお過ごしでしょうか。

しかし、この記事ではBEAR.Sundayはロマンチックでなく、セマンティックというお話をします。

## Semver

BEAR.Sunday 1.0のリリースは2014年。来年で10年を迎えます。

この1.0のリリースの時に、強い思いで決めていたことがありました。それは破壊的変更(Breaking Change)を行わないということです。

[セマンティック バージョニング](https://semver.org/lang/ja/) に従えば、破壊的変更が取り込まれた場合、メジャーバージョンを上げなければなりません。つまりこの先にメジャーバージョンを上げない。例えば "BEAR.Sunday 2.0" や "BEAR.Monday"がもし出ることがあれば、このプロジェクトは部分的あるいは全面的な失敗だとまで考えました。

BEAR.Sundayはずっと1.xでいるということですが、これは進化をしない事を意味している訳ではありません。破壊をしないということです。それにはアイデアや技術が必要ですが、それ以上に良い制約が必要です。

メジャーバージョンアップはお祝いではなく、失敗だと考えるマインドセットが最初からありました。

## Romver

[Nils Adermann](https://twitter.com/naderman)氏と[Jordi Boggiano](https://twitter.com/seldaek) 氏によって始められた"composer"が最初に [1.0.0-alpha1](https://github.com/composer/composer/releases/tag/1.0.0-alpha1) としてリリースされたのは2013年3月です。composer.jsonによる依存パッケージのバージョンニングはsemverを前提としています。 例えば `~1.0`のバージョン指定は破壊的変更の行われる`2.0` 以上のパッケージのインストールは行わないというものです。

ところがcomposerのリリースから数年が過ぎてもこれに従わないパッケージはそんなに珍しいことではありませんでした。例えば [Michael Dowling](https://twitter.com/mtdowling)氏の開発した[Guzzle](https://docs.guzzlephp.org/en/stable/#)はかつてそうでしたし[^0]、他のフレームワークの多くもそうでした。[^1][^2][^3]

[^0]: https://github.com/guzzle/guzzle/issues/350
[^1]: https://x.com/taylorotwell/status/698146203540664321
[^2]: https://x.com/taylorotwell/status/1184090836943998976
[^3]: https://github.com/rails/rails/issues/9979#issuecomment-44596397

では、semverに従ってないバージョンは何を表すのでしょうか？ 最初の数字の意味は何でしょうか。

## Romantic ?

Semverに従わず、X.Y.ZのYの変更で破壊的変更を行うバージョニングを『[ロマンティック バージョニング](https://github.com/romversioning/romver)』 と呼びます 😅[^sentimental]

[^sentimental]: 他に『[センチメンタルバージョニング](https://news.ycombinator.com/item?id=24751264)』 という呼び方もありました。😅

しかしバージョン管理をする側からすると、パッケージ毎でバージョンの数字の意味が違うのであれば、それは全然ロマンチックな話じゃありません。どのバージョンがセマンティックで、どれがロマンティックなのかを把握してそれぞれに応じてバージョンアップを管理して、行わないと破壊的変更が取り込まれ既存のソフトウエア動作が壊れてしまいます。

## Jordiさんに直訴?

<figure>
<img src="https://scontent-nrt1-1.xx.fbcdn.net/v/t1.18169-9/13718642_489160914607394_2172248677958349745_n.jpg?_nc_cat=104&ccb=1-7&_nc_sid=7f8c78&_nc_ohc=TK9H71DrL90AX_DGoXm&_nc_ht=scontent-nrt1-1.xx&oh=00_AfD5gvVur2Og7eLgknFNG0DzhRNs36fNIbDypNDqv8Ll8w&oe=65AE8761" width="50%">
<figcaption><br />(これでしょとBEAR.Sundayご存知だったJordiさん)</figcaption>
</figure>

composerの作者、Jordiさんが2016年に来日した時 [^jordi] に「Semverに従うのが理想であってもRomverを使うパッケージがある現実がある以上、それに対応する必要があります！」みたいな話をして、自分の使ってるバージョニングはセマンティックなのかロマンチックなのか宣言すれば良いのでは、とこのような"versioning-type"の仕様を提案をしました。

[^jordi]: https://techplay.jp/event/593477

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="en" dir="ltr">My question is that how do we know which framework (or library) follows which versioning ? Romantic versioning gives little value for the dependency management ?</p>&mdash; Akihito Koriyama (@koriym) <a href="https://twitter.com/koriym/status/997368037358518273?ref_src=twsrc%5Etfw">May 18, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<img src="https://pbs.twimg.com/media/DddeBt0VMAE6Xm5?format=jpg">

しかし「composer.jsonのバージョニングはsemver前提だ！」 と却下されました。（当然）

## 非破壊的進化

BEAR.Sundayはバージョン1.xのままです。破壊的変更をしないという約束はこの10年守られました。

どのように守ったのか？

PHPのメジャーバージョンアップ、サポートPHPバージョンのドロップ、全体をロックしないバージョニング、追加機能、使わなくなった機能、複雑性、リファクタリング、テストや静的解析、型システムの変化

どのようなマインドセット、アイデア、技術で対応して、非破壊的な変更を避け進化可能性（evolvability）を保ったのか...次回の記事に続きます。

それでは皆さん、セマンティック、じゃなくてロマンチックな週末をお過ごしください。Merry Christmas！🎄✨

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940/a4f3fb4a-b905-6e11-749f-b394ce4f04bc.png" alt="bear in snow" width="80%">

P.S.
ところで、ロマンチックだったら"セマンチック"でも良いと思うのですが？？