Ostatnie kilka tygodni poznaję programowanie funkcyjne z kursem z mimuw.edu.pl. Przerobiłem kilka lekcji. Udowodniło mi to, że nauka nowych rzeczy, zwłaszcza opisanych w dość mocno naukowy, abstrakcyjny sposób, wymaga innego podejścia niż zwykłe zgłębianie dobrze znanego tematu. Na ten sam problem jako programiści trafiamy wielokrotnie – poznając nowe biblioteki, języki czy algorytmy. W tym artykule przedstawiam kilka metod, które pomogą ogarnąć Ci trudne tematy, ale najpierw dygresja.
Kiedyś uczyłem się grać z nut na gitarze z książki. Początkowo umiałem zagrać z wielkim trudem tylko kilka pierwszych nut z pierwszej strony. Wracałem do książki wielokrotnie i za każdym razem, udawało mi się zagrać trochę więcej i lepiej. Kolega który świetnie grał na gitarze, mógł przerobić kurs z książki w jeden dzień. Nie wynikało to z szeroko pojętego „talentu”, po prostu, ta osoba zaczynała podobnie jak inni, ale była bardzo zawzięta i ćwiczyła dłużej. Z czasem pewne rzeczy stają się nawykami i zamiast zastanawiać się nad tym, jak chwycić akord, wykonujemy ruch podświadomie.
Przekłada to się także na programowanie, które jest treningiem myślenia. Jeśli będziemy trenowali je we właściwy sposób, przełoży się to na lepszy kod, szybsze rozwiązywanie problemów oraz zrozumienie dziedziny w której się poruszamy. Jak zauważyłem, większość ludzi pracuje jednak z myślą aby jak najszybciej skończyć taski, bez zrozumienia. Sam też pracowałem w taki sposób, co prawie nie dawało poczucia rozwoju.
Moim zdaniem, jeśli uczymy się w prawidłowy sposób, to przekłada się to na łatwiejsze zrozumienie kodu czy dokumentacji, na które z pewnością natkniemy się podczas szukania rozwiązań naszych problemów w pracy. Musisz wiedzieć jak mniej więcej działa kod i nie wolno kopiować Ci rozwiązań innych osób na ślepo. Dobry programista umie korzystać z oficjalnych źródeł, takich, jak dokumentacja czy kod biblioteki.
Jak skutecznie trenować programowanie?
Na stronach tego i moich poprzednich blogów zwykle umieszczam linki do darmowych kursów programowania. Materiałów w sieci jest mnóstwo, główny problem polega na ich właściwym wykorzystaniu.
Właściwa postawa
Chyba najłatwiej opisać ją cytatem Charlesa Darwina – „ignorancja częściej jest przyczyną pewności siebie, niż wiedza”. Zaakceptuj że jest mnóstwo rzeczy których będziesz musiał się nauczyć. Odrzuć często powtarzaną iluzję, że „to się nie przyda„. Słyszałem taką wymówkę od wielu ludzi. Jesteś na to gotowy – świetnie! Zaczynamy.
Pełne zrozumienie podstaw tematu
Zaczynasz uczyć się jakiejś technologii i nagle pojawia się w niej kilkanaście nieznanych Ci wcześniej nowych rzeczy. Chcesz przeć do przodu, ale nie rozumiesz połowy czytanego tekstu. Hold your horses – trzeba wrócić do podstaw.
Przykłady – Typescript jest nadzbiorem JS, co implikuje, że w pierwszej kolejności powinieneś doskonale poznać właśnie Javascript. Jeśli uczysz się SCSS musisz znać CSS, a gdy chcesz poznać Lomboka, dowiedz się, jakie mechanizmy on upraszcza. Warto znać także wzorce projektowe – przykładowo RXJS łączy w sobie wzorzec Iterator i Obserwator i to jest podstawowa wiedza potrzebna do zrozumienia tej biblioteki. Jeśli tworzysz api to musisz wiedzieć, czym może zajmować się każda z warstw.
Dokumentacje często naszpikowane są terminami technicznymi. Jeśli nie masz nawyku uczenia się tych „trudnych rzeczy”, nie będziesz nigdy pewny tego, dlaczego piszesz dany kod i jakie problemy on rozwiązuje. Następnie jest Ci jeszcze trudniej poznać zaawansowane techniki, bo z reguły opierają się one na tych prostych, których dobrze nie znasz.
Idealnym przykładem jest tutaj CSS. Można łatwo poznać jego podstawy, ale jeśli nie poznasz zasad dotyczących specyficzności, praca będzie bardzo frustrująca.
Niektóre działy informatyki – np. machine learning czy programowanie funkcyjne bardzo mocno opierają się na znajomości matematyki i tego etapu nauki nie możesz pominąć, jeśli zależy Ci na dobrym zrozumieniu. Moim zdaniem, matma w programowaniu jest tak samo ważna, jak znajomość nut w graniu na dowolnym instrumencie. To wiedza leżąca u podstaw większości zagadnień.
Proponuje takie ćwiczenie – otwórz dokumentację technologii którą chcesz poznać i wczytaj się w nią bardzo dokładnie. Jeśli coś nie będzie jasne, doczytuj w sieci i wracaj potem znowu do dokumentacji. Rzeczy których nie znałeś i uznasz za warte zapamiętania, warto wrzucać do Anki. W ten sam sposób możesz analizować kod – zatrzymuj się przy fragmentach których nie jesteś pewien i sprawdzaj.
Masz mniej czasu i napotkałeś na jakieś nowe informacje, które warto sobie przyswoić? Nic straconego, wrzuć je na swoją listę rzeczy do nauczenia się i wróć do tego później.
Gdy zajmowałem się tłumaczeniami znalazłem przydatną zasadę. Jeśli nie sprawdziłeś jakiegoś rzadziej używanego słowa w słowniku i wydaje Ci się, że wiesz co ono znaczy, prawdopodobnie przetłumaczysz je źle.
Staraj się, by było jak najmniej rzeczy, z którymi się stykasz o których wydaje Ci się że coś wiesz, ale w rzeczywistości nawet nie umiesz ich opisać słowami. Mózg często ma tendencję do pomijania trudnych rzeczy. Nauka tych „trudnych podstaw” zwraca się bardzo mocno – zwykle są one wykorzystywane w podobny sposób w różnych językach programowania.
To samo dotyczy technicznych słów w języku angielskich, których nie znasz. Jeśli w pracy padają nazwy skomplikowanych technologii używanych przez innych członków zespołu, także powinieneś o nie dopytywać.
Częste powracanie
Jak pisałem we wstępie, odbijałem się od tutoriala programowania funkcyjnego z wazniak.mimuw.edu.pl, ale za każdym razem wracałem do niego po krótkiej przerwie. Po takim powrocie widać, że niektóre części materiału są nadal niezrozumiałe i trzeba się bardziej nad nimi pochylić, a niektóre zaczynam rozumieć.
Bardzo wartościowe jest powtarzanie podstawowych materiałów dotyczących używanych technologii. Mistrzowie szachowi często powracają do podręczników dla niższych kategorii, a muzycy ćwiczą gamy i pasaże. Tak samo programista powinien regularnie pracować nad jak najlepszym poznaniu podstaw.
Powracanie do dobrych materiałów, przepisywanie kodu po raz kolejny i kolejny, wyciąganie i uczenie się rzeczy których do końca nie rozumiemy – to sposób na sukces. Trzeba też dawać sobie czas na ułożenie pewnych informacji w głowie.
Wydaje mi się, że rzetelnie i wielokrotnie przerobiony ten sam materiał daje o wiele lepsze efekty, niż skakanie po łebkach lub oglądanie setek godzin materiału szkoleniowego, do którego nigdy nie wrócimy.
Wiele tutorialów jest aktualizowana i można z nich dowiedzieć się o nowych rzeczach dodanych do języka lub biblioteki.
Całościowe przerabianie materiału
Moim zdaniem warto przerabiać materiały szkoleniowe, książki, nagrania od a do z, chyba, że znajdziesz w nich rzeczy które są mocno nie aktualne. Przykładowo – jeśli przerabiasz tutorial z NGRX (https://ngrx.io/guide/store/walkthrough), przejdź go do końca, nie poprzestawaj na najłatwiejszych rzeczach. Dzięki temu zyskasz większą perspektywę i gdy natrafisz w kodzie na jakieś problemy, być może coś Ci zaświta w głowie że kiedyś o tym czytałeś.
Jeśli poprzestaniesz jedynie na skopiowaniu z tutoriala rozwiązania które wydaje Ci się, że działa, skazujesz siebie na powielanie tych samych błędów w nieskończoność.
Nie jestem fanem tutoriali w formie wideo dlatego, że zwykle one jedynie prześlizgują się po głównych tematach. Zwykle podobną wiedzę znajdziemy w tutorialu wprowadzającym do technologii napisanym przez autorów. Wideotutorial może być jednak dobry wtedy, gdy chcesz poznać nowe przykłady lub chcesz zmienić kontekst nauki z czynnej na bardziej bierną.
Ćwiczenia
Kod znajdujący się w dokumentacji / tutorialu należy przepisać i wykonać. Jednocześnie, możesz poszukać sobie ćwiczeń online (na przykład na Codewars), lub zaproponować swoje ćwiczenia i wrzucić je do Anki. Często robię to w ten sposób – zapisuję sobie fragment kodu na przykład w JSFiddle i daję w komentarzu opis, jaki rezultat jest oczekiwany. Następnie podlinkowuje ćwiczenie w Anki.
Ćwiczenia nie muszą być w formie problemów do rozwiązania. Przydatne może być stworzenie fiszki w której zapytasz przyszłego siebie, dlaczego jakieś rozwiązanie jest lepsze albo poprosisz o wyjaśnienie działania kodu.
Pozdrawiam – Kamil Naja
Brak komentarzy:
Prześlij komentarz