Автор: Алексей Журавлев, системный архитектор
Если у вас есть свой бизнес или вы работаете в бизнес-подразделении более-менее крупной компании, особенно на руководящей позиции, вы, скорее всего, сталкивались с заказной разработкой программного обеспечения или столкнетесь с ней, когда захотите улучшить свои результаты. Под заказной разработкой я подразумеваю не только контрактные отношения с подрядной организацией, но ваших собственных штатных IT-шников.
Перед началом разработки, как водится, нужно составить план - ресурсы, сроки, деньги - все как у людей. Вы приходите на встречу с легким сердцем: задача небольшая, нужно всего-то добавить пару форм и отчет, а вы, хоть и не специалист, но понимаете, что это не может быть сложным. Но все меняется, когда разработчики называют сроки.
— Два месяца? На простейший функционал? Это неприемлемо! — вы пытаетесь давить, пугать, просить, торговаться; разработчики явно нервничают, но сроки не двигают. В итоге вы приходите к какому-то компромиссу, который не нравится никому, злые и недовольные.
Мы попробуем разобраться, почему так происходит и откуда берутся эти огромные сроки и оценки. К написанию этой статьи меня подтолкнул недавний кейс: наш диалог с заказчиком дошел, казалось, до абсурда. Причем — уверен — заказчик думал так же. В этой статье я разберу наш реальный кейс и на его примере станет понятно, что стоит за непониманием и конфликтами, с которыми сталкивалось большинство заказчиков. Эта статья — в первую очередь для тех, кто выступает в роли заказчика.
Как было дело
К нам обратилась компания, которой была нужна система, предполагающая некоторое взаимодействие между пользователями разных ролей. Функционала было много, развивать платформу предполагалось итерационно. Для того, чтобы начать работу, мы договорились, что в первый релиз войдет несколько основных бизнес сценариев и ряд вспомогательных функций вроде email уведомлений. Мы составили календарный план с разбивкой на промежуточные этапы и представили это заказчику.
Первый промежуточный этап мы планировали сделать больше технологическим - проработать архитектуру, спроектировать модель данных, сформировать UI-kit и реализовать какие-то базовые механизмы, так озвученные планы на будущее как бы говорили нам, что если сейчас отнестись к проектированию легкомысленно, то это самое будущее будет непростым для всех. По опыту я знаю, что такие технологические релизы редко встречают одобрение у бизнеса, так как денег он заплатил, а результат увидеть не может. Поэтому в первый этап было включено несколько функций, которые можно потрогать и попробовать.
Схематично наш план выглядел примерно так:
![](https://senior.ua/storage/article/content/73816194-21e1-4d94-b220-1a261752cde6.jpeg)
Несколько функций планировалось закончить по окончанию 1 этапа (этапы были длиной в один месяц, такие спринты-переростки), остальные планировалось завершить позднее.
И далее у нас состоялся очень показательный диалог примерно следующего содержания (очень сокращенно):
— Коллеги, я правильно понимаю, весь первый месяц у вас уйдет только на регистрацию и авторизацию?
— Нет, не совсем так, у нас будет фаза проектирования, мы проработаем модель данных, базовые механизмы, кучу сопутствующих вещей и начнем реализацию больших блоков, которые завершатся позднее
— Но мы увидим только регистрацию?
— В качестве завершенных функций - да
— Так не пойдет. Мы хотим по итогам первого этапа увидеть весь основной функционал, а все остальное давайте делать позднее. Целый месяц делать одну регистрацию - слишком долго
— Мы делаем НЕ ТОЛЬКО регистрацию, мы стартанем и другие задачи, которые просто завершатся позднее установленной даты. Выкинуть все остальное - не получится, это скелет платформы. Если не спроектировать модель данных, некуда будет сохранять регистрационные данные и неоткуда будет брать данные для других функций
— Я просто не понимаю, почему так сложно? Регистрация — это ведь стандартная функция? Давайте возьмем готовый модуль и просто прикрутим его, например из WordPress. Можем так сделать?
— Из WordPress? Нет
— Почему? Давайте соберем систему из стандартных компонентов. В моем представлении это просто форма, пару кнопок и поле в базе данных!?
И так несколько раз по кругу. Я пытался рассказать о том, как строятся системы, почему не бывает “стандартной регистрации” и в чем риск строить mission critical систему в конструкторе сайтов, но особого эффекта это не возымело. В итоге мы нашли тяжелое, но компромиссное решение, скорректировав срок и очень сильно порезав скоуп, но было видно, что заказчик остался недоволен и, возможно, с ощущением, что его обманывают.
Разбор полетов
Проблема первая. “Эффект морковки”
Очевидно и естественно, что для бизнеса и вообще для любого, кто не занимается разработкой ПО, любая система - это набор функций, которые он может пощупать и увидеть. При этом сложность реализации функции оценивается по ее “визуальному богатству” - чем больше форм и кнопок, тем интуитивно задача кажется более сложной.
В действительности корреляции практически нет - большую, но “тупую” форму на 40 атрибутов для создания объекта вместе с механизмом сохранения этого объекта сделать обычно проще, чем одно маленькое поле “Поиск по сайту”, потому что потребует добавления в систему поискового движка или разработки собственного.
![Иллюстрация в дополнительных комментариях не нуждается. Так бывает не всегда, но чаще, чем могло бы. Иллюстрация в дополнительных комментариях не нуждается. Так бывает не всегда, но чаще, чем могло бы.](https://senior.ua/storage/article/content/0d90556d-d7c4-4d4e-a070-d398818360ca.jpeg)
Проблема вторая. “Свеча или лампочка”?
Интуитивно кажется, что для стандартных задач проще взять что-то готовое, чем писать свое. И это действительно так при условии, что “готовое” является полностью готовым и переносимым компонентом, а не неотъемлемой частью большой подсистемы. Например, если нам нужен свет, мы можем купить готовую свечу и она будет одинаково хорошо работать сама по себе, но мы не можем просто купить лампочку и выключатель и установить их в избушке в лесу - нужна еще сеть электроснабжения, провода, источник энергии и тп.
Разработчики действительно пользуются готовыми компонентами, но это это именно программные компоненты, “сухие смеси”, а не готовые изделия. Бизнес заказчики часто считают, что можно скачать и “прикрутить” целую бизнес функцию, но это почти всегда не так.
![Как в глазах заказчиков иногда выглядит набор “стандартных решений” Как в глазах заказчиков иногда выглядит набор “стандартных решений”](https://senior.ua/storage/article/content/5485f888-bf20-4ccc-85da-923c95c9effc.jpeg)
К сожалению, это так не работает. Нельзя в строительном магазине купить коробку с горячим водоснабжением - можно купить отдельно трубы, краны и котел, все смонтировать, настроить, и закрыть плиткой. Разработчики давно не пишут код полностью с нуля (как и строители не занимаются трубопрокатом или обжигом керамики) и на этом действительно экономится куча времени. Когда бизнес-заказчик решает, что тут можно сэкономить, добавив что-то стандартное и готовое, разработчик уже это сделал, оценив свою работу с учетом того, что он и так будет строить решение из готовых модулей настолько, насколько это возможно.
Проблема третья. “Золотая клетка”
Современный интернет проделал огромный путь от простых сайтов с информацией к сложным информационным системам, выполняющим различные функции, которые, тем не менее, взаимодействуют с пользователем так же как и раньше, через браузер. Для пользователя при этом все остается простым и понятным - вот текст, вот изображения, вот какие-то кнопки. Граница между “просто сайтом” и “информационной системой” очень нестрогая и размытая, но все же она есть. Никто ведь не называет интернет-банк сайтом? Есть отдельно сайт банка, а есть - интернет банк. Также сложно назвать просто сайтом Gmail или какой-нибудь онлайн редактор - обычно говорят “веб версия” такого-то сервиса. Примеров много, общего между ними то, что сайты это больше про “почитать”, а системы или сервисы - про “что-то сделать”.
И есть особый вид систем (или сервисов), задача которых - помогать быстро делать сайты. Их много - Тильда, 1С.Битрикс, WordPress, Joomla и другие. Некоторые доступны только в качестве онлайн сервисов, другие можно установить на свой сервер и доработать, так как есть исходный код. Но задача всех подобных систем - быстро и просто создать информационные сайты. При этом то, что мы называем “сайтом, сделанном на таком-то движке”, является по-прежнему сложной информационной системой, которая позволяет через специальный интерфейс быстро и просто настраивать некоторый небольшой набор страниц, организованных в логическую группу “Сайт компании N”.
![При одинаковой “видимой” функциональности сайты, работающие на готовых движках, являются гораздо более сложными системами. При одинаковой “видимой” функциональности сайты, работающие на готовых движках, являются гораздо более сложными системами.](https://senior.ua/storage/article/content/8a881c84-88a3-44c2-81be-69ffe0ca3347.jpeg)
Движки для создания сайтов хороши и удобны, когда ваша задача лежит в границах их стандартных возможностей - а это почти всегда просто информационные сайты с контентом, новостями, формой обратной связи и т.п. Вам не нужно писать код, вы пользуетесь готовыми механизмами и через web интерфейс просто добавляете нужные функции.
Но все меняется, когда требуется решить нестандартную задачу - доработка такой сложной, но стройной системы обычно затратна, несет риск что-то сломать и главное - рано или поздно упрется в ограничения, обусловленные архитектурой. Представьте, что у вас в хозяйстве из инструментов только топор. Им идеально колоть дрова и рубить деревья, можно забивать крупные гвозди, худо-бедно вскопать грядку, но вот чтобы покосить траву - нужно приложить столько усилий, что проще дергать траву руками. Хотя казалось бы - есть и рукоять, и острая часть, и дрова колет топор отлично…
Так что, нельзя ничего переиспользовать?
Можно, но не готовые бизнес-функции, а программные компоненты, библиотеки и модули, ускоряющие разработку. Если вы слышали такие слова, как React JS, Angular, Spring, Laravel, Hibernate - это как раз они. Хорошая информационная система, даже маленькая, строится по определенным правилам, имеет стройную архитектуру, а ещё, что не маловажно, спроектирована так, чтобы ее можно было дорабатывать и развивать. Бизнесу кажется, что это все не так важно, главное - функционал, но представьте себе автомобиль, у которого капот приварен к кузову. Да, быстрее дешевле, чем делать замки и механизм подъема, но чтобы поменять масло, нужно болгаркой разрезать капот, потом просверлить отверстие в корпусе двигателя.. думаю, можно не продолжать.
Часто системы представляют в виде набора “кирпичиков”, добавил еще один - получилась новая функция. Действительно, можно представить в виде кирпичиков, выглядеть будет так:
![Компоненты и аспекты системы, обеспечивающие “стандартный функционал” Компоненты и аспекты системы, обеспечивающие “стандартный функционал”](https://senior.ua/storage/article/content/4bf739a7-ebaf-4321-86f4-41e2dcdd7eff.jpeg)
И это не преувеличение: одинаковые с виду функции могут сильно различаться по внутренней организации.
Заключение
Мне хочется верить, что эта статья поможет людям, которые взаимодействуют с IT-командами в качестве заказчиков, лучше понимать причины, по которым работы иногда оцениваются так дорого. Поверьте, любой разработчик - в первую очередь рационализатор и если можно где-то упростить решение задачи, он это сделает и так. Не экономьте на разработке, обращайтесь к профессионалам, ведь они строят для вас рельсы, по которым будет двигаться ваш бизнес.
0 комментариев
Добавить комментарий