Внесу свою лепту наверное.
Как по мне, возможно надо разделять разработку на волны. Первая волна - это конструкция нужной функциональности из подручных средств. Вторая - архитектурный рефакторинг и доработка. Причин много, но в целом даже сейчас так и идёт, где бы я ни работал. Очень редкий сервис встаёт сразу так как надо. Так что, если нет сильных рисков, то лучше сперва сделать дешёвый MVP продукт, обкатать, получить фидбек и создать более устойчивый сервис с более качественной архитектурой. Можно даже использовать первую волну как отдельный сервис для второй. А после проектирования окружения второй волны, имплементировать туда первый и убрать старый сервис.
Третья волна появляется в момент, когда сервис надо переработать и добавить функциональности. Обычно через несколько лет.
Бизнес ждать не будет. Этого и не нужно. Сделали что-то, отдали результат, потом сделали всё по-хорошему, экономя нервы своих разработчиков. Опять же на короткой дистанции можно протестировать что-то новое из технологий и уже во второй волне с опытом сделать в лучшем варианте. При таком подходе нужно грамотное планирование и умение защитить вторую волну.
Я не говорю, что так всегда надо делать, но во многих проектах, которые я видел, стоило бы делать именно так.
https://youtu.be/oDNz9hXpT90?t=52