Тебе точно нужно проектировать?

5 minute read

Дизайн, или проектирование, программного обеспечения несомненно важный этап разработки. А мы в этом уверены?

В переговорке стоят ворота

  • Мой любимый вопрос - «Зачем?». Как думаешь, зачем нужна архитектура?
  • Для быстрых прогнозируемых изменений кода? Ну не изменений, а добавления нового поведения.
  • Прогнозируемых = интуитивных? Если нет, то мне тогда нужна помощь, чтобы понять ответ.
  • Интуитивных? Даже не знаю. Одна из задач, чтоб сверху было примерно понятно что происходит и чем занимается проект. Наверное, ответ - “Да”.
  • Похоже, ага. Тогда каким будет самое важное ее качество?
  • Ну я вижу самым главным качеством архитектуры — это возможность быстро внедрить или изменить фичу для заказчика с минимальными изменениями т.е. если мы строим какое-то здоровенное здание пользоваться которым будут для работы, чтоб пожить, чтоб поиграть. Чтоб когда те, кто пришел к нам поиграть, не захотели добавить футбольную площадку. И если в результате таких изменений в переговорке стоят ворота, то значит архитектура не очень.
  • Клевая метафора. А что в такой архитектуре не очень? Цель ведь достигнута и быстро.
  • В результате достижения цели для одного заказчика, мы, не намеренно, изменили части другого заказчика.
  • Это тоже, но если это обоих устроило то все ок? Или нет?
  • Кажется, это сломало интуитивность. Это не планируемые изменения.
  • Вот мне тоже так показалось. А что такое интуиция?
  • Ты клонишь к тому, что слова собираются в образы, образы в классы, классы в архитектуру и таким образом читая когда-то слова ты интуитивно чувствуешь код?
  • Не совсем. А может и совсем Не. Интуиция это же по сути опыт. Точнее решения, принимаемые на его основе.
  • Согласен.
  • Только вот нюанс: опыт разработки у всех разный, а нужно чтобы всем было одинаково интуитивно. Что делать?

За что тебе платят?

  • Использовать один описанный!
  • Можно и так. Пробовал когда-нибудь синхронизировать опыт с кем нибудь? Например, убедить кондуктора что ты расплатишься в конце поездки. Или еще какого-нибудь злобного упертого в том, что тебе можно доверять.
  • Тяжело его синхронизировать если каждому пытаться угодить.
  • Ага.
  • А если один чувак говорит как надо и все делают?
  • Чуваки меняются. Что делать когда он сменится?
  • Другого взять! Власть меняется, векторы развития меняются. Это закон бытия.
  • Перепишем архитектуру? Долго дорого. Бизнес финансировать не будет. А так как принципы никто не знает — привет легаси и не интуитивный код. Ошибки, медленные изменения.
  • 🤔
  • Вспомни, что ты делаешь в приложении, чтобы сохранить данные?
  • Пишем в базу?
  • Выносим в выделенное хранилище, ага. Что если поступить и тут так же? Вынести опыт в отказоустойчивое хранилище. А что может быть таким хранилищем в контексте опыта?
  • Ну не знаю.
  • За что тебе платят?
  • За реализацию потребностей бизнеса.
  • Я бы назвал чуть иначе, но это детали. Этого достаточно, чтобы определить, что есть наше хранилище.
  • Ничего не понимаю.
  • Архитектура не нужна если нет приложения, верно? Тогда когда наше приложение потеряет актуальность?
  • Когда бизнес сдохнет?
  • А получается наш “опыт” теряет актуальность вместе с бизнесом. Так почему бы не поместить архитектуру в него?
  • ?…
  • Есть такой Закон Конвея: “Организации, проектирующие системы, ограничены дизайном, который копирует структуру коммуникации в этой организации” (c) Wikipedia. Из него получаем что архитектура станет не актуальной только тогда, когда сдохнет направление в бизнесе. Но если направление сдохло, то код становится не поддерживаемым или его можно выкинуть. Вот этого и позволяет достичь Единый язык.
  • Это все хорошо, но не гарантирует главную потребность бизнеса — быстрое изменение системы.

И он заставляет тебя переписать 15 классов

  • Я бы сказал что гарантирует. Если быть точным, это способствует отсутствию фрикций при загрузке контекста потому как скорость изменений системы это не только код. Не задумывался из чего состоит решение какой-либо проблемы?
  • Не, как-то слишком абстрактно.
  • У меня обычно происходит так: Сначала разбираю ее суть. Здесь мы отвечаем на вопрос: “А как это вообще сейчас работает?”. Я это называю загрузкой контекста. Возможно и не я вовсе — уже забыл откуда взял, но сути не меняет. После того как мы осознаем проблему, мы переходим к проверке гипотезы. Здесь мы ищем предполагаем решение этой проблемы. Затем этап дизайна, накидываем решение и под конец это пишем. Кто-то провел исследование. То ли Майкрософт, то ли Оракл, эти обычно что-то такое делают. Выяснили что среднее количество времени, которое уходит на “загрузку контекста” чет около 65%. При этом это средняя температура по палате. То есть в результатах есть как приверженцы XP, так и проекты с огромным техдолгом. Вот и получаем, что за счет крайне низкого времени загрузки контекста мы сильно бустим не только скорость, но и простоту решений
  • Хорошо, это понятно. Но ведь не только код может выступать как загрузка контекста. Лучше чтоб этим занимались тесты. Тогда мы можем Единый язык перенести в тесты, а код сделать более абстрактным.
  • В теории да, но так мы получим слой “переводчик”. Поговорил с бизнесом -> пошел переводить -> нашел в тестах -> пошел в код. Приколы начинаются когда в исходнике находятся противоречия достижения исходной цели. А когда ты говоришь на одном языке — ты загружаешь контекст сразу в процессе диалога. Это еще и целостность помогает сохранять.
  • Да, но тогда людям, которые не впервые в проекте, и контекст проектной абстракции у него загружен, вносить изменения в коде становится значительно сложнее, разве нет?
  • Думаю ты прав, однако есть пара нюансов. Во-первых, покажи мне хоть одного человека, который знает контекст всего бизнеса, начиная от среднего размера, и держит его в голове и я поставлю тебе бутылку хорошего вискаря на твой выбор.
  • Нет-нет. Бизнес у нас в тестах описан. Но код у нас более абстрактный.
  • Ну хорошо. Вот представь себе ситуацию: фраза бизнеса “Теперь Услуга не может быть оплачена без модерации”. В каком классе этот функционал?
  • Теперь ты пишешь тест, который не пройдет это условие и заставляешь его работать.
  • Ага. И он заставляет тебя переписать 15 классов. Знакомо?
  • Вот это знакомо, когда у тебя код не соблюдает базовые законы. Если мы представим, что у нас каждый класс имеют 1 причину для изменений, тогда такого кейса никогда не будет.
  • Вероятно. Ну сути то не меняет. Тест тебе не даст интуитивного кода. Он только его зафиксирует и подскажет когда зависимость нужно выделять. А вот в какой тест посмотреть тебе что скажет? Или будешь все 8000 тестов перечитывать?
  • В какой тест посмотреть, скажет ровно то, что сказало бы тебе, куда смотреть в коде
  • Именно поэтому не имеет смысла делать только одно.
  • Я понял! Одно другому не мешает. Абстрактный код не означает отсутствие Единого языка.
  • Ага. Ну и «чистую выдумку» никто не отменял. Это как раз было “во-вторых” 😁