it-swarm-eu.dev

Was ist ein Hack?

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

Was ich davon wegnehmen kann ist, dass es nicht gut ist. Als ich sie fragte, ob es funktioniert, sagen 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? Verwendet es einen Nebeneffekt von Code als Teil Ihrer Lösung?

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

55
dustyprogrammer

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

Ein Beispiel, das ich kürzlich gesehen habe: Sie möchten eine Person namens "Jim", um immer zuerst in einer alphabetischen Liste zu erscheinen. Um es schnell zu lösen, benennen Sie ihn in " Jim". Dies ist ein Hack, der sicherlich später zurückkommt, um dich zu beißen.

98
JD Isaacks

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

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

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

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

Der Begriff Hack impliziert fast immer die Absicht, ein Problem vorübergehend zu lösen und "es direkt danach zu tun", aber erfahrene Entwickler wissen, dass die dauerhaftesten Dinge im Code temporäre Hacks sind.

60
Uri

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 ein Hack sein, der aufgrund der Unkenntnis einer besseren Praxis oder einer Annahme, die /1 schien einfacher zu der Zeit oder ein Fehler in einer Bibliothek, der das /1 richtig arbeiten.

Liegt es an guten Praktiken?

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

  • Unkenntnis der richtigen Gestaltungsprinzipien. (d. h. SOLID Prinzipien)

  • Arroganz (d. H. Falsche Annahmen) über eine API oder ein Sprachkonstrukt.

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

  • Das Management setzt auf gute Entwurfs- und Korrekturannahmen. "Budget" ist eine häufige Rechtfertigung, aber dies ist im Wesentlichen eine der drei oben genannten (Unwissenheit, Arroganz oder Fehler) mit einer nicht technischen Grundursache.

Oder nicht wartbar?

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

Verwendet es einen Nebeneffekt von Code als Teil Ihrer Lösung?

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

20
S.Lott

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

Beim Hack werden häufig nicht dokumentierte und nicht unterstützte Funktionen verwendet, die sich in Zukunft möglicherweise ändern und Ihren Code beschädigen. Sie können auch fest codierte Werte enthalten.

Hack ist normalerweise auch eine vorübergehende Umgehung des Codes mithilfe einer Bibliothek/eines Dienstes, anstatt das zugrunde liegende Problem zu lösen. Wenn Sie später nicht mehr unter Kontrolle sind, ist Hack möglicherweise die einzige Möglichkeit, damit umzugehen.

15
vartec

Der Begriff wird gelegentlich mit der entgegengesetzten Konnotation verwendet, wie bei einem "brillanten Hack". Nur weil es viel üblicher ist, Fehler zu machen, als etwas Brillantes zu tun, ist es viel üblicher, 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 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 ein brillanter Hack oft die Ausnutzung eines unbeabsichtigten Aspekts der Technologie beinhaltet.

11
jhocking

Eine Lösung, die im Moment 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 keines 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>";
}
10
Mike Baranczak

Ein Hack ist eine geniale Lösung für ein Problem, oft abhängig vom unkonventionellen Denken und dem Ausnutzen unerwarteter Fakten über die Umgebung. Es gibt ein Sprichwort über den archetypischen Hack, dem die Zuschauer zustimmen, dass er genial ist, aber nicht herausfinden kann, ob er wunderbar oder schrecklich ist. Dies ist die Art von Dingen, die Sie in Ihren Wartungskorrekturen nicht möchten.

Ein Hack, der ein Problem behebt, hängt sehr wahrscheinlich von den Details der Umgebung oder den nicht dokumentierten 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 schaden, aber in Zukunft Probleme mit perfekt guten Codeteilen in einiger Entfernung verursachen, und das kann ein Albtraum sein, mit dem man sich befassen muss.

9
David Thornley

Der Word-Hack wird missbraucht. Wenn Sie wirklich ein bisschen Geschichte bekommen möchten, können Sie es Wikipedia. Ein Hack ist ein Wort, um den Prozess des Optimierens von Dingen zu beschreiben, um etwas zu tun, für das sie nicht gedacht waren. Im Kontext der Elektrotechnik ist das gut. Es gibt eine bessere Beschreibung auf Wikipedia dazu.

Nun, im Kontext der Informatik. Ein Hack ist im Allgemeinen schlecht. Ja, es funktioniert, aber normalerweise bedeutet dies, 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 eine Entscheidung, ob der Hack akzeptiert werden soll oder nicht. Zumindest möchten Sie, dass der leitende Softwareentwickler den Hack genehmigt, da er über mehr Erfahrung verfügt und eine fundiertere Entscheidung treffen kann. Auf jeden Fall wollen Sie nicht, dass die Junioren Entscheidungen über das Akzeptieren von Hacks treffen. Sie können sich eine einfallen lassen und mit den Senioren diskutieren, ob die Vorteile den Schmerz wert sind, den Hack aufrechtzuerhalten.

9
Erion

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

Hack

Eigentlich ist über 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 besteht darin, dass Sie ein bestimmtes Problem und Tools haben, die es nie lösen sollten, aber Sie lösen das Problem nur mit diesen Tools (anstatt die richtigen zu bekommen). Sie sind klug, 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 verbrennen oder so.

In der Softwareentwicklung möchten Sie, dass Ihr Code von anderen (einschließlich Ihrer zukünftigen Person) ohne das Äquivalent einer tödlichen Verletzung verarbeitet 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 voller Demut an und vermeidet clevere Tricks wie die Pest.

Und Hacks gehören zu den cleversten Tricks.

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

6
back2dos

Der Begriff ist nicht sehr präzise, ​​bezieht sich aber wahrscheinlich auf eine schnelle und schmutzige Lösung eines Problems, das schwer richtig zu lösen ist. Die fragliche Lösung funktioniert wahrscheinlich, ist aber wahrscheinlich keine sehr gute Implementierung, hat möglicherweise subtile Fehler, vielleicht einige kleine bekannte Fehler und sollten später wiederholt werden, wenn es die Zeit erlaubt. Ich denke, was Sie als "Hack" hören, wird manchmal auch als " kludge " bezeichnet.

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

Ein Hack ist normalerweise ein Code, der anscheinend die gewünschte Ausgabe liefert, jedoch auf nicht optimale Weise.

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

Gelegentlich wird versucht, einen Sprach- oder Bibliotheksfehler zu umgehen, aber in den meisten Fällen ist die Hauptursache normalerweise Unwissenheit.

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

Dinge, die auf ungefähr ineffiziente Weise erledigt werden, normalerweise sowohl räumlich als auch zeitlich, aber schließlich die gewünschte Ausgabe erzeugen, jedoch zu einem Preis und möglicherweise nicht erkennbaren Edge-Fällen ohne Testbarkeit und ohne Wartbarkeit. In der Regel aufgrund eines Mangels an grundlegendem Verständnis von Logik oder Sprachsprache. Siehe auch "der harte Weg".

Normalerweise ist der Code etwas, das jemand mit der entsprechenden Erfahrung nicht einmal in Betracht ziehen würde, oder er müsste lange und gründlich nachdenken, um ihn so kompliziert und ineffizient zu machen wie den von ihm aufgedeckten Round-About-Hack.

Beispiele

The Vista Fix

Gültigkeit der E-Mail-Validierung

Softwareeinheiten

Nicht deterministischer Hash

4
user7519

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 (Geldautomat) oder Gerichtsverfahren sein. Jedes "Regelsystem", bei dem Sie eine Lücke kennen und diese zur Lösung eines Problems ausnutzen.

4
mefisto

Ein kahler Reifen funktioniert, aber niemand würde ihn als ideale Lösung für eine Reifenpanne bezeichnen. Dies kann auf der ganzen Linie 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 normalerweise nicht der normalen Programmierpraxis in einem Programmiergeschäft (z. B. viel Hardcodierung). Es kann durchaus eine kleine Lösung sein.

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

2
temptar

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

"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 aus schlecht, aber es liefert in allen Fällen die richtige Lösung. Stellen Sie sich eine faktorisierte Gleichung in der Mathematik vor - das Verhalten/die Beziehung ist in beiden Versionen identisch und korrekt, aber die Form ist unterschiedlich. Hmm, Faktor eine Gleichung, Refactor eine Gleichung, Refactor Code ... nein, keine Ähnlichkeit Ich bin 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 einer Weise priorisiert, die für alle Einträge funktioniert).

2
anon

Ein Hack macht etwas, das das erwartete Ergebnis zurückgibt, dies jedoch auf seltsame Weise (normalerweise mit einem Leistungseinbruch).

Z.B.:

Task: Um eine Integer-Variable in ein Double umzuwandeln

Lösung: Verwenden Sie den Cast-Operator. Das heißt: dblVar = CType (intVar, Double)

Hack: Teilen Sie durch ein Doppel. Das heißt: dblVar = intvar/1.0

1
Onion-Knight

Ein Hack signalisiert seine Geburt, wenn der verantwortliche Codierer erklärt "Ich werde zurückkommen und das später beheben".

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

Die andere gebräuchliche Definition ist eine Technik, die das Verhalten von Edge-Fällen ausnutzt, um Einschränkungen/Schutzmaßnahmen auf der Plattform zu umgehen.

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

0
sunwukung

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

0
Josh Smith