Що таке злом? [зачинено]


55

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

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

Мені цікаво, коли щось класифікують як хак. Як це можна визначити?


5
Щось може працювати, але бути повільним, тендітним, негарним для роботи та болісним у підтримці. Це злом.
Трезоїд


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

Для всіх, хто заявляє, що хаки - це брудні бандеролі , перегляньте, що означало для тих, хто назвав себе хакерами на сторінці outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ Неймовірно добре і, можливо, дуже трудомістка робота, яка виробляє саме те, що потрібно.

1
Функція, яка не реалізована відповідно до популярних стандартів або за стандартом вашого начальника.
Aditya P

Відповіді:


97

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

Приклад, який я нещодавно бачив: Ви хочете, щоб людина на ім’я "Jim"завжди була першою в алфавітному списку. Щоб швидко вирішити його, ви перейменовуєте його в " Jim". Це злом, який, безумовно, повернеться, щоб вкусити вас пізніше.


34
Або ви могли назвати його "AAA Jim".
комман

4
Іншим прикладом може бути розширення параметра if, if ... else ... else ... else через часові обмеження, замість більш розширюваного рішення.
Філ Лелло

29
І справжнє рішення для того, щоб Джим з’явився першим в алфавітному списку, це, звичайно, переупорядкувати алфавіт.
Артем

1
@artem правда, і це виглядало так: jzbcdefghiklmnopqrstuvwxya (не хочеться змінювати впорядкований алфавіт, щоб зняти a і піднести z)
Відобразити ім'я

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

60

Кожне інженерне рішення - це компроміс між негайною вартістю та затримкою та пов'язаними з цим витратами та технічним боргом.

Злом - це ситуація, коли перший віддається перевазі, приймаючи останній як наслідок.

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

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

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


13
+1 для "але досвідчені розробники знають, що найбільш постійні речі в коді - це тимчасові хаки"! Що також означає, що лінь ніколи не повинна заважати вам робити це правильно.
Матьє М.

20

Як рішення погано, якщо воно працює?

Розглянемо це

2 + 2 <-- Correct.  Elegant.  Simple.

(2/1 + 2/1) * 1/1 <-- Also Correct.  Lots of useless weird code.  

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

Це пов'язано з хорошою практикою?

Ні. Хаки - це "доцільний" код. Є три чотири причини.

  • Незнання правильних принципів дизайну. (тобто принципи SOLID)

  • Зарозумілість (тобто помилкові припущення) щодо API чи мовної конструкції.

  • Фактичні помилки, які не вирішені, але вирішені.

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

Або не є ремонтом?

В тім-то й річ. Злом заснований на незнанні, помилках або припущеннях.

Чи використовується побічний ефект коду як частина вашого рішення?

Це може бути прикладом незнання або помилковим припущенням.


Прекрасна відповідь, але не враховує, що хаки іноді пишуться з якістю, що затягується завдяки трикутнику «Якість проти часу та вартості».
StuperUser

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

1
@ Оптимізуйте: кури зубів рідкісні. Чи така ситуація рідкісна?
Метт Еллен

@Matt Ellen: Це може бути різне використання фрази "Зуби курятини". Це може означати «суперечливий» замість «рідкісний».
S.Lott

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

15

Хак у контексті програмування був би еквівалентний виправленню чогось за допомогою качки-стрічки або гумки для бульбашок.

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

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


21
Використання качки-стрічки для каналів було б шарлатанством;)
JeffO

quack quack quack
Mateen Ulhaq

11

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

"Хак", що використовується в позитивному сенсі, в основному означає елегантне рішення, яке вирішує проблему несподівано і особливо розумно. Негативні та позитивні значення насправді є близькими, оскільки геніальний хакер часто передбачає використання непередбачуваного аспекту технології.


1
Це блискучий злом, тому що важко буде побачити, що ви зробили на поверхні, але що при подальшому детальному огляді очевидно, що це смішно хитрий код лівого поля. Чи можу я направити вас на магію землетрусу квадратного коріння: codemaestro.com/reviews/9
Роберт Массайолі

10

Рішення, яке працює зараз , але, ймовірно, спричинить проблеми в перспективі.

Приклад: вам потрібно створити документ HTML, заповнюючи деякі значення динамічно. Правильний спосіб зробити це - використовувати один із інструментів, які фактично призначені для цієї мети, як Freemarker, або XSLT, або JSP. Але ви не можете використовувати жодне з них, або вам просто не завадить зробити це належним чином, тому ви пишете щось подібне:

public String getGreetingPage(String name) {
    return "<html><body>Hello, "+name+"!</body></html>";
}

9

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

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


9

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

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

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


6

Це злом, як знайдено на сайті thereifixedit.com .

Рубати

Насправді про все, що на цьому сайті, є злом.

Хаки - це геніальне і зухвале використання деяких речей поза їх контексту.
Краса злому полягає в тому, що у вас є задана проблема та інструменти, які ніколи не мали на меті її вирішити, але ви вирішуєте проблему саме тими інструментами (замість того, щоб отримати потрібні). Вони розумні, швидкі та веселі. Мінусом є те, що результати часто немічні та небезпечні для використання сторонніх людей.
Я маю на увазі, якщо вам подобається вирішувати свої проблеми, як на малюнку, проблем немає. Проблема виникає, коли ви вирішуєте подібні проблеми інших людей. У цьому випадку вони, мабуть, отримали би током або спалили щось.

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

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

А хаки - це одні з найрозумніших хитрощів.

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


4

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

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


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

@james: З мого досвіду, два програмісти можуть дивитись на якийсь код, і один називатиме це хак, інший - ні. Немає реального способу оцінити фрагмент коду як хак. У кожного своє уявлення про те, що таке хакер, і часто вони схожі, але не завжди однакові. Написаний як хтось, у кого його код називали "хакіз" іншими, і не погоджувався. І я назвав код інших людей "хакітським", і вони не погодилися. Щоправда, це, мабуть, прикордонні випадки, але межі можуть бути нечіткими часом
FrustratedWithFormsDesigner

1
@FWFD - це просто не погоджуючись з приводу того, чи є щось злом. Якщо хтось «каже» якийсь код - це хакер, ви знаєте, що вони мали на увазі.
ozz

4

Я витрачаю багато часу як розробник, що відповідає моїм розробникам, тому моє визначення хака:

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

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


4

Злом - це звичайно якийсь код, який, мабуть, забезпечує бажаний вихід, але неоптимально.

Зазвичай використовується деяка недокументована або незрозуміла функція мови / бібліотеки певним чином, яка не була навмисно створена автором, і, таким чином, заплутувала те, що є наміром.

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

Молотком все схоже на цвях.

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

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

Приклади

Виправлення Vista

Валідність електронної пошти

Одиниці програмного забезпечення

Недетермінований хеш


+1 Для субоптимальних. А тому, що хаки не потрібні "тимчасовими", як голосували найвищі.
rlb.usa

2

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

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

Основна причина поганого полягає в тому, що: а) це може призвести до непередбачуваних результатів; З мого досвіду, хаки, як правило, дуже погано задокументовані.


2

Коротке визначення, яке я почув і прийшов до поваги:

"Рішення симптому, який не повністю вирішує проблему у всіх випадках"

Некрасивий код може бути, а може і не бути злом. Приклад 2 + 2 в іншій відповіді не є злому, це некрасиве рішення коду і погано з точки зору розуміння коду, але він дає правильне рішення у всіх випадках. Подумайте про математичне рівняння з математики - поведінка / відносини однакові і правильні в обох версіях, але форма інша. Хм, коефіцієнт рівняння, рефактор рівняння, код рефактора ... ні, немає подібності я впевнений :)

Приклад в одній з інших відповідей про зміну імені на "Джим" - це хакер: він вирішує симптом (ім'я в списку - Джим), але не вирішує повністю проблему (список не сортується або визначити пріоритет будь-яким способом, який працює для всіх записів).


1

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

Наприклад:

Завдання : Закинути змінна ціла величина в подвійну

Рішення : Використовуйте оператор Cast. Тобто: dblVar = CType (intVar, Double)

Хак : Діліться на подвійний. Тобто: dblVar = intvar / 1.0


+1 для зоряного прикладу. У старому коді AS400 я побачу європейські дати, помножені на кілька прискіпливих десятків, що виводить американську дату. Проблеми починаються, коли певні кодери починають просочуватися в наш код .Net ... bleh!
Морган Херлоккер

0

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


Я б змусив його зламати його до того, як зловмисник отримає шанс зламати мій мозок.
Mateen Ulhaq

Що робити, якщо у вас було лише кілька хвилин?
StuperUser

0

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

На серйозну увагу - злом у контексті ОП - це те, що досягає бажаного результату, але для цього використовується тимчасовий або ненадійний метод.

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

Хак у другому контексті має певний кэш серед "мавериків" (читати: небезпечно) героїв-кодерів ...

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