Что такое взлом? [закрыто]

55

Я часто слышу, как коллеги говорят друг другу: «Это ужасный, ужасный взлом».

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

Мне интересно, когда что-то классифицируется как взлом. Как вы можете определить это?

запыленного программиста
источник
5
Что-то может работать, но быть медленным, хрупким, уродливым и болезненным в обслуживании. Это взломать
Trezoid
1
Гетто-фальсифицированный код == взломать
Гарет Клаборн
Я не говорю, что это хак, но вы хотите динамически переосмысливать патчи-обезьяны +для разделения на основе эвристики.
dietbuddha
Для всех тех, кто утверждает, что хаки являются грязными бинтами, посмотрите, что значило для тех, кто называл себя хакерами, на outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ Невероятно хороший и, возможно, очень трудоемкая часть работы, которая производит именно то, что нужно.
1
Функция, которая не реализована в соответствии с популярными стандартами или стандартами вашего начальника.
Адитья П

Ответы:

97

Он наносит временную пластырь на большую зияющую рану. На данный момент это исправлено, но позже это вызовет еще больше проблем.

Пример, который я недавно видел: вы хотите, чтобы человек по имени "Jim"всегда появлялся первым в алфавитном списке. Чтобы быстро решить это, вы переименовываете его в " Jim". Это взлом, который обязательно вернется, чтобы укусить вас позже.

JD Isaacks
источник
34
Или вы могли бы назвать его "ААА Джим".
компаньон
4
Другим примером будет расширение if ... else ... else ... else из-за нехватки времени вместо более расширяемого решения.
Фил Лелло
29
И реальное решение сделать Джим первым в алфавитном списке - это, конечно, изменить порядок алфавита.
Артем
1
@artem true, и это выглядело так: jzbcdefghiklmnopqrstuvwxya (вам не нужно переупорядочивать алфавит, записывать и выводить z)
отображаемое имя
1
Чтобы сформулировать это с точки зрения управления проектами: взлом - это решение, которое может создать в будущем долг времени / человеко-часов и / или противоречит передовым методам или стандартным соглашениям.
Инкогнито
60

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

Хак - это ситуация, в которой первое предпочтительнее, а последующее принимается последним.

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

Опытные разработчики делают, но по разным причинам (многие законно) выбирают первое.

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

Uri
источник
13
+1 за "но опытные разработчики знают, что самые постоянные вещи в коде - это временные хаки"! Что также означает, что лень никогда не должна мешать вам делать это правильно.
Матье М.
20

Чем плохое решение, если оно работает?

Учти это

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

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

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

Это из-за хорошей практики?

Нет. Хаки это "целесообразный" код. Есть три четыре причины.

  • Незнание правильных принципов проектирования. (т.е. твердые принципы)

  • Высокомерие (то есть ошибочные предположения) об API или языковой конструкции.

  • Фактические ошибки, которые не решены, но исправлены.

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

Или не ремонтопригоден?

В этом-то и дело. Взлом основан на невежестве, ошибках или предположениях.

Использует ли это побочный эффект кода как часть вашего решения?

Это может быть примером невежества или ложного предположения.

С.Лотт
источник
Отличный ответ, но не принимается во внимание, что хаки иногда пишутся с ограничением качества из-за треугольника Качество - Время - Стоимость.
StuperUser
1
Я использую, чтобы играть в эту игру с клиентами. Я бы попросил их выбрать два наиболее важных аспекта проекта: Качество, Время, Стоимость. Почти всегда выбирались время и стоимость, а потом они торговались за качество. В частности, ссылаясь на тот факт, что я был консультантом и должен быть в состоянии доставить все три в срок, затраты и с выдающимся качеством. Этот сценарий похож на куриные зубы!
OptimizePrime
1
@ Оптимизировать: зубы курицы редки. Это редкая ситуация?
Мэтт Эллен
@Matt Эллен: Это может быть другое использование фразы "Зубы курицы". Это может означать «противоречивый» вместо «редкий».
S.Lott
Я считаю, что это почти всегда решение "переопределения управления".
Марк Макдональд
15

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

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

Хак, как правило, также может быть временным обходом кода с использованием некоторой библиотеки / службы вместо решения основной проблемы. Если позже вам не под силу, хак может быть единственным способом борьбы с ним.

vartec
источник
21
Использование липкой ленты для воздуховодов было бы
кряком
кря кря кря
Матин Улхак
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

Слово взломать неправильно. Если вы действительно хотите получить немного истории, вы можете это сделать в Википедии. Хак это слово, чтобы описать процесс настройки вещей, чтобы сделать то, что они не должны были делать. В контексте электротехники это хорошо. На это есть лучшее описание в Википедии.

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

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

Erion
источник
6

Это взлом, как найти на сайтеififedit.com .

мотыга

На самом деле обо всем на этом сайте взломать.

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

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

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

И взломы являются одними из самых умных трюков.

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

back2dos
источник
4

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

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

FrustratedWithFormsDesigner
источник
Я не уверен, что вы подразумеваете под «не очень точным» - я бы сказал, что большинство программистов точно знают, что имеется в виду, говоря, что некоторый написанный код - это хак. Но остальная часть ответа точная, она работает, но по какой-то причине (архитектура, производительность и т. Д.) Это не оптимальное решение.
Оз
@james: По моему опыту, два программиста могут посмотреть какой-то код, и один из них назовет его хаком, а другой нет. Там нет никакого реального способа количественно оценить кусок кода как взломать. У каждого свое представление о том, что такое взлом, и часто они похожи, но не всегда одинаковы. Написанный как кто-то, чей код был назван «хакерским» другими, и не согласен. И я назвал код других людей "хакерским", и они не согласились. Правда, это, вероятно, граничные случаи, но порой границы могут быть размытыми ...
FrustratedWithFormsDesigner
1
@FWFD - это просто несогласие с тем, является ли что-то взломом. Если кто-то «говорит», что какой-то код - это взлом, вы бы знали, что он имел в виду.
Оз
4

Я много времени провожу в качестве фронтенд-разработчика, поэтому мое определение хака:

Решение, основанное на глубоком знании недостатков среды и недокументированного поведения.

Средой может быть ваш фреймворк, веб-браузер, база данных, банкомат (банкомат), кейс-кейс. Любая «система правил», где вы знаете лазейку и используете ее для решения проблемы.

Mefisto
источник
4

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

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

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

С молотка все выглядит как гвоздь.

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

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

Примеры

Исправление Vista

Срок действия электронного письма

Единицы программного обеспечения

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

оборота user7519
источник
+1 Для неоптимальных. И потому, что взломы не являются необходимыми "временными", поскольку большинство проголосовало.
rlb.usa
2

Лысая шина работает, но никто не назвал бы это идеальным решением для прокола. Это может создать худшие проблемы в будущем.

Обычно я считаю взлом быстрым и грязным решением неотложной проблемы. Как правило, он может не соответствовать обычной практике программирования в магазине программирования (например, использовать много жесткого кодирования). Это может быть небольшим исправлением.

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

temptar
источник
2

Краткое определение, которое я услышал и стал уважать:

«Решение симптома, который не полностью решает проблему во всех случаях»

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

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

скоро
источник
1

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

Например:

Задача : привести целую переменную к двойному

Решение : используйте оператор приведения. Т.е.: dblVar = CType (intVar, Double)

Взломать : разделить на двойной. Т.е.: dblVar = intvar / 1.0

Луковый рыцарь
источник
+1 за звездный пример. В старом коде AS400 я буду видеть европейские даты, умноженные на какое-то дурацкое десятичное число, которое выводит американскую дату. Проблемы начинаются, когда некоторые кодеры начинают просачиваться в наш код .Net ... блин!
Морган Херлокер
0

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

Джош Смит
источник
Я бы попросил его взломать его, прежде чем злоумышленник получит шанс взломать мой мозг.
Матеин Улхак
Что если бы у вас было всего несколько минут?
StuperUser
0

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

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

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

У хака во втором контексте есть определенный признак среди «индивидуалистов» (читай: опасных) героев-кодеров ...

sunwukung
источник