Я часто слышу, как коллеги говорят друг другу: «Это ужасный, ужасный взлом».
От этого я могу избавиться, что это нехорошо. Когда я спросил их, работает ли они, они говорят «да, но это не хорошо». Означает ли это, что это не хорошее решение? Чем плохое решение, если оно работает? Это из-за хорошей практики? Или не ремонтопригоден? Использует ли это побочный эффект кода как часть вашего решения?
Мне интересно, когда что-то классифицируется как взлом. Как вы можете определить это?
terminology
запыленного программиста
источник
источник
+
для разделения на основе эвристики.Ответы:
Он наносит временную пластырь на большую зияющую рану. На данный момент это исправлено, но позже это вызовет еще больше проблем.
Пример, который я недавно видел: вы хотите, чтобы человек по имени
"Jim"
всегда появлялся первым в алфавитном списке. Чтобы быстро решить это, вы переименовываете его в" Jim"
. Это взлом, который обязательно вернется, чтобы укусить вас позже.источник
Каждое инженерное решение - это компромисс между немедленной стоимостью и задержкой, а также сопутствующими затратами и техническим долгом.
Хак - это ситуация, в которой первое предпочтительнее, а последующее принимается последним.
Неопытные разработчики (частично из-за того, как работает система инженерного образования) сосредотачиваются на первом и не имеют достаточного опыта, чтобы по-настоящему понять или оценить второе.
Опытные разработчики делают, но по разным причинам (многие законно) выбирают первое.
Термин «взлом» почти всегда подразумевает намерение временно решить проблему и «сделать это сразу же», но опытные разработчики знают, что наиболее постоянные вещи в коде - это временные взломы.
источник
Учти это
Второй пример, однако, может быть хаком, который используется из-за незнания лучшей практики или предположения, которое в то время
/1
казалось более простым, или из-за ошибки в библиотеке, которая делала/1
работу правильно.Нет. Хаки это "целесообразный" код. Есть
тричетыре причины.Незнание правильных принципов проектирования. (т.е. твердые принципы)
Высокомерие (то есть ошибочные предположения) об API или языковой конструкции.
Фактические ошибки, которые не решены, но исправлены.
Управление переопределено для хорошего дизайна и допущений коррекции. «Бюджет» является распространенным обоснованием, но это, по сути, одно из трех перечисленных выше (невежество, высокомерие или ошибка) с нетехнической основной причиной.
В этом-то и дело. Взлом основан на невежестве, ошибках или предположениях.
Это может быть примером невежества или ложного предположения.
источник
Взлом в контексте программирования был бы эквивалентен исправлению чего-либо с помощью клейкой ленты или жевательной резинки.
Хак очень часто включает использование недокументированных и неподдерживаемых функций, которые могут измениться в будущем, нарушая ваш код. Они могут также включать жестко закодированные значения.
Хак, как правило, также может быть временным обходом кода с использованием некоторой библиотеки / службы вместо решения основной проблемы. Если позже вам не под силу, хак может быть единственным способом борьбы с ним.
источник
Термин иногда используется с противоположной коннотацией, как в «блестящем хаке». Просто потому, что гораздо чаще встречаться с ошибками, чем делать что-то блестящее, гораздо чаще можно услышать об ужасных взломах, чем о блестящих взломах, но я слышал, что термин использовался в обоих случаях.
«Взлом», используемый в положительном смысле, в основном означает элегантное решение, которое решает проблему неожиданным и особенно умным способом. Отрицательные и положительные значения на самом деле близки, потому что блестящий взлом часто подразумевает использование непреднамеренного аспекта технологии.
источник
Решение, которое работает прямо сейчас , но, вероятно, вызовет проблемы в долгосрочной перспективе.
Пример: вам нужно сгенерировать HTML-документ, динамически заполняя некоторые значения. Правильный способ сделать это - использовать один из инструментов, специально разработанных для этой цели, например Freemarker, XSLT или JSP. Но вы не можете использовать ни один из них, или вы просто не можете быть обеспокоены, чтобы сделать это правильно, поэтому вы пишете что-то вроде этого:
источник
Взлом - это гениальное решение проблемы, часто зависящее от нестандартного мышления и использования неожиданных фактов об окружающей среде. Там есть высказывание об архетипическом взломе, что зрители соглашаются, что это гениально, но не могут понять, чудесно это или ужасно. Это то, что вам не нужно в ваших исправлениях обслуживания.
Взлом, который решает проблему, очень вероятно будет зависеть от деталей среды, недокументированных возможностей инструмента или чего-то подобного. Вероятно, это будет хрупкое решение, работающее сейчас, но, вероятно, сломанное, когда что-то изменится. Может быть трудно понять, как это работает, и любой программист по обслуживанию будет ненавидеть трудный для понимания код. У него могут быть побочные эффекты, которые пока ничего не повредят, но будут вызывать проблемы с совершенно хорошими фрагментами кода на некотором расстоянии в будущем, и это может быть кошмаром для решения.
источник
Слово взломать неправильно. Если вы действительно хотите получить немного истории, вы можете это сделать в Википедии. Хак это слово, чтобы описать процесс настройки вещей, чтобы сделать то, что они не должны были делать. В контексте электротехники это хорошо. На это есть лучшее описание в Википедии.
Теперь в контексте информатики. Взлом это вообще плохо. Да, это работает, но обычно это означает, что программист написал какой-то неоднозначный кусок кода, который не соответствует дизайну программного обеспечения и который смущает каждого программиста, который должен читать этот код. Конечно, программисты тратят много времени, поэтому в качестве менеджера хочется иметь программное обеспечение, которое легче всего обслуживать. То же самое относится и к программистам. Кроме того, хаки, как правило, ломают что-то еще в программном обеспечении.
Это суждение, принять ли взломать или нет. По крайней мере, вы хотите, чтобы старший инженер-программист одобрил взлом, поскольку у него больше опыта и он может принять более образованное решение. Определенно, вы не хотите, чтобы младшие парни принимали решения о принятии хаков. Они могут придумать один и обсудить со старшими парнями, стоят ли выгоды от поддержки взлома.
источник
Это взлом, как найти на сайтеififedit.com .
На самом деле обо всем на этом сайте взломать.
Хаки - это гениальные и дерзкие способы использования некоторых вещей вне их контекста.
Прелесть взлома состоит в том, что у вас есть заданная проблема и инструменты, которые никогда не предназначались для ее решения, но вы решаете проблему только с помощью этих инструментов (вместо того, чтобы получить нужные). Они умные, быстрые и веселые. Недостатком является то, что результаты часто являются хрупкими и опасными для использования для посторонних.
Я имею в виду, если вам нравится решать свои проблемы, как на картинке, нет проблем. Проблема возникает, когда вы решаете проблемы других людей, как это. В этом случае они могут быть убиты током или сожжены или что-то в этом роде.
При разработке программного обеспечения вы хотите, чтобы ваш код мог обрабатываться другими (включая вас в будущем) без ущерба для жизни. Как сказал Дейкстра:
И взломы являются одними из самых умных трюков.
Хаки тикают бомбы замедленного действия где-то в вашем коде, потому что общие по своей природе основаны на слишком многих предположениях («просто делать это» предпочтительнее, чем правильное разделение). Как только эти предположения перестанут действовать, вся ваша система может сломаться, и вы не поймете, что произошло.
источник
Термин не очень точный, но, вероятно, он относится к быстрому и грязному решению проблемы, которую трудно решить должным образом. Рассматриваемое решение, вероятно, работает, но, вероятно, не очень хорошая реализация, может иметь незначительные ошибки, может быть некоторые небольшие известные ошибки, и должно быть переделано позже, если позволит время. Я думаю, что то, что вы слышите, называется «взлом», также иногда называется « Kludge ».
Я часто вижу взломы, когда есть очень жесткие временные ограничения для завершения задачи, и решение для взлома реализовано, потому что оно работает "достаточно", чтобы пройти QA, с надеждой, что оно может быть исправлено позже. К сожалению, такое исправление / очистка не всегда происходит :(
источник
Я много времени провожу в качестве фронтенд-разработчика, поэтому мое определение хака:
Средой может быть ваш фреймворк, веб-браузер, база данных, банкомат (банкомат), кейс-кейс. Любая «система правил», где вы знаете лазейку и используете ее для решения проблемы.
источник
Хаком обычно является некоторый код, который, очевидно, действительно обеспечивает желаемый результат, но неоптимальным образом.
Обычно он использует какую-то недокументированную или непонятную функцию языка / библиотеки каким-то образом, который был непреднамеренным для создателя и, таким образом, запутывал намерение.
Иногда это делается для обхода некоторых языковых или библиотечных ошибок, но в большинстве случаев основной причиной обычно является невежество;
Вещи, которые делаются неэффективно, обычно как в пространстве, так и во времени, но в конечном итоге дают желаемый результат, но с затратами и возможными неизвестными крайними случаями без тестируемости и ремонтопригодности. Обычно вытекает из недостатка фундаментального понимания логики или языковых идиом. Также см. «Трудный путь».
Обычно код является то, что кто-то с соответствующим опытом не будет даже рассматривать делать, или придется долго думать и трудно сделать это так сложно и неэффективно, как кругом хака, что они обнаружили.
Примеры
Исправление Vista
Срок действия электронного письма
Единицы программного обеспечения
Недетерминированный хэш
источник
Лысая шина работает, но никто не назвал бы это идеальным решением для прокола. Это может создать худшие проблемы в будущем.
Обычно я считаю взлом быстрым и грязным решением неотложной проблемы. Как правило, он может не соответствовать обычной практике программирования в магазине программирования (например, использовать много жесткого кодирования). Это может быть небольшим исправлением.
Основная причина того, что это плохо, заключается в том, что а) это может привести к непредсказуемым результатам б) оно может не соответствовать первоначальному дизайну рассматриваемого кода, что вызовет проблемы с обслуживанием. По моему опыту, хаки, как правило, также очень плохо документированы.
источник
Краткое определение, которое я услышал и стал уважать:
«Решение симптома, который не полностью решает проблему во всех случаях»
Гадкий код может быть или не быть взломом. Пример 2 + 2 в другом ответе - не взлом, это уродливое решение для кода и плохое с точки зрения понимания кода, но оно дает правильное решение во всех случаях. Подумайте о факторизованном уравнении в математике - поведение / отношения идентичны и правильны в обеих версиях, но форма различна. Хм, фактор уравнения, рефакторинг уравнения, код рефакторинга ... нет, я не уверен, что нет сходства :)
Пример в одном из других ответов об изменении имени на «Джим» является хаком: он решает симптом (первое имя в списке - Джим), но не полностью решает проблему (список не отсортирован или расставлены приоритеты любым способом, который работает для всех записей).
источник
Хак делает что-то, что возвращает ожидаемый результат, но делает это странным образом (обычно влечет за собой снижение производительности).
Например:
источник
Представьте, что ваша нога заразилась и должна была быть удалена, чтобы вы выжили. Вы бы предпочли, чтобы доктор быстро срубил его топором или удалил его хирургическим путем после изучения проблемы и выбора подходящих инструментов, процедур и т. Д.? То же самое относится и к программному обеспечению.
источник
Хак сигнализирует о своем рождении, когда ответственный кодер заявляет: «Я вернусь и исправлю это позже».
Серьезное замечание - взлом в контексте ОП - это то, что достигает желаемого результата, но использует временный или ненадежный метод для этого.
Другое распространенное определение - это метод, который использует поведение крайнего случая, чтобы обойти ограничения / гарантии в платформе.
У хака во втором контексте есть определенный признак среди «индивидуалистов» (читай: опасных) героев-кодеров ...
источник