Как рабочая система превращается в минное поле

04.06.26

Разработка - Рефакторинг и качество кода

Чем активнее развивается старая система, тем страшнее бывает её менять. Снаружи всё выглядит живым: релизы выходят, бизнес получает новые функции, пользователи работают. Но внутри уже появляются фразы, после которых разговор заканчивается: «это лучше не трогать», «там когда-то всё упало», «давайте сделаем рядом». И в какой-то момент становится непонятно: система ещё развивается — или команда уже просто учится обходить опасные места.

Самое странное в старых системах — они могут активно развиваться и одновременно деградировать. Команда закрывает задачи, в релизах появляются новые функции, бизнес видит движение. Формально всё нормально.

Но внутри команды уже есть фразы, после которых разговор заканчивается: «Это лучше не трогать», «там когда-то всё упало», «работает же», «давайте сделаем рядом». В этот момент система ещё жива технически, но команда уже начинает относиться к ней как к минному полю. Не как к инструменту, который можно улучшать, а как к механизму, где любое лишнее движение может привести к аварии.

Я не сразу понял, насколько это опасно. Долгое время мне казалось, что такая осторожность — признак зрелости. Люди помнят инциденты, берегут боевую базу, не рискуют без необходимости. В разговоре это звучит как забота о стабильности.

Проблема начинается позже, когда осторожность перестаёт защищать систему и начинает запрещать думать.

 

История про модуль, который нельзя было трогать

На одном проекте у нас была система расчёта бонусов. Проекту было больше пяти лет. За это время он прошёл несколько этапов внедрения, десятки доработок под бизнес и длинный хвост исправлений. Через систему успела пройти не одна команда.

Сначала её делала команда внедрения. Потом проект остался на одном разработчике, который занимался поддержкой и закрывал срочные запросы. Позже бизнес вырос, задач стало больше, и вокруг проекта снова собрали команду. Когда я подключился, в ней было уже около 10 человек.

Со стороны проект выглядел живым: система росла вместе с бизнесом, появлялись новые правила, отчёты, интеграции и сценарии для пользователей. Но внутри было другое ощущение: общее понимание многих доработок уже пропало.

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

Каждая отдельная правка в моменте была объяснима, но вместе они перестали складываться в понятную схему. Одна доработка — под акцию. Вторая — под исключение. Третья — под возврат. Четвёртая — под ручную корректировку. Через пять лет это уже не набор решений, а слой за слоем накопленная история, которую нельзя восстановить по одному файлу.

Так модуль начисления бонусов превратился в участок, который никто уже толком не понимал. Команда особенно переживала именно за него. На вопрос «как он считает?» обычно не было короткого ответа. Кто-то знал один сценарий. Кто-то помнил, что есть исключения для отдельных клиентов. Кто-то говорил, что часть логики завязана на дату документа. Кто-то вспоминал, что после старой доработки бонусы пересчитывались иначе при возвратах. Но цельной картины не было.

Самое неприятное началось после пары неудачных попыток вмешаться в эту логику. Разработчик менял небольшое условие, а потом всплывало расхождение в другом сценарии. Исправляли начисление для одного типа операции — ломался пересчёт при возврате. Убирали дублирование — оказывалось, что в одном месте оно было не дублем, а старым исключением для конкретного бизнес-правила.

После таких историй в команде закрепилась простая фраза: «Бонусы лучше не трогать». Сначала она звучала разумно. Модуль действительно был критичным. Ошибка в начислении бонусов быстро становилась видимой: клиенты задавали вопросы, менеджеры спорили с цифрами, поддержка получала обращения, бизнес просил срочно объяснить, почему начислилось не так.

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

Но это «когда-нибудь» не наступало. Новые требования продолжали приходить. Нужно было изменить правило начисления для одной группы клиентов. Потом добавить исключение для другой. Потом учесть новую акцию. Потом изменить пересчёт при возврате. И каждый раз команда выбирала более безопасный на вид путь: не менять старую логику, а обойти её.

Где-то добавляли отдельную ветку. Где-то делали предварительную корректировку перед вызовом модуля. Где-то пересчитывали результат после того, как основной механизм уже отработал. Где-то создавали отдельную обработку для частного случая, потому что «в общий модуль лучше не лезть».

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

Это стало видно в оценках. Задачу, которую раньше обсуждали как правку на 4–6 часов, уже оценивали в 2–3 дня: надо было найти все места начисления, проверить возвраты, ручные корректировки, акции и ночные пересчёты. На обсуждениях команда всё чаще спорила не о том, как правильно сделать, а о том, какой участок лучше не задеть. QA тоже расширял проверки: даже маленькое изменение проходило через 10–12 сценариев, потому что никто не мог назвать точную зону влияния.

Тогда я впервые поймал себя на мысли: мы защищали модуль начисления бонусов от поломки, а в итоге сделали его ещё менее управляемым. И что хуже — мы почти не замечали этого.

 

Как «не трогать» превращается в архитектуру

В командах страх изменений редко звучит прямо. Никто не говорит: «Я боюсь менять этот код». Обычно говорят иначе: «сейчас не время», «давайте после релиза», «это не в рамках задачи», «лучше добавим отдельный механизм», «там много связей», «надо сначала всё изучить».

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

На том проекте мы уже не обсуждали, как устроено начисление бонусов. Мы обсуждали только то, как его обойти. Страх превращался в архитектуру не одним решением, а цепочкой маленьких обходов.

Сначала появлялся запрет: «в основной модуль не лезем». Потом приходило новое требование бизнеса. Его надо было выполнить, поэтому разработчик добавлял отдельную ветку рядом. Через месяц приходило похожее требование — и появлялась ещё одна ветка. Потом кто-то делал обработку, которая корректировала результат уже после начисления, потому что менять сам расчёт было страшно.

Так «не трогаем» превращалось в «дублируем». Не сразу. Без злого умысла. По одному безопасному решению за раз. Именно здесь осторожность меняет природу. Она уже не снижает опасность, а переносит её в будущее и делает дороже.

Если команда говорит: «Давайте сначала покроем это тестами и потом изменим» — система жива. Если команда говорит: «Давайте вообще не будем туда смотреть», задача перестаёт быть инженерной. Команда уже не ищет решение, а выбирает маршрут вокруг опасного места.

Обычно всё начинается с конкретной боли. Не с философии про технический долг, а с правки, после которой команда несколько дней разбирает последствия. Но в памяти команды это часто остаётся не как «мы плохо подготовили изменение». Остаётся другая формула: «менять опасно».

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

Каждый такой обход выглядит разумно в моменте. Релиз не сорвали. Бизнес получил функцию. Команда избежала риска. Но в коде остаётся тихий договор с будущим: мы знаем, что это неправильно, но сейчас не будем менять. Через год этот договор уже никто не помнит. Остаётся только код.

 

Как код становится табу

После нескольких таких историй вокруг отдельных участков системы появляется молчаливый запрет. Не потому что в документации написано «критичный модуль». Не потому что есть ясное объяснение. Просто все знают.

Новый разработчик спрашивает: «Почему бонусы начисляются здесь и ещё пересчитываются в отдельной обработке?» Ему отвечают: «Так исторически сложилось. Не трогай». Он уточняет: «Но здесь ошибка. Если изменить правило в одном месте, второе останется старым». Ответ тот же: «Знаю. Но когда это меняли в прошлый раз, всё упало». И он не трогает.

С этого момента это уже не просто плохой код. Это командное табу. И дальше табу начинает само себя защищать. Новые люди приходят уже не в систему, а в набор запретов. Они не видели исходной аварии, не знают, что именно сломалось, но быстро понимают: спорить с этим участком бесполезно.

После этого команда делает вывод: «Видите, бонусы действительно опасные». Хотя настоящая причина уже другая. Опасность создал не сам механизм. Опасность создали обходы, которые появились из-за страха его менять.

Я видел это не только в бонусах. Так начинают вести себя любые крупные механизмы, которые несколько лет дорабатывали разные разработчики без общего плана. Сначала каждый решал свою задачу. Потом менялись люди, терялся контекст, накапливались исключения. И однажды механизм, который раньше просто работал, превращался в участок, куда команда уже не хотела заходить.

Сначала есть один сложный механизм. Потом вокруг него появляются обходы. Потом обходы становятся частью архитектуры. Потом любое изменение действительно становится опасным. Страх сам создаёт доказательства своей правоты.

 

Почему это не только техническая проблема

Долгое время я думал, что такие ситуации решаются архитектурой. Нужно больше тестов. Лучше документация. Чище границы модулей. Меньше дублирования. Понятнее владение кодом. Всё это правда.

Но потом я увидел: даже когда появляются тесты и время на рефакторинг, команда не всегда идёт менять старое место. Потому что проблема уже не только в коде. Она в памяти команды.

Разработчик, который однажды сломал боевую базу, потом иначе смотрит на похожие задачи. Он может понимать, что теперь есть тесты. Может понимать, что изменение безопаснее. Но внутри всё равно остаётся вопрос: «А если снова упадёт?»

Руководитель, который один раз объяснялся перед бизнесом за сорванный отчётный период, тоже становится осторожнее. Иногда слишком осторожным. Старший разработчик, который помнит ночной разбор инцидента, начинает защищать команду от повторения боли. Он говорит новичкам: «Не трогайте это». И в моменте он прав.

Но проходит год. Потом второй. Люди меняются. Причина запрета стирается. Остаётся только сам запрет.

Есть старая управленческая притча про обезьян и бананы. Как научный аргумент я бы её не использовал. Но как образ командной памяти она точная.

Клетка. Пять обезьян. К потолку подвязана связка бананов. Под ней стоит лестница. Одна обезьяна голодная. Она подходит к лестнице, чтобы достать банан. Как только она касается лестницы, всех обезьян обливают холодной водой.

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

Потом одну обезьяну заменяют новой. Она видит бананы, видит лестницу и идёт наверх. Остальные бросаются на неё. Новая обезьяна не знает про воду. Она не понимает причину. Но быстро запоминает правило: к лестнице нельзя.

Потом заменяют вторую обезьяну. Новая снова идёт к бананам — и её останавливают все. В том числе та, которую самой водой никогда не поливали. Причём с особым энтузиазмом. Так постепенно в клетке оказываются пять обезьян, которых водой вообще не поливали. Но они всё равно не дают никому подойти к лестнице. Почему? Потому что так тут заведено.

В командах это выглядит проще и тише. Никто уже не помнит все детали старых неудачных правок. Никто не может быстро восстановить полную цепочку решений. Но фраза «бонусы не трогаем» продолжает работать. Правило пережило причину. И чем дольше оно живёт без причины, тем сильнее становится. Потому что теперь это уже не решение по конкретному инциденту. Это часть культуры.

 

Где я сам ошибался

Моя ошибка была в том, что я путал осторожность с управлением. Когда команда говорила «не трогаем», я часто воспринимал это как зрелость. Люди помнят боль, берегут боевую базу, не рискуют без необходимости.

Но управление начинается не с запрета. Управление начинается с вопроса: «Что именно мы боимся сломать?» Если ответа нет, перед нами не риск. Перед нами туман.

На том проекте я слишком долго принимал этот туман как норму. Мы могли сказать: «Бонусы трогать опасно». Но не могли быстро назвать все сценарии, которые надо проверить. Не могли показать полную схему начисления. Не могли объяснить, какие исключения ещё актуальны, а какие остались от старых бизнес-правил.

Это был не осознанный риск. Это была выученная беспомощность. Позже я стал начинать такие разговоры иначе. Не с фразы «давайте перепишем». И не с фразы «ничего не трогаем». Я начинал с инвентаризации страха.

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

Иногда после такого разговора становилось ясно: да, трогать сейчас нельзя. Сначала нужны тесты, стенд, план отката, отдельное окно и человек, который понимает предметную область. Но иногда выяснялось другое: запрет держится на истории трёхлетней давности, которую уже никто не может восстановить.

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

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

Команда начинает верить системе не после большого рефакторинга. Она начинает верить после нескольких маленьких изменений, которые прошли без пожара.

 

На что я теперь смотрю в старых системах

Когда я прихожу в зрелую систему, я смотрю не только на код. Я слушаю фразы. На обсуждении кто-то говорит: «Это исторически сложилось». Я прошу показать историю. Через десять минут звучит: «Сюда лучше не лезть». Я спрашиваю, что именно сломается. Потом появляется предложение: «Давайте сделаем рядом». И вот тут уже важно остановиться.

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

Отдельно я смотрю на места, где система умеет делать одно и то же несколькими способами. Два механизма уведомлений. Три варианта начисления бонусов. Четыре способа выгрузить данные. Пять мест, где проверяются права.

Это не всегда катастрофа. Иногда у этого есть причина. Но если команда не может объяснить, почему способов несколько, значит, проблема уже не в одном модуле, а в способе принимать решения. Поэтому в старой системе я сначала ищу не «плохой код», а места, вокруг которых команда выстроила запреты. Если их назвать вслух, становится понятнее, где реальная опасность, а где правило давно пережило причину.

 

Осторожность, которая убивает систему

Система умирает не тогда, когда в ней много старого кода. Старый код сам по себе не страшен. Я видел системы на старых механизмах, которые нормально развивались, потому что команда понимала их устройство и могла менять без паники.

Система умирает, когда команда перестаёт верить, что её можно безопасно изменить. Сначала это выглядит как осторожность. Потом как привычка. Потом как культура. И в какой-то момент архитектура начинает отражать не предметную область, а историю испугов команды.

Здесь скопировали, потому что боялись тронуть ядро. Здесь сделали второй механизм, потому что первый был «опасный». Здесь оставили старую ветку, потому что никто не помнит, кому она нужна. Здесь всё держится на одном человеке, потому что только он знает, где нельзя наступать.

Снаружи это всё ещё система. Внутри — карта старых запретов. Я не думаю, что каждую такую систему надо сразу переписывать. Часто это невозможно и не нужно. Но я теперь считаю важным ловить момент, когда осторожность перестаёт защищать и начинает консервировать проблему.

Со временем выбор сужается. Пока механизм ещё понятен, его можно изменить. Когда вокруг него выросли обходы, остаётся только добавлять новые. Когда даже обходы начинают конфликтовать друг с другом, команда уже не развивает систему, а поддерживает её до замены.

Теперь в таких проектах я первым делом спрашиваю себя и команду: где у нас осторожность ещё защищает систему, а где она уже мешает ей жить? Обычно ответ начинается с простой фразы: «это лучше не трогать».

Вступайте в нашу телеграмм-группу Инфостарт

технический долг legacy архитектура рефакторинг сопровождение команда разработки страх изменений продуктив бизнес-логика бонусы доработки регрессия качество кода управление разработкой

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Рефакторинг и качество кода Программист Руководитель проекта 1С:Предприятие 8 Абонемент ($m)

MetaVision for 1C PRO — профессиональная версия статического анализатора и визуализатора кода. Загружает выгрузки конфигураций, расширения и внешние файлы, за секунды строит графы функций, находит уязвимости безопасности и подсвечивает проблемы производительности. В арсенале: визуализация логики в виде графов условий, циклов, транзакций и вызовов, статический аудит безопасности с поиском RCE, SSRF, COM-инъекций и паролей в коде, выявление запросов в циклах и вложенных блокировок, полнотекстовый поиск по всем модулям, встроенный редактор с конвертером запросов и автоформатированием, а также честная статистика по объектам и функциям. Главное новшество PRO — до пяти конфигураций одновременно с мгновенным переключением, наложение до пяти расширений как в конфигураторе, анализ внешних файлов в единой связке с основной конфигурацией и пять тем оформления. Инструмент для тех, кто ведёт несколько проектов параллельно и хочет видеть полную картину в одном окне — быстро, наглядно и безопасно.

7 стартмани

19.05.2026    2781    27    KHoroshulinAV    7    

13

Запросы Рефакторинг и качество кода Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Есть запросы, которые сразу вызывают подозрение: десятки соединений, множество временных таблиц, объединения, группировки и длинный список условий. Но чаще проблемы прячутся в другом месте — в запросах, которые выглядят вполне приемлемо. Пара обращений через точку, отбор после виртуальной таблицы, РАЗЛИЧНЫЕ «чтобы убрать дубли», большой список в параметре, реквизит регистратора через составной тип — и вот уже на тестовой базе все летает, а в рабочей базе отчет открывается минуту. Разберу такие случаи из практики: не синтаксические ошибки, а именно запросы, которые формально нормальные, но на больших данных начинают вести себя плохо.

04.05.2026    1735    YA_2060655612    11    

9

Рефакторинг и качество кода Программист Бесплатно (free)

Почему рефакторинг, призванный улучшать код, иногда приводит к сбоям, потерям времени и новым ошибкам? Показываем типичные ситуации, когда рефакторинг становится токсичным: работа с legacy-кодом, изменения перед релизом, рефакторинг про запас и без тестирования. Объясняем, как универсальные мегаметоды, преждевременные абстракции и отсутствие понимания бизнес-логики ухудшают систему. А также рассказываем, когда рефакторинг действительно нужен, и какие принципы помогают делать его безопасно и осознанно.

29.04.2026    928    _apelsin4ik    0    

5

Рефакторинг и качество кода Программист Стажер 1С 8.3 Бесплатно (free)

Код в 1С редко начинает тормозить сразу. Намного чаще он долго выглядит нормальным, а проблемы проявляются позже — когда растут данные, пользователи и количество доработок. В статье разбираю типичные причины такой деградации: запросы в цикле, лишние ПолучитьОбъект(), тяжёлые формы и обработку “по одному”. Статья практическая: с примерами, типичными ошибками и понятными признаками того, что код уже плохо масштабируется.

21.04.2026    1960    YA_2060655612    6    

11

Инструментарий разработчика Рефакторинг и качество кода Программист 1С:Предприятие 8 Бесплатно (free)

Инструмент для тех, кто устал читать модули по 50 тысяч строк и искать ошибки глазами. MetaVision загружает выгруженные файлы конфигурации и за секунды строит графы функций, находит уязвимости и подсвечивает проблемы производительности. Ключевые возможности: Визуализация логики функций (графы условий, циклов, транзакций и вызовов). Статический аудит безопасности (RCE, SSRF, COM-инъекции, пароли в коде). Поиск проблем производительности (запросы в циклах, вложенные блокировки). Полнотекстовый поиск по всем модулям конфигурации. Статистика по объектам и функциям. Безопасность: Программа работает строго локально. Код вашей конфигурации не отправляется в интернет и не анализируется на сторонних серверах. Попробуйте MetaVision сегодня — узнайте, что скрывает ваш код.

20.04.2026    11449    1212    KHoroshulinAV    56    

89

Рефакторинг и качество кода Программист 1С 8.3 Россия Бесплатно (free)

Как быстро разобраться в чужом коде? Как не забыть через полгода алгоритм работы своего собственного кода? Как наглядно проектировать? Ответам на эти вопросы посвящена данная публикация.

17.04.2026    859    chuprina_as    4    

4

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

Создадим скрипт на Пайтон, предназначенный для автоматизированного подбора чанков (фрагментов требований к коду) при разработке на 1С. Она помогает разработчику формировать качественные промпты для ИИ, включающие все необходимые требования безопасности, производительности и стандартов кодирования. Кому интересно, покритикуйте и предложите улучшения. Результаты опубликуем.

20.03.2026    1683    ksnik    4    

5

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

ИИ действительно помогает команде ускориться: быстрее разбирать код, быстрее входить в сложные участки, быстрее запускать доработки. Проблема в том, что вместе со скоростью он может ускорять и другое — накопление скрытой сложности, рост цены изменений и потерю управляемости. В статье разбираю, почему первые успехи с ИИ так легко опьяняют, когда система начинает выставлять счёт и что нужно сделать, чтобы ускорение не превратилось в новый виток технического долга.

17.03.2026    2234    IgorVasilyev    54    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DmitryKlimushkin 04.06.26 13:16 Сейчас в теме
.... Изо всех сил молчу...
2. chuevsf 390 04.06.26 14:19 Сейчас в теме
(1) Ну ладно. Давай выговаривайся! Не держи в себе.)))
3. DmitryKlimushkin 04.06.26 14:53 Сейчас в теме
(2) Ситуация настолько классическая, что хочется плакать.
Очень часто в статье упоминается слово "система". В этом и подвох. Слово одно, а пониманий множество. Для меня система это свод нормативных документов, обязательных правил, догм, методик и чертежей, изложенных в общедоступных документах и имеющих универсальное применение (действует для всех!). Короче говоря, система - это полка с книгами, в моём понимании этого слова. ИТ-шники напряглись, потужились и родили новое понимание старого слова. В их Вселенной "Гугла и Винда" системой стал железный ящик с программным кодом. Изначально всё выглядело красиво. Зачем тратить время, силы и прочие ресурсы на создание никому не нужной (как всегда поверхностно кажется!) бумажной (бумага, Карл!) нормативной базы. Это при таких-то умных и светлых головах, да мы щас прям из уст аналитиков через свои уши вольём, в пальчики спустим, а те заколотят сразу код в любимый ящик. Ведь пока аналитик говорит - всем всё понятно сейчас и через пятилетку останется понятным. Мы любим программирование и радостно наделяем своё детище таким свойством, как "правосубъектность". Как нам надо жить? А как код в компьютере забит - так и надо жить.
Уже через неделю никто не помнит, что там сладко плёл аналитик, и вообще он в отпуске, из которого не выйдет, а сразу уволится. Менеджера, породившего очередную красивую идею (про те же бонусы!) отправили на повышение в другой филиал и он поменял телефон. Всё, "ящик резко стал чёрным". Пока всё крутится как-то и работает, но туда лучше уже не лезть, ибо никто не знает всех тупиков и поворотов. А сверить-то не с чем! На бумаге же сэкономили!
Настройщики музыкальных инструментов пользуются камертоном - щёлкнут по нему и тянут струнки, ищут резонанс. Камертон - эталон настройки. Имея эталон можно лезть в любую систему, ведь сразу под руками образец, к которому надо стремиться и есть критерии "правильно-неправильно". Разве только в ИТ такие страхи перед "системами"? Вменяемый электрик сроду не полезет в провода, не держа схему перед глазами, оно ему надо - жизнью рисковать?
То же и с механиками. А разве в Инете мало роликов, как очередной экскаватор нечаянно "нашёл" водопровод или высоковольтный кабель?
У меня есть сильное подозрение, что ИТ-шники как-то дольше всех тупят и пытаются работать без чертежей, схем и прочих, БУМАЖНЫХ, нормативных актов, делающих код - СИСТЕМОЙ!
Автор упомянул систему бонусов. А любопытно было бы взглянуть на приказ по предприятию "О порядке расчета и начисления бонусов". Он - есть? Не декларативная бумазея в стиле "А пусть будут бонусы", а подробная методика с формулами, формирующая свойства, условия и алгоритм вцелом. Нет бумажки? Так перестаньте называть код - системой. Это просто ворох нулей и единичек.
EvgeniyOlxovskiy; chuevsf; +2 Ответить
4. chuevsf 390 04.06.26 15:18 Сейчас в теме
(3) Да я этот коммент читал с большим упоением, чем саму статью! )))

P.S. Со злостью вспоминаю модератора, который не пропустил статью этого автора!
5. IgorVasilyev 118 04.06.26 15:35 Сейчас в теме
(3)Дмитрий, по сути я с вами согласен. В идеальном мире перед изменением критичного механизма у команды есть методика, схема, владелец правила, актуальные сценарии проверки, история изменений и понятный эталон, с которым можно сверяться. В такой картине действительно меньше причин бояться кода: есть камертон, относительно которого можно понять, что правильно, а что уже отклонение.
Но я как раз писал не про идеальный мир. В реальных проектах, особенно когда системе уже 3–5 лет и больше, часто оказывается, что «камeртон» либо не был создан, либо давно перестал совпадать с тем, что живёт в продуктиве. Приказ мог быть. Методика могла быть. Даже схема могла быть. Но потом пришли акции, исключения для отдельных клиентов, срочные правки, ручные корректировки, изменения после релиза, обходы, ночные пересчёты — и через несколько лет фактическое поведение системы уже нельзя восстановить по исходному документу.
И здесь появляется отдельная ловушка. Одни команды действительно экономят на описании правил и потом получают чёрный ящик. Это ровно тот случай, о котором вы пишете: кода много, эталона нет, сверяться не с чем.
Но есть и другой перекос: компания строит «идеальную систему управления», порождает сотни страниц регламентов, схем, методик и показателей, но команда всё равно работает по устной памяти, потому что эти документы никто не читает, не обновляет и не использует при изменениях. Формально нормативная база есть. Фактически она не управляет разработкой.
Поэтому для меня проблема не в том, «нужны документы или не нужны». Конечно, нужны. Особенно для расчётов, денег, прав, закрытия месяца, интеграций и любых механизмов, где ошибка быстро становится бизнес-инцидентом.
Проблема в другом: документ должен быть рабочим эталоном, а не архивной бумагой. Если есть приказ «О порядке расчёта бонусов», но в нём нет актуальных исключений, возвратов, ручных корректировок, условий пересчёта и спорных сценариев, команда всё равно будет бояться менять код. Если схема есть, но последний раз её открывали два года назад, она не снижает риск. Если методика написана так, что её нельзя превратить в проверочные сценарии, она не помогает разработчику и QA. В статье я использовал слово «система» шире, чем просто код. Для меня рабочая система — это код, данные, правила бизнеса, интеграции, регламенты, тесты, эксплуатационные процедуры и память команды. Когда один из этих слоёв становится единственным источником правды, начинаются проблемы. Если вся правда только в коде — получаем чёрный ящик. Если вся правда только в документах, которые не совпадают с продуктивом, — получаем красивую нормативную витрину, рядом с которой живёт отдельная реальная система.
Хороший эталон не обязан быть тысячей страниц. Иногда для старта достаточно таблицы сценариев: как считается в обычном случае, что происходит при возврате, какие есть исключения, какие ручные корректировки допустимы, где вызывается расчёт, какие проверки обязательны перед релизом. Такая документация короче, но она работает: по ней можно спорить, тестировать, принимать изменения и удалять обходы.
Так что я бы сформулировал так: страх изменений появляется не только потому, что нет документов. Он появляется, когда у команды нет живого эталона поведения системы. Иногда потому, что его никогда не сделали. Иногда потому, что его сделали, но перестали поддерживать. А иногда потому, что документации стало так много, что она перестала быть инструментом работы и превратилась в отдельный ритуал.
И вот тогда код действительно начинает жить как единственный закон. С этим я полностью согласен: это плохая точка для любой зрелой системы.
6. DmitryKlimushkin 04.06.26 15:52 Сейчас в теме
(5) Слова "система" и "отдельный клиент" несовместимы. Либо фабрика готовой одежды, либо ателье мастера и индпошив.
"Команда не читает..." Однажды прочёл исторический труд про Мамая. Он был образованнейшим человеком своего времени. Вот он говорил, что "если слово амира (военноначальника) короче его кнута, то это не амир а пастух для баранов". Команда, делающая то, что она хочет или не хочет, по умолчанию систему создать не способна. Да и вообще, такое стадо командой не называется...
Если у вас есть принятая на предприятии нормативная база (восторг! Я туда поеду - посмотреть и потрогать!), а действующий цифровой "слепок" этой нормативке не соответствует, то сразу вкрадчивый вопрос - а чьим приказом этот загадочный чёрный ящик вообще разрешили эксплуатировать? Как верить цифрам на экране?
И вов всём этом сквозит "затупившаяся бритва Оккама". Насоздавали немеряно лишних сущностей. Работаете с контрагентом? Нет ничего другого, кроме Гражданского Кодекса и соответствующей статьи о "О гражданском договоре". Навыдумывали ложных сущностей? Налепили "ласточкиных гнёзд" для каких-то особых форматов и видов отношений? Теперь страдайте. В подавляющем числе случаев тотальный отказ от всей этой мишуры (бонусы, скидки, прокидки, спецобслуживание и вымпел "Любимый покупатель") вообще не влияет на объём выручки. Как пелена спадает и немой вопрос в глазах глядящих друг на друга менеджеров "А нафига мы всеми этими мульками столько лет занимались??" Это тот случай, когда администрирование профита оказывается дороже и больше самого профита.
Такой огород зачастую радостно городят сами программисты. Им скучно, им хочется творчества. Вот и натворили. "У всех проблем одно начало - сидела женщина, скучала...") Оставьте сухую поджарую лаконичную и функциональную систему оформления сделок, впишите это в свою учётную систему и не засоряйте свой ИТ-пейзаж, чтобы он напоминал тюнингованный ВАЗ 2106 в 1993-ем году)
8. IgorVasilyev 118 04.06.26 18:34 Сейчас в теме
(6) Дмитрий, давайте проверим вашу модель на конкретном примере.

Есть дистрибьютор. Есть крупный сетевой клиент, который даёт заметную долю оборота по направлению. Он согласовывает с компанией квартальный ретро-бонус: если объём закупки выше порога, начисляется бонус, но с учётом возвратов, просрочек оплаты и исключённых товарных групп.
По вашей логике здесь легко сказать: «слова “система” и “отдельный клиент” несовместимы, не надо плодить сущности, есть договор и ГК».
На бумаге это выглядит чисто. Но коммерческий блок в реальности не отменит сделку только потому, что она портит архитектурную симметрию. Если условие экономически важно, оно всё равно появится. Вопрос только в том, где оно будет жить.
Если в системе нет управляемого способа описать такое правило, оно переедет в Excel, письма, ручные корректировки, допсоглашения, квартальные сверки и память конкретного менеджера. Формально учётная система останется сухой и лаконичной. Фактически вокруг неё появится ручной процесс, который никто целиком не контролирует.
И вот это хуже, чем честно признать сложность и встроить её в модель. Потому что в первом случае у правила может быть владелец, срок действия, критерии применения, сценарии проверки, связь с договором и понятный расчёт. Во втором случае система красивая, но реальная жизнь происходит рядом с ней.
Я согласен, что многие бонусы, скидки и спецусловия годами живут без проверки экономического смысла. Это настоящая проблема. Иногда администрирование такой «гибкости» действительно стоит дороже, чем эффект от неё. Но вывод из этого не в том, что любые исключения надо объявить мишурой и убрать из системы.

Вывод другой: каждое исключение должно пройти проверку на цену жизни.

Кто владелец правила?
Какой экономический эффект оно даёт?
Где срок пересмотра?
Какие сценарии проверки обязательны?
Что происходит при возврате?
Что происходит при просрочке оплаты?
Какие товарные группы исключаются?
Где это связано с договором?
Кто имеет право изменить условие?

Если на эти вопросы нет ответа, да, это не система. Это ласточкино гнездо. Но если ответы есть, то перед нами не «индпошив вместо фабрики», а параметризованная модель коммерческих правил.
Проблема старых ИТ-систем как раз в том, что они часто не делают этого различия. Одни исключения надо было запретить. Другие — встроить в общую модель. Третьи — дать временно и потом удалить. Вместо этого их годами добавляли как частные обходы.
Поэтому я бы спорил не с бонусами как классом и не с нормативной базой как идеей. Я бы спорил с управленческой привычкой принимать исключения без расчёта стоимости сопровождения.
Сухая лаконичная система хороша там, где она отражает реальную модель бизнеса. Но если ради красивой простоты мы выкинули из неё реальные коммерческие правила, то мы не упростили компанию. Мы просто перенесли сложность в Excel, ручные сверки и память людей.
А это уже не система. Это как раз то самое минное поле, только спрятанное не в коде, а вокруг него.
11. DmitryKlimushkin 04.06.26 18:59 Сейчас в теме
(8) А коммерция вообще не укладывается в систему. Это творческий процесс и сроду в нем не удаётся создать хоть что-то живущее и действующее хотя бы пару лет подряд. Никуда от этого не деться. Да, Эксель! Он именно для этого и был создан, кстати. Системный учет оставить в системе. А творчество вывести в отдельный "загон", и пусть в этой песочнице конкретный менеджер окучивает каждого клиента - индивидуально, если это того стоит. Я провёл в обороте нефтепродуктов от 15 до 20 лет (свой бизнес!) И смотрю на теперешнюю ситуация с бензином и дизелем. Вот в какую бы систему я это смог бы загнать? Какими бонусами обложить или исчислить? ДА все на кончиках пальцев! Один созвон обрушит планы, построенные на неделе назад. Одно распоряжение властей обнулит все договорённости, независимо от статуса клиента. Что здесь можно кодом описать?
Но по-прежнему балдею от формулировок. Очень трудно оспаривать такой текст, ИИ отдыхает) Да и не спорим мы, чаще всего. Профдеформации по месту конкретной работы) Как старики на лавочке, у одного коленки болят, у другого - спина, но вцелом говорят о ревматизме))
IgorVasilyev; +1 Ответить
13. IgorVasilyev 118 04.06.26 19:42 Сейчас в теме
(11) Дмитрий, вот здесь я как раз вижу важную границу.
Коммерция как переговоры действительно плохо укладывается в систему. Клиент позвонил, рынок качнулся, поставщик поменял условия, регулятор выпустил распоряжение, логистика встала, маржа за неделю стала другой. Это не надо пытаться «закодировать» целиком. Если менеджер ведёт сделку, подбирает условия, считает варианты в Excel и индивидуально окучивает клиента — это нормальная рабочая песочница.
Но дальше появляется другой момент. Пока это расчёт варианта — пусть живёт в Excel. Пока это переговорная позиция — пусть живёт у менеджера. Пока это гипотеза — её не надо тащить в учётную систему.
Но когда условие стало обязательством компании, оно уже перестаёт быть творчеством. Если клиенту по итогам квартала надо начислить бонус, сделать корректировку, изменить цену, удержать скидку, пересчитать возврат или объяснить цифру в акте сверки — это уже не «кончики пальцев». Это деньги, документы, ответственность и воспроизводимость расчёта.
И вот здесь Excel-песочница становится опасной, если она остаётся единственным местом правды.
Не потому что Excel плохой. Он как раз хорош для моделирования и быстрых расчётов. Плохо, когда по Excel принимают обязательство, а потом никто не может восстановить: какая версия файла была финальной, кто согласовал формулу, какие возвраты исключили, какие отгрузки вошли, почему одному клиенту посчитали так, а другому иначе.
Поэтому я бы не пытался загнать всю коммерцию в код. Это действительно мёртвая идея. Но я бы жёстко разделял:
до сделки — творчество, переговоры, Excel, сценарии, ручной расчёт;
после принятого обязательства — правило, владелец, срок действия, способ проверки и место, где компания может воспроизвести расчёт.
Иначе получается странная конструкция: системный учёт вроде бы в системе, а реальные финансовые последствия живут в отдельных файлах, письмах и памяти менеджера. Пока менеджер на месте и рынок не спорит — всё работает. Потом человек ушёл, клиент попросил расшифровку, бухгалтерия сверяет документы, а команда ищет тот самый файл «финал_точно_последний_3.xlsx». Так что, кажется, мы действительно говорим про один ревматизм, только с разных суставов.
Вы говорите: не надо превращать живую коммерцию в бюрократический механизм. Я с этим согласен, но добавлю - не надо оставлять уже принятые коммерческие обязательства в тумане, потому что потом этот туман всё равно придёт в учёт, поддержку, сверки и ИТ.
15. DmitryKlimushkin 04.06.26 19:50 Сейчас в теме
(13) Финансовые последствия живут в виде фактов хозяйственной жизни. В случаях, когда договорённость живёт только в пределах одной операции (купли-продажи), каждую следующую операцию придётся начинать с достижения новой договорённости в новых условиях. Как говорится, "оплата счёта означает согласие с условиями". По факту всех этих "коммерций" речь всегда о цене. Иногда о форме оплаты (если кому-то ещё нужна наличка). Менеджер оговорил цену - её внесли в документ продажи. Вот оно - последствие. Но можно ещё бусы повесить и павлиньи перья воткнуть) Кажется, в офисах стало сидеть слишком много народа....
19. IgorVasilyev 118 04.06.26 20:11 Сейчас в теме
(15) Дмитрий, здесь я с вами согласен в важной части: если договорённость живёт ровно в пределах одной продажи, её действительно не надо превращать в отдельную сущность.
Менеджер согласовал цену, цену внесли в документ реализации, клиент оплатил счёт — всё, факт хозяйственной жизни состоялся. В такой ситуации бонусная система, статусы, «любимые покупатели» и прочие павлиньи перья действительно могут быть лишней надстройкой. Иногда лучший механизм скидки — это просто правильная цена в документе.
Но это работает только пока последствие полностью помещается в одну операцию.
Как только условие начинает жить дольше одной продажи, одной цены в документе уже мало. Например: квартальный бонус за объём, перерасчёт после возвратов, скидка при соблюдении платёжной дисциплины, компенсация логистики, маркетинговый бюджет, ретро-бонус по группе товаров, условие по сети филиалов. Там финансовый результат возникает не в момент одной реализации, а после набора событий за период.
И вот здесь вопрос не в том, чтобы «навесить бусы». Вопрос в том, где компания потом сможет воспроизвести расчёт.
Если всё действительно сводится к цене в счёте — отлично, не надо усложнять.
Если условие влияет на будущие начисления, корректировки, взаиморасчёты, акты сверки и объяснение цифр клиенту через три месяца — это уже должно быть управляемым правилом, а не памятью менеджера и не файлом на рабочем столе.
С тезисом про лишних людей в офисах тоже спорить сложно. Очень часто сложность живёт не потому, что она нужна бизнесу, а потому что вокруг неё уже выросли роли, отчёты, согласования и привычные ритуалы. Но тогда правильный вопрос не «как это красивее закодировать», а «зачем это вообще существует и сколько стоит сопровождение».
Если ответ: «ни зачем, просто так исторически сложилось» — сносить.
Если ответ: «это даёт деньги, но плохо оформлено» — приводить в модель.
Если ответ: «это временное исключение» — давать срок жизни и дату пересмотра.
Вот это и есть граница: не всякую коммерцию надо тащить в систему, но всякое обязательство, которое переживает одну сделку и влияет на деньги, должно быть воспроизводимо. Иначе мы не упрощаем систему, а просто переносим минное поле из кода в Excel, почту и память конкретного менеджера.
7. gybson 13 04.06.26 18:31 Сейчас в теме
Это проблема любого кустарного производства. Оно не может расти. И при таком управленческом коллапсе 10 человек! И ни один не умеет читать код. Это просто джек пот какой-то. Такие факапы делаются гораздо дешевле!
EvgeniyOlxovskiy; +1 Ответить
9. IgorVasilyev 118 04.06.26 18:40 Сейчас в теме
(7) С кустарным производством согласен: оно действительно плохо растёт.
Но я бы не сводил проблему к тому, что «10 человек не умеют читать код». В старой учётной системе код показывает, что сейчас происходит, но не всегда отвечает на вопросы: зачем это условие появилось, какое бизнес-правило оно защищало, актуально ли оно сейчас, какие данные уже накоплены и какие процессы на это завязаны.
Разработчик может прочитать функцию. Но если за пять лет в неё добавляли акции, возвраты, исключения, ручные корректировки и ночные пересчёты, одного чтения уже мало. Нужно восстановить смысл решений.
Кустарность как раз в этом: система росла без механизма сохранения контекста — без владельцев правил, актуальных сценариев проверки, срока жизни исключений и регулярного удаления обходов.
Такие факапы действительно делаются дёшево: одной срочной правкой, одной обработкой, одной веткой «только для этого случая». Дорого становится потом, когда десятки дешёвых решений складываются в участок, который работает, но уже плохо поддаётся изменению.
10. gybson 13 04.06.26 18:46 Сейчас в теме
(9) Правильно, этого вообще не должно быть в коде, это уровень пользователя.
14. IgorVasilyev 118 04.06.26 19:48 Сейчас в теме
(10) Да, согласен: выбор коммерческого условия должен быть на уровне пользователя, а не в коде.
Но здесь важное уточнение: «уровень пользователя» не должен означать “где-то в Excel, письмах и устной договорённости”.
В коде действительно не должно быть веток вида: «если клиент такой-то, считаем иначе». Это почти всегда будущая мина. Но в системе должен быть способ описать правило как данные: вид условия, период действия, группа клиентов, товарные группы, порог оборота, порядок учёта возвратов, срок действия, кто согласовал.
Тогда разработчик не меняет код под каждого клиента. Пользователь управляет условиями в рамках модели, а система обеспечивает расчёт, проверку и воспроизводимость результата.
Проблема начинается там, где исключение вроде бы «уровень пользователя», но в системе для него нет нормального места. Тогда оно уезжает в ручные корректировки, отдельные обработки, файлы и комментарии к задачам. Формально код чистый. Фактически логика расчёта всё равно существует, только уже вне управляемой модели.
Поэтому я бы сформулировал так: да, это не должно быть захардкожено в коде. Но если это влияет на деньги, документы и обязательства перед клиентом, оно должно быть представлено в системе как управляемое правило, а не как память конкретного пользователя.
16. gybson 13 04.06.26 19:55 Сейчас в теме
(14) Уходит та романтичная пора, когда условный Васили или Федор 1С-ник совершал магию недоступную для контроля смертных. В виде огромных страшных процедур, хардкода и единственного источника недоступной никому правды. Мне кажется это еще с тех времен, когда был страх перед программистом 1С. Как-будто он единственный умеет читать и писать, а голову мыть не умеет. Я надеюсь вы описываете уже уходящие проблемы.
20. IgorVasilyev 118 04.06.26 20:15 Сейчас в теме
(16) Да, я тоже надеюсь, что эта пора в прошлом. Во многих командах она действительно уходит: код-ревью, тесты, CI, разбор изменений и нормальное владение кодом сильно уменьшают власть «единственного Василия, который знает, как оно работает».
Но проблема не исчезла полностью, она просто сместилась.
Раньше магия часто жила в огромной процедуре, хардкоде и голове одного 1С-ника. Сейчас она может жить в цепочке старых решений: в настройках без владельца, обработках «на всякий случай», регламентных заданиях, Excel рядом с системой, неописанных исключениях и устной памяти бизнеса.
То есть программист уже может быть вполне нормальным: читать код, писать тесты, проходить ревью и мыть голову. Но если система пять лет росла через срочные правки, временные обходы и исключения без срока жизни, чёрный ящик всё равно может возникнуть.
Только теперь его создаёт не один «магический» разработчик, а накопленная история решений, которые живут дольше контекста, в котором появились.
12. EvgeniyOlxovskiy 111 04.06.26 19:34 Сейчас в теме
Команда просто не умеет писать код. Не хватает архитектора. Эта ситуация уже давно описана в книжках по программированию. Это во-первых.

Во-вторых, если правила начисления бонусов нигде не прописаны, кроме кода, то получается, что их нет. Так чего тогда мы боимся? Можно сносить всё это дело. Если кто-то начнет говорить, что бонусы неправильно считаются, то к нему вопрос: а где правила начисления?
DmitryKlimushkin; +1 Ответить
17. gybson 13 04.06.26 19:57 Сейчас в теме
(12) Если правил нет это не значит, что не побьют. Скорее всего даже наоборот.
18. IgorVasilyev 118 04.06.26 20:05 Сейчас в теме
(12) Евгений, с тем, что архитектурной работы там не хватило, спорить не буду. Если критичный механизм за несколько лет превратился в набор исключений, обходов и устной памяти, значит, команда действительно не удержала модель.
Но я бы не сводил это к «просто не умеют писать код». Код можно писать нормально и всё равно вырастить такую проблему, если нет владельца правил, ревизии исключений и сценариев проверки.

По второму пункту логика понятная: если правил нигде нет, значит, их как будто нет и можно сносить. В идеальном мире — да. Но в рабочей системе такой подход напоминает анекдот про поручика Ржевского: слов он уже не помнит, но смысл сводится к тому, что все вокруг неправы, а он один д’Артаньян.
Если прийти в проект и начать сносить все недокументированные изменения, поиски следующей работы могут сильно затянуться, а срок на текущем месте — оказаться неожиданно коротким.
Вопрос «где правила начисления?» правильный, но запоздалый. Его нужно было задавать до попадания правила в продуктив. Если механизм уже живёт несколько лет, сначала приходится восстановить фактическую модель: что реально считается, кто этим пользуется, какие исключения живые, какие мёртвые, где есть обязательства, а где просто исторический мусор.
И только после этого часть действительно можно и нужно снести. Но уже с пониманием последствий, а не по принципу «нет документа — нет правила».
Для отправки сообщения требуется регистрация/авторизация