2010-12-08

Zaklinacz kodu

Czasem, gdzieś w komentarzach w kodzie pojawiają się takie określenia jak "White Magic", "Black Magic", "Deep Magic" i inne określenia różnych szkół magii. Nie każdy (zwłaszcza początkujący) koder zna znaczenie tych określeń, będących właściwie skrótami dłuższych, opisowych komentarzy.

Co ciekawe i zaskakujące: bardzo trudno znaleźć w Sieci dokładne wyjaśnienie wspomnianych terminów. Jest dokument, który opisuje wspomniane zagadnienia, jednak przebicie się przez cały, obszerny spis żargonu nie należy do przyjemnych zadań. W związku z tym postanowiłem podsumować kilka wybranych terminów i opisać je szerzej.


Deep Magic: fragment kodu, do którego napisania wykorzystana została niepublikowana, "tajemna" wiedza z danej dziedziny. Przykładowo może to być: algorytm kompresji, program sztucznej inteligencji, niektóre algorytmy szyfrujące. Do określenia Deep Magic przyjmuje się, że kod sam w sobie może być prosty, czynnikiem decydującym jest teoria stojąca za kodem.

Black Magic: tu pojawiają się dwa określenia. Po pierwsze: kod, który w sposób niezrozumiały przez twórcę (i czytającego, zazwyczaj) działa poprawnie. Po drugie: celowo i świadomie użyte bardzo złe praktyki (singletony, wywoływanie funkcji po obliczeniu adresu), które przy ewentualnym debugowaniu wymagają masę uwagi. W skrócie można powiedzieć, że jest to określenie niedebugowalnego kodu, który działa.

Heavy Wizardy: kod, którego złożoność - czy to przez nietypowe użycie funkcji API, czy też przez zastosowanie dziwnych/zaawansowanych sztuczek językowych - czyni go wyjątkowo trudnym w zrozumieniu. W odróżnieniu od Black Magic, kod taki jest deterministyczny i pisany z pełną świadomością popełnianych czynów. Zrozumienie takiego kodu wymaga głębokiej znajomości języka, platformy i API (w przeciwieństwie do Deep Magic, które wymaga znajomości teorii stojącej za kodem).

Cargo Cult Programming: styl programowania oparty na "zbieraniu kodu". Generalnie osoba praktykująca programowanie zgodne z doktrynami ww. kultu nie ma w zwyczaju usuwania kodu - raczej go zakomentowuje, doda nowe funkcje pod inną nazwą itd. Na wyższym poziomie wiara ukazywana jest przez przesadne stosowanie wzorców projektowych. Po naszemu często łączone z "stosowaniem armaty na komara".

White Magic: rzadko stosowane określenie, widziane gdzieś w jakimś SDK. Oznacza powszechnie akceptowaną i uznaną sztuczkę programistyczną, bazującą na zaawansowanych zagadnieniach językowych. Dobrym przykładem jest operowanie na łańcuchach w stylu C - zarówno w kwestii zakończenia łańcucha znakiem '\0', jak i stosowania pętli typu while(cStr[++i]).

Automagiczne: połączenie słów 'automatyczne' i 'magiczne'. Automatyzacja pewnych czynności tak, aby user nie musiał interesować się tym, co dzieje się w tle. Dobrym przykładem jest generowanie poleceń dla kompilatora i linkera na podstawie plików konfiguracyjnych projektów.

Voodoo Programming: 'technika' programowania polegająca na pisaniu kodu w sposób kompletnie chaotyczny, losowy, bez jakiegokolwiek odniesienia do celów i zadań projektowych. Przenosi się to również na debugowanie, które - zamiast metodycznego szukania błędu fragment po fragmencie - wykonywane jest chaotycznie wg. zasady "a może błąd jest tu". Sprawa oczywista: należy tego unikać ;-)

Arch Wizard: z tym określeniem spotkałem się raz, na kanale IRCowym poświęconym C++. Określenie takie podsumowuje osobę, która dany język programowania zna perfekcyjnie, jest w stanie bez problemu zrozumieć bardzo zawiły kod, od razu rozszyfrowuje różne sztuczki językowe. Przykładem takiej osoby może być (jak podejrzewam) Bjarne Stroustrup, twórca C++.

Magic: generalnie określenie opisujące wszystko to, co jest niewyjaśnione, niewyjaśnialne lub zbyt skomplikowane, aby warto było tracić czas na wyjaśnianie. Przykładowo: programując w C# łączenie się ze sobą assemblies czy współpraca kodu C# i VB.NET to dla typowego programisty magia - działa, acz jest niezrozumiałe. Magik (Magican) to określenie stosowane do osób, które zajmują się wspomnianą magią - często wyłącznie w odniesieniu do zagadnienia, projektu itd.

Magic number: w programowaniu określenie dowolnej stałej liczbowej (innej niż 0, 1, czasem 2 lub inna potęga 2) występującej w kodzie. Wszystkie stałe liczbowe powinny być określone albo za pomocą dyrektyw #define, albo za pomocą typowanych, nazwanych stałych ('zmienne const').

Rain dance: po naszemu "taniec deszczu". Zestaw akcji podejmowanych zawsze gdy występuje problem, niezależnie od jego źródła i objawów. Typowym przykładem są procedury infolinii technicznych nakazujące sprawdzić kilka konkretnych rzeczy niezależnie od objawów.

Szczerze mówiąc, niektórzy programiści chyba pokochali te określenia i stosują je tak często, jak to tylko możliwe. Niedowiarkom polecam Symbian SDK do przejrzenia - typowy programista może poczuć się jak czarodziej, a po skończeniu dnia pracy zostać łowcą czarownic ;-)

1 komentarz:

  1. Ja znam takie magie:

    // Magic. Do not touch.

    // Deep magic. Do not touch even if you are sure you know how it works.

    OdpowiedzUsuń