Carbon と Chronos から見る OSS 運営

19

Transcript of Carbon と Chronos から見る OSS 運営

Page 1: Carbon と Chronos から見る OSS 運営

Carbon と Chronos から見る OSS 運営

CakePHP が Carbon を捨てるに至った経緯

@serima PHP BLT #6

Page 2: Carbon と Chronos から見る OSS 運営

日付/時刻操作ライブラリといえば Carbon?

Page 3: Carbon と Chronos から見る OSS 運営
Page 4: Carbon と Chronos から見る OSS 運営

Carbon との出会いは LaravelLaravel 4.2 を使い始めた時、Carbon を知りました

めっちゃ便利!日付操作簡単!

 DateTime  クラスを継承している

Page 5: Carbon と Chronos から見る OSS 運営

使用例

// 現在時刻$now = Carbon::now();// $now : 2017-02-20 03:32:09

// 明日$now->addDay();// $now : 2017-02-21 03:32:09

// 月末$now->endOfMonth();// $now : 2017-02-28 23:59:59

Page 6: Carbon と Chronos から見る OSS 運営

とても便利だけど、ちょっと違和感

Page 7: Carbon と Chronos から見る OSS 運営

違和感の正体はミュータブル

リリース後最初に作られた issue がミュータブルについて

しかし、今は対応しないということでクローズされる

Ref: Still mutable · Issue #2 · briannesbitt/Carbon

Page 8: Carbon と Chronos から見る OSS 運営

ミュータブルの何が良くないのか

オブジェクトが変更可能 = 複数の状態をとりうる複数の状態を扱う必要

想定外のデータが飛んでくる可能性

バグの温床

Page 9: Carbon と Chronos から見る OSS 運営

バグを生みそうな例

Carbon を使っているとこんな場面はよくあるはず

$now = Carbon::now();$two_hours_later = $now->modify('+2 hours');

このとき、 $now  も  $two_hours_later  も2時間後をさしているあとで、 $now  を使うとき、もはやそれは now じゃない

Page 10: Carbon と Chronos から見る OSS 運営

では、どのように回避するか

 copy()  を使って新たなインスタンスをコピーし、その上で時間操作

$now = Carbon::now();$two_hours_later = $now->copy()->modify('+2 hours');

もしくは

$now = Carbon::now();$two_hours_later = clone $now;$two_hours_later->modify('+2 hours');

どちらもバグが入り込みやすそうな記述

Page 11: Carbon と Chronos から見る OSS 運営

ChronosPHP 5.5.0 から実装されている  DateTimeImmutable  クラスを継承している

CakePHP に v3.2.0 から導入CakePHP はこのタイミングで Carbon を捨てた

Page 12: Carbon と Chronos から見る OSS 運営

使用例

// 現在時刻$now = Chronos::now();// $now : 2017-02-20 07:09:06

// 明日$tomorrow = $now->addDay();// $now : 2017-02-20 07:09:06// $tomorrow : 2017-02-21 07:09:06

// 月末$end_of_month = $now->endOfMonth();// $now : 2017-02-20 07:09:06// $end_of_month : 2017-02-28 23:59:59

Chronos において、 $now  はイミュータブル(不変)

Page 13: Carbon と Chronos から見る OSS 運営

Carbon と Chronos の比較表

nesbot/carbon cakephp/chronos

Requirements"php": “>=5.3.0"

"symfony/translation": "~2.6|| ~3.0"

"php": ">=5.5.9"

Owner briannesbitt cakephp

Stars 5209 295

Downloads 21.59M 513K

Dependents 980 7

Page 14: Carbon と Chronos から見る OSS 運営

時系列

 2012年09月11日  Carbon v1.0.0 公開 (この時点での、PHPのメジャー

バージョンは  5.4 ) 2012年09月12日  Carbon のリポジトリでイミュータブルに出来ないか

という issue が作られる 2013年04月19日  Laravel のリポジトリで Eloquent 内で DateTime の代わりに Carbon を使っては?という提案 issue が作られる 2013年04月20日  Laravel に Carbon が取り込まれる 2013年05月28日  Carbon が取り込まれた Laravel v4.0.0 (php >=5.3.0) が公開 2013年06月20日   DateTimeImmutable  クラスが実装された PHP5.5.0 が公開 2014年04月17日  CakePHP に Carbon が取り込まれる 2015年05月08日  CakePHP コミュニティで Carbon を使うのを止めようという提案がされる

Page 15: Carbon と Chronos から見る OSS 運営

分岐点となった issue

https://github.com/cakephp/cakephp/issues/6509

Page 16: Carbon と Chronos から見る OSS 運営

何が決め手だったのか

Carbon コミュニティの不活発性

バグ修正の遅さ(クリティカルなバグ修正も遅かった)

より良い実装の実現例がイメージできていた

Page 17: Carbon と Chronos から見る OSS 運営

時系列

 2015年10月12日  Chronos v0.1.0 公開 2016年01月02日  Carbon がすべて Chronos に置き換えられたCakePHP 3.2.0‑RC1 (php >= 5.5.10) が公開 2017年01月08日  Carbon needs to be more ACTIVE. という issue がCarbon リポジトリ内で作成される (2016年、1度もリリースがなかった)

 2017年01月11日  @lucammichot が Carbon のメンバーに追加される

 2017年01月15日  1 年 3 ヶ月ぶりに Carbon のマイナーバージョンアッ

プされ 1.22.0 が公開

結果的に Carbon は危機を乗り越えた。今後もメンテナンスは続きそう

だが、イミュータブルな実装を取っていくことはなさそうな気がする。

PHP 5.5 未満をサポートしなくてはならないプロジェクトでもない限

り、Chronos を使ったほうが良いのでは�

Page 18: Carbon と Chronos から見る OSS 運営

いちデベロッパーとしての教訓

スター数が多くても、その時点で適切なライブラリとは限らない

Laravel のような巨大なフレームワークが使用しているライブラリ

だからといって鵜呑みにするのは良くない

違和感を大切にしたい

Page 19: Carbon と Chronos から見る OSS 運営

OSS 運営側としての教訓コントリビュータは大切

いずれメンバーに昇格できるように設計思想や指針などをオープン

にしていく必要がある

適切な権限委譲ができないと、いかにデファクトスタンダードを取

っていても、廃れていく可能性がある

先日、emacs も同じような問題に直面してるという記事も

結局、OSS も人間の集まり ということを認識する