Сложность точка невозврата. Как вы это называете?


13

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

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

Есть ли у этого конкретного момента название на программистском диалекте (что-то похожее на закон Годвина для троллей)?

--редактировать--

Извините, если мне не ясно. Я не думаю, что этот «момент» имеет официальное название или является серьезной метрикой. Я думал о чем-то в духе «пика Балмера» в xkcd .


1
Я вижу одно противоречие в вашем определении рассматриваемого вопроса: ... за меньшее время вам потребуется переписать все с нуля , что означает, что те, кто собирается переписать проект, достаточно хороши или, по крайней мере, лучше, чем те, кто создал беспорядок в первую очередь;)
моджуба

1
Я думаю, что одна причина, по которой нет согласованного названия, заключается в том, что это зависит от того, кто смотрит на код. То, что кажется безнадежно сложным или непригодным для одного разработчика, может показаться разумным для другого. В серьезных случаях я просто компилирую в DLL с префиксом "ms" и говорю, что это от Microsoft.
Кевин Сюй

1
Может быть, это
подойдет

Ответы:


20

Это больше вопрос ремонтопригодности, чем сложности.

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

Это то, что вы имели в виду?


Спасибо за ваш ответ. Мне знакомо понятие «технический отдел». У каждого проекта есть какой-то технический долг. Я имею в виду: как вы называете момент, когда этот долг становится настолько высоким, что вы бы предпочли выбросить проект на свалку и начать заново?
Тибо Дж

3
Мне нравится ваш термин «техническое банкротство». Это говорит о том, что, как и в случае реального банкротства, вы должны внимательно посмотреть, какие части подлежат спасению, а какие следует оставить позади. И, возможно, некоторая реструктуризация долга - это все, что действительно нужно :)
Jaap

2
@Thibault J: я не верю, что есть конкретный термин для этого момента. Это больше о том, чтобы понять, счастливы ли вы до этого времени или грустно прошли дальше.

1
@ Developer Art: ... понимая, если вы все еще счастливы до того времени или, к сожалению , вышли за его пределы - я думаю, что это ключ к хорошему определению сути: проект, который вышел за рамки этого, - это проект, который ни один инженер не будет взять на себя добровольно.
Моджуба

3
Я пойду на срок "технического банкротства", мне это нравится. И я также буду использовать ваше определение.
Тибо J

16

«Точка чрезмерной сложности» в английском языке обозначается как:

О, Боже мой, что это за хрень.

Проблема в том, что это может относиться к чему-то, что на самом деле просто, но реализовано так ужасно, что у вас такая же реакция.

Так что отличить что-то очень сложное от чего-то очень ужасного может быть сложно.

ОДНАКО: То, что на самом деле происходит со всем программным обеспечением, происходит примерно так:

Шаг 1: Иметь хорошую спецификацию, делать хороший дизайн, реализовывать хорошие вещи. Все счастливы.

В конце шага 1: разработчики поздравляют себя с удивительной элегантностью своего дизайна и уходят от счастья, думая: «У меня есть замечательное наследие, к которому другие могут добавить вещи в будущем, это будет чудесно, и мир станет лучшее место."

Шаг 2: Внесены некоторые изменения, добавлены вещи, включены новые функции. Архитектура и структура из шага 1 сделали этот процесс довольно безболезненным. [Но, к сожалению, «фактор погрешности» только увеличился.]

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

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

В конце шага 3: разработчики поздравляют себя с удивительной элегантностью их дизайна и уходят от довольно счастливого размышления: «Ну и дела, эта архитектура довольно хороша, чтобы позволить такому количеству изменений просто вставлять легко. Но я немного несчастен о X, Y и Z. Теперь их можно немного почистить. Но !!! Ааааааааааааааааа .... Я так умен, что сделал все эти поправки в Шаге 1. Это прошло так хорошо. У меня есть замечательное наследие для другие будут добавлять вещи в будущем, это будет чудесно, и мир станет лучше ».

Шаг 4: так же, как шаг 3. За исключением:

В конце шага 4: разработчики думают: «Этот материал, который был настолько хорош, становится уродливым для обслуживания. Он действительно нуждается в серьезных изменениях. Мне не очень нравится работать над этим. Нужен рефакторинг. Интересно, что за начальник? скажет, когда я скажу ему, что ему нужно 6 недель, и пользователям будет нечего видеть в конце этого ... но я получу еще 5 лет вкусной будущей модификации, сделав это .... хммм .. . время идти в паб за пивом ".

Шаг 5: Нужно сделать кучу изменений.

И во время шага 5 разработчики говорят друг другу: «Этот код - отстой. Кто это написал? Они должны быть застрелены. Это ужасно. Мы должны переписать это».

Шаг 5 смертелен. Именно здесь фактор погрешности настолько плох, что в коде не может быть просто еще нескольких изменений, ему нужно внести БОЛЬШИЕ изменения.

Проблема на Шаге 5 - желание выбросить это и начать снова. Причина этого фатальна - «Фактор Netscape». Иди в Google. Компании умирают на этом этапе, потому что начинать заново означает, что вы начинаете с примерно 50% предположений вместо фактов, 150% энтузиазма вместо знаний, 200% высокомерия вместо смирения («Эти ребята были такими тупыми!»). И вы вводите целую кучу новых ошибок.

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


Бьюсь об заклад, вы получите больше голосов, если вы сократите свои шаги.
Кодизм

Я должен добавить, что большинство компаний не выделяют на это бюджет, поэтому рефакторинг всегда слишком поздно. Чтобы управлять возрастающей энтропией систем, необходимо установить, чтобы с первого дня бюджет (10% -20%) выделялся на каждую работу по ведению домашнего хозяйства. Это не ошибка исправления бюджета. Расходы бюджета определяются инженерным, а не менеджментом, маркетингом или продажами. Он используется только для того, чтобы вычленить энтропию, создаваемую разработкой, и сократить расходы по мере приближения продукта к концу срока службы.
Mattnz

Согласовано. Менеджмент всегда хочет урезать такие вещи. Иногда вы можете скрыть это (добавьте около 20% к оценке разработки для выполнения чего-либо, а когда необходим рефакторинг - СДЕЛАЙТЕ ЭТО).
fast_now

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

2

Я согласен с тем, что этот момент трудно распознать, и его можно избежать с помощью надлежащих процессов. Однако вопрос был в том, как это назвать. В реальной экономике существует концепция «убывающей отдачи»: точка, в которой увеличение затрат на один ресурс в процессе уменьшает вашу общую прибыль на единицу. Это, безусловно, относится к кодированию, и даже такие хорошие вещи, как абстракция, повторное использование и т. Д., Имеют такую ​​точку снижения отдачи. Общий термин, относящийся к программированию, - «переобучение». Для кого-то, кто склонен к этому, мне нравится термин Джоэля " астронавт архитектуры ".


1

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

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

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

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


Что ж, я видел проект, который так взвинчен, что их бюджет на обслуживание в три-четыре раза превышал первоначальный бюджет разработки. В любом случае, термин, который я ищу, не является «официальным» и серьезным, а скорее похож на «пик Балмера» в xkcd. Извините, если мне не очень понятно.
Тибо Дж

Но как это так взвинчено? Если это из-за сложных требований, плохого управления, по сравнению с оптимистичными инженерами, зачем переписывать это исправлять?
Mattnz

Потому что команда переписывает это не то же самое, что тот, кто пишет это в начале?
Тибо J

1

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

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


«Каждый коммит в кодовую базу выполняется с верой в то, что это улучшение в этой кодовой базе». Кажется, мы никогда не работали в одних и тех же компаниях :)
Thibault J

@ThibaultJ - Возможно, ваши коллеги были психопатами?
Дэн Рэй

@Thibault J: Я считаю, что каждый коммит делается с верой в то, что это улучшение в этой кодовой базе. Конечно, вера иногда плохо исследована и необоснованна.
Дэвид Торнли

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

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

-1

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


Или позаимствовать другой ядерный термин: критическая масса.
Джон Кромарти

-2

Это не очень интересный вопрос.

На самом деле это тривиально.

Это так тривиально, что мы разработали множество способов справиться с этим.

  1. Водопад методологии. Многие люди тратят много времени на пересмотр требований и разработку документации, чтобы убедиться, что сложность решена.

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

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

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

  • Отсутствие сроков спринтов или правильных приоритетов в Agile методологии. Они не ориентированы на то, чтобы что-то было предоставлено пользователю как можно быстрее.

Сложность должна быть ограничена постановкой целей.

Борьба со сложностью означает, что цели не установлены или не вознаграждены должным образом.

Там нет "поворотный момент". Если управление сложностью является проблемой, организационно что-то уже не так.


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

@ Дэвид Торнли: Это моя точка зрения. «Точка сложности, откуда нет возврата» не существует. Это просто старое плохое управление. Там нет необходимости для сложного имени или правила. Сложность - это просто симптом плохого управления. Не очень интересно.
С.Лотт

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

@ Дэвид Торнли: Я думаю, что очень трудно отделить плохое управление (что приводит к ужасающей сложности) от плохого управления (которое приводит к тому, что все уходят). Я не вижу способа определить, станет ли проект слишком сложным, запоздалым или просто некомпетентным.
S.Lott

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

-2

Существуют методы для визуализации и мониторинга риска увеличения сложности для (больших) проектов и кода. Когда они применяются разумно, мы надеемся, что новое имя для точки невозврата не требуется. (Существует соответствующий MOOC на openHPI: https://open.hpi.de/courses/softwareanalytics2015/ )

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

Вот некоторые методы, чтобы уменьшить структурную сложность: http://www.buch.de/shop/home/suche/?fq=3540878890 :

  • модуляризация
  • избегание петель обратной связи
  • триангуляция

Кроме того, существует концепция аксиоматического дизайна: https: \ en.wikipedia.org \ wiki \ Axiomatic_design \ С помощью этой концепции можно избежать проблем, связанных с ненужной сложностью.

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


Это не отвечает на вопрос.
Халк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.