amarao: (Default)
[personal profile] amarao
Одно из самых сложных и повреждающих действий в проекте - повышение сложности проекта без должной отдачи.

Когда человек сталкивается с новым требованием в проекте, он открывает код, ищет, куда что дописать. Находит. Дописывает. Фича готова. Если проект достаточно покрыт тестами, то старые фичи/юскейсы не сломаны. Задача сделана, можно сказать, на отлично.

... Но в глубине...

В каждом месте, где он дописал, изменение, грубо говоря, можно свести к:

* всегда делать что-то (добавлять timestamp к сообщению). Сложность не изменилась, точнее, изменилась на несколько строчек. С точки зрения необоснованной сложности вопросов нет. Могут быть вопросы по дублированию кода (если одна и та же строчка получения/форматирования времени появилась в нескольких местах).
* Делать что-то по условию (если у нас есть фичефлаг 'timestamp', добавлять timestamp). Был линейный код, теперь у нас ветвление. Маленькое или большое - но ветвление. В декартовом произведении состояний приложения всё удвоилось.
* Делать что-то по условию в ветвях условий. Если это одно и то же, то это просто дублирование кода и предыдущий случай, если же это разные действия, то мы получаем нарушение инварианта, в котором, возможно, есть не покрытые тестами ветки.
* Добавить трекинг фичефлага или "режима", или "глобальной переменной". Теперь весь (или существенная часть) кода параметризирована, и, возможно, имеет необходимость отвечать на вопрос "что делать в этой ситуации" даже там, где фича не нужна или не имеет смысла.
* Вызывать распространяющиеся изменения (например, фичефлаг - линейный код в месте использования, но новый код вызывает расползающиеся изменения в компонентах, которые зависили от старого кода, включая "накладывание" эффектов идущих по разным ветвям кода на другой код, который вынужден вместо одного "да/нет" уметь реагировать на комбинацию действий разных ветвей кода (А: да, Б: нет; А: да, Б: да, А: нет, Б: да, А: нет, Б: нет).
* Вызвать появление нескольких версий интерфейсов или нарушение контрактов интерфейсов из-за появления вариантивности из-за фичи, включая необходимость думать о ковариантности или контр-вариантности (паталогический случай: когда в код передают сущность (коллбэк, замыкание), ожидающую объект с фичей или без фичи как параметр); особо тут обстоит вопрос с контрактами для внешних потребителей.
* Вызывать нелинейные сайд-эффекты, проявляющиеся через нетипизированные изменения среды исполнения (блокировки из-за чрезмерно активной записи, переполнения, etc).


И всё это выглядит как feature done, но последствия для проекта совершенно разные.


А вот заметить это глубинное преступление очень трудно. Feature done? Ну да, пришлось добавить matrix, ну да, мы теперь с помощью if'а вычисляем зависимости вместо линейного списка, у нас появилась ещё одна переменная, которую по Глубокой Причине надо выставлять в явном виде и помнить про её существование всем остальным вокруг.

Если это всё немного обобщить, то преступления тут нескольких видов:

* Повышение цикломатической сложности
* Нарушение инвариантов
* Добавление паталогических связей (с особым преступлением, когда оказываются связаны вместе два компонента, которые раньше были независимы)
* Экспозиция сложности в контракты
* Повышение нестабильности сайд-эффектов.


... И я не имею ни малейшего представления как это можно заметить, кроме как на интуиции, и то, не всегда.

Date: 2023-06-08 05:57 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Хороший анализ. Эта фигня происходит вечно. Лекарство, как я понимаю - рефакторинг. Увеличение сложности должно приводить к какой-то регуляризации структуры. Но обычно все кончается большой жопой и желанием все переписать.

Date: 2023-06-09 06:18 am (UTC)
From: [personal profile] ex0_planet
Всё продемонстрированное в посте имеет простое название: протекающие абстракции. И, да, под достаточным давлением (требований, обстоятельств, итд) любые абстракции текут, вопрос лишь во времени.

Заметить мало, нужно еще иметь желание, возможность и способность отреагировать, а это возможно не всегда (подтверждением чему есть мой текущий проект, но то отдельная история).

Date: 2023-06-09 03:34 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Дык. Я когда в Америку приехал, мне там дали хрень, добавить функциональности (покрыть тестами все существующие символы юникода); делов-то ничего, но мне дали уже "готовый код", написанный филологом (автором словаря какого-то африканского языка). Я приужахнулся, стал расчищать площадку. А Джон моему менеджеру пожаловался, что я его код починяю. А менеджер такой - "а зачем это ты делаешь?" А я такой (только что из Питера) - да там очень плохой код, надо расчистить место. А менеджер такой - "Ой! Так говорить в Америке нельзя!" (Сам он за пару лет до меня притащился из Швеции.) Ну нельзя так нельзя. Могу не говорить. А чо делать-то, надо что-то? Короче, меня оставили в покое, а с Джоном мы потом помирились.

Ну с тех пор вот так вот и поступаю - как считаю нужным.

Date: 2023-06-09 03:35 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

see "Accidental Complexity".

Date: 2023-06-09 06:19 pm (UTC)
From: [personal profile] dedekha
Именно поэтому у нас появляются новые компании: после нескольких десятков лет в какой то момент становится невозможным вносить изменения в систему и старые компании умирают.

Цена вопроса миллиарды (если компания просуществовала 20 лет это вполне ожидаемая цена) - могли бы и соломки с рефакторингом подстелить а встает он почему-то неожиданно для управленцев

https://ivypanda.com/essays/atampt-companys-wireless-self-destructs/
https://en.wikipedia.org/wiki/3Com

Date: 2023-06-09 07:48 pm (UTC)
From: [personal profile] anonim_legion
Есть ровно одно окончательное решение этой проблемы. Запихивание требований обратно в рот заказчику.

Но для этого надо, чтобы программисты работали в гильдиях, цехах, вроде ныне существующих медиков или юристов.

Date: 2023-06-12 10:57 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

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

Date: 2023-06-12 12:30 pm (UTC)
From: [personal profile] anonim_legion
Да, отказ вносить изменения, или назначение долгих сроков, поскольку изменение потребует переработки архитектуры.

Date: 2023-06-13 11:00 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

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

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 26th, 2026 08:00 pm
Powered by Dreamwidth Studios