Was ist ein Hack? [geschlossen]


55

Ich höre oft Kollegen zu einander sagen: "Das ist ein schrecklicher, schrecklicher Hack."

Was ich davon abbringen kann ist, dass es nicht gut ist. Als ich sie fragte, ob es funktioniert, sagten sie "Ja, aber es ist nicht gut". Bedeutet das, dass es keine gute Lösung ist? Wie ist eine Lösung schlecht, wenn sie funktioniert? Liegt es an guten Praktiken? Oder nicht wartbar? Wird ein Nebeneffekt von Code als Teil Ihrer Lösung verwendet?

Es ist interessant für mich, wenn etwas als Hack eingestuft wird. Wie können Sie es identifizieren?


5
Etwas mag funktionieren, aber es ist langsam, zerbrechlich, hässlich und schmerzhaft zu warten. Das ist ein Hack.
Trezoid

1
Ghetto-manipulierter Code == Hack
Garet Claborn

Ich sage nicht, dass es ein Hack ist, aber Sie möchten das dynamische Patchen +von Affen überdenken , um es anhand von Heuristiken aufzuteilen.
Dietbuddha

Für alle, die behaupten, Hacks seien schmutzige Pflastersteine, lesen Sie bitte, was für diejenigen, die sich selbst als Hacker bezeichneten, unter outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ Ein unglaublich gutes Beispiel und vielleicht sehr zeitaufwändige Arbeit, die genau das produziert, was benötigt wird.

1
Eine Funktion, die nicht nach gängigen Standards oder nach dem Standard Ihres Vorgesetzten implementiert ist.
Aditya P

Antworten:


97

Es wendet ein temporäres Pflaster auf eine große klaffende Wunde an. Es ist vorerst behoben, aber es wird später noch mehr Probleme verursachen.

Ein Beispiel, das ich kürzlich gesehen habe: Sie möchten, dass eine Person mit dem Namen "Jim"immer zuerst in einer alphabetischen Liste angezeigt wird. Um es schnell zu lösen, benennen Sie ihn in um " Jim". Dies ist ein Hack, der sicherlich wiederkommt, um Sie später zu beißen.


34
Oder Sie könnten ihn "AAA Jim" nennen.
compman

4
Ein anderes Beispiel wäre die Erweiterung eines if ... else ... else ... else aus Zeitgründen anstelle einer erweiterbareren Lösung.
Phil Lello

29
Und die wirkliche Lösung, um Jim als ersten in der alphabetischen Liste erscheinen zu lassen, besteht natürlich darin, das Alphabet neu zu ordnen.
Artem

1
@artem true, und es sah so aus: jzbcdefghiklmnopqrstuvwxya (Sie möchten das Alphabet nicht neu anordnen, um a zu entfernen und z
Anzeigename

1
Um es in Projektmanagement-Begriffen auszudrücken: Ein Hack ist eine Lösung, die in Zukunft eine Verschuldung von Zeit / Arbeitsstunden schaffen kann und / oder gegen Best Practices oder Standardkonventionen verstößt.
Inkognito

60

Jede technische Entscheidung ist ein Kompromiss zwischen den unmittelbaren Kosten und der Verzögerung sowie den Folgekosten und der technischen Verschuldung.

Ein Hack ist eine Situation, in der der erstere bevorzugt wird, während der letztere als Konsequenz akzeptiert wird.

Unerfahrene Entwickler (teilweise aufgrund der Funktionsweise des Ingenieurausbildungssystems) konzentrieren sich auf die ersteren und verfügen nicht über ausreichende Erfahrung, um die letzteren wirklich zu verstehen oder einzuschätzen.

Erfahrene Entwickler tun dies, wählen jedoch aus verschiedenen Gründen (viele legitimiert) die erstere.

Der Begriff "Hack" impliziert fast immer die Absicht, ein Problem vorübergehend zu lösen und "unmittelbar danach" zu handeln. Erfahrene Entwickler wissen jedoch, dass die dauerhaftesten Dinge im Code vorübergehende Hacks sind.


13
+1 für "aber erfahrene Entwickler wissen, dass die dauerhaftesten Dinge im Code temporäre Hacks sind"! Das bedeutet auch, dass Faulheit Sie niemals daran hindern sollte, es richtig zu machen.
Matthieu M.

20

Wie ist eine Lösung schlecht, wenn sie funktioniert?

Bedenken Sie

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

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

Das zweite Beispiel könnte jedoch Hack sein, der verwendet wird, weil eine bessere Vorgehensweise nicht bekannt ist oder eine Annahme, die zu diesem Zeitpunkt einfacher/1 erschien, oder ein Fehler in einer Bibliothek, der die Arbeit korrekt gemacht hat./1

Liegt es an guten Praktiken?

Nein. Hacks sind "zweckmäßiger" Code. Es gibt drei vier Ursachen.

  • Ignoranz der richtigen Designprinzipien. (dh SOLID Prinzipien)

  • Arroganz (dh falsche Annahmen) über eine API oder ein Sprachkonstrukt.

  • Tatsächliche Fehler, die nicht behoben sind, aber umgangen werden.

  • Das Management hat Vorrang vor guten Entwurfs- und Korrekturannahmen. "Budget" ist eine häufige Rechtfertigung, aber dies ist im Wesentlichen eine der drei oben genannten Begründungen (Ignoranz, Arroganz oder Irrtum) mit einer nicht-technischen Grundursache.

Oder nicht wartbar?

Das ist der Punkt. Der Hack basiert auf Unwissenheit, Fehlern oder Annahmen.

Wird ein Nebeneffekt von Code als Teil Ihrer Lösung verwendet?

Das kann ein Beispiel für Unwissenheit oder eine falsche Annahme sein.


Gute Antwort, berücksichtigt aber nicht, dass Hacks manchmal mit Qualitätsproblemen aufgrund des Dreiecks zwischen Qualität und Zeit und Kosten geschrieben werden.
StuperUser

1
Ich spiele dieses Spiel mit Kunden. Ich würde sie bitten, die beiden wichtigsten Aspekte eines Projekts unter Qualität, Zeit, Kosten auszuwählen. Fast immer wurden Zeit und Kosten ausgewählt, und dann wurde mit der Qualität gefeilscht. Insbesondere unter Berufung auf die Tatsache, dass ich ein Berater war und in der Lage sein sollte, alle drei Aufgaben pünktlich, kostengünstig und in hervorragender Qualität zu erfüllen. Dieses Szenario ist wie Hen's Teeth!
OptimizePrime

1
@Optimize: Hühnerzähne sind selten. Ist diese Situation selten?
Matt Ellen

@ Matt Ellen: Es kann eine andere Verwendung der Phrase "Hen's Teeth" sein. Es kann "widersprüchlich" statt "selten" bedeuten.
S.Lott

Ich finde, dass es fast immer die Entscheidung "Management Override" ist.
Mark McDonald

15

Hack im Programmierkontext wäre gleichbedeutend damit, etwas mit Klebeband oder Kaugummi zu reparieren.

Hack beinhaltet sehr oft die Verwendung von undokumentierten und nicht unterstützten Funktionen, die sich in Zukunft möglicherweise ändern und Ihren Code beschädigen. Sie können auch fest codierte Werte enthalten.

Hack ist in der Regel auch eine vorübergehende Arbeit im Code, die eine Bibliothek / einen Dienst verwendet, anstatt das zugrunde liegende Problem zu lösen. Wenn Sie später keinen Einfluss mehr haben, ist Hack möglicherweise die einzige Möglichkeit, damit umzugehen.


21
Das Verwenden von Klebeband für Kanäle wäre ein Quacksalber;)
JeffO

Quacksalber Quacksalber
Mateen Ulhaq

11

Der Begriff wird gelegentlich mit der entgegengesetzten Konnotation verwendet, wie in einem "brillanten Hack". Nur weil es viel häufiger ist, Fehler zu machen, als etwas Brillantes zu tun, ist es viel häufiger, von schrecklichen Hacks zu hören als von brillanten Hacks, aber ich habe gehört, dass der Begriff in beide Richtungen verwendet wird.

"Hack" im positiven Sinne bedeutet im Grunde genommen eine elegante Lösung, die das Problem auf unerwartete und besonders clevere Weise löst. Die negativen und positiven Bedeutungen sind tatsächlich ziemlich nahe beieinander, da bei einem brillanten Hack häufig ein unbeabsichtigter Aspekt der Technologie ausgenutzt wird.


1
Es ist ein brillanter Hack, denn es wird schwer zu sehen sein, was Sie an der Oberfläche getan haben, aber bei genauerer Betrachtung ist es offensichtlich, dass dies eine lächerlich clevere Linke-Feld-Code ist. Darf ich Sie auf die Bebenquadratwurzelmagie
hinweisen

10

Eine Lösung, die jetzt funktioniert , aber auf lange Sicht wahrscheinlich Probleme verursachen wird.

Beispiel: Sie müssen ein HTML-Dokument generieren und einige Werte dynamisch eingeben. Der richtige Weg, dies zu tun, besteht darin, eines der Tools zu verwenden, die tatsächlich für diesen Zweck entwickelt wurden, wie Freemarker, XSLT oder JSP. Aber Sie können keine davon verwenden, oder Sie können sich einfach nicht die Mühe machen, es richtig zu machen, also schreiben Sie so etwas:

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

9

Ein Hack ist eine ausgeklügelte Lösung für ein Problem, die oftmals von unkonventionellen Überlegungen abhängt und sich unerwartete Fakten über die Umgebung zunutze macht. Es gibt ein Sprichwort über den archetypischen Hack, dass die Zuschauer zustimmen, dass er genial ist, aber nicht herausfinden können, ob er wunderbar oder schrecklich ist. Dies ist die Art von Dingen, die Sie in Ihren Wartungskorrekturen nicht wollen.

Ein Hack, der ein Problem behebt, hängt sehr wahrscheinlich von den Details der Umgebung oder undokumentierten Funktionen eines Tools oder Ähnlichem ab. Es ist wahrscheinlich eine spröde Lösung, die jetzt funktioniert, aber wahrscheinlich kaputt geht, wenn sich etwas ändert. Es kann schwierig sein zu verstehen, wie es funktioniert, und jeder Wartungsprogrammierer wird schwer verständlichen Code hassen. Es kann Nebenwirkungen haben, die vorerst nichts verletzen, aber in Zukunft Probleme mit einwandfreien Codeteilen in einiger Entfernung verursachen, und das kann ein Albtraum sein.


9

Das Wort Hack wird missbraucht. Wenn Sie wirklich ein bisschen Geschichte bekommen wollen, können Sie es Wikipedia. Ein Hack ist ein Wort, das beschreibt, wie Dinge optimiert werden, um etwas zu tun, für das sie nicht vorgesehen sind. Im Kontext der Elektrotechnik ist dies gut. Auf Wikipedia gibt es dazu eine bessere Beschreibung.

Nun, im Kontext der Informatik. Ein Hack ist in der Regel schlecht. Ja, es funktioniert, aber normalerweise bedeutet es, dass der Programmierer einen mehrdeutigen Code geschrieben hat, der nicht dem Design der Software entspricht und jeden Programmierer verwirrt, der diesen Code lesen muss. Natürlich ist die Zeit für Programmierer teuer, daher möchte man als Manager die am einfachsten zu wartende Software haben. Gleiches gilt für Programmierer. Außerdem neigen Hacks dazu, etwas anderes in der Software zu beschädigen.

Es ist ein Urteilsspruch, ob man den Hack akzeptiert oder nicht. Zumindest möchten Sie, dass der leitende Software-Ingenieur den Hack genehmigt, da er über mehr Erfahrung verfügt und in der Lage ist, fundiertere Entscheidungen zu treffen. Auf keinen Fall wollen Sie, dass die Junioren Entscheidungen über das Akzeptieren von Hacks treffen. Sie können sich einen einfallen lassen und mit den älteren Leuten besprechen, ob die Vorteile die Mühe wert sind, den Hack aufrechtzuerhalten.


6

Dies ist ein Hack, wie auf thereifixedit.com zu finden .

Hacken

Eigentlich ist alles auf dieser Seite ein Hack.

Hacks sind geniale und kühne Verwendungen einiger Dinge außerhalb ihres Kontexts.
Das Schöne an einem Hack ist, dass Sie ein bestimmtes Problem und Tools haben, die es nie lösen wollten, aber Sie lösen das Problem nur mit diesen Tools (anstatt die richtigen zu bekommen). Sie sind schlau, schnell und machen Spaß. Der Nachteil ist, dass die Ergebnisse für Außenstehende oft fragil und gefährlich sind.
Ich meine, wenn Sie Ihre Probleme wie auf dem Bild lösen möchten, gibt es kein Problem. Das Problem tritt auf, wenn Sie die Probleme anderer Leute so lösen. In diesem Fall würden sie wahrscheinlich einen Stromschlag erleiden oder sich verbrennen oder so.

Bei der Softwareentwicklung möchten Sie, dass Ihr Code von anderen (einschließlich Ihrer Zukunft) ohne das Äquivalent einer tödlichen Verletzung gehandhabt werden kann. Wie Dijkstra es ausdrückte:

Der kompetente Programmierer ist sich der begrenzten Größe seines eigenen Schädels voll bewusst. Er geht seine Aufgabe daher mit Demut an und vermeidet clevere Tricks wie die Pest.

Und Hacks gehören zu den cleversten Tricks.

Hacks ticken irgendwo in Ihrem Code Zeitbomben, weil die gängigen Annahmen von Natur aus auf zu vielen Annahmen beruhen ("nur machen" ist der richtigen Entkopplung vorzuziehen). Sobald diese Annahmen nicht mehr zutreffen, kann Ihr gesamtes System zusammenbrechen, ohne dass Sie eine Ahnung haben, was passiert ist.


4

Der Begriff ist nicht sehr präzise, ​​bezieht sich aber wahrscheinlich auf eine schnelle und schmutzige Lösung für ein Problem, das nur schwer richtig zu lösen ist. Die fragliche Lösung funktioniert wahrscheinlich, ist aber wahrscheinlich keine sehr gute Implementierung, weist möglicherweise subtile Fehler auf, möglicherweise einige kleine bekannte Fehler, und sollte später wiederholt werden, wenn die Zeit es zulässt. Ich denke, was man als "Hack" bezeichnet, wird manchmal auch als " Kludge " bezeichnet.

Ich sehe oft Hacks, wenn es sehr enge Zeitbeschränkungen gibt, um eine Aufgabe abzuschließen, und eine Hack-Lösung wird implementiert, weil sie "gerade genug" funktioniert, um die Qualitätssicherung zu bestehen, mit der Hoffnung, dass sie später behoben werden kann. Leider passiert dieses spätere Reparieren / Aufräumen nicht immer :(


Ich bin mir nicht sicher, was Sie mit "nicht sehr genau" meinen - ich würde sagen, die meisten Programmierer würden genau wissen, was damit gemeint ist, dass ein geschriebener Code ein Hack ist. Aber der Rest der Antwort ist genau richtig, es funktioniert, aber aus irgendeinem Grund (Architektur, Performances usw.) ist es keine optimale Lösung.
ozz

@james: Nach meiner Erfahrung können sich zwei Programmierer Code ansehen und einer nennt ihn Hack, der andere nicht. Es gibt keine echte Möglichkeit, einen Code als Hack zu quantifizieren. Jeder hat seine eigene Vorstellung davon, was ein Hack ist, und oft sind sie ähnlich, aber nicht immer gleich. Geschrieben als jemand, dessen Code von anderen als "hackisch" bezeichnet wurde und dem man nicht zustimmt. Und ich habe den Code anderer Leute als "hackisch" bezeichnet, und sie waren anderer Meinung. Es stimmt, das sind wahrscheinlich Grenzfälle, aber die Grenzen können manchmal verschwommen sein ...
FrustratedWithFormsDesigner

1
@FWFD - das ist nur uneinig darüber, ob etwas ein Hack ist. Wenn jemand sagt, dass ein Code ein Hack ist, wissen Sie, was er bedeutet.
ozz

4

Ich verbringe viel Zeit als Front-End-Entwickler, daher ist meine Definition eines Hacks:

Eine Lösung, die auf fundierten Kenntnissen über Umgebungsfehler und undokumentiertes Verhalten basiert.

Die Umgebung kann Ihr Framework, Webbrowser, Datenbank, Geldautomat, Gerichtsverfahren sein. Jedes "Regelsystem", bei dem Sie eine Lücke kennen und es ausnutzen, um ein Problem zu lösen.


4

Ein Hack ist in der Regel ein Code, der anscheinend die gewünschte Ausgabe liefert, jedoch auf suboptimale Weise.

In der Regel wird eine undokumentierte oder undurchsichtige Sprach- / Bibliotheksfunktion verwendet, die vom Urheber nicht beabsichtigt war und daher die Absicht verschleiert hat.

Gelegentlich wird versucht, einen Sprach- oder Bibliotheksfehler zu umgehen. In den meisten Fällen liegt die Hauptursache jedoch in der Unwissenheit.

Für einen Hammer sieht alles aus wie ein Nagel.

Dinge, die auf eine ineffiziente Art und Weise erledigt werden, normalerweise sowohl räumlich als auch zeitlich, aber letztendlich die gewünschte Leistung erbringen, jedoch zu einem Preis und möglicherweise unerkennbaren Randfällen ohne Überprüfbarkeit und Wartbarkeit. In der Regel aufgrund eines Mangels an grundlegendem Verständnis der Logik oder der Sprache. Siehe auch "Der harte Weg".

Normalerweise handelt es sich bei dem Code um etwas, das jemand mit der entsprechenden Erfahrung gar nicht in Betracht ziehen würde, oder das er sich lange und gründlich überlegen müsste, um es so kompliziert und ineffizient zu machen, wie das Round-About-Hack, das er aufgedeckt hat.

Beispiele

Der Vista Fix

Gültigkeit der E-Mail-Validierung

Software-Einheiten

Nicht deterministischer Hash


+1 Für suboptimal. Und weil Hacks nicht unbedingt "temporär" sind, da sie am häufigsten gewählt werden.
rlb.usa

2

Ein kahler Reifen funktioniert, aber niemand würde es als ideale Lösung für eine Reifenpanne bezeichnen. Dies kann später zu schlimmeren Problemen führen.

Normalerweise würde ich einen Hack als schnelle und schmutzige Lösung für ein unmittelbares Problem betrachten. Es entspricht möglicherweise nicht der normalen Programmierpraxis in einem Programmiergeschäft (verwenden Sie z. B. viel Hardcoding). Es kann durchaus eine kleine Lösung sein.

Ein Hauptgrund dafür ist, dass es a) zu unvorhersehbaren Ergebnissen führen kann, b) möglicherweise nicht mit dem ursprünglichen Design des fraglichen Codes übereinstimmt, was zu Wartungsproblemen führt. Nach meiner Erfahrung sind Hacks typischerweise auch sehr schlecht dokumentiert.


2

Eine kurze Definition, die ich gehört habe und respektiere:

"Eine Lösung für ein Symptom, das das Problem nicht in allen Fällen vollständig löst"

Hässlicher Code kann ein Hack sein oder auch nicht. Das 2 + 2-Beispiel in einer anderen Antwort ist kein Hack, es ist eine hässliche Codelösung und vom Standpunkt des Codeverständnisses schlecht, aber es liefert in allen Fällen die richtige Lösung. Denken Sie an eine faktorielle Gleichung in der Mathematik - das Verhalten / die Beziehung ist in beiden Versionen identisch und korrekt, aber die Form ist unterschiedlich. Hmm, faktoriere eine Gleichung, refaktoriere eine Gleichung, refaktoriere Code ... nein, keine Ähnlichkeit, da bin ich mir sicher :)

Das Beispiel in einer der anderen Antworten zum Ändern des Vornamens in "Jim" ist ein Hack: Es löst das Symptom (Vorname in der Liste ist Jim), löst das Problem jedoch nicht vollständig (die Liste ist nicht sortiert) oder in irgendeiner Weise priorisiert, die für alle Einträge funktioniert).


1

Ein Hack tut etwas, das das erwartete Ergebnis liefert, aber auf seltsame Weise (normalerweise mit einem Leistungseinbruch).

Z.B:

Aufgabe : Umwandlung einer Integer-Variablen in ein Double

Lösung : Verwenden Sie den Cast-Operator. Dh: dblVar = CType (intVar, Double)

Hack : Dividiere durch ein Doppel. Dh: dblVar = intvar / 1.0


+1 für ein hervorragendes Beispiel. Im alten AS400-Code werden europäische Datumsangaben mit einer verrückten Dezimalstelle multipliziert, die das amerikanische Datum ausgibt. Die Probleme beginnen, wenn bestimmte Codierer damit beginnen, sie in unseren .Net-Code zu lecken ... bleh!
Morgan Herlocker

0

Stellen Sie sich vor, Ihr Bein wäre infiziert und müsste entfernt werden, damit Sie überleben. Möchten Sie lieber, dass der Arzt es schnell mit einer Axt abhackt oder es operativ entfernt, nachdem Sie das Problem untersucht und die geeigneten Werkzeuge, Verfahren usw. ausgewählt haben? Gleiches gilt für Software.


Ich würde ihn abhacken lassen, bevor der Angreifer die Chance bekommt, sich in mein Gehirn zu hacken.
Mateen Ulhaq

Was wäre, wenn Sie nur ein paar Minuten Zeit hätten?
StuperUser

0

Ein Hack signalisiert seine Geburt, wenn der zuständige Programmierer erklärt "Ich komme zurück und repariere das später".

Im Ernst - ein Hack im Kontext des OP ist etwas, das das gewünschte Ergebnis erzielt, aber eine vorübergehende oder unzuverlässige Methode verwendet, um dies zu tun.

Die andere gebräuchliche Definition ist eine Technik, die Randfallverhalten ausnutzt, um Einschränkungen / Schutzmaßnahmen auf der Plattform zu umgehen.

Hack im zweiten Kontext hat ein gewisses Gütesiegel unter "Einzelgängern" (sprich: gefährlichen) Heldencodierern ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.