Программисты иногда преднамеренно усложняют код? [закрыто]


26

Часто кажется, что на стековом потоке люди (особенно программисты) имеют тенденцию чрезмерно усложнять решение проблемы, где решение намного сложнее, чем исходная проблема? Я ни в коем случае не эксперт, но часто я пытаюсь использовать самое простое решение, которое работает (и, очевидно, это не работает ВЕЗДЕ), но у меня был довольно хороший успех, предлагая простые решения на работе, которые кажутся людям упускать НАМНОГО более сложные решения?

Это как нормальная вещь для программистов ..... или я просто не думаю в правильной перспективе.


5
1. Да, я иногда думаю. 2. Да, по крайней мере, некоторые программисты, по крайней мере, иногда чрезмерно усложняют свой код, по крайней мере, в некоторых случаях намеренно. 3. Корпуса закрыты.
Работа

3
Был ли у вас когда-нибудь кто-то кричал на вас: «Ты должен был подумать об этом!» когда вы пропустили какое-то требование, которое не было указано в начальном сборе требований? Вот что может привести к тому, что некоторые вещи станут более сложными, чем это необходимо.
JB King

Ответы:


18

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

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

Я думаю, что хороший программист избегает слишком сложного кода. Это включает в себя избежание соблазна заставить шаблон проектирования соответствовать решению, которое в действительности не требуется. Это также включает в себя избегание объектов Бога, магических кнопок, преждевременную оптимизацию, преждевременное обобщение и другие анти-паттерны.

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

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


32

Я видел много кода, который был более сложным, чем нужно, и почти всегда по этим трем причинам:

1) Чрезмерно спроектированный из-за преждевременного обобщения или попытки предвидеть будущие потребности, которые никогда не возникали

2) Разработчики хотели изучить / поэкспериментировать с новым шаблоном дизайна или технологией, которые они не использовали ранее, и включили их в действие, даже если это было излишним. Они делают это, потому что это делает их работу более интересной, и они узнают что-то новое.

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


Боюсь, я виновен в №2. Имея опыт (и зрелость?), Я теперь склонен воздерживаться, хотя ... и вместо этого экспериментировать дома :)
Matthieu M.

Я вижу, что люди все время делают 1, в итоге они создают в 5 раз больше работы для себя
Союзник

11

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

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


4
-1: как говорится в большинстве книг, хороший разработчик знает, как сделать это простым. - Вы абсолютно правы по этому поводу. Но тогда вы подразумевали, что злоупотребление новыми технологиями является основной причиной чрезмерного усложнения кода. Вы ошибаетесь по этому поводу. Поверьте мне, есть много слишком сложного кода, который не имеет ничего общего со злоупотреблением новыми технологиями.
Джим Г.

Где именно я подразумеваю, что это «самая большая причина чрезмерного усложнения кода»? Это, безусловно, проблема: «Эй, я только что изучил шаблон X, где я могу применить его» - Патрицит. Ты действительно вложил слова в мой рот, Джим.
Мартин Блор,

4
«Я сделал это письмо длиннее, чем обычно, только потому, что у меня не было времени, чтобы сделать его короче». - Блез Паскаль Очень применим и здесь. «Сложное» часто является признаком поспешного, ленивого или некомпетентного кодирования.
Билл

@Bill Интересно то, что это хороший аргумент для более сложного кода с точки зрения бизнеса - если вам платят фиксированную сумму за реализацию чего-либо, и для рефакторинга или укорочения требуется дополнительное время, если вы не можете это сделать прямо в первый раз (кто может?), по сути, есть штраф за то, чтобы сделать ваш уже работающий код менее сложным.
Майкл

10

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

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


1
Вот как я на это смотрю. IE, если это слишком просто, это не стоит использовать?

@Mercfh Я не понимаю мнение. Какое отношение имеет простота решения к его эффективности?
GSto

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

7

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


Я видел программистов, которые писали цикл для каждой копии строки. Никогда не использовал вызов стандартной библиотечной функции. (Что еще хуже, копия платформы была оптимизирована для чтения слова за раз.)
BillThor

7

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

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

Другими словами, во многих случаях простое - в глазах смотрящего.


2
+1: слишком много программистов не думают об этом
Лука

5

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

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

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


4

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

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

Отсутствие ясности будет препятствовать способности людей удалить все лишнее.


4
Еще одна важная цитата: «Я бы написал короткое письмо, но у меня не было времени».
user16764

3
« Я представляю себе совершенство так, чтобы оно не было лишним, но не лишним», «Кажется, совершенство достигается не тогда, когда нечего добавить, а когда больше нечего убрать ». - Французский летчик, поэт и инженер Антуан Мари Роджер Виконт де Сент-Экзюпери, 1939 год (из книги« Terre des Hommes »Ветер, песок и звезды » )).
Йорг Миттаг

Спасибо, похоже, я никогда не знал истинного происхождения :-) Приятно.
Стивен Бэйли,

3

Лучшие инженеры - это те, кто может решить действительно сложные проблемы и превратить их в простые в реализации и понятные решения. Звучит просто, но таких инженеров / разработчиков не так много. На самом деле таких людей не так много. В действительности большинство людей там делают с точностью до наоборот. Они берут простые проблемы и усложняют их до неузнаваемости. Просто посмотрите на наших политиков, чтобы найти пример людей, которым удается решать простые проблемы и превращать их в полный хаос. Программисты ничем не отличаются в этом отношении.


3
Ой! Я как раз собирался дать вам +1, но потом я увидел вашу аналогию с политикой, и это в лучшем случае слабо. // Это правда - в политике много запутывания, потраченных впустую движений, взмахов рук и особых интересов, и в результате счета могут стать слишком сложными. Но чрезмерное усложнение является побочным продуктом запутывания, потраченного впустую движения, махания рукой и особых интересов. Не первопричина
Джим Г.

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

1
@JimG. Да, я согласен с вами ... мне кажется, что многие проблемы с политическими решениями - это политики, которые утверждают, что есть простое (их!) Решение действительно сложной проблемы, которая на самом деле не имеет простого решения.
Майкл

2

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


1

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

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

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


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

... это значительно ослабило бы правила продвижения / балансировки. Некомбируемый шорт без знака, добавленный к промотируемому int, даст непродвигаемый шорт без знака, независимо от того, shortявляется ли он таким большим или нет int. Перспективный unsigned shortдобавляют к перспективному intдаст int. Добавление подписанных и неподписанных вещей одинакового размера или добавление не подлежащих рекламе вещей разных размеров будет ошибкой. Добавьте немного сложности заранее, и странные угловые случаи вниз по течению исчезнут.
суперкат

1

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


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

0

Может быть, проблема классической ошибки?

30. Застройщик позолота.

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

  • Стив Макконнелл, Rapid Development.

0

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


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

Я скажу, что если разработчик Jr находит код, который невозможно понять, это запах кода, и на самом деле может быть, что код слишком сложен, однако вы используете далеко, чтобы развернуть кисть здесь. Этот запах кода на самом деле может просто существовать, потому что Jr-разработчик нуждается в помощи для понимания продвинутой техники, а не в том, что сам метод виноват.
P. Roe

-1

ДА ... и я заплатил цену слишком много раз.

Моя доска теперь имеет звездочку в самом верху, которая гласит:

«Если это не просто, это не правильно»

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

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

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