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ć?
terminology
zakurzony programista
źródło
źródło
+
aby podzielić je na podstawie heurystyki.Odpowiedzi:
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.źródło
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.
źródło
Rozważ to
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
/1
wydawało się wówczas prostsze, lub błędu w bibliotece, który poprawił/1
działanie.Nie. Hacki są „celowym” kodem. Istnieją
trzycztery 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.
O to chodzi. Hack opiera się na ignorancji, błędach lub założeniach.
To może być przykład ignorancji lub fałszywego założenia.
źródło
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.
źródło
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.
źródło
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:
źródło
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.
źródło
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.
źródło
To jest włamanie, jak można znaleźć na thereifixedit.com .
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:
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.
źródło
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 :(
źródło
Spędzam dużo czasu jako programista front-end, więc moja definicja hacka to:
Ś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.
źródło
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;
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
źródło
Ł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.
źródło
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).
źródło
Hack robi coś, co zwraca oczekiwany wynik, ale robi to w dziwny sposób (zwykle powodując spadek wydajności).
Na przykład:
źródło
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.
źródło
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 ...
źródło