Co to jest hack? [Zamknięte]


55

Często słyszę współpracowników, którzy mówią sobie: „To okropny, okropny hack”.

Mogę od tego odjąć, że nie jest dobrze. Kiedy zapytałem ich, czy to działa, mówią „tak, ale to nie jest dobre”. Czy to oznacza, że ​​nie jest to dobre rozwiązanie? Jak złe jest rozwiązanie, jeśli działa? Czy wynika to z dobrej praktyki? A może nie do utrzymania? Czy wykorzystuje efekt uboczny kodu jako części twojego rozwiązania?

Interesuje mnie, gdy coś jest klasyfikowane jako hack. Jak możesz to zidentyfikować?


5
Coś może działać, ale być powolne, kruche, brzydkie w pracy i bolesne w utrzymaniu. To jest hack.
Trezoid


Nie twierdzę, że to hack, ale chcesz dynamicznie przemyśleć łatanie małp, +aby podzielić je na podstawie heurystyki.
dietbuddha

Wszystkim tym, którzy twierdzą, że hacki są brudnymi pomocnikami, spójrz na to, co oznaczało tych, którzy nazywali siebie hakerami na outpost9.com/reference/jargon/jargon_23.html#TAG824 - 2. /n./ Niezwykle dobry , i być może bardzo czasochłonne, praca, która wytwarza dokładnie to, czego potrzeba.

1
Funkcja, która nie jest zaimplementowana zgodnie z popularnymi standardami lub standardem przełożonego.
Aditya P

Odpowiedzi:


97

Stosuje tymczasowe wspomaganie opaski na dużą otwartą ranę. Na razie jest to naprawione, ale później spowoduje jeszcze więcej problemów.

Przykład, który ostatnio widziałem: Chcesz, aby osoba o nazwisku "Jim"zawsze pojawiała się pierwsza na liście alfabetycznej. Aby szybko go rozwiązać, zmień jego nazwę na " Jim". To hack, który na pewno wróci, by cię ugryźć później.


34
Możesz też nazwać go „AAA Jim”.
compman

4
Innym przykładem byłoby rozszerzenie if ... else ... else ... z powodu ograniczeń czasowych, zamiast bardziej rozszerzalnego rozwiązania.
Phil Lello

29
A prawdziwym rozwiązaniem, aby Jim pojawił się pierwszy na liście alfabetycznej, jest oczywiście zmiana kolejności alfabetu.
artem

1
@artem true, i wyglądało to tak: jzbcdefghiklmnopqrstuvwxya (nie chcesz zmieniać kolejności alfabetu, zdejmować i wyświetlać z)
Nazwa wyświetlana

1
Aby sformułować to w kategoriach zarządzania projektem: hack to rozwiązanie, które może stworzyć w przyszłości dług czasu / roboczogodzin i / lub jest sprzeczne z najlepszymi praktykami lub standardowymi konwencjami.
Incognito

60

Każda decyzja inżynierska stanowi kompromis między bezpośrednim kosztem i opóźnieniem a wynikającymi z tego kosztami i długiem technicznym.

Hack to sytuacja, w której pierwszy jest preferowany, a jednocześnie akceptuje drugi.

Niedoświadczeni programiści (częściowo ze względu na sposób działania systemu edukacji inżynierskiej) skupiają się na tym pierwszym i nie mają wystarczającego doświadczenia, aby naprawdę zrozumieć lub oszacować ten drugi.

Doświadczeni programiści tak robią, ale z różnych powodów (wielu uzasadnionych) wybierają to pierwsze.

Termin „hack” prawie zawsze implikuje zamiar tymczasowego rozwiązania problemu i „zrób to zaraz potem”, ale doświadczeni programiści wiedzą, że najbardziej trwałymi rzeczami w kodzie są tymczasowe hacki.


13
+1 dla „ale doświadczeni programiści wiedzą, że najbardziej trwałymi rzeczami w kodzie są tymczasowe włamania”! Co oznacza również, że lenistwo nigdy nie powinno przeszkadzać w robieniu tego poprawnie.
Matthieu M.

20

Jak złe jest rozwiązanie, jeśli działa?

Rozważ to

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

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

Drugim przykładem może być jednak włamanie, które przyzwyczaja się z powodu niewiedzy o lepszej praktyce lub założeniu, które /1wydawało się wówczas prostsze, lub błędu w bibliotece, który poprawił /1działanie.

Czy wynika to z dobrej praktyki?

Nie. Hacki są „celowym” kodem. Istnieją trzy cztery przyczyny.

  • Nieznajomość właściwych zasad projektowania. (tj. zasady SOLID)

  • Arogancja (tj. Błędne założenia) dotyczące interfejsu API lub konstrukcji języka.

  • Rzeczywiste błędy, które nie zostały rozwiązane, ale zostały obejrzane.

  • Zarządzanie zastępuje dobre założenia projektowe i korekcyjne. „Budżet” jest powszechnym uzasadnieniem, ale zasadniczo jest to jeden z powyższych trzech elementów (ignorancja, arogancja lub błąd) o nietechnicznej podstawowej przyczynie.

A może nie do utrzymania?

O to chodzi. Hack opiera się na ignorancji, błędach lub założeniach.

Czy wykorzystuje efekt uboczny kodu jako części twojego rozwiązania?

To może być przykład ignorancji lub fałszywego założenia.


Świetna odpowiedź, ale nie bierze pod uwagę, że włamania są czasami pisane z uszczypnięciem jakości ze względu na trójkąt Jakość vs. Czas vs. Koszt.
StuperUser

1
Używam tej gry z klientami. Poprosiłbym ich o wybranie dwóch najważniejszych aspektów projektu z jakości, czasu i kosztów. Prawie zawsze wybrano czas i koszt, a potem targowano się o jakość. W szczególności, powołując się na fakt, że byłem konsultantem i powinienem być w stanie dostarczyć wszystkie trzy w terminie, pod względem kosztów i z wyjątkową jakością. Ten scenariusz jest jak Zęby Kura!
OptimizePrime

1
@Optimize: Zęby kury są rzadkie. Czy ta sytuacja jest rzadka?
Matt Ellen

@Matt Ellen: Może to być inne użycie wyrażenia „Zęby Hen”. Może to oznaczać „sprzeczne” zamiast „rzadkie”.
S.Lott,

Uważam, że prawie zawsze jest to decyzja o „zastąpieniu zarządzania”.
Mark McDonald

15

Hack w kontekście programistycznym byłby równoznaczny z naprawieniem czegoś za pomocą taśmy kaczkowej lub gumy balonowej.

Hack bardzo często wymaga użycia niektórych nieudokumentowanych i nieobsługiwanych funkcji, które mogą się zmienić w przyszłości w wyniku złamania kodu. Mogą również obejmować wartości zakodowane na stałe.

Hack zazwyczaj może również polegać na tymczasowym obejściu kodu przy użyciu biblioteki / usługi, zamiast rozwiązywania podstawowego problemu. Jeśli później jest poza twoją kontrolą, hack może być jedynym sposobem radzenia sobie z tym.


21
Użycie taśmy-kaczki do przewodów byłoby szarlatanem;)
JeffO

kwak kwak kwak
Mateen Ulhaq

11

Termin ten jest czasami używany z odwrotną konotacją, jak w „genialnym hacku”. Tylko dlatego, że o wiele częściej się psuje, niż robić coś genialnego, o wiele częściej słyszy się o okropnych hackach niż genialnych hackach, ale słyszałem, że termin ten był używany na dwa sposoby.

„Hack” użyty w pozytywnym tego słowa znaczeniu oznacza w zasadzie eleganckie rozwiązanie, które rozwiązuje problem w nieoczekiwany i szczególnie sprytny sposób. Negatywne i pozytywne znaczenia są właściwie trochę bliskie, ponieważ genialny hack często wymaga skorzystania z niezamierzonego aspektu technologii.


1
To genialny hack, ponieważ trudno będzie zobaczyć, co zrobiłeś na powierzchni, ale po szczegółowej inspekcji jest oczywiste, że jest to absurdalnie sprytny lewy kod pola. Czy mogę skierować was do magii trzęsienia pierwiastka kwadratowego: codemaestro.com/reviews/9
Robert

10

Rozwiązanie, które działa teraz , ale prawdopodobnie spowoduje problemy na dłuższą metę.

Przykład: musisz wygenerować dokument HTML, wypełniając niektóre wartości dynamicznie. Właściwym sposobem na to jest skorzystanie z jednego z narzędzi, które zostały zaprojektowane do tego celu, takich jak Freemarker, XSLT lub JSP. Ale nie możesz użyć żadnego z nich lub po prostu nie możesz zadać sobie trudu, aby zrobić to poprawnie, więc piszesz coś takiego:

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

9

Hack to genialne rozwiązanie problemu, często zależne od nieszablonowego myślenia i wykorzystywania nieoczekiwanych faktów na temat środowiska. Jest takie powiedzenie na temat archetypowego hacka, że ​​widzowie zgadzają się, że jest genialny, ale nie może dowiedzieć się, czy to cudowne, czy okropne. Jest to coś, czego nie chcesz w swoich poprawkach konserwacyjnych.

Hack, który rozwiązuje problem, najprawdopodobniej będzie zależeć od szczegółów środowiska, nieudokumentowanych funkcji narzędzia lub czegoś podobnego. Prawdopodobnie będzie to kruche rozwiązanie, działające teraz, ale prawdopodobnie zepsute, gdy coś się zmieni. Zrozumienie tego, jak to działa, może być trudne, a każdy programista serwisowy będzie nienawidził trudnego do zrozumienia kodu. Może mieć skutki uboczne, które na razie nic nie ranią, ale spowodują problemy z doskonale dobrymi fragmentami kodu w przyszłości, co może być koszmarem.


9

Słowo hack jest niewłaściwie używane. Jeśli naprawdę chcesz uzyskać trochę historii, możesz to zrobić na Wikipedii. Hack to słowo opisujące proces poprawiania rzeczy, aby zrobić coś, do czego nie były przeznaczone. W kontekście elektrotechniki jest to dobre. Jest na ten temat lepszy opis na Wikipedii.

Teraz w kontekście informatyki. Hack jest ogólnie zły. Tak, działa, ale zazwyczaj oznacza to, że programista napisał dwuznaczny fragment kodu, który nie jest zgodny z projektem oprogramowania i który dezorientuje każdego programistę, który musi odczytać ten kod. Oczywiście czas programistów jest drogi, więc jako menedżer chce mieć oprogramowanie, które można najłatwiej utrzymać. To samo dotyczy programistów. Ponadto, włamania zwykle psują coś innego w oprogramowaniu.

To jest decyzja sądu, czy zaakceptować hack, czy nie. Przynajmniej chcesz, aby starszy inżynier oprogramowania zatwierdził hack, ponieważ ma on większe doświadczenie i jest w stanie podjąć bardziej wykształconą decyzję. Zdecydowanie nie chcesz, aby młodsi chłopcy podejmowali decyzje dotyczące akceptowania hacków. Mogą wymyślić jeden i przedyskutować z seniorami, czy korzyści są warte bólu związanego z utrzymaniem włamania.


6

To jest włamanie, jak można znaleźć na thereifixedit.com .

Włamać się

Właściwie wszystko na tej stronie to hack.

Hacki to pomysłowe i odważne użycie niektórych rzeczy poza ich kontekstem.
Piękno włamania polega na tym, że masz dany problem i narzędzia, które nigdy nie miały go rozwiązać, ale rozwiązujesz problem tylko za pomocą tych narzędzi (zamiast uzyskania odpowiednich). Są sprytni, szybcy i zabawni. Minusem jest to, że wyniki są często kruche i niebezpieczne dla osób postronnych.
To znaczy, jeśli lubisz rozwiązywać swoje problemy jak na zdjęciu, nie ma problemu. Problem występuje, gdy rozwiązujesz problemy innych ludzi w ten sposób. W takim przypadku prawdopodobnie zostaną porażeni prądem, spaleni lub coś w tym rodzaju.

Podczas opracowywania oprogramowania chcesz, aby Twój kod mógł być obsługiwany przez innych (w tym twoją przyszłą ciebie) bez szkody śmiertelnej. Jak ujął to Dijkstra:

Kompetentny programista jest w pełni świadomy ograniczonego rozmiaru własnej czaszki. Dlatego podchodzi do swojego zadania z pełną pokorą i unika sprytnych sztuczek, takich jak zaraza.

A hacki należą do najmądrzejszych sztuczek.

Hacki tykają bomby zegarowe gdzieś w twoim kodzie, ponieważ te typowe z natury opierają się na zbyt wielu założeniach („po prostu robienie tego” jest lepsze od właściwego oddzielenia). Gdy tylko te założenia przestaną obowiązywać, cały system może się załamać, nie mając pojęcia, co się stało.


4

Termin ten nie jest zbyt precyzyjny, ale prawdopodobnie odnosi się do szybkiego i brudnego rozwiązania problemu, który jest trudny do prawidłowego rozwiązania. Rozwiązanie, o którym mowa, prawdopodobnie działa, ale prawdopodobnie nie jest bardzo dobrą implementacją, być może zawierają subtelne błędy, może niektóre małe znane błędy i powinny zostać ponownie wykonane później, jeśli pozwoli na to czas. Myślę, że to, co słyszysz, nazywane „hackem”, jest czasem nazywane „ kludge ”.

Często zdarza mi się, że hacki zdarzają się, gdy istnieją bardzo ścisłe ograniczenia czasowe na zakończenie zadania, a zaimplementowane jest rozwiązanie hakerskie, ponieważ działa „tylko”, aby przejść kontrolę jakości, mając nadzieję, że można to naprawić później. Niestety to późniejsze naprawianie / czyszczenie nie zawsze się zdarza :(


Nie jestem pewien, co masz na myśli przez „niezbyt precyzyjny” - powiedziałbym, że większość programistów wiedziałaby dokładnie, co to znaczy, że napisanie kodu to hack. Ale reszta odpowiedzi jest na miejscu, działa, ale z jakiegoś powodu (architektura, występy itp.) Nie jest to optymalne rozwiązanie.
ozz

@james: Z mojego doświadczenia wynika, że ​​dwóch programistów może spojrzeć na jakiś kod, a jeden nazwie to hack, a drugi nie. Naprawdę nie ma sposobu na oszacowanie fragmentu kodu jako włamanie. Każdy ma własne wyobrażenie o tym, czym jest hack, i często są podobne, ale nie zawsze takie same. Napisany jako ktoś, kto miał kod o nazwie „hackish” przez innych i nie zgodził się z tym. I nazwałem kod innych ludzi „hackish” i oni się nie zgodzili. To prawda, są to prawdopodobnie przypadki graniczne, ale granice mogą być czasem rozmyte ...
FrustratedWithFormsDesigner

1
@FWFD - to tylko nie zgadzanie się co do tego, czy coś jest hackowaniem. Gdyby ktoś „powiedział”, że jakiś kod to hack, wiedziałbyś, co miał na myśli.
ozz

4

Spędzam dużo czasu jako programista front-end, więc moja definicja hacka to:

Rozwiązanie oparte na dogłębnej wiedzy na temat wad środowiska i nieudokumentowanego zachowania.

Środowiskiem może być Twoja platforma, przeglądarka internetowa, baza danych, bankomat (bankomat), sprawa sądowa. Dowolny „system reguł”, w którym znasz pętlę i wykorzystujesz ją do rozwiązania problemu.


4

Hack to zwykle jakiś kod, który najwyraźniej zapewnia pożądane wyniki, ale w sposób nieoptymalny.

Zwykle korzysta z jakiejś nieudokumentowanej lub niejasnej funkcji języka / biblioteki w sposób, który nie był zamierzony przez twórcę, a tym samym zaciemniał cel.

Czasami robi się to w celu obejścia jakiegoś błędu językowego lub biblioteki, ale w większości przypadków główną przyczyną jest zwykle ignorancja;

Dla młotka wszystko wygląda jak gwóźdź.

Rzeczy, które są wykonywane w nieefektywny sposób, zwykle zarówno w czasie, jak i przestrzeni, ale ostatecznie dają pożądaną wydajność, ale kosztem i możliwe niepoznawalne przypadki brzegowe bez możliwości testowania i konserwacji. Zwykle wynika z braku fundamentalnego zrozumienia logiki lub idiomów językowych. Zobacz także „trudną drogę”.

Zazwyczaj kod jest czymś, czego ktoś z odpowiednim doświadczeniem nawet nie rozważałby, lub musiałby długo i ciężko myśleć, aby uczynić go tak skomplikowanym i nieefektywnym jak runda dotycząca włamań, którą odkryli.

Przykłady

Poprawka do systemu Vista

Ważność weryfikacji adresu e-mail

Jednostki oprogramowania

Niedeterministyczny skrót


+1 za nieoptymalne. A ponieważ hacki nie są konieczne „tymczasowe”, ponieważ najczęściej głosowane.
rlb.usa

2

Łysa opona działa, ale nikt nie nazwałby jej idealnym rozwiązaniem na przebicie. Może to powodować gorsze problemy.

Zazwyczaj uważam hack za szybkie i brudne rozwiązanie natychmiastowego problemu. Zwykle może nie być zgodny z normalną praktyką programistyczną w sklepie programistycznym (np. Używać dużo programowania). Może to być niewielka poprawka.

Głównym powodem, dla którego jest zły, jest to, że: a) może powodować nieprzewidywalne wyniki, b) może nie pasować do pierwotnego projektu danego kodu, co spowoduje problemy z konserwacją. Z mojego doświadczenia wynika, że ​​włamania są zwykle bardzo słabo udokumentowane.


2

Krótka definicja, którą usłyszałem i którą uszanowałem:

„Rozwiązanie symptomu, które nie rozwiązuje w pełni problemu we wszystkich przypadkach”

Brzydki kod może, ale nie musi, być hackowaniem. Przykład 2 + 2 w innej odpowiedzi nie jest włamaniem, jest brzydkim rozwiązaniem kodowym i złym z punktu widzenia rozumienia kodu, ale zapewnia prawidłowe rozwiązanie we wszystkich przypadkach. Pomyśl o faktorowym równaniu w matematyce - zachowanie / relacja jest identyczne i poprawne w obu wersjach, ale forma jest inna. Hmm, czynnik równanie, refaktoryzacja równania, kod refaktora ... nie, nie ma podobieństwa jestem pewien :)

Przykładem w jednej z pozostałych odpowiedzi na temat zmiany imienia na „Jim” jest hack: rozwiązuje on symptom (pierwsze imię na liście to Jim), ale nie rozwiązuje w pełni problemu (lista nie jest posortowana lub uszeregowane według priorytetów w jakikolwiek sposób, który działa dla wszystkich wpisów).


1

Hack robi coś, co zwraca oczekiwany wynik, ale robi to w dziwny sposób (zwykle powodując spadek wydajności).

Na przykład:

Zadanie : rzutowanie zmiennej całkowitej na liczbę podwójną

Rozwiązanie : użyj operatora rzutowania. Tj .: dblVar = CType (intVar, Double)

Hack : Podziel przez podwójny. Tj .: dblVar = intvar / 1.0


+1 za gwiezdny przykład. W starym kodzie AS400 zobaczę daty europejskie pomnożone przez jakiś zwariowany ułamek dziesiętny, który wyprowadza datę amerykańską. Problemy zaczynają się, gdy niektórzy koderzy zaczynają wyciekać to do naszego kodu .Net ... bleh!
Morgan Herlocker

0

Wyobraź sobie, że twoja noga została zainfekowana i musiała zostać usunięta, abyś przeżył. Czy wolałbyś, aby lekarz szybko zhakował go siekierą lub chirurgicznie usunął po zbadaniu problemu i wybraniu odpowiednich narzędzi, procedury itp.? To samo dotyczy oprogramowania.


Zmusiłbym go do zhakowania go, zanim atakujący będzie miał szansę włamać się do mojego mózgu.
Mateen Ulhaq

Co jeśli masz tylko kilka minut?
StuperUser

0

Hack sygnalizuje narodziny, gdy odpowiedzialny programista deklaruje „Wrócę i naprawię to później”.

Mówiąc poważnie - hack w kontekście PO jest czymś, co osiąga pożądany rezultat, ale wykorzystuje do tego tymczasową lub zawodną metodę.

Inną powszechną definicją jest technika wykorzystująca zachowania przypadków skrajnych w celu obejścia ograniczeń / zabezpieczeń na platformie.

Hack w drugim kontekście ma pewną przewagę wśród „indywidualistycznych” (czytaj: niebezpiecznych) bohaterów kodujących ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.