Чи інколи програмісти навмисно над ускладнюють код? [зачинено]


26

Мабуть, багато разів на стаковому потоці люди (особливо програмісти) схильні надто ускладнювати вирішення проблеми, де рішення набагато складніше, ніж оригінальна проблема? Я не будь-який експерт будь-якими способами, але багато разів намагаюся працювати з найпростішим рішенням, яке працює (і, очевидно, це не працює ВСЕ), але я мав досить хороший успіх, пропонуючи прості рішення на роботі, які здаються людям випустити з уваги МНОГО складніші рішення?

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


5
1. Так, я думаю, що іноді. 2. Так, принаймні деякі програмісти хоча б якийсь час надмірно ускладнюють свій код, принаймні, якийсь час навмисно. 3. Справи закриті.
Робота

3
У вас коли-небудь хтось кричав на вас: "Ви повинні про це подумати!" коли ви пропустили якусь вимогу, яка не була зазначена в початковому зборі вимог? Саме це може призвести до того, що деякі роблять речі складнішими, ніж потрібно.
Король JB

Відповіді:


18

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

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

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

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

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


32

Я бачив безліч кодів, які були складнішими, ніж це було, і майже завжди з цих трьох причин:

1) Надмірно розроблений через передчасне узагальнення або намагання передбачити майбутні потреби, які ніколи не виникали

2) Розробники хочуть навчитися / експериментувати з новим дизайнерським малюнком або технологією, якою вони раніше не користувалися, і впорядкували її навіть у надмірній кількості. Вони роблять це, тому що це робить їх роботу цікавішою, і вони отримують, щоб навчитися чомусь новому.

3) Були додані функції та виправлення помилок, але наявний код на той час не було належним чином відновлено разом із ним. Це може бути лише невеликий фрагмент дублювання або приєднання іншого аргументу прапора до методу, але все це додається. Ефективно, хаки додаються, і це не займе багато часу, щоб все надмірно ускладнилося через усі запахи коду. Це найпоширеніше і, як правило, пов’язане з невідомим кращого або часового тиску.


Я боюсь, що я винен №2. З досвідом (і зрілістю?) Я зараз схильний утримуватися від себе, хоча ... і замість цього експериментую вдома :)
Матьє М.

Я бачу, що люди роблять 1 весь час, вони в кінцевому підсумку створюють для себе 5 разів більше роботи
Аллі

11

Це абсолютно звичайна річ. Як каже більшість книг, хороший розробник знає, як зробити це просто. Занадто просто надмірно ускладнювати щось із новою технологією чи «класною» рамкою, яку ви тільки знайшли, тому ви починаєте шукати способи її використання, а не думати з точки зору проблем.

Як заявив Мартін Фаулер, ті, хто вивчає нову технологію, мають короткотермінову проблему, де її "технологічні" рішення.


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

Де саме я мав на увазі, що це "найбільша причина надмірного ускладнення коду"? Це, безумовно, питання: "Гей, я щойно дізнався шаблон X, куди я можу піти застосувати це" - Patternitus. Ти справді поклав слова мені в рот, Джиме.
Мартін Блор

4
"Я написав цей лист довше, ніж зазвичай, лише тому, що не встиг його скоротити". - Блейз Паскаль Тут також застосовний. "Складне" часто є ознакою поспішного, ледачого чи некомпетентного кодування.
Білл

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

10

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

Я думаю, що деякі люди вважають, що деякі люди бачать зробити щось по-справжньому просто "занадто легко", і що це не дуже хороша демонстрація їхніх навичок. Тому вони повинні вирішити велике, складне рішення, яке може сказати «подивись, що я можу зробити!», Хоча це може бути не найкращим вирішенням проблеми.


1
Ось як я на це дивлюся. IE, якщо це занадто просто, його не варто використовувати?

@Mercfh Я не розумію думку. Що стосується простоти рішення з його ефективністю?
GSto

Я коментував його коментар, кажучи "Так, я згоден", що досить часто програмісти думають "О, якщо це занадто просто, це не дуже добре".

7

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


Я бачив програмістів, які писали цикл для кожної копії рядка. Ніколи не використовував дзвінок до стандартної функції бібліотеки. (Що гірше - копія платформи була оптимізована для того, щоб прочитати слово за один раз.)
BillThor,

7

Це залежить від того, що ви називаєте "простим". Деякі люди бачать кодекс, що реконструюється, як «складніший», оскільки там більше коду та кілька графіків викликів. Однак цей код є більш "простим" тим, що його набагато простіше вносити зміни.

Я часто знаходжу, що велика функція виглядає "простою", поки вам не потрібно внести зміни, потім вона стає складною.

Іншими словами, просто в очах глядача в багатьох випадках.


2
+1: надто багато програмістів не замислюються над цим
Лука

5

Проблема полягає в тому, що якщо ви не можете чітко бачити прості рішення (саме тут розпочинаються дискусії з колегами) або якщо ви занадто рано узагальнюєте.

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

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


4

У деяких випадках може бути просто складність придумати чисте / просте рішення.

Є цитата, яку я не можу пригадати або вважаю, що йде щось окремо рядки "Код не завершений, коли ви написали все, що вам потрібно написати, але заповніть лише раз, коли вам нічого не залишається для видалення"

Відсутність ясності заважатиме людині здатності прибрати все зайве.


4
Ще одна відповідна цитата: «Я написав би коротший лист, але не встиг би».
user16764

3
"Я справді вдосконалюю, що не відвідує, і не є плюсом, але це не більше, ніж", - додається, що досконалості досягається не тоді, коли більше нічого додати, а коли немає нічого більше , щоб видалити » . ) - французький пілот, поет і інженер Антуан Марі Роже віконт де Сент-Екзюпері, 1939 (з книги Terre де Hommes ( Вітер, пісок і зірки )).
Йорг W Міттаг

Дякую, схоже, я ніколи не знав справжнього походження :-) Приємно.
Стівен Бейлі

3

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


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

Незалежно від причини, для багатьох проблем країни є дуже просте рішення, але політики вирішують зробити їх важче, ніж потрібно. Ми припускаємо, що це відбувається через гроші, владу чи голоси, але я також вважаю, що це значною мірою стосується можливостей. У такому випадку моя аналогія є суцільною.
Данк

1
@JimG. Так, я згоден з вами ... мені здається, що багато проблем з політичними рішеннями - це політики, які стверджують, що існує дуже просто (їхнє!) Дійсно складна проблема, яка насправді не має простого рішення.
Майкл

2

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


1

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

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

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


Дивовижно, скільки систем починається з дійсно простого ядра, яке майже відповідає вимогам, але не вистачає багатьох способів, а потім додає безліч ускладнень для усунення безлічі прогалин, яких можна було б уникнути трохи складнішим дизайном. Розглянемо просту конструкцію цілих типів С та деякі химерно складні правила, що йдуть із ними. Якби для кожного типу була опція "чи слід це рекламувати", це номінально збільшило б кількість типів (хоча насправді не таким чином, відмінним від класифікатора, як volatileтощо), але ...
supercat

... це значно полегшило б правила просування / балансування. Ні-беззнаковий короткий перспективний додають до міжнар б перспективному отримання не-беззнаковое стислість перспективного, або НЕ shortнастільки ж великим , як int. Рекламний додаток, який unsigned shortдодається до рекламного коду int, дасть результат int. Додавання підписаних та непідписаних речей одного розміру або додавання речей, що не рекламуються, різного розміру, було б помилкою. Додайте крихітку складності вперед, і дивні кутові корпуси вниз за течією зникнуть.
supercat

1

Ще одна причина, яка ще не піднімалася - це те, що люди можуть надмірно ускладнювати доставлені рішення, щоб гарантувати, що згодом вам будуть потрібні їхні послуги для підтримки цих рішень. Іншими словами: для безпеки роботи.


Не впевнений, чому це було сприйнято, я натрапив на надзвичайно великі проекти, кодовані одним чоловіком, який створив власну структуру, і щогодинно платили виключно працюючи над цим проектом. Якби роботодавець розгнівав його, вся лінійка продуктів буде накручена. Минуло б кілька місяців, щоб інший розробник досконало розібрався в коді, тоді як "всезнаючим" кодерам знадобиться кілька хвилин, щоб оновити свою безладність спагетті.
SSH Цього

0

Можливо, проблема класичної помилки?

30. Розробник позолочення.

Розробники захоплюються новою технологією і іноді прагнуть спробувати нові функції своєї мови чи середовища або створити власну реалізацію гладкої функції, яку вони побачили в іншому продукті - незалежно від того, потрібен він чи ні в їхньому продукті. Зусилля, необхідні для розробки, впровадження, тестування, документування та підтримки, не вимагають подовження розкладу.

  • Стів Макконнелл, швидкий розвиток.

0

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


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

Я скажу, що якщо розробник Jr вважає код неможливим зрозуміти, це запах коду, і насправді може статися, що код занадто складний, однак ви тут використовуєте далеко для широкого пензля. Цей запах коду насправді може існувати просто тому, що розробнику Jr потрібна допомога, щоб зрозуміти передову техніку, а не в тому, що винна сама техніка.
P. Roe

-1

ТАК ... і я заплатив ціну занадто багато разів.

Зараз на моїй дошці в самому верху написано зірочки, на яких написано

"Якщо це не просто, це не так"

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

Це дійсно працює для мене, тому що мої складні конструкції стають набагато простішими, що перетворюється на чистіший код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.