해킹이란 무엇입니까? [닫은]


55

나는 종종 동료들이 서로에게 "끔찍하고 끔찍한 핵"이라고 말하는 것을 듣습니다.

내가 그에게서 벗어날 수있는 것은 좋지 않다는 것입니다. 내가 작동하는지 물어 보면 "그렇지만 좋지 않습니다"라고 말합니다. 이것이 좋은 해결책이 아닙니까? 솔루션이 작동하면 어떻게 나쁜가요? 좋은 습관 때문입니까? 아니면 유지할 수 없습니까? 솔루션의 일부로 코드의 부작용을 사용하고 있습니까?

무언가가 핵으로 분류 될 때 흥미 롭습니다. 어떻게 식별 할 수 있습니까?


5
무언가는 효과가 있지만 느리고 깨지기 쉽고 추악하고 유지하기가 어려울 수 있습니다. 이것은 해킹입니다.
Trezoid

1
유대인 - 리깅 코드 == 해킹
Garet Claborn

나는 그것이 해킹이라고 말하지는 않지만 +휴리스틱을 기반으로 나누기 위해 동적으로 원숭이 패치 를 다시 생각하고 싶습니다 .
dietbuddha

해킹 더러운 반창고 것을 주장하는 모든 사람들을 위해,에서 스스로 해커라는 사람들을 위해 의미하는 온 것을보고하십시오 outpost9.com/reference/jargon/jargon_23.html#TAG824 믿을 수 없을만큼 좋은 /n./ 2 - , 필요한 것을 정확하게 생성하는 시간이 많이 걸리는 작업 일 것입니다.

1
대중적인 표준이나 상급자의 표준에 따라 구현되지 않은 기능.
Aditya P

답변:


97

큰 틈새 상처에 임시 밴드 보조제를 적용하고 있습니다. 지금은 해결되었지만 나중에 더 많은 문제가 발생할 것입니다.

최근에 본 예 :이라는 이름의 사람 "Jim"이 항상 알파벳순으로 먼저 표시 되기를 원합니다 . 빨리 해결하려면 이름을로 바꿉니다 " Jim". 이것은 나중에 당신을 물기 위해 다시 올 해킹입니다.


34
또는 그를 "AAA Jim"이라고 부를 수도 있습니다.
compman

4
또 다른 예는 더 확장 가능한 솔루션 대신 시간 제약으로 인해 if ... else ... else ... else를 확장하는 것입니다.
Phil Lello

29
그리고 Jim을 알파벳 목록에서 첫 번째로 표시하는 실제 솔루션은 물론 알파벳 순서를 바꾸는 것입니다.
artem

1
사실 @artem, 그리고이 jzbcdefghiklmnopqrstuvwxya처럼 보였다 (당신은을 가지고 및 z을 가지고, 알파벳 순서를 갖고 싶어 그나마)
이름 표시

1
프로젝트 관리 용어로 말하면, 해킹은 미래의 시간 / 인간 시간의 부채를 만들거나 모범 사례 또는 표준 규칙에 위배되는 솔루션입니다.
시크릿

60

모든 엔지니어링 결정은 즉각적인 비용 및 지연과 그에 따른 비용 및 기술 부채 간의 상충 관계입니다.

핵은 전자를 선호하면서 후자를 선호하는 상황입니다.

경험이없는 개발자 (부분적으로는 공학 교육 시스템의 작동 방식으로 인해)는 전자에 중점을 두며 후자를 실제로 이해하거나 평가할 충분한 경험이 없습니다.

숙련 된 개발자는 여러 가지 이유로 (다수의 합법적 인) 전자를 선택합니다.

해킹이라는 용어는 거의 항상 문제를 일시적으로 해결하고 "나중에 바로 수행"하려는 의도를 내포하지만 숙련 된 개발자는 코드에서 가장 영구적 인 것이 임시 해킹이라는 것을 알고 있습니다.


13
+1 "하지만 숙련 된 개발자는 코드에서 가장 영구적 인 것이 임시 핵임을 알고 있습니다"! 또한 게으름이 당신이 그것을 올바르게하지 못하게해서는 안된다는 것을 의미합니다.
Matthieu M.

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 21

1
@ 최적화 : 암탉의 이빨은 드물다. 이 상황은 드물나요?
매트 엘렌

@ 매트 엘렌 (Matt Ellen) : "Hen 's Teeth"라는 문구를 다르게 사용했을 수도 있습니다. "희귀"대신 "모순"을 의미 할 수 있습니다.
S.Lott

거의 항상 "관리 무시"결정이라고 생각합니다.
마크 맥도날드

15

프로그래밍 컨텍스트에서의 해킹은 오리 테이프 또는 풍선 껌으로 무언가를 고정하는 것과 같습니다.

해킹은 문서화되지 않은 기능과 지원되지 않는 기능을 사용하는 경우가 많으며, 이로 인해 나중에 코드가 손상 될 수 있습니다. 하드 코딩 된 값이 포함될 수도 있습니다.

해킹은 일반적으로 근본적인 문제를 해결하는 대신 일부 라이브러리 / 서비스를 사용하여 코드에서 일시적으로 해결 될 수도 있습니다. 나중에 통제 할 수없는 경우 해킹이 처리 할 수있는 유일한 방법 일 수 있습니다.


21
덕트에 오리 테이프를 사용하는 것은
엉망입니다

꽥 꽥 꽥
Mateen Ulhaq

11

이 용어는 때때로 "화려한 핵"에서와 같이 반대 의미로 사용됩니다. 훌륭한 무언가를하는 것보다 망치는 것이 훨씬 일반적이기 때문에 화려한 핵보다 끔찍한 핵에 대해 듣는 것이 훨씬 일반적이지만, 두 가지 용어가 사용된다는 말을 들었습니다.

긍정적 인 의미로 사용 된 "해킹"은 기본적으로 예상치 못한, 특히 영리한 방식으로 문제를 해결하는 우아한 솔루션을 의미합니다. 훌륭한 해킹은 종종 의도하지 않은 기술 측면을 이용하기 때문에 부정적이고 긍정적 인 의미는 실제로는 아주 가깝습니다.


1
표면에서 수행 한 작업을보기 어려울 것이기 때문에 훌륭한 해킹이 가능하지만 자세한 검사를 통해 이것이 우스운 영리한 왼쪽 필드 코드임을 알 수 있습니다. 지진 제곱근 마법으로 안내해 드리겠습니다
Robert Massaioli

10

지금 작동 하지만 장기적으로 문제를 일으킬 수 있는 솔루션입니다 .

예 : 일부 값을 동적으로 채우면서 HTML 문서를 생성해야합니다. 이를 수행하는 올바른 방법은 Freemarker, XSLT 또는 JSP와 같이이 목적을 위해 실제로 설계된 도구 중 하나를 사용하는 것입니다. 그러나 당신은 그중 하나를 사용할 수 없거나, 제대로 신경 쓰지 않아도되므로 다음과 같이 작성하십시오.

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

9

해킹은 기본적으로 생각하고 환경에 대한 예기치 않은 사실을 이용하는 경우에 따라 문제에 대한 독창적 인 솔루션입니다. 시청자들이 독창적이라고 동의하지만, 그것이 훌륭하거나 끔찍한 지 알아낼 수 없다는 전형적인 해킹에 대해 언급하고 있습니다. 이것은 유지 관리 수정에서 원하지 않는 종류입니다.

문제를 해결하는 해킹은 환경의 세부 사항이나 도구의 문서화되지 않은 기능 또는 이와 유사한 기능에 따라 달라질 수 있습니다. 깨지기 쉬운 솔루션 일 가능성이 있지만 지금은 작동하지만 무언가가 변경되면 깨질 수 있습니다. 작동 방식을 이해하기 어려울 수 있으며 유지 관리 프로그래머는 이해하기 어려운 코드를 싫어합니다. 그것은 당분간 아무것도 해치지 않지만 미래에 멀리 떨어진 완벽한 코드 조각에 문제를 일으킬 수있는 부작용이있을 수 있으며, 그로 인해 악몽이 될 수 있습니다.


9

해킹이라는 단어가 잘못 사용되었습니다. 실제로 약간의 역사를 얻고 싶다면 Wikipedia를 사용하십시오. 해킹은 의도하지 않은 일을하기 위해 일을 조정하는 과정을 설명하는 단어입니다. 전기 공학의 맥락에서 이것은 좋습니다. 이것에 대한 Wikipedia에 대한 더 나은 설명이 있습니다.

이제 컴퓨터 과학의 맥락에서. 해킹은 일반적으로 나쁘다. 예, 작동하지만 일반적으로 프로그래머가 소프트웨어의 설계를 준수하지 않는 모호한 코드를 작성하여 해당 코드를 읽어야하는 모든 프로그래머를 혼란스럽게한다는 것을 의미합니다. 물론 프로그래머는 시간이 많이 소요되므로 관리자는 가장 쉽게 유지 관리 할 수있는 소프트웨어를 원합니다. 프로그래머도 마찬가지입니다. 또한 해킹은 소프트웨어에서 다른 것을 깨뜨리는 경향이 있습니다.

해킹을 수락할지 여부를 판단해야합니다. 경험이 많고 더 교육적인 결정을 내릴 수 있기 때문에 수석 소프트웨어 엔지니어가 해킹을 승인하기를 원합니다. 확실히 당신은 후배들에게 해킹 수락에 대한 결정을 내리기를 원하지 않습니다. 그들은 하나를 생각해 내고 수석 사람들과 해킹을 유지 해야하는 고통의 가치가 있는지 논의 할 수 있습니다.


6

이것은 thereifixedit.com 에있는 해킹 입니다.

파헤 치다, 난도질하다

실제로 해당 사이트의 모든 내용은 해킹입니다.

해킹은 문맥에서 독창적이고 대담하게 사용됩니다.
해킹의 아름다움은 주어진 문제와 그것을 해결하려는 의도가 아닌 도구를 가지고 있지만 올바른 도구 대신 올바른 도구 대신 문제를 해결한다는 사실에 있습니다. 그들은 영리하고 빠르며 재미 있습니다. 단점은 결과가 종종 부서지기 쉽고 외부인에게 사용하기에 위험하다는 것입니다.
그림과 같이 문제를 해결하고 싶다면 아무 문제가 없습니다. 다른 사람들의 문제를 해결하면 문제가 발생합니다. 이 경우 감전되거나 화상을 입을 수 있습니다.

소프트웨어 개발에서 치명적인 부상을 입지 않고 다른 사람 (미래를 포함하여)이 코드를 처리 할 수 ​​있기를 원합니다. Dijkstra는 다음과 같이 말합니다.

유능한 프로그래머는 자신의 두개골의 제한된 크기를 완전히 알고 있습니다. 그러므로 그는 겸손한 태도로 자신의 임무에 접근하고 재앙과 같은 영리한 속임수를 피합니다.

그리고 해킹은 가장 영리한 속임수입니다.

해킹은 코드 어딘가에 시한 폭탄을 사용하고 있습니다. 일반적인 것들은 본질적으로 너무 많은 가정에 기반을두고 있기 때문입니다. 이러한 가정이 더 이상 유지되지 않으면 무슨 일이 있었는지 전혀 모른 채 전체 시스템이 고장날 수 있습니다.


4

이 용어는 매우 정확하지는 않지만 제대로 해결하기 어려운 문제에 대한 빠르고 더러운 솔루션을 의미합니다. 문제의 해결책은 아마도 효과가 있지만 아마도 아주 좋은 구현 은 아니며, 미묘한 버그, 작은 알려진 버그 있을 수 있으며 시간이 허락하면 나중에 다시 수정 해야 합니다. 나는 당신이 "핵"이라고 부르는 것을 때로는 " kludge "라고 생각합니다.

작업을 완료하는 데 시간 제약이 매우 심한 경우 해킹이 발생하는 경우가 종종 있으며, 해킹 솔루션은 QA를 통과 할 수있을 정도로 "충분히 작동"하여 나중에 수정 될 수 있기를 바랍니다. 불행히도, 그 이후의 수정 / 정리가 항상 일어나는 것은 아닙니다 :(


"정확하지 않다"는 것이 무슨 의미인지 잘 모르겠습니다. 대부분의 프로그래머는 작성된 코드가 해킹이라고하는 것이 무엇을 의미하는지 정확히 알고있을 것입니다. 그러나 나머지 답변은 제자리에 있으며 작동하지만 어떤 이유로 든 (아키텍처, 성능 등) 최적의 솔루션이 아닙니다.
ozz

@ 제임스 : 내 경험에 따르면 두 명의 프로그래머가 일부 코드를 볼 수 있으며 하나는 해킹이라고 부르고 다른 하나는 그렇지 않습니다. 코드를 해킹으로 정량화 할 수있는 방법은 없습니다. 누구나 해킹이 무엇인지에 대한 자신의 생각을 가지고 있으며 종종 비슷하지만 항상 같은 것은 아닙니다. 다른 사람에 의해 "hackish"라는 코드를 가지고 있고 동의하지 않는 사람으로 작성되었습니다. 그리고 다른 사람들의 코드를 "hackish"라고 불렀는데 그들은 동의하지 않았습니다. 사실, 이것은 아마도 경계의 경우 일 수도 있지만 경계 때때로 퍼지 될 있습니다.
FrustratedWithFormsDesigner

1
@FWFD-그것은 해킹인지 여부에 대해 의견이 맞지 않습니다. 누군가가 어떤 코드를 "말"하면 해킹의 의미를 알게 될 것입니다.
ozz

4

나는 프론트 엔드 개발자로서 많은 시간을 소비하므로 해킹에 대한 나의 정의는 다음과 같다.

환경 결함 및 문서화되지 않은 동작에 대한 심층적 인 지식을 기반으로하는 솔루션입니다.

환경은 프레임 워크, 웹 브라우저, 데이터베이스, ATM (현금 인출기), 법원 사건 일 수 있습니다. 허점을 알고 문제를 해결하기 위해 활용하는 "규칙 시스템".


4

해킹은 일반적으로 원하는 출력을 제공하지만 최적이 아닌 방식으로 제공되는 일부 코드입니다.

일반적으로 작성자가 의도하지 않은 방식으로 문서화되지 않았거나 모호한 언어 / 라이브러리 기능을 사용하므로 의도가 모호합니다.

때때로 일부 언어 또는 라이브러리 버그를 해결하기 위해 수행되지만 대부분의 경우 주된 원인은 대개 무지입니다.

망치로 모든 것이 못처럼 보입니다.

일반적으로 공간과 시간 모두에서 비효율적 인 방식으로 이루어 지지만 결국 원하는 출력을 산출하지만 비용이 들며 테스트 가능성과 유지 관리 성이없는 알 수없는 엣지 사례가 발생할 수 있습니다. 일반적으로 논리 또는 언어 관용구에 대한 근본적인 이해 부족에서 비롯 됩니다. "어려운 길"도 참조하십시오.

일반적으로 코드는 적절한 경험을 가진 사람이 수행조차 고려하지 않았거나 발견 한 해킹에 대한 라운드만큼 복잡하고 비효율적으로 만들기 위해 길고 힘들게 생각해야 할 것입니다.

비스타 픽스

이메일 유효성 검사 유효성

소프트웨어 단위

비 결정적 해시


차선책의 경우 +1 그리고 가장 많이 투표 된 것처럼 해킹이 "임시"필요하지 않기 때문입니다.
rlb.usa

2

대머리 타이어는 작동하지만 아무도 그것을 펑크에 대한 이상적인 솔루션이라고 부를 수는 없습니다. 이로 인해 더 심각한 문제가 발생할 수 있습니다.

일반적으로 해킹은 즉각적인 문제에 대한 빠르고 더러운 해결책으로 생각합니다. 일반적으로 프로그래밍 샵에서 일반적인 프로그래밍 방식을 따르지 않을 수 있습니다 (예 : 많은 하드 코딩 사용). 작은 수정일 수 있습니다.

나쁜 이유는 a) 예상치 못한 결과를 초래할 수 있습니다. b) 문제가되는 코드의 원래 설계와 일치하지 않아 유지 관리 문제가 발생할 수 있기 때문입니다. 내 경험에 따르면, 해킹은 일반적으로 매우 잘 문서화되어 있지 않습니다.


2

내가 듣고 존중하는 짧은 정의 :

"모든 경우에 문제를 완전히 해결하지 못하는 증상에 대한 해결책"

추악한 코드는 핵일 수도 있고 아닐 수도 있습니다. 다른 대답의 2 + 2 예제는 해킹이 아니며, 추악한 코드 솔루션이며 코드 이해 관점에서 나쁘지만 모든 경우에 올바른 솔루션을 생성합니다. 수학에서 인수 분해 된 방정식을 생각하십시오. 행동 / 관계는 두 버전에서 동일하고 정확하지만 형태는 다릅니다. 흠, 방정식을 인수 분해, 방정식을 리팩토링, 리 팩터 코드 ... 아니, 유사성은 없습니다 :)

이름을 "Jim"으로 변경하는 것에 대한 다른 대답 중 하나의 예는 해킹입니다. 증상을 해결하지만 (목록의 이름은 Jim 임) 문제를 완전히 해결하지는 못합니다 (목록은 정렬되지 않음) 또는 모든 출품작에 적용되는 방식으로 우선 순위를 정합니다).


1

해킹은 예상 결과를 반환하는 작업을 수행하지만 이상한 방식으로 수행됩니다 (일반적으로 성능 저하가 발생 함).

예 :

작업 : 정수 변수를 이중으로 캐스팅

해결책 : 캐스트 연산자를 사용하십시오. 즉 : dblVar = CType (intVar, Double)

해킹 : 더블로 나눕니다. 즉 : dblVar = intvar / 1.0


더 좋은 예는 +1입니다. 오래된 AS400 코드에서는 유럽 날짜에 엉뚱한 10 진수를 곱한 것으로 미국 날짜를 출력합니다. 특정 코더가 .Net 코드로 유출하기 시작하면 문제가 시작됩니다.
Morgan Herlocker

0

다리가 감염되어 살아 남기 위해 제거해야한다고 상상해보십시오. 의사가 도끼로 신속하게 해킹하거나 문제를 조사하고 적절한 도구, 절차 등을 골라 외과 적으로 제거하도록 하시겠습니까? 소프트웨어에도 동일하게 적용됩니다.


공격자가 내 두뇌를 해킹 할 기회를 갖기 전에 그를 해킹하도록하겠습니다.
Mateen Ulhaq

몇 분 밖에 없었다면?
StuperUser

0

책임자는 코더가 "나중에 와서 나중에 고칠 것"이라고 선언했을 때 탄생을 알립니다.

참고로 OP의 맥락에서 해킹은 원하는 결과를 얻는 것이지만 일시적이거나 신뢰할 수없는 방법을 사용합니다.

다른 일반적인 정의는 플랫폼에서 제한 / 안전 조치를 우회하기 위해 엣지 케이스 동작을 이용하는 기술입니다.

두 번째 맥락에서 핵은 "매버릭"(읽기 : 위험한) 영웅 코더들 사이에 특정 캐시를 가지고 있습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.