Пообещайте мне API

Интересную проблему поднимает Макс Канат в своём блоге codesimplicity.com — проблему совместимости API при переходе продуктов от версии к версии.
Создавая у своего сервиса API, разработчики дают "обещание", что данная функциональность будет доступна через данный API. И далее, если меняется функциональность или форматы данных, то появляется проблема, как моральная, так и техническая.
Всем проектам и всем разработчикам, использующим ваш API, придется переделывать свои разработки под сделанные изменения. Хорошо, если авторы пользовательского кода ещё доступны и готовы разобраться в изменениях. Хуже если проект, использующий данный API, уже эксплуатируется и команда, его разработавшая, уже давным давно занимается дауншифтингом в тихой деревеньке во владимирской области.
Выходит, владельцу сервиса нужно поддерживать как новый API, так и старый. А это сложно и неприятно, но не так страшно как переработка всех пользовательских приложений.
Лучший способ избежать таких ситуаций — не давать в публичный доступ API, сделанное на скорую руку. Надо заложить в него потенциальные пути развития. В идеале, развитие вашего сервиса должно приводить к расширению и обогащению сервисных методов.
Другой способ — версионирование. Например, старая и новая версия API сервиса salesforce.com доступны по разным URL. То есть, используя URL доступа к API, можно точно специфицировать версию интерфейса, которую вы хотите использовать.
Снова повторю вывод: относитесь ответственно к проектированию и выпуску API. Потому что плохо продуманное API — это последующая головная боль вас и ваших клиентов.
Может ли отсутствие API у сервиса быть панацеей от последующих несовместимостей? Как не парадоксально — НЕТ!!! Людям необходимо интегрировать системы, и если ваш продукт не имеет удобного API, то они всё равно проведут интеграцию, выдергивая данные из вашей БД, разбирая html-странички или придумав какой-нибудь хак. Конечно в этом случае у вас нет никаких обязательств относительно совместимости, но всё это закончится либо матом в сторону вашего продукта/сервиса, либо некоторые клиенты не захотят покупать у вас новые версии и останутся привязанными к старой версии, с которой проведена интеграция.
Поэтому, разрабатывая продукт или сервис, позаботьтесь о том, чтобы у него был API, который либо может гибко расширяться, либо хорошо версионируемый. Не поленитесь написать свой собственный клиент к данному API, чтобы убедиться что он сделан разумно и удобно.
И держите свои APIщания!