Zacznę ten wpis od zacytowania Yogi Berra:
W teorii nie ma różnicy pomiędzy teorią a praktyką. W praktyce – jest.
Czy to praca, czy to hobby – bez względu na to, jak wiele książek o danej tematyce przeczytasz, filmów obejrzysz, wykładów wysłuchasz, bez praktyki nie zdobędziesz umiejętności i skuteczności w dziedzinie leżącej w kręgu Twoich zainteresowań. Nie inaczej jest z programowaniem. Chcesz być świetnym programistą, rozwijać się – musisz ćwiczyć. Aby utrzymać poziom na którym aktualnie jesteś – trzeba ćwiczyć.
Porównać to można do budowania sylwetki, rozwoju sprawności i dbania o zdrowie poprzez ćwiczenia fizyczne. Jeżeli przestaniesz ćwiczyć, to nie tylko przestaniesz poprawiać wymienione wcześniej cechy, w krótkim czasie zauważysz pogorszenie się zdrowia czy sprawności. Wysiłek, który wcześniej nie sprawiał żadnych trudności okaże się zauważalnie męczący. Jedyną odpowiedzą jest regularny trening.
Praktyka programisty czyli niewygodna prawda
Bez względu na to, co podpowiada nam intuicja, nasza praca nie zalicza się do treningu. Codzienne dojazdy do pracy samochodem nie zrobią ze mnie profesjonalnego kierowcy, poruszanie się w ciągu dnia nie poprawi mojego zdrowia. Podobnie programowanie w pracy, może być niewystarczające aby osiągnąć poziom.
Zapytajmy siebie w duchu, jak często wykonując swoje obowiązki mamy do czynienia z czymś zupełnie nowym, problemem leżącym poza domeną systemu, nieznanym framework’iem, metodologią pracy, praktyką pisania kodu czy wzorcem projektowym? Rozsądek mówi mi, że takich okazji nie ma zbyt wiele – nie ma w tym nic złego – dzięki pracy w środowisku, które znamy, czujemy się pewnie i działamy z wysoką skutecznością. Wydajność wysoka, rozwój niewielki.
Krawędź możliwości
Co należy robić, aby poprawić umiejętności, podnieść kompetencje i zwiększyć możliwości? Jak to się dzieje, że jeden entuzjasta może spędzić setki tysięcy godzin programując, ćwicząc grę na instrumencie, taniec czy grę w szachy – nie przekraczając w tym czasie poziomu amatorskiego, a inna osoba zaczynająca z tego samego miejsca może w wielokrotnie krótszym czasie rozwinąć zdolności dalece wykraczające poza amatorskie?
Odpowiedzą jest krawędź możliwości, wyczerpujące studium. Tak często jak się da, należy zbliżyć się do granicy swoich umiejętności, przygotować się na trud, porażkę i podjąć próbę przesunięcia granicy. Takie działanie – stałe mierzenie się z problemami leżącymi na skraju naszych kompetencji, których rozwiązanie niemal na pewno zakończy się niepowodzeniem jest drogą pozwalającą rozwijać się błyskawicznie. Jeżeli nie popełniasz błędów i nie ponosisz porażek, to prawdopodobnie nie rosną Twoje umiejętności i kompetencje. Aby osiągać nowe, lepsze wyniki musimy stale rozwiązywać nowe, trudniejsze problemy. Szukać wyzwań i wychodzić poza strefę komfortu.
Daleko od domu
Jak znaleźć się poza miejscem w którym czujemy się pewnie? Każdy człowiek instynktownie to wie. Miejsce poza jego strefą komfortu leży dokładnie tam, gdzie odczuwa niepokój, nie chce przebywać i oczekuje porażki. To naprawdę proste – każda czynność na którą odpowiadasz „nie mam czasu”, „nie chce mi się” lub „to zajmie cały dzień” – prawdopodobnie leży poza bezpiecznym schronieniem na opuszczenie którego nie masz ochoty. Wymówki są naturalną obroną przed znalezieniem się poza strefą komfortu.
Posiadając tą wiedzę, będziemy w stanie wykryć, jakie wyzwania są naszą drogą do szybkich postępów. Można również obserwować, gdzie znajdują się granice komfortu osób trzecich. W trakcie codziennych rozmów z ludźmi w Twoim otoczeniu zapewne usłyszysz kilka wymówek. Prawdopodobnie wskazują one na granicę, jakich rozmówcy nie chcą przekroczyć, a przekroczenie których mogłoby poprawić ich … (wstaw jedno z wymienionych: zdrowie/sprawność/kompetencje/umiejętności/zarobki) – wiedzę tę wykorzystaj w prawy sposób.
Trening programisty
Programista w celu podniesienia swoich praktycznych umiejętności może:
Czytać cudzy kod. Kod osoby, której nigdy nie widział na oczy, nigdy z nią nie pracował. Źródło powinno być załadowane do IDE, pozwalać na modyfikowanie oraz kompilowanie. Wtedy będzie w stanie odnaleźć logikę i przyswoić odrobinę techniki pisania kodu. Dobrze, żeby był to kod lepszego programisty ale nie jest to konieczne. Od każdego można nauczyć się wartościowych technik, praktyk.
Odmianą powyższego treningu jest czytanie dobrze napisanego kodu na przemian ze źle napisanym. Dodając do tego zabawę tymi źródłami, prawdopodobnie będzie w stanie odnaleźć przyczyny dlaczego kod jest zły – zaczną przeszkadzać cechy kodu, programista instynktownie rozpocznie proces refaktoryzacji. Dobrym kodem się zachwyci, dostrzegając prostotę i łatwość z jaką dokonuje zmian.
Zastanowi się z jakich narzędzi korzysta codziennie. Nauczy się skrótów klawiatury i przećwiczy je. Spróbuje znaleźć sposoby na to, by używać narzędzi z większą efektywnością.
Napisać samouczek do wybranego zagadnienia, techniki, narzędzia – kładąc nacisk na praktykę. W trakcie realizacji, będzie wiele okazji, aby przypomnieć sobie szczegóły i przyswoić nową wiedzę.
Poszukać partnera do programowania w parze. Jest to dobry sposób do realizacji w pracy. Pozwala na wzajemne zarażanie się stylem tworzenia oprogramowania. Ważne jest, aby partnera zmieniać co jakiś czas, ze względu na upodabnianie się sposobu postrzegania problemów u obu programistów – zjawisko w istocie niezwykle intrygujące.
Wykonywać code kata, lub podejmować wyzwania programistyczne na jednym z portali do tego przeznaczonych. Polecić mogę codility, codewars, codefights lub codingame. Ważną zaletą części z tych portali jest możliwość zobaczenia jak inni programiści rozwiązali dany problem. Portal codefights jest według mnie najlepszy z wymienionych pod tym względem, ponieważ rozwiązania są oceniane przez społeczność i można jednym kliknięciem przenieść je do edytora w celu eksperymentów.
Czytać cudzy kod… To już było? Tym bardziej powinien to robić. Studiować, modyfikować źródła projektów Open-Source.
Zacząć własny projekt. Słowo „zacząć” jest tutaj w przewadze nad słowem „projekt”. Powód powstania programu nie powinien być bardziej istotny od rozpoczęcia tworzenia tego oprogramowania. Złożoność powinna być niska. Niech to będzie coś tak prostego jak systemowy notatnik. Celem jest trening, nie dorobienie się życia na emeryturze w wieku 20 lat.
Dołączyć aktywnie do społeczności rozwijającej projekt Open-Source. Naprawić malutki błąd. Nauczyć się pisać kod w stylu, który jest łatwy w utrzymaniu dla innych programistów. Odrobić lekcję pokory, nauczyć się być najgorszym programistą w zespole.
Poznać (w praktyce!) nowy język programowania. Pozwoli to zwalczyć nieświadomą niekompetencję, zmienić perspektywę i rozwiązywać stare problemy w zupełnie nowy sposób. Poszerzyć horyzonty, umożliwić wymianę poglądów w nowych obszarach i zrównoważyć samoocenę.
Code Kata
Wrócimy jeszcze raz do rozwiązywania zadań programistycznych na portalach. Specjaliści ze świata IT dzielą się na zwolenników oraz przeciwników wykonywania tego typu ćwiczeń. Obie strony mają mocne argumenty. Ja zachęcam do wykonywania tych zadań. Ćwiczenia wykonywane w ten sposób nie podniosą zdolności w tworzeniu architektury oprogramowania, rozcinaniu zależności klas i nie pomogą w lepszym debugowaniu. Nie po to zostały wymyślone. Jeżeli tutaj mamy braki, to zła droga i należy szukać innej.
Code Kata znajdują zastosowania w rozwijaniu i poprawianiu innych profesjonalnych stref programisty. Jeżeli celem jest poprawienie skuteczności posługiwania się narzędziami pracy, takimi jak IDE, to wykonywanie ćwiczeń w swoim edytorze pozwoli na trenowanie skrótów klawiatury oraz znajdowanie efektywnych metod posługiwania się nimi.
Problem stanowi styl, ekspresja kodu lub użycie pamięci? Za sprawą dostępu do rozwiązań problemu innych programistów w przestrzeni tego samego języka i kompilatora, będzie okazja do sprawdzenia w jaki sposób można rozwiązać problem pisząc mniej kodu, przy użyciu mniejszej ilości zasobów.
Chcesz doświadczyć TDD, praktyki pisania kodu sterowanego testami, sprawdzić czy to dla Ciebie? Otwierasz zadanie, masz gotowe testy i możliwość tworzenia kolejnych. Wszystko przygotowane, podane pod klawiaturę. Teraz wystarczy eksperymentować. Być może uda się dostrzec potencjał jaki drzemie w dodaniu kolejnego testu przed napisaniem kolejnej linii kodu. Zastanowienie się nad dodaniem nowego testu, prawdopodobnie zwróci uwagę na rozważenie nowego przypadku, zestawu danych czy warunków brzegowych, które trzeba uwzględnić w rozwiązaniu, a których nie dostrzegaliśmy wcześniej.
Po otworzeniu nowego zadania w portalu z ćwiczeniami jest przygotowana deklaracja funkcji oraz kilka przykładowych testów jednostkowych. Z tego powodu, doskonale nadają się do nauki nowego języka programowania. Rozpocząć pisanie można poprzez analogię. Ważnym atutem jest przygotowane kompleksowe środowisko – jest edytor, kompilator i skonfigurowane testy – od razu można rozpocząć pisane kodu, bez potrzeby „walki z maszynami”.
Rozwiązywanie takich zadań rozwija skuteczność w rozwiązywaniu problemów, posługiwaniu się algorytmami i używaniu zestawów funkcji standardowych.
Słowem zakończenia
Przyswajanie teoretycznej wiedzy jest ważne, pozwala rozszerzać horyzonty, poznawać ideologię wraz z przyczynami powstania i zobaczyć jak w teorii należy rozwiązywać opisywane problemy. Czytanie książek i blogów, słuchanie podcastów czy wyjazdy na konferencje i meet-up’y jest rozwijające, nie można tego pomijać. Praktyka to druga strona tej samej monety, a zupełnie inna bestia.
Za sprawą praktyki jesteśmy w stanie doświadczyć nabytej wiedzy, zyskać instynkt i skuteczność w używaniu zdobytych informacji. Sposobów na ćwiczenie w praktyce w świecie programowania jest wiele. Zmieniając co jakiś czas sposób w jaki ćwiczymy będziemy w stanie niwelować nudę i utrzymywać wysoko motywację. Motywację wzmocni dodatkowo oglądanie efektów naszych treningów, czy to poprzez działający projekt, czy ulubione narzędzie Open-Source pozbawione niewielkiego za to irytującego nas strasznie błędu, może to być również dostrzegalny wzrost umiejętności.
W 1963 roku Richard Held i Alan Hein przygotowali eksperyment. Dwa koty które były wychowywane w kompletnej ciemności na krótki okres w ciągu dnia były umieszczane na karuzeli, gdzie włączane było światło. Jeden kot mógł się poruszać, drugi umieszczany był w koszu z otworem na głowę. Oba mogły obserwować otoczenie ale tylko jeden był w stanie wchodzić z otoczeniem w interakcje i doświadczać tego co widzi.
W fazie testów eksperymentu okazało się, że tylko aktywny kot potrafił omijać przeszkody, mrugać w przypadku dostrzeżenia szybko zbliżającego się obiektu. Wnioski: Aktywny ruch wraz ze sprzężeniem zwrotnym w postaci doświadczeń wizualnych jest niezbędny do prawidłowego rozwoju wzorców poruszania się w oświetlonym środowisku. Programista aby dostrzegać problemy, jakie mogą wystąpić w trakcie realizacji projektu musi aktywnie, regularnie wykorzystywać nabywaną wiedzę poprzez praktykę. Ćwiczenie w ten sposób pozwoli właściwie reagować na pojawiające się trudności i podejmować szybko dobre decyzje.
Regularne mierzenie się z zagadnieniami będącymi na granicy kompetencji, częste ponoszenie porażek i opuszczanie strefy komfortu jest pewną ścieżką do stania się lepszym programistą.