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?
terminology
Staubprogrammierer
quelle
quelle
+
von Affen überdenken , um es anhand von Heuristiken aufzuteilen.Antworten:
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.quelle
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.
quelle
Bedenken Sie
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
Nein. Hacks sind "zweckmäßiger" Code. Es gibt
dreivier 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.
Das ist der Punkt. Der Hack basiert auf Unwissenheit, Fehlern oder Annahmen.
Das kann ein Beispiel für Unwissenheit oder eine falsche Annahme sein.
quelle
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.
quelle
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.
quelle
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:
quelle
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.
quelle
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.
quelle
Dies ist ein Hack, wie auf thereifixedit.com zu finden .
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:
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.
quelle
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 :(
quelle
Ich verbringe viel Zeit als Front-End-Entwickler, daher ist meine Definition eines Hacks:
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.
quelle
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.
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
quelle
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.
quelle
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).
quelle
Ein Hack tut etwas, das das erwartete Ergebnis liefert, aber auf seltsame Weise (normalerweise mit einem Leistungseinbruch).
Z.B:
quelle
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.
quelle
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 ...
quelle