понедельник, 7 июля 2008 г.

Райан Томайко. Как я объяснил REST своей жене

Как я объяснил REST своей жене
Райан Томайко
Оригинал текста: http://tomayko.com/writings/rest-to-my-wife

Жена: Кто такой Рой Филдинг?

Райан: Чувак один. Умный.

Жена: Ну да? А что он сделал?

Райан: Он участвовал в написании первых веб-серверов, а потом провёл кучу исследований, чтобы объяснить, почему веб работает так, как он работает. Его имя есть в спецификации протокола, по которому странички попадают с сервера в твой браузер.

Жена: А как это работает?

Райан: Веб?

Жена: Ну да.

Райан: Ну... Вообще это просто офигительно. А самое смешное - недооценено. Протокол, про который я говорил, HTTP, он способен на кучу разных фишек, которые люди по каким-то причинам игнорируют.

Жена: Этот "http" - типа как начало того, что я пишу в браузере?

Райан: Ну да. Эта первая часть говорит браузеру, какой протокол использовать. Вот эта фигня, которую ты пишешь, является одним из важнейших прорывов в компьютерной истории.

Жена: Почему?

Райан: Потому что благодаря ей можно описать расположение чего угодно, где угодно в мире. Это основание веба. Можешь считать, что это GPS-координаты знания и информации.

Жена: Для веб-страниц?

Райан: Да вообще для чего угодно. Этот чувак, Рой Филдинг, он много пишет о том, куда указывают эти штуки, в том исследовании, о котором я говорил. Веб построен в архитектурном стиле, который называется "REST". В REST есть понятие "ресурс", вот на него-то и указывают эти ссылки.

Жена: Значит, веб-страница - это ресурс?

Райан: Типа. Веб-страница - это "представление" ресурса. Ресурсы - это просто некие идеи. Вот URLы, ну вот эти штуки, которые ты пишешь в браузере...

Жена: Да знаю я, что такое URL...

Райан: А, ну ладно. Так вот, они говорят браузеру, что где-то имеется такая вот идея. Тогда браузер может пойти и попросить какое-то конкретное представление этой идеи. Если точнее, то браузер просит представление этой идеи в виде веб-страницы.

Жена: А какие ещё представления бывают?

Райан: Вообще-то разные представления как раз не часто используются. Обычно у ресурса есть только одно представление. Но есть надежда, что разнообразные представления в будущем будут больше использоваться, потому что постоянно появляется куча разных новых форматов.

Жена: Например?

Райан: Ну... Вот, например, есть такая идея, называется "веб-сервисы". Она вообще-то может означать кучу разных вещей, и многие её понимают по-своему, но в основе её лежит то, что машины могут использовать веб так же, как и люди.

Жена: Это опять что-то про роботов?

Райан: Не совсем. Я не имею ввиду, что машины сидят за столом и сёрфят по вебу. Но компьютеры могут использовать те же самые протоколы, чтобы обмениваться сообщениями друг с другом. Мы уже давно этим занимаемся, но ни одна из технологий, которые сейчас используются, не подходит для того, чтобы общаться со всеми машинами в мире.

Жена: Почему?

Райан: Потому что они не были предназначены для такого использования. Когда Филдинг со своими дружками начинал строить веб, возможность общаться с любой машиной в любой точке земного шара была основной задачей. Большинство технологий, которые мы используем для того, чтобы компьютеры могли общаться друг с другом, не были разработаны с таким расчётом. Надо было просто обеспечить общение небольшого количества машин.

Жена: А теперь понадобилась возможность общаться с любой машиной?

Райан: Я тебе больше скажу. Нужна возможность общаться со всеми машинами обо всём, что находится на всех остальных машинах. Так что нужен какой-то способ, чтобы одна машина сказала другой машине о ресурсе, который находится на третьей машине.

Жена: Чего?

Райан: Ну смотри. Ты разговариваешь со своей сестрой, и она хочет у тебя взять на время веник там, или ещё чего. А у тебя его нет, но есть у твоей мамы. Так что ты говоришь сестре, чтобы она сходила и попросила веник у мамы. В реальной жизни такое происходит постоянно, и при общении машин такое тоже часто случается.

Жена: И как же машины говорят друг другу о том, где что-то находится?

Райан: С помощью URL, конечно. Если назначить свой URL для любой вещи, о которой машинам может понадобиться поговорить, то мы получим машинный эквивалент существительного. Согласись, очень важно, что и ты, и я, и весь остальной мир согласились говорить о существительных определённым способом, так?

Жена: Ну.

Райан: Для машин нет универсальных существительных - поэтому они отстой. В каждом языке программирования, базе данных или любой другой системе есть свой способ говорить о существительных. Поэтому URL так важен. Он позволяет всем этим системам говорить друг другу о существительных, которые у них есть.

Жена: Но когда я смотрю на веб-страницу, я же не думаю о ней так.

Райан: И никто не думает. Кроме Филдинга и ещё немногих. Поэтому машины всё ещё отстой.

Жена: А как насчёт глаголов, местоимений и прилагательных?

Райан: Забавно, что ты спросила, потому что это ещё один большой аспект REST. По крайней мере, глаголы.

Жена: Да я пошутила просто...

Райан: Шутка смешная, только это вовсе не шутка. Глаголы очень важны. Есть такая мощная концепция в программировании и компьютерной науке, называется "полиморфизм". Это такой извратный термин, обозначающий, что к одним и тем же существительным можно применить разные глаголы.

Жена: Непонятно.

Райан: Ну... Смотри, вот кофейный столик. Какие тут существительные: кружка, поднос, газета, пульт. А теперь подумай, какое действие ты можешь совершить со всеми этими вещами?

Жена: Непонятно...

Райан: Ты можешь взять их, так? Ты можешь поднять их. Можешь перевернуть. Можешь сжечь. То есть ты можешь применить одни и те же глаголы к любому из этих предметов.

Жена: Ну ладно... и что?

Райан: Вот это очень важно. Представь, что вместо "возьми чашку", "возьми газету", "возьми пульт", мне нужно было бы использовать разные глаголы для каждого из этих существительных? Я не смог бы использовать слово "взять" в каждом случае, мне пришлось бы придумывать новое слово для каждой комбинации глагола и существительного.

Жена: Ого! Изврат какой.

Райан: Это точно. Наши мозги достаточно развиты, чтобы сообразить, что одни и те же глаголы можно применить к куче разных существительных. Некоторые глаголы более конкретные, чем другие, и они относятся только к небольшому числу существительных. Например, я не могу водить чашку, или выпить машину. Но есть глаголы почти универсальные, например, ВЗЯТЬ, ПОЛОЖИТЬ или УДАЛИТЬ.

Жена: Чашку нельзя УДАЛИТЬ.

Райан: Ну, да, но её можно выкинуть. Ты ведь опять пошутила, да?

Жена: Ага.

Райан: Ну так вот, HTTP, этот протокол, который создал Филдинг со своими друзьями, как раз построен на применении глаголов к существительным. Например, когда ты идёшь на веб-страничку, браузер применяет HTTP-запрос ВЗЯТЬ на URLе, который ты написала, и возвращает веб-страничку.

На веб-страничках обычно есть картинки, так? Это отдельные ресурсы. Веб-страничка просто содержит ссылки на URLы изображений, а браузер опять применяет к ним HTTP -запросы ВЗЯТЬ, пока он не получит все необходимые ресурсы и не сможет отобразить веб-страничку. Но главное тут в том, что с самыми разнообразными существительными можно выполнять одни и те же действия. Будь это картинка, текст, видео, mp3, или презентация - неважно. Я могу ВЗЯТЬ любую из этих вещей одним и тем же способом, если у меня есть URL.

Жена: Похоже, ВЗЯТЬ - это очень важный глагол.

Райан: Ещё бы. Особенно когда ты используешь веб-браузер, потому что браузеры в основном этим ВЗЯТИЕМ и занимаются. Они не очень часто используют другие типы взаимодействий с ресурсами. В этом и проблема, потому что многие люди из-за этого думают, что протокол HTTP можно использовать только для ВЗЯТИЯ. Но на самом деле HTTP - это протокол общего назначения для применения глаголов к существительным.

Жена: Круто. Но я всё равно не понимаю, что от этого меняется. Какие существительные и глаголы тебе ещё нужны?

Райан: Существительные-то есть, но не в том формате.

Представь, например, что ты копаешься на amazon.com в поисках подарка мне на Рождество. Пусть каждый продукт - это существительное. Так вот, если бы они были доступны в таком представлении, которое было бы понятно компьютеру, ты могла бы сделать кучу прикольных вещей.

Жена: А почему машина не понимает обычную веб-страницу?

Райан: Потому что веб-страницы предназначены для людей. Машине плевать на разметку и стили. Машине в основном нужны просто данные. В идеале, каждый URL должен иметь представление для человека и представление для машины. Если машина хочет ВЗЯТЬ ресурс, она просит представление для машины. Если браузер хочет ВЗЯТЬ ресурс для человека, он попросит представление, понятное человеку.

Жена: Значит, людям пришлось бы делать машинные форматы для всех страниц?

Райан: Если бы эти страницы имели такую ценность.

Смотри, мы уже много говорим об этом абстрактно. Давай возьмём реальный пример. Вот ты учительница. Могу поспорить, в школе у вас большая компьютерная система, или даже три-четыре системы, которые позволяют работать с данными о студентах: в каких они классах, какие у них оценки, с кем связаться, если что, какие учебники используются для преподавания, и т.д. Если эти системы сделаны на базе веба, то, возможно, для каждого из существительных есть свой URL: студент, учитель, класс, книга, комната и т.д. Сейчас ты можешь ВЗЯТЬ URL через браузер и получить веб-страницу. А если бы для каждого URL было машинное представление, то не составило бы никакого труда навесить на систему новые инструменты, потому что вся информация могла бы быть доступна стандартным способом. Также намного легче было бы организовать общение систем друг с другом. Или можно было бы построить систему в масштабах штата или даже страны, которая могла бы общаться с каждой отдельной школьной системой, чтобы получать оценки за тестирования. Возможности безграничны.

Каждая из систем могла бы получить информацию от любой другой с помощью простого HTTP-запроса ВЗЯТЬ (GET). Если одной системе нужно было бы что-то добавить в другую, она использовала бы HTTP-запрос ЗАПИСАТЬ (POST). Если нужно обновить - использовала бы HTTP-запрос ПОЛОЖИТЬ (PUT). Единственное, что остаётся решить - как будут выглядеть данные.

Жена: Так значит, этим ты и все остальные компьютерщики сейчас занимаетесь? Решаете, как должны выглядеть данные?

Райан: К сожалению, нет. Вместо этого большинство занято тем, что пишет кипы мудрёных спецификаций, позволяющих добиться всего того же самого, но гораздо менее удобными и выразительными методами. Существительные не универсальны, а глаголы не полиморфичны. Мы выбрасываем десятилетия реальных наработок и проверенных технологий и начинаем с нуля разрабатывать то, что очень похоже на системы, в прошлом потерпевшие неудачу. Мы используем HTTP только потому, что он помогает нам меньше общаться с специалистами по сетям и защите информации. Мы обмениваем простоту на броские инструменты и утилиты.

Жена: Почему?

Райан: Понятия не имею.

Жена: Ну почему бы тебе не сказать об этом?

Райан: Может, и скажу.