Czy same tutoriale starczą, by nauczyć się czegokolwiek dobrze?

Gdy uczycie się czegoś lub chcecie poznać mechanizm działanie jakiejś rzeczy – patrzcie na prawdziwe przykłady, nie tylko tutoriale – to genialne źródło wartościowej wiedzy której nie zdobędziecie nigdzie indziej. Kiedyś sam patrzyłem tylko na tutoriale, przez co nadłożyłem sobie roboty – więcej dalej we wpisie…

Jak wiecie lub nie, w wolnych chwilach staram się napisać aplikację pozwalającą na pisanie programów na Arduino i interpretacje ich na żywo – bez kompilacji i wgrywania. Działa to na zasadzie poleceń w postaci pojedynczych bajtów przesyłanych przez port szeregowy – każdy bajt odpowiada jednej prostej instrukcji, przykładowo konstrukcja 0x2 0xD 0x1 oznacza „zmień stan logiczny (0x2) pinu 13 (0xD) na HIGH (0x1)”. Powstał jeden problem – nie wiedziałem, jak zaimplementować poszczególne komendy w aplikacji tak, by były one zdatne do dalszego użycia.

Wtedy przypomniałem sobie bibliotekę Launchpad napisaną przez rngtng – opisując krótko, służy ona do sterowania Launchpadem – kontrolerem MIDI firmy Novation. Biblioteka ta także musi mieć te komendy w jakiś sposób zaimplementowane – skoro tam to działa, to czemu by nie spojrzeć? Launchpad korzysta z komend MIDI do komunikacji – a te są ustandaryzowane. Najpierw następuje bajt komendy, np NOTE_ON (0x90), potem bajt nuty a za nim bajt prędkości. W Launchpadzie nuty odpowiadają przyciskom, a prędkość kolorom diod pod nimi. Prowadzę projekt oparty o tą bibliotekę – nie ma jeszcze oficjalnej nazwy, jest rozbity na dwa moduły (jak na razie) – LMenu i LChar. Z założenia mają one usprawnić proces tworzenia aplikacji korzystających z Launchpada jako UI – raczej oczywiste jest, że nie jest to projekt na poważnie, raczej nikt nie będzie tworzyć korzystających z Launchpada aplikacji, jest on przystosowany do innych celów – ale mimo wszystko ten projekt wiele mnie uczy. Nauczył i tym razem…

Nie odpływając od tematu, zagłębiłem się w bibliotekę (zagłębiłem to dużo powiedziane, ale nevermind), dochodząc w ten sposób do klasy LMidiCodes – kontenera zawierającego stałe z kodami poleceń – byłem już prawie w domu, teraz wystarczyło tylko zobaczyć w jaki sposób są wysyłane – czy odpowiada za to oddzielna klasa, czy jakaś prosta funkcja. Okazało się, że prosta funkcja – ale nie to jest teraz najważniejsze. Przeglądając LMidiCodes zauważyłem taki kawałek kodu:

Wyjaśniając: za każdym razem gdy chciałem zmienić klatkę wyświetlaną na Launchpadzie musiałem najpierw wyczyścić ekran (czyli de facto ustawić wszystkie przyciski po kolei na kolor OFF), a potem wyświetlić to co chciałem – jak można się domyślić, traciłem przez to połowę możliwych fpsów, obraz migotał też niemiłosiernie – w końcu co druga klatka była pusta, tych prawdziwych zostało mi tylko około 14. Co zrobiłem? Dodałem dwuwymiarową tablicę, która przechowywała wartości kolorów każdego z przycisków – jeżeli kolor przycisku był identyczny z tym, który chciałem wysłać do Launchpada po prostu nie był wysyłany.

Wysiłek ten był bezsensowny – okazało się, że sam Launchpad ma taki mechanizm wdrożony harware’owo… Żeby go włączyć, wystarczy do niego wysłać jedną flagę – i wszystkie problemy znikają…

Więc, przechodząc do dzisiejszego tematu – czy tutoriale są dobre do nauki? Owszem – ale w umiarze. Są dobre do wprowadzenia w temat, ale tylko teoretycznie – życie to jednak praktyka. Uczmy się więc w praktyce – pisząc własne aplikacje i zaglądając do kodu innych. Tutorial objaśni nam tylko, co potrafi dana technologia i pokaże jak to osiągnąć; nie pokaże jednak, co można osiągnąć. Nie pokaże, jak do tego doprowadzić – on tylko zaprezentuje nam narzędzia i sposób ich wykorzystania.

Tutoriale do języków programowania – czy nie widzicie tu pewnej zależności? Praktycznie każdy tutorial do każdego języka objaśnia tylko jego mechanizmy i sposób dostania się do nich, ale nie wyjaśnia, jak z nich korzystać w harmonii z innymi mechanizmami, by uzyskać dużą, trybiącą machinę. Wątpię, że po przejściu tutoriala do HTML czy CSS potrafiliście zbudować responsywną stronę WWW – mimo że mieliście do tego narzędzia i w tutorialu zostały wam one pokazane!

Dlatego właśnie ważne jest wzorować się na istniejących już projektach – im większy tym lepiej. Wtedy mamy pewność, że to co jest tam zrobione działa i to dobrze. Tutorial nie nauczył mnie, jak dobrze umieszczać stałe w programie. Nauczył mnie, jak je tworzyć – ale nie jak zastosować je w tym konkretnym przypadku.

 

To już koniec tego tekstu, ale mam jeszcze jedno ogłoszenie parafialne – uruchomiłem konto PayPal, na które możecie przesyłać dotacje. Aktualnie, w momencie publikacji tego tekstu zbieram na kamerę, by moje materiały miały jeszcze wyższą jakość. Jeżeli to co tworzę ci się podoba – rozważ dotację, wesprzesz w ten sposób dalszy rozwój bloga!