こう 聞かれます
- 「API の
バージョンと 後方 互換性を どう 保ちますか」 - 「API の
項目の 名前を 変えたくなったら、 どう 進めますか」 - 「スマホアプリの
古い 版が 残っていると、 何が 困りますか」
面接官が 見ている点
- どの
変更が 互換を 壊すか (破壊的変更) を、 具体的に 分けられるか - 版を
分ける 方法 (住所の /v1/、ヘッダー) と、 それぞれの 向き不向きを 知っているか - 古い
版を いきなり消さず、 知らせて、 使われていないのを 確かめてから 閉じる、という 手順を言えるか - スマホアプリは
古い版が 長く 残るので、 更新を 促す仕組みも 要る、 と分かっているか
短い答え
- まず、
項目を 足すだけの 変更で 済むよう 設計し、 既存の 項目を 消す、 名前や型を 変える、といった 互換を 壊す変更は 避けます。 - どうしても
壊すときは、 住所 ( /v1/と/v2/) やヘッダーで 版を 分け、 しばらく 両方を 動かして 利用者に 移って もらいます。 - スマホアプリは
古い版が 残り続けるので、 古い版を 閉じる 前に、 更新を 強く 促す仕組みを 用意して おきます。
少し 詳しい答え
互換を 保つ変更と壊す変更
後方
- 互換を保つ応答に
新しい 項目を 足す、 受け取る 項目に 省略して よい 物を 足す、 新しい 住所を足す - 互換を壊す項目を
消す、 名前を 変える、 型を 変える (数を 文字列に する など)、 省略して よかった 項目を 必須に する、 エラーの 形を変える
たとえば、name を fullName に
JSON
{
"id": 7,
"name": "山田 花子",
"fullName": "山田 花子"
}呼び出し側が fullName にname を
版の分け方
壊す変更を
http
GET /v1/users/7
GET /v2/users/7住所に
古い版を 閉じる 手順と トレードオフ
古い版は、
- 新しい
版を 出し、 古い版は 「いつ閉じるか」を 文書や 応答の ヘッダーで 知らせます - 古い
版への 呼び出しの 数を 記録で 見て、 誰が まだ 使っているかを 確かめます - 使う
人が ほぼいなくなってから閉じます
スマホアプリは、
版を
話すときは、
よく ある間違い
- 項目の
名前を いきなり変える 古い 呼び出し側が、 その 日から 落ちます。 しばらく 両方を 返して 移って もらいます - 小さな
変更でも 毎回版を上げる 動かす版が 増えて 手間がかさみます。 足す変更で 済むなら それで進めます - スマホアプリの
古い版を忘れる 更新しない 利用者が 残るので、 更新を 促す仕組みが 無いと、 古い API を いつまでも 閉じられません
深掘りの問い
- 「必須でなかった
項目を 必須に したいときは」まず 省略された ときの 既定の 値を サーバーで 決めて 受け入れ、 呼び出し側が 送るようになってから 必須に する、と答えます - 「エラーの
形を 変えたいときは」エラーの 形も 約束の 一部なので、 壊す変更として 扱い、 版を 分けるか、 両方の 形を しばらく 返す、と答えます - 「誰が
古い版を 使っているか、 どう 調べますか」 呼び出しの 記録に 版と 呼び出し元 (API キーや アプリの 版) を 残し、 数を 見て 決める、と答えます