[PL] Functional MIND | Kartka papieru |

in #polish7 years ago (edited)


Oryginalne zdjęcie wykonane przez Rene Böhmer na Unsplash


Była druga w nocy. Już gotowy do spania przeglądałem Steemit. Niestety niespodziewany telefon zmienił moje plany: "potrzebujemy cię na miejscu zbrodni, teraz". To był mój szef. Wiedziałem już, że nie będzie to najlepsza noc mojego życia, ale okazało się, że było jeszcze gorzej.



Fotografia wykonana przez Sergey Zolkin na Unsplash


Kartka papieru

Mój samochód jest zawsze gotowy na nocne przejażdżki. Wsiadłem więc w samochód, odpaliłem ulubioną muzykę i wyruszyłem w rejs. Noc była piękna, a niebo pełne gwiazd. Jednak cel podróży był okropny.

Po około dwóch godzinach przybyłem na miejsce zdarzenia. Przybyłem do miejsca, które było środkiem niczego. Tylko droga, ale nie było samochodów. Tylko policjanci, ale nie było ludzi. Ofiara znajdowała się pod jedną z ulicznych latarni. Podeszłem bliżej - ofiarą była kobieta w wieku ok. 22 lat. Została zabita strzałem w głowę.

"Kim trzeba być, żeby coś takiego zrobić..." - westchnąłem.

"Szalonym programistą" - odpowiedział jeden z policjantów.

"Czemu akurat programista?" - zapytałem.

"Spójrz na latarnie" - odpowiedział.

Byłem pewien, że żartuje. Popatrzyłem jednak na latarnie, która stała się miejscem zbrodni i... była tak kartka z następującą treścią:

const nextTarget = (thisVictim) => 
    thisVictim
    .filter(x => x !== '02/01/1996')
    .map(x => x === 'Aleksandra' ? 'Adam' : x);

"Co do..." - powiedziałem w myślach.

Nie miałem pojęcia czym to było i co to znaczy. To znaczy wiedziałem, że jest to kod, ale nigdy nie programowałem. Znam nieco angielski więc domyśliłem się, że napisał to zabójca, ponieważ było tam coś o "victim", czyli ofierze.

"Potrzebuje osoby, która potrafi programować" - zapytałem, ale nikt mi nie odpowiedział.

Cóż, ten kod był jedynym charakterystycznym obiektem z tej zbrodni, więc serio potrzebowałem kogoś, kto go zrozumie. Miałem dwa wyjścia - nauczyć się programować lub znaleźć kogoś, kto potrafi. Nauka programowania od podstaw prawdopodobnie nie była najlepszą opcją, więc zdecydowałem się skontakować się z Maxem.



Fotografia wykonana przez Matt Palmer na Unsplash


Mój stary przyjaciel

Znaliśmy się od dziecka. Max był zwykłym człowiekiem, który po prostu lubił programować. Wszystko zmieniło się dwa lata temu. Zbudował mały domek pośrodku niczego. Nie miał tam nawet internetu. Wydawać by się mogło, że nie jest to opis miejsca idealnego dla programisty. Jednak najdziwniejszy był powód, dla którego się odciął od świata, wysłał mi wtedy taką wiadomość:

"Mam już dosyć tej gonitwy frameworków JavaScriptowych. Codziennie nowy framework. Jestem już tym zmęczony. Wymasteruje jeden i to i tak nie ma znaczenia, bo już nikt go nie używa. Muszę odciąć się od świata i stać się mistrzem czystego JavaScriptu."

"Nawet nie wiem, czym jest framework, uspokój się" - odpowiedziałem.

"Po co miałbyś chcieć to wiedzieć..."

"Chcę zrozumieć co mówisz."

"Więc tak, framework jest czymś w rodzaju schematu w budowie oprogramowania. Z tym, że to framework jest twoim mistrzem a nie ty mistrzem frameworku. To on narzuca przepływ sterowania." [1]

Od tej wiadomości spotkaliśmy się może trzy razy. Trzy razy w ciągu dwóch lat. Nasza przyjaźń nie jest już tak silna jak kiedyś. Nie mogłem mu nawet dać znać, że przyjeżdżam, bo nie miał telefonu. Nie miałem jednak wyboru, wsiadłem do samochodu i pojechałem.

Był już widoczny wschód słońca. Zapukałem w drzwi jego domku. Max otworzył zdziwiony:

"Witam, co robisz tu tak wcześnie?" - zapytał.

"Jest problem do rozwiązania - problem związany z programowaniem."

"No tak, nigdy nie jest za wcześnie na programowanie, wejdź."

W jego domu nie było zbyt dużo. Laptop, dwa monitory, lodówka, kuchenka, łóżko i dużo książek. Nie potrzebował więcej - cały dzień czytał książki związane z informatyką i programował. Przedstawiłem mu sytuacje i pokazałem kod.

"Hmmm, morderca użył tu paradygmatu programowania funkcyjnego." - powiedział Max.

"Co?" - zapytałem nie wiedząc, czym jest paradygmat programowania.

"W programowaniu, paradygmat jest sposobem patrzenia na problem, który musimy rozwiązać. Jest wiele paradygmatów w moim świecie, np. programowania obiektowe, programowanie imperatywne lub programowanie funkcyjne, które zostało tu użyte." [2]

"Ok, ale co ten kod robi?" - chciałem się w końcu tego dowiedzieć.

"To tak, morderca powiedział wam kto będzie jego kolejną ofiarą. Popatrz: nextTarget jest funkcją, która przyjmuje jeden argument - dane ofiary w postaci tablicy (thisVictim) i zwraca dane innej osoby, prawdopodobnie kolenego celu. Na początku, .filter(x => x !== '02/01/1996') tworzy nową tablicę z takimi elementami z thisVictim, które przeszły test x !== '02/01/1996', co jest jak myślę datą urodzin dzisiejszej ofiary. Oznacza to prawdopodobnie to, że następna ofiara urodziła się kiedy indziej niż ta. Kolejno .map(x => x === 'Aleksandra' ? 'Adam' : x) znów tworzy nową tablicę z elementami takimi jak wcześniej już bez daty narodzin i zmienia jeden z elementów z 'Aleksandra' na 'Adam'. Jego następnym celem jest jakiś Adam. To nie był skomplikowany JavaScript, ale kod wymaga od ciebie znajomości danych osoby zamordowanej. Prawdopodobnie więc nazwisko kolejnej ofiary jest takie same jak nazwisko obecnej." - wytłumaczył Max. [3] [4]

Brzmiało to zbyt łatwo. Morderca mówiący policji kto jest kolejną ofiarą? Jednak minutę później zadzwonił telefon, był to mój szef:

"Mamy kolejnego trupa. I kolejny kod..."

Odniesienia:

  1. Wikipedia
  2. cs.lmu.edu/~ray/notes/paradigms/
  3. developer.mozilla.org o .filter
  4. developer.mozilla.org o .map

Podobało ci się opowiadanie? Zostaw follow!


Sort:  

O kurde, ale sztos, rozumiem, że sam napisałeś tą historie?

Dzięki, oczywiście, że sam napisałem ;D

Muszę też wrócić do pisania mojej powieści.

Trochę mi tu coś nie pasuje. To x musi być jednocześnie datą urodzin i imieniem ofiary? Czy w filtrach do porównania nie powinno się użyć jakichś pól klasy obiektu w zmiennej x? Np. x.birhtDate i x.firstName? Nigdy jakoś na bardzo poważnie nie bawiłem się JavaScriptem i nie jestem pewien czy dobrze rozumiem 'arrow function' ale czy ten kod działa?

Kod działa, ale Zbrodniarz wymyślił, że należy dane ofiary podawać w formie tablicy, np:
['Aleksandra', 'Białek', '02/01/1996']
jeśli wymagałby te dane w postaci objektu, kod byłby bardziej skomplikowany, ponieważ Object w JS natywnie nie posiada takich funkcji wyższego rzędu jak map czy filter. Ale kto wie co przyniosą kolejne zbrodnie...

Taka ciekawostka dodatkowo: JavaScript nie posiada klas ;) Wiem, że w standardzie ES6 jest coś takiego jak class, ale jest to tylko nakładka, przez co np. metody i pola 'klasy' w JS nie mają modyfikatorów dostępu.

Tak trochę w temacie to zadam pytanie - JS znam jako tako, bo nigdy nie było mi z nim po drodze, ale ostatnio piszę sobie w nim taki 'toy project'. I mam wrażenie, że za bardzo próbuję przenosić praktyki z innych języków, zamiast robić to zgodnie z konwencją JS. Czy poleciłbyś jakąś książkę / cokolwiek która by mi pomogła przestawić się na właściwe dla tego języka tory?

Hmm, myślę, że te dwa artykuły Ci pomogą:

Niedawno odkryłem też bardzo ciekawy kanał na YT, również polecam, szczególnie te playlisty:

  • Tekst z wyjazdem w góry, żeby zmasterować czysty Javascript zrobił mi dzień :)

    Nowe frameworki w JS są tak często tworzone, że powstała nawet strona odliczająca dni od powstania nowego frameworku: https://dayssincelastjavascriptframework.com/

    ps. z tym, że od dawna wskazuje 0, bo powstaje kilka dziennie :D

    Hej przez chwile zastanawialam sie czy to historia z zycia wzięta - Twojego zycia... brr

    Z życia wzięta, ale to ja byłem tym zabójcą ;)

    a , to spoko :)

    Congratulations @jakipatryk! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

    Award for the number of comments

    Click on any badge to view your own Board of Honor on SteemitBoard.
    For more information about SteemitBoard, click here

    If you no longer want to receive notifications, reply to this comment with the word STOP

    By upvoting this notification, you can help all Steemit users. Learn how here!

    Coin Marketplace

    STEEM 0.18
    TRX 0.16
    JST 0.032
    BTC 59643.43
    ETH 2606.19
    USDT 1.00
    SBD 2.45