Частая ситуация. Начинаем делать проект для нового клиента. Изначально не понятно во что выльется наше сотрудничество. Возможно после завершения проекта мы попрощаемся с этим клиентом. А возможно проект будет постоянно дорабатываться и работа над этим проектом перерастет в многолетнее сотрудничество, изначальный функционал будет многократно расширен, а требуемая производительность вырастит в NNN раз. При старте возникает вопрос, какая будет основа проекта. Есть два крайних варианта:
1. Делаем как можно проще. По сути делаем прототип на коленках, который потом доводим продакшена. Получается дешево и быстро. Но если проект будет долго играющим, то его развитие превратиться в кошмар. А если проект будет разовым, то все в порядке. Клиент счастлив (требуемый функционал получен), разработчик счастлив (не требуется работать с кривоватой архитектурой).
2. Закладываем крутую архитектуру. Думаем о долгосрочном развитии проекта. Только первая версия будет дорогая и сроки будут большими. Клиент скорее всего откажется, т.к. наш конкурент ООО "Govno-код" предложит тоже самое, но дешево и быстро по схеме №1.
И вот мы сделали проект по схеме 1 и проект, к нашему удивлению, начал развиваться. Кстати, часто развитие проекта начинается уже через несколько лет после сдачи первой версии. Клиент просит сделать еще одно маленькую фичу, потом еще и еще. Нагрузка на систему возрастает в сотни и тысячи раз. Клиент засыпает запросами на новые фичи по несколько раз в день.
Да, сделать небольшую новую фичу быстро и не дорого. Но из-за кривой архитектуры это костыли. Через несколько лет система превращается в прототип погребенный под огромным слоем костылей. Но клиент счастлив, вроде все работает. Изредка выявляются проблемы, но прекрасный исполнитель быстро их устраняет.
В какой то момент мы понимаем что пора этот ад переписать с нуля и сделать нормальную архитектуру и стоить это будет x000000 рублей. Но клиент абсолютно не понимает зачем все переделывать за такую сумму, когда оно и так все работает, и новые фичи дописываются быстро и дешево. Возражения "оно же работает", "все проблемы вы же решаете", "грохнется, есть же бакапы", "вы же быстро делаете новые фичи, все же получается"... и т.д.
Точка невозврата, когда еще можно заняться, рефакторингом давно прошла. Клиент каждый раз активно отказывался оплачивать рефакторинги, мотивируя что нужно еще всего лишь пару мелких доработок.
Можно конечно заняться саботажем, или оценивать время доделки новых фич в десятикратном размере от реально требуемого времени. Или вообще провоцировать сбой и системе или умышленно их игнорировать. Но это непорядочно.
Вариант просто объявить что с такой то даты мы полностью прекращаем с вами сотрудничество по старой версии программы - череват потерей клиента.
Как правильно быть в такой ситуации, когда проект превращается в монстра из-за начальной дешевой архитектуры?
Для понятности, прилагаю страничку из своего рабочего блокнота, на которой я выражал эмоции, когда работал над одним из таких проектов: