У нас есть несколько команд. Нужно, чтобы они одновременно работали над своими частями проекта. Как их скоординировать? Через некое описание API: одна команда его пишет, другая планирует использовать. Документ, который описывает API и называется контрактом (ничего общего с юридическим контрактом).

Если такое много и часто практиковать, то это Contract-based development. При этом контракты часто лежат как-то отдельно. Например, в виде Swagger-схем в отдельном репозитарии git. Далее будут рассуждения именно о такой практике.

Главный вопрос – как код и контракты синхронизируются друг с другом.

Если вручную, то это приводит ко множеству проблем рассинхронизации. Конечно, от апологетов будет множество возражений, что нет никаких проблем. Но проблемы есть, просто их стараются не замечать. Плюс, при обновлении команды проблем станет значительно больше.

Если автоматически, то клиент и сервер должны генерироваться из swagger-описания, а затем при его обновлении так же обновляться.

С клиентом это достаточно легко сделать. Хотя тоже есть свои сложности – например, я написал свой шаблон для генерации Kotlin-клиента – https://github.com/stepin/swagger-codegen (т.к. стандартные не подходили).

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

В этом случае, уже обычно не делают отдельный репозитарий со swagger-спецификациями. И это уже не называется Contract-based development. Поэтому я против Contract-based development: оно как бы в теории красиво, но на практике по другому лучше.