俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #92 - APIとSDKってなんぞって聞かれたので

書くことねぇよ!ちっくしょーーー!!!
あと7回なんだ、年内に100回達成して、そして振り返り、もっといい形にするんだ。
そのためにも、「毎日書こうとするとこういう下らないブログになっちゃうよ」っていうブログも残すことに意味があるんだ。

今日はエンジニアチームではないメンバーからこんなことを聞かれました。
SDKってなに?APIってなに?2つの違いって何?」
こんな厳しい質問あるでしょうか。
調べてみましょう。

SDKは「一般に、特定のソフトウェアパッケージ、ソフトウェアフレームワーク、(略)などのためのアプリケーションを作成するためにソフトウェア技術者が使用する開発ツールのセットを意味する。」だそうです。WikiPedia参照。
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%82%AD%E3%83%83%E3%83%88
APIは「つまり、簡単にいえば、アプリケーションをプログラムするにあたって、プログラムの手間を省くため、もっと簡潔にプログラムできるように設定されたインターフェースの事である。」だそうです、WikiPedia参照。
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9

いらぬ修飾を外してみます。
SDKは「アプリケーションを作成するためのツールセット」だそうです。
APIは「アプリケーションを簡潔にプログラムできるように設定されたインターフェース」だそうです。
「簡潔に」という言葉が定義の根幹に関わるハズがないことと、「プログラムする」は「作成する」と大して変わらんだろうということを前提に、もっとシンプルに削ってみましょう。
SDKは「アプリ作成ツールセット」です。
APIは「アプリ作成できるようなインターフェース」です。
ということらしいです。

どちらも「アプリ作成」のための何からしいですが、
ツールセット」と「インターフェース」の違いはなんですか?という話ですね。
というか、前者はまぁなんとなくいいとして、問題は後者ですよね。
インターフェースってなによ、と。
はい、Wikipediaいってみましょう。
インターフェースは「ものごとの境界となる部分と、その境界でのプロトコルを指す。」(http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9_(%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93))
ということだそうです。
はい、次はプロトコルですね。
プロトコルは「コンピュータ等の電子機器間で通信する際の取り決め。」(http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB
だそうです。

では組み合わせてみましょう。
インターフェースとは、
「ものごとの境界となる部分と、その境界で通信する際の取り決めを指す」ということみたいです。
バッサリ削ってみましょう。
インターフェースは「ものごとの境界部分と、その境界間での通信ルール」です。
もうこれで解決ですね。 SDKAPIの文言にこれを当てはめましょう。
SDKは「アプリ作成ツールセット」です。
APIは「アプリ作成できるようなものごとの境界部分と、その境界間での通信ルール」です。
かなり分かりやすくなりましたね。
API部分をもっと分かりやすくするために、
APIは「アプリ作成できるようなものの境界部分と、その境界間での通信ルール」とします。
アプリ作成というものがちょっと想像つかないので、犬小屋にします。
SDKは「犬小屋作成ツールキット」 APIは「犬小屋作成できるようなものの境界部分と、その境界間での通信ルール」です。
APIが分からん。
「犬小屋作成できるようなものの境界部分」ってなんぞ。
いや、むしろその境界部分こそAPIなわけです。
それが素直に想像できないということは「犬小屋」が悪いんですね。
アプリ作成をもっと身近な例に変えられないでしょうか。
じゃぁもうちょっとプログラムによせるイメージで「ゲーム」にしてみましょう。
SDKは「ゲーム作成ツールキット」
APIは「ゲーム作成できるようなものの境界部分と、その境界間での通信ルール」
あれ?ゲーム作成できるようなものってゲーム作成ツールキットのことでもあるんじゃね?
って思えてきませんか。
ということで、そうしてみます。
APIは「SDKとかの境界部分と、その境界間での通信ルール」
あぁなんかグッと分かりやすくなってきました。
SDKみたいな「機能をもった実体」の境界部分と、その通信ルールのことがAPIなんですね。
「機能を持った実体」はサーバにおいてあるプログラムでもいいわけです。
サーバにおいてあるプログラムへのアクセス境界部分といえば、httpアクセスなわけです。
そのルールって要はURIなわけです。
ということで、APIは「なんかインターネットでアクセスするとjson返してくれるやつ」みたいな感じになるんですね。

なんとなく言葉だけで説明を試みましたが、
やっぱり案外むずいものですね。
現場の境界部分からは以上です。