ボクココ

サービス開発を成功させるまでの歩み

オープンソースと外部 API サービスの利用判断

ども、@kimihom です。

f:id:cevid_cpp:20180318185115j:plain

最近はどんどんと便利な外部 API サービスが出てきている。私たちエンジニアは、それらサービスに乗っかって開発すべきか、それとも自前で構築するか オープンソース(以下 OSS) を使って作るべきかの判断が強いられている。これらの判断について個人的に思うことを記す。

もちろん、開発を全て自前でできればいいに越したことはない。しかし、それにかける時間を考えると、 OSS を利用するか外部APIサービスを利用するかの判断になることだろう。てことで本記事ではこの2つ(OSS or 外部APIサービス)について比較/考察する。

OSS と 外部 API サービスの利用の比較

自社で何かを開発したいって時に、OSS を駆使して実現するって方法がある。この方法はエンジニアにとってはコントリビュートの機会を得られるし、自分が"エンジニアとして成長している"感覚を得ることができる。最新技術に触れながら、サービスも成長していくという意味では理想に近いかもしれない。OSS を駆使してサービス運営している企業は多く見受けられる。

ただし、OSS にどっぷり浸かって開発する方法には以下のようなリスクが存在する。

  • バージョンアップ/メンテナンスを全て自分の責任で行う必要がある。OS やミドルウェアの更新に追従していかなければならない。
  • ソースや仕様を深くまで理解する必要がある。もしバグや課題を見つけたら Github に Issue 投げるよりも自分でコーディングしてプルリクすることが求められる。これは場合によって多くの時間をかける必要が出てきてしまう。
  • 基本的にはOSSのメンテのための担当者が必要になる。最初の流行に乗っかってイケてるライブラリやミドルウェアを導入したはいいけど、担当者がいなくなって誰もメンテ/バージョンアップできなくなってしまったということが起こりうる。

OSS の利用は、気軽に利用できる反面、こうしたリスクがあるので慎重に検討して利用したいところだ。

反対に、外部 API サービスを使えば先述のようなデメリットを解消できる。外部APIサービス側でミドルウェアのバージョンアップや監視は勝手にやってくれるし、ミドルウェアに問題や疑問点が起きればソースを深くまで読むのではなく、そのミドルウェアのプロフェッショナルである外部 API サービス側にサポートを依頼することができる。

テクノロジーにおける"選択と集中"の話になってくるけど、ある技術に対して自分が本当に極めたいコア技術でない限りは、こうした外部 API サービスを使うことを検討してもいいのではないかと思う。

外部 API サービスを利用することのリスク

OSS は完全に無料であるけど、外部APIサービス側は基本的に有料だ。これを高いと見るか安いと見るかは人それぞれだけど、一般的にその技術に対してのサポートがつくと思えば、そのためのスペシャリストを1人雇うことと比べて許せる金額の範囲内であることが多い。

外部APIサービスはソースコードがクローズドになっているため、例えばバグの報告をしたところで外部APIサービスの行動に委ねる必要がある。外部APIサービス側のやる気や勢いがなくなっていれば、問題の修正に時間がかかったり、いつまでたっても問題が治らない問題も起こりうる。そんな状態になってしまったら最初から OSS で自分でソース読んで直した方が早かったってオチになる可能性もなくはない。

また、外部APIサービスの利用料金が高すぎて、他企業の提供する API や自前でOSSを利用した方がよかったってことも起こる。この料金体系も外部 API サービス側に完全に委ねられているので、急に値上げされてしまったり、そのAPI自体がクローズされてしまったということも起こりうる。

これら問題に対応するには、信頼できる外部APIサービスを選ぶしかない。そして、自分(たち)が外部APIサービスに対して重要と思われる存在になることで、より外部APIサービスを有利に仕向けることができるようになる必要がある。

外部APIサービス側にとって重要な存在になることの重要性を説明するために、簡単な例をあげよう。

"Heroku には日本のリージョンがない" という問題がよく挙げられる。Heroku がいつ JP リージョンを全ユーザーで使えるようになるのかってのは、完全に運営側に委ねられている。この点に関して重要になってくるのが、日本の Heroku ユーザーが Heroku にとって重要な存在だと思われることにある。とりわけアジアで Heroku の利用がますます広まっていけば、十分この対応がいつかなされる可能性があるわけだ。

OSS 利用者に関しては Github を通じたコミュニケーションが存在するけど、外部APIサービスの利用者同士でコミュニケーションをとって存在を強くさせていくことが求められる。OSS はコントリビュートすればそれだけ自分の理想に持っていくことができるけど、外部APIサービスの場合は自分たちが外部APIサービス側にとって重要な存在であると思ってくれなければ、彼らを動かすことはできない。

これに関して結局はどのくらいのお金をその外部APIサービスに支払っているかって話で存在の強さが決まる訳なんだけども、1社で存在感を出すにはどうしても限界があるのでコミュニティを通じてみんなの力で重要な存在になっていければいいんじゃないかと思っている。だから、私はそのための行動を OSS のコントリビュートと同じように外部APIサービスのコミュニティ運営をやっている。コミュニティ活動やイベント開催を通して利用ユーザーが密に交流できるようにしている。

終わりに

今回は OSS と外部APIサービスの利用について簡単に比較してみた。

  • 自分でコントリビュート/プルリクするくらいの、"この技術はうちの強みにする" っていう技術は OSS をガンガン使って最新に追従する
  • この技術は 自前で運用は困難/使う必要はあるが自社の強みにするほどでもない って場合には 外部 API サービスの機能やサポートに委ねる

両者をうまく使い分けて適材適所ができるようになるといいんじゃないかな。