2014-08-21 (Thu)
#mozaicfm REST を聴いての感想
mozaic.fmでRESTの回が企画されているということを、API Meetup #1 のときに yohei さんから直接聞いていたのですが、ついにそれが公開されたので、喜び勇んで聴きました。
断片的に感想をツイートしたので、そのまとめです。
RESTの何が重要なのか
さすがの t_wada さん。アーキテクチャとしてもそうだし、アプリケーションフレームワークも「適切な制約」を設けることで設計のコストが下がる、という話の流れでした。
“Constraints are liberating”「制約は自由をもたらす」は僕が好きな言葉ですが、これを知ったのはDHHのRubyKaigi 2006の講演からです。(初出はどこか別のところなのかも?)
RESTの流行
「RESTは流行りすぎて、何でもREST前提、Web前提の考え方に縛られていた面がある」流行ったのはよかったけれど、流行りすぎてバズワード化したことで、ただJSON返すだけなのをRESTと呼ぶようになった面もあり、悩ましいです #mozaicfm
原理主義者的発言をするなら、「REST API」と謳って世に出たWeb APIはただのJSON/XML over HTTPばかりじゃないか、ともいえるわけです。Richardson Maturity ModelでいうLevel 1かLevel 2のものばかり。
流行り始めの頃はもっとひどくて、平気でLevel 0のがあったので、だいぶ良くなったわけですが。
「課題や要求の解決、という点からアーキテクチャを考えるべき」全く同感で、例えばクローズドで密結合なAPIが欲しければRESTなんかやめてRPC使えばいいんですよね。もちろん疎結合のメリットを捨てるという点は認識した上で。 #mozaicfm
2014-08-20 00:48:32 via Twitter for Mac to @tkawa
これは話中にも出ていたリアルタイムWebにもあてはまることで、WebSocketやWebRTCなどが開発されたのは、まさに課題の解決にRESTアーキテクチャが合わなかったからだと思います。
ただ少し話がずれますが、たとえばWebSocketは制約がなさすぎるため、相互運用の需要が出てきたら今後問題になるんじゃないかな、と懸念しています。
初期の頃WebSocket上にRESTを持ち込もうという動きがありましたが、当然のごとくうまくいきませんでした。
Web APIのバージョニング
ただ「変更は避けられない」という点においては @t_wada さんに同意なので、結局「破壊的な変更をするな拡張せよ」というところに落ち着くと思います。非互換な変更(=バージョニング)は別のAPIを作ることと同じになります #mozaicfm
2014-08-20 01:03:18 via Twitter for Mac to @tkawa
Golangのパッケージバージョニングの話は、 yohei さんの通りちょっとレイヤーが違う話だと思いましたが、 Jxckさんの「バージョンがないものに後からバージョンを入れるのは困難」というのは、わかる気がしました。
とはいえ、Web APIの文脈でバージョンを語るには「バージョンとは何か」「バージョンの切り替え方」などをクライアントに理解させなければいけません。それがなければ、バージョンが変わったときにただクライアントは動かなくなるだけです。
非互換な変更がない(拡張など)なら、クライアントはバージョンを意識する必要はありません。そして、クライアントが壊れず正常に動き続けることが一番大事なことです。
バージョニング自体よりむしろ、やむを得ずバージョニングを行ったときに、API利用者を誘導する移行プロセスのノウハウのほうが重要かもしれません。
今のJSON Web APIが抱える問題
「to_jsonはダメ→JSONもビューだからちゃんと設計しよう→ちゃんと構造を入れたい→JSON Schemaとかいろいろ→WSDLみたいでダメじゃね?」このへんは自分の中でかなりアツいところ。どうすればいいか今いろいろ考えてます #mozaicfm
「JSONにいろいろ載せるとWS-*の失敗を繰り返す」「バラバラいろんなものが乱立すると、絶対流行らない」まさにその通りだと思っていて、いかにシンプルに作れるかだとは思っていますが難しい。今のところ寄らば大樹の陰戦法(Googleに乗ってみるとか)かなと考え中 #mozaicfm
2014-08-20 01:13:35 via Twitter for Mac to @tkawa
これは「予告」で。
「Webを支える技術」を改訂するとしたら?
「Webを支える技術」改訂について。REST厨的には「RESTの中で最も重要で最も忘れられているハイパーメディア(HATEOAS)」は外せないと思うんですけどどうでしょうか? #mozaicfm
JSONにリンクがない問題、今のところメディアタイプとLINKヘッダという2つの解決策がありますが、どちらも決め手に欠けます。でもそれで行くしかないでしょう。ビッグプレイヤーがよいデファクトスタンダードを提示してくれることを期待します。改訂のころにはコンセンサスが得られているかも?(いてほしい)
予告
このあたりのこと、特に「今のJSON Web APIが抱える問題」に関することを9月18日のRubyKaigi 2014で話します。よろしくお願いします。