Moja nauka programowania, oraz kilka refleksji na jej temat


Czas nieubłaganie pędzi do przodu, świat zmienia się każdego dnia i zaczął się właśnie nowy 2019 rok. Chciałbym więc skorzystać z klimatu przełomu roku i noworocznych podsumowań i samemu wrócić do początków swojej nauki, a przy okazji podzielić się paroma swoimi refleksjami na temat tego, co być może mogłem zrobić lepiej.

Chciałbym też od razu zaznaczyć, że nie chcę nikogo nauczać, nie mam do tego kompetencji. Po prostu dzielę się swoimi doświadczeniami i ewentualnie kilkoma refleksjami na jego temat… być może się komuś przydadzą.

Ciemny pokój

Rozpoczęcie nauki programowania kojarzy mi się z wejściem do ciemnego pokoju, w którym nic nie widać. Byłeś w jasności tego co znasz, co robiłeś do tej pory i wchodzisz z odrobiną lęku do takiego pokoju, w którym widzisz ciemność. Jeżeli nie masz obok siebie kogoś, kto by cię choć trochę nakierowywał, to łatwo jest się w nim pogubić, a dodatkowo te ciemności, czyli brak wiedzy, stale ciążą. Mówią, że trzeba pisać projekty żeby się nauczyć… no ale jak na początku nic nie umiesz, to co tu napisać 😉 . Odkąd podjąłem decyzję o nauce programowania, to jakiś czas się z nim wąchałem, tj. skakałem po vlogach i blogach. Zabawne było troszkę,  że czytałem już o Springu, a nie znałem jeszcze zmiennych, tablic, czy pętli. Zaczęło więc mnie to w pewnym momencie uwierać, że ciągle słucham i czytam o nauce programowania, ale nie bardzo programuję.

Pierwszy kurs

Kupiłem więc pierwszy kurs video i zacząłem przerabiać odcinki z podstaw Javy. Miałem takie wyobrażenie, że jak nauczę się i zrozumiem wszystkie tematy w kursie, to napiszę pierwszą aplikację. Po ukończeniu kursu wydrukowałem przepisany kod wraz z notatkami na jakichś 45 stronach, po czym nie bardzo wiedziałem co dalej. Poznałem sporo mechanizmów języka Java na raz, ale z zerową praktyką nie byłem pewien jak kontynuować. Próbowałem coś pisać, jednak ten kurs nie nauczył mnie programować. Wpadałem więc w oglądanie, czytanie o programowaniu oraz łapanie zastoi, od czego czułem się sfrustrowany.

Otóż trochę się łudziłem, że jak ukończę taki kurs, to napiszę aplikację. Jak byłem w środku kursu i przerabiałem o interfejsach, to zapomniałem już jak działały pętle, a pod koniec nie wiedziałem o co chodziło z interfejsami i pętlami. Z wiedzą troszkę jak z winem, potrzebuje czasu.

Każdy potrzebuje, jak sądzę już na początku takiego obrazka, żeby sobie poprzez uogólnienie zarysować pewien kształt w głowie, który stałby się celem do osiągnięcia, a który osiąga się przez wchodzenie stopniowo w głąb, poprzez uszczegóławianie. Kurs natomiast, w którym są wyjaśniane na osobno w odcinkach dane elementy języka, może nie budować takiego obrazka.
Jak masz choćby możliwość z kimś bardziej doświadczonym pogadać, to może być już dużo, ale jak jesteś sam, to jest ciężko. Inna rzecz, że te kursy są teraz coraz lepsze i często opierają się o tworzenie projektu w trakcie nauki, ale ja od takiego nie zaczynałem.

Co więc na początku robić?

Moje zastoje skończyły się jak zacząłem robić zadania na codingame.com i codingbat.com.  Rozwiązywanie problemów wciągnęło mnie serio nie na żarty, główkowałem w kibelku i w trakcie zmywania, a w wolnej chwili leciałem do kompa sprawdzić, czy to co wykombinowałem zadziała. Może wyszło przy okazji, że nie jestem geniuszem, ale wniosek był jednoznaczny, bardzo mi się spodobało, a to jest myślę podstawa. Jeżeli więc jesteś całkowicie początkujący i chcesz się uczyć, ale nie wiesz co konkretnie robić, to polecam tę ścieżkę rozwoju. W zasadzie jeżeli przerabiasz jakiś kurs i tam w pierwszych rozdziałach jest o zmiennych, w tym stringach, pętlach, tablicach i instrukcjach warunkowych, to po zapoznaniu się tylko z tym, najlepiej od razu przejść do wykonywania zadań. Teoria w tym przypadku to nie tak dużo, a praktyka, to wiele godzin spędzonych na główkowaniu, w trakcie rozwiązywania problemów.

Kod Java składa się głównie, czy w znacznej mierze, z metod, które coś robią, a rozwiązywanie zadań to właśnie pisanie metod, składających się na rozwiązania problemów.

Cytat:
“Working with students in office hours, I see what a big advantage it is for students who are practiced and quick with these little bits of code… If you want to build skill in running, what do you do? You run. To build skill in code, write code. Ok, that’s pretty obvious…”
Nick Parlante, a computer science lecturer at Stanford.

W telegraficznym skrócie, co dalej?

W jakimkolwiek fachu byś nie robił, to trzeba poznać podstawowe narzędzia. Taki main set początkującego, to głównie IDE, chyba najlepiej dziś pisać w Intellij Idea, Maven i Git. Pisząc, dobrze jest przy okazji mieć na uwadze skróty klawiszowe. Ja używam żółtych karteczek z paroma skrótami pod monitorem, które po czasie zmieniam na inne.

Java jest językiem obiektowym, w następnym kroku trzeba więc tę obiektowość poznać, gdyż bez niej nie da się nic zrobić. Tutaj najlepiej jest już pomyśleć nad jakimś projektem i dodatkowo douczać się teorii. Programowanie w dużym skrócie, to dane wejściowe, które są przetwarzane na dane wyjściowe, oraz ich przechowywanie w określonych strukturach. Takie podstawowe struktury danych, służące do ich przechowywania, to tablice, kolekcje, pliki i bazy danych. Trzeba więc coś pisać, co pobiera dane od użytkownika, wykonuje jakieś operacje i zwraca 😉 . Przykładowo mogą to być quizy pobierające dane od użytkownika i porównywane z wynikiem jakiegoś wyliczenia, a następnie zwracające komunikaty na konsolę. Może to być jakiś katalog produktów pobierający dane z konsoli i zapisujący do bazy.

Bardzo dobrze moim zdaniem jest, jeżeli ktoś rozpisze ci taki pierwszy projekt, czy projekty w formie zadań, czy celów do osiągnięcia, tj. co konkretnie ma się dziać. To jest dobre z tego względu, że samemu przez kłopot z oceną swoich możliwości, wynikający z oczywistego braku doświadczenia, istnieje ryzyko zakopania się w jakiś nieco zbyt ambitny projekt. Można sobie po prostu narobić galimatiasu i potem w upartości, miesiąc albo więcej rwać włosy z głowy, nie posuwając się już w pewnym momencie do przodu.

No a później, to już będziesz musiał zadecydować co robić dalej. Można coś napisać w JavaFX, czyli jakiś programik typu desktop. Można też pójść w kierunku systemu Android, chociaż na tym polu Java ma konkurenta, jest to oficjalnie wspierany przez Google język Kotlin. Opcją więc jak myślę optymalną, również pod kątem możliwości podjęcia pracy, to nauka Spring Framework i programowanie webowe.

Jeśli potrzebujesz tu rozwinięcia, to możesz zerknąć na wpis oraz video, na blogu Mateusza Kupilasa pt. Jak bym dzisiaj zaczynał z Javą od zera?.

Kilka refleksji na temat tego, co mogłem od początku zrobić lepiej

  1. Nie zwlekać z systemem kontroli wersji Git i od początku wypychać kod na Github.
    No nie robiłem tego i to był spory błąd. Myślałem sobie chyba, że się wpierw muszę programować nauczyć. Otóż gdybym wysyłał od początku pierwsze wykonane zadanka, które finalnie wrzuciłem na tego bloga, to po paru miesiącach miał bym już fajnie wyglądające konto. Moje wysiłki byłyby dokumentowane, a tym samym dałbym w ten sposób okazję komuś, aby być może je docenił. Korzystanie z Gihub ma jeszcze taką zaletę, że w moim odczuciu działa pozytywnie na motywację do pracy. Uwierz, te zielone kwadraciki oznaczające dni z wrzutką kodu na serwer, działają tak, że chcesz ich mieć jak najwięcej 😉 . No i w końcu szybciej poznał bym Git, co samo w sobie było by korzyścią.
  2. Najlepiej od początku zaznajomić się z testami jednostkowymi.
    Testy jednostkowe polegają na testowaniu każdej z osobna metody wchodzącej w obręb projektu. No a zadanka, to właśnie metody, których działanie najlepiej od samego początku testować. Metoda dla przyjętych określonych danych, ma coś określonego na wyjściu zwrócić? Pomyśl więc wpierw nad metodą testującą, która zakłada, że to będzie zawsze zwrócone. Test driven development od samego początku 😉 . Teoria tutaj, w takim podstawowym ujęciu, to też nie za wiele, a korzyści z praktykowania od początku bardzo cenne. Ukierunkowujące nawyki na pisanie zgodne z obowiązującym warsztatem. Ja niestety nie pisałem testów, bo po prostu mi to nie przyszło do głowy. No a później, nawet jak świadomość nieco wzrosła, to przez spory czas myślałem o testach, że to jest takie odwrócenie, że najpierw muszę coś przecież mieć, żeby to testować, a tymczasem zdaje się, że wcale tak nie jest. Pisanie w pierwszej kolejności metod testujących, zakładających poprawny wynik działania metod właściwych, ma wiele wspólnego z planowaniem i tworzeniem pewnych założeń, tak jak się normalnie planuje różne rzeczy, więc ta kolejność wcale nie koniecznie jest odwrócona.
  3. Szybciej się wdrożyć w programowanie funkcyjne, które weszło do języka Java od wersji 8.
    W pierwszych miesiącach, kiedy ‘klepałem’ zadania, to mogłem po pewnym czasie jak już dobrze przećwiczyłem sobie pętlę ‘for’, zamienić ją na wyrażenia lambda i w ten sposób próbować rozwiązywać te same problemy. Wystarczyło wykonane wcześniej zadanka z użyciem tablic przekształcić tak, aby zwracały listy i już mogłem ćwiczyć programowanie funkcyjne. Łączyło by się to przy okazji z poznaniem interfejsu funkcyjnego, czy klasy anonimowej. Mogłem po prostu już na stosunkowo wczesnym etapie praktykować ważny element warsztatu. Może to nie jest jakaś kluczowa kwestia, wpływająca szeroko na cały rozwój ale można było i tu zrobić coś lepiej.
  4. Spróbować poszukać partnera lub partnerów i pisać coś wspólnie.
    Po czasie myślę, że dobrze by było gdybym się odezwał w pewnym momencie powiedzmy na Facebook, poszukał kogoś na zbliżonym poziomie i spróbował coś zrobić razem. Praca z Git wskoczyła by na wyższy poziom, dodatkowo okazja do realnego wykorzystania narzędzi dedykowanych dla pracy w zespole, takich jak Trello, czy Slack. Możliwość wytłumaczenia komuś czegoś lub nauczenia się samemu
    czegoś od kogoś. To już Sokrates przecież mówił, że trzeba się uczyć od ludzi a nie od kwiatków i drzew 😉 . Wiem też, że samemu można nieźle utknąć, a w grupie raźniej i może w razie czego łatwiej by było zdobyć pomoc u jakiegoś doświadczonego programisty. Robiąc samemu często doskwierał mi choćby brak zwykłej rozmowy na temat programowania. Co prawda stawiałem w pewnym momencie na biurku gumową kaczuszkę żeby z nią gadać, ale synek za każdym razem mi ją zabierał, więc w końcu i z niej zrezygnowałem.
  5. Bootcamp z Java?
    Jakiś czas temu słuchałem konferencji o osobach przekwalifikowujących się i nauce Java od zera. Prowadzący powiedział na niej w kontekście takiej samotnej nauki coś takiego: ta nauka jednym może zając rok, innym półtora, jeszcze innym dwa, a niektórzy nigdy nie osiągają odpowiedniego poziomu. Słuchając całkiem niedawno innej konferencji na podobny temat, prowadzący (Michał Lewandowski) wymieniając co jest niezbędne żeby się wyszkolić, przy opcji ‘samouk’, wymienił dobrego mentora, i że bez tego to po prostu nie wypali, nie przejdzie. Powiedział, że najlepiej jak by to był ktoś z rodziny, komu na was zależy. No cóż, biorę wdech… w sumie mam taką sytuację, że nie wiem jeszcze czy mi to wypaliło, czy nie, ale nikogo takiego o kim on wspomniał nie mam i nie miałem. W każdym razie to był moment gdzie sobie pomyślałem, że trzeba było iść na ten bootcamp. Byliby ludzie, mentor i usystematyzowana wiedza. Natomiast kilka miesięcy poślizgu jakie może lekko pochłonąć takie samotne siedzenie, jeszcze przy dzieciach, sprawia że ta opcja pomimo swojej ceny, po prostu zaczyna się opłacać. 
  6. Prowadzenie bloga?
    No jak już patrzę krytycznym okiem, to spójrzmy i na tę kwestię. Odpowiedź z pewnością nie jest w tym przypadku jednoznaczna. Prowadzenie bloga w takim szerszym kontekście ma sporo plusów. Przykładowo jeżeli chcesz o czymś napisać, o czym ci się wydaje że wiesz o co chodzi, to potem okazuje się, że trzeba jeszcze sporo doczytać, sprawdzić itd. Blog więc może pomóc lepiej ugruntować, usystematyzować wiedzę, oraz tworzyć stopniowo w miarę uporządkowaną bazę z notatkami, do której zawsze można zerknąć, a przecież naturalne jest, że człowiek zapomina. Niestety minus jest taki, że idzie na to niemało czasu, który zamiast pisania kodu poświęcasz na pisanie prozy. Tak więc, jeżeli chcesz jak najszybciej osiągnąć jakiś sensowny poziom, żeby się powiedzmy gdzieś załapać, to blog może cię spowalniać. Ja zacząłem pisać bloga i tego już nie odpuściłem, tak samo jak siedzenia samemu, są być może tego minusy, ale może i jakieś plusy. No a może nawet jak mawiał klasyk, minusy dodatnie i plusy ujemne 🙂 . 

Słowem podsumowania

Mam nadzieję, że swoimi krytycznymi uwagami w stosunku do samego siebie, nie zrażę potencjalnego pracodawcy. Zamiast tego wolałbym żeby to co napisałem się komuś przydało.

Nauka programowania od zera, to niełatwe zadanie. Łatwo można pomyśleć, że będę robił to czy tamto, ale realizacja pomysłu, to już inna rzecz. Dodatkowo jeżeli uczysz się całkiem sam, tym bardziej czyha na ciebie wiele pułapek. W Internecie jest ogrom treści i łatwo można przykładowo czytać o wszystkim w nieuporządkowany sposób. Szukasz czegoś na Stack Overflow ale zainteresowało cię również coś innego, po czym jeszcze coś innego i nagle się okazuje, że wyczerpałeś czas który miałeś, a pierwotnego problemu nie rozwiązałeś. Dlatego serio, jeżeli nawet nie masz nikogo obok siebie, kto już po prostu jest programistą, to dobrze jest poszukać gdzieś ludzi, którym również przydało by się towarzystwo na tej, co tu dużo mówić, niełatwej drodze.

To chyba na tyle i życzę wszystkim dev-wannabe dużo wytrwałości, efektywnej nauki oraz realizacji celów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *