😊

機能は追加すればいいというものではない 〜 プラグイン編

2023/06/01に公開

以前書いた機能は追加すればいいというものではないという記事の続きです。

前回の記事を書いた後に、さまざまな反応がありました。そのうちの一つは「プラグインのしくみを作れば解決」というものでした。プラグインとはソフトウェアのさまざまなポイントに、本体を変更せずに外部から機能拡張できるようにするしくみです。本記事ではこのプラグイン機能はそれはそれで大変という話をします。なお、みなさんにはご自身のソフトウェアのユーザをなるべく増やしたいという動機があるものとします。

では本題に入ります。第一にプラグインによる拡張可能なポイント、および、どこまでの拡張を許すかなどの仕様を決めるのが難しいです。変なところを拡張ポイントにしたり、できることが少なすぎたりすると役立つプラグインは作れない、あるいは作りにくいので、せっかく拡張ポイントを作ったのにプラグインが作られないという悲しいことになります。また、拡張の余地を大きければ大きくするほどセキュリティリスクが高まるという問題もあります。

メンテコストも上がります。拡張ポイント自身が一つの機能なので、コードは大なり小なり複雑になりますし、拡張ポイントに対するissue、PRが来たりします。拡張可能ポイントが多ければ多いほどこれらの問題は増えますし、複数のプラグインが干渉し合ってうまく動作しなくなるといった問題も起こります。さらに拡張ポイントの仕様を変えたくなっても既存のプラグイン作者やそのプラグインのユーザが困ることになるて大仕事になりがちです。

さらにプラグインについてのissueが本体であるみなさんのソフトウェアに飛んてきたりもします。ほとんどのユーザは問題が本体にあるのかプラグインにあるのかを区別できません。このたびに「これはプラグイン作者に聞いてくれ」と誘導する必要があります。プラグインの問題か本体の問題かよくわからない場合は問題の切り分けにも時間を食います。

他にも色々つらさはあるんですが、本記事ではここまでにしたいと思います。なお、欠点ばかり書いておいてなんですが、わたしはプラグインのしくみは悪などというつもりはないです。うまく拡張ポイントとインタフェースを作れると非常に強力なしくみです。しかしながらプラグインにはうれしさだけではなくてつらさもあることを本記事によって知っていただけたのであれば幸いです。

Discussion