『突然動かなくなった!』外部サービス利用による不具合発生リスクの理解を深める

デザインのあれやこれ

Posted on 2015/12/20 by Kentaro

『突然動かなくなった!』外部サービス利用による不具合発生リスクの理解を深める

今まで問題なく動いていたものが突然不具合を起こした…という現象は、ITシステム全般・特にWebの場合は顕著に見られます。 何故このような現象が起きるの?その原因のひとつ『外部サービスが更新された為』に焦点を当てて書きました。

『このページの◯◯◯が突然おかしくなったよ!』
…というのは、Webサイト運営では頻繁にあるあるな話だと思います。つい先日も発生して『またきたか』とシブい思いをしたところです…とほほ。
こういった事は制作会社勤務の時代にもよく体験しましたし、Webに限らずITシステム関係の知人からもよく似たような話を聞きます。

今まで問題なく動いてた(表示されていた)ものが、どうして突然動かなくなったのか。
作った人が手を抜いたのが原因?いえ実際には、天才プログラマーが抜かりなく組んだとしても起こりうることなんです。

その原因のひとつとして挙げられる『組み込まれた外部サービスの仕様が突然変わったため』という点について、主にWordPressを例に挙げて書いてみようと思います。

現在のwebは多数の外部システムの集合体

現在のwebは多数の外部システムの集合体

最近のブログ記事やページの端っこにはほとんど、facebookやtwitter・Google+やはてブ等のボタンが表示されていますよね。
その他にもfacebookのライクボックス(サイトオーナーのfacebook記事や、いいね!を押した人の一覧が表示されるアレですね)があったり、ページの一部にGoogleマップが表示されてて、お店の位置や駅からのルートまで表示されているものもあります。通販ページでは様々な決済サービス(WebMoneyやPayPalなど)の機能がついていますし、Instagramに投稿した写真が表示されているものもありますね。

これらは、一部分だけ外部のサービスの機能を借りて表示しているものなんです。

大手のSNSは大体こういう機能を提供してくれていますので、ある決められた仕様に従って利用すれば、自身のサイトにfacebookやtwitter等の外部サービスの機能の一部を組み込んで連携させることが可能になります。
これらのサービスはそれぞれ独自の組織が開発・運営をしているもので、そのシステムや仕様はその組織が独自に設定・変更をしていきます。

これら外部サービスの仕様変更が行われた際に、連携に不具合が生じる可能性があるんです。

噛み砕いて説明してみると、

facebook『abcという機能を提供しています。call-abcというプログラムで呼び出して使います。』
Web制作者『call-abcというプログラムをサイトに組み込んでみよう・・・よしfacebook投稿がサイト内に表示されるようになったよ!』

(後日突然)

facebook『abcdeとという機能にアップデートしました。call-abcdeというプログラムで呼び出すよう変更しました。』
〜Webサイトにエラー表示〜
Web制作者『えっ、エラーってどういうこと!?』

こんなカンジでしょうか。
利用していた外部サービスが何らかのアップデートを行った際、使い方等の仕様が変更されたため、連携に不具合が生じるという現象があるんです。
この手のアップデートは基本的に予告無しで行われる事が多いので、利用者側は『突然おかしくなった!』と感じてしまいますね。

この手の不具合を回避する方法は?

この手の不具合を回避する方法は?

様々な組織がそれぞれ独自に開発・提供しているサービスを同時に使用する限り、この手の不具合はぶっちゃけ避けられないものです。

一応、このような外部サービスを一切使用せずに、独自のシステムを構築するという手段はあります。しかし、イチからフルスクラッチですべて開発するとなると、当然コストは爆発的にハネ上がります。
WordPressのようなブログシステムを開発するのであれば、簡単な基本のブログシステムだけで軽く数十万〜百万以上はコストがかかります。インターフェースや汎用性まで全て実装させようものならコストは計り知れませんよね。もちろん、開発期間も相当長いものになってしまいます。
あまりにコストがかかりすぎる為、よほど余裕のある=数百〜数千万の予算と半年〜一年以上の開発期間を設けられる、そんなケースでない限りは現実的じゃありませんよね。

結局、現実的にとりうる手段としては、以下のようなものが挙げられるんじゃないでしょうか。

複数の外部システムを同時に使用することはなるべく避ける

連携するシステムが多くなればなるほど、不具合が発生する可能性は高くなっていきます。
WordPressでいえば、プラグインが1〜2個の状態なら競合もほとんど起こりません。しかし10個も20個も入れたとなると、もういつシステムが動かなくなっても不思議じゃありません。(むしろ怖くてできませんよ!)
不要なプラグインを入れないことはもちろんですが、ものによっては複数の機能を1つのプラグインで実装してくれるものもありますので、なるべくそちらを利用して、プラグインの数を減らしていきます。このようにして、競合による不具合発生の可能性を減らしていきます。

手軽に作れるものなら作ってしまう

外部サービスやシステムを利用せずとも実装できるものなら、なるべく自身で制作して実装する方が安全です。
WordPressならプラグインを利用して機能を実装してしまうのが手軽で早いのですが、本体がアップデートされた後にプラグイン側がアップデートされず、それが原因で不具合が発生するという現象はなるべく避けたいものです。
functionsにコードを記載することで実装可能なものならば、コードで実装させた方が安全です。アップデートによる本体〜プラグイン間の不具合や、他プラグインとの競合も避けられます。また、例えばテスト環境から実稼働サーバへ移動する際や、サーバ移行をする際に、余計なプラグインが無いため移動が楽になります。これは地味に見えて、かなり便利で安心できます。

そもそも機能を省く

本当に必要な機能を省いちゃダメですけどね。
よくありがちなのが、もっと便利にしようもっと凄くしようと、様々な機能をゴテゴテとつけてしまい、システムを複雑化させてしまう事です。複雑化するほどに競合や不具合の発生する確率が高くなっていきます。ついでに運用も複雑化して利便性が落ちてしまいます。
運用するうえで本当に必要な機能だけに的を絞り、シンプルなシステムを組めば不具合発生率も下がり、安定した運用が見込めます。システムに限らずデザインも、ゴチャゴチャと煩雑なものは長い目でメリット少ないよって思いますね。

得られるメリットの対価として捉える考え方

得られるメリットの対価として妥当なものと捉える考え方

これは、デメリットだけを見れば厄介なもののように感じますが、得られるメリットの対価として考えれば非常にオトクなものなんですよね。

従来の『(webサイト等の)システムを作るには膨大な技術と時間・コストがかかる』という問題を解決するために、『安価(または無償)で提供されている外部サービスを利用してコストダウンを図る』という手段を取り入れたものです。その結果、ある一定の動作検証がなされて安定した稼働が見込めるシステム(サービス)を、安価または無償で利用し、大幅なコストカットを実現させています。その副作用が、先に紹介したような一部アップデートによる動作不具合発生等のリスクなんです。

このメリットとデメリットを天秤にかければ、メリットのほうがずっと大きいですね。本来なら数十〜数百万の予算と長い開発期間をかけてやっと完成するシステムを、安価にしかも早く手に入れられるんですから。

便利な外部サービスを利用する際は、安価で大きなメリットを得られる対価と捉えてリスクを把握し、対処の心構えをしておくことが大切だと思います。

Thank you for reading! 読んでくれてありがとう!