Jakub Gutkowski
Jakub GutkowskiPrincipal Software Engineer / blog.gutek.pl

Jak podchodzę do nauki nowego języka programowania?

Spojrzenie na wybór nowej technologii, kolejne etapy nauki, pojęcie płynności w danym języku - i parę innych kwestii.
16.06.20197 min
Jak podchodzę do nauki nowego języka programowania?

W jaki sposób wybieram nową technologię? W przypadku języka przychodzi mi to dość łatwo. Wystarczy, że odpowiedź na jedno z poniższych pytań jest twierdząca.

  1. Czy w tym momencie ktoś zapłaci mi za to, bym napisał aplikację w tym języku? Czy mam projekt wymagający znajomości tego języka?
  2. Czy w najbliższym czasie będę miał projekt, który zwróci mój zainwestowany czas?
  3. Czy znajomość języka jest potrzebna/niezbędna, bym lepiej wykonywał aktualną czynność? 
  4. Czy znajomość języka spowoduje, iż będę dogłębniej rozumiał to, co piszę w innym języku? 


Pytań nie ma wiele, ale kilka rzeczy jest kluczowych. Jeśli nie widzę zapotrzebowania na język, to nie będę się go uczył. I nie chodzi o zapotrzebowanie rynku, ale moje osobiste – bardzo egoistyczne. Na przykład do tej pory nie tknąłem Pythona – nie widzę potrzeby, by się go uczyć. Wiem, że przy kilku rzeczach byłby przydatny, ale w ciągu ostatnich dziesięciu lat może ze trzy-pięć razy chciałem go użyć.

Inna ważną rzeczą jest to, że jak już poświęcam czas na naukę, to nie chcę o tym języku zapomnieć, a bez praktyki i jego wykorzystania nie ma szans, bym miał w nim jakąkolwiek płynność. 

Oczywiście - podobnie jak z językami obcymi - im więcej języków znasz, tym szybciej uczysz się nowego. Jednak także, jak już wspomniałem, im rzadziej korzystasz z danego języka, tym szybciej go zapominasz. Dla mnie złotym środkiem jest to, że wiem, iż przez następne kilka miesięcy będę z niego korzystał lub to, że wspomoże mnie on w aktualnych czynnościach. Jedynym językiem, który poznałem, by zrozumieć dokładniej działanie innego, jest F# – w którym jeszcze parę lat temu byłem wstanie coś napisać, zaś dzisiaj mam kłopot nawet z przeczytaniem kodu źródłowego.

Jaki cel obieram?

Mam dwa cele przy każdym języku, którego się uczę:

  • Płynność w posługiwaniu się nim + ekosystemem (np.: w .NET to .NET Framework)
  • Zrozumienie, na jakiej zasadzie on działa

Jedno nie przychodzi bez drugiego, więc jak już rozumiem działanie języka, dochodzi do tego płynność. A płynność nigdy się nie pojawia, jeżeli nie rozumiem, jak on działa. Wtedy to raczej orzę jak pies na polu - dziura tam, dziura tu, a kości ni widu, ni słychu.

Pierwsze kroki

Po pierwsze: zorientowanie się, co jest mi potrzebne, by postawić środowisko dev – nieważne, czy to będzie system operacyjny, czy odpowiednie aplikacje. Następnie instalacja wszystkiego i odpalenie pierwszej, najbardziej banalnej aplikacji, jaką się da. Może to być console app, co kompletnie nic nie robi i wyłącza się. Chodzi o to, by aplikacja była najprostsza z możliwych, z najmniejszą liczbą linii kodu wygenerowanego przez IDE. Celem tego projektu nie jest poznanie wszystkiego, ale skonfigurowanie środowiska, by móc potem uczyć się programować nie myśląc cały czas o tym, że może fajnie by było postawić jakiś kompilator i sprawdzić, czy to, co wiem - faktycznie wiem, czy nie wiem :) 

Mając taką aplikację patrzę na kod i zastanawiam się, czy go rozumiem :) Jeśli tak to plus dla mnie - będzie mi łatwiej nauczyć się języka. Jeśli nie rozumiem, zaczynam się martwić,o ja się wpakowałem ;)

Zanim jednak przejdę dalej, próbuję samemu napisać Hello, WorldTo jest test na to, czy coś na temat języka wiem, czy kompletnie nic. Nie uda się? Nie ma problemu. Uda się? Super, to mi wystarcza.

I kolejne kroki 

Niezależnie od tego, czy mi się udało z Hello, World robię pierwszy - jakiś prosty - tutorial. Jeżeli to aplikacja na WP8 piszę aplikację z przyciskiem, czy coś w tym stylu (to, co znajdę w sieci). To samo dla innych systemów. Chodzi o to, by zobaczyć jak wygląda język, IDE, co można zrobić i co wyklikać bez wiedzy na temat języka i IDE. Z tego nic nie zapamiętuję - robię tutaj „głupią małpę” poznając trochę IDE i obsługę środowiska.

Następnie zaczyna się zabawa :) Po pierwsze, szukam źródeł informacji – skąd mogę co ściągnąć/przeczytać. Czytam opinie na temat książek, pytam się poprzez sieci społecznościowe co polecają inni, itp.

Mając źródła zaczynam czytać, próbując poznać zarówno zasady funkcjonowania języka, jak i jego składnię. Na razie wszystko jest czysto teoretyczne. Chodzi o to, by przeczytać, zorientować się, o co chodzi, mieć podstawy. Kiedy podczas czytania coś mnie trąci, by usiąść i coś sprawdzić w języku samym w sobie to tak robię – ale nie siedzę z książką przy komputerze. Tutaj ma działać mój mózg i moja pamięć oraz rozwiązywanie problemów. Chcę wiedzieć, dlaczego tak jest i dlaczego tak się to wszystko zachowuje.

Kiedy uważam, że zaczynam mieć pojęcie na temat języka: co on może, a czego nie, zaczynam czytać kody źródłowe. Serio, po prostu patrzę na kod i próbuje go rozkminić. Co jest kiedy wywoływane, czy dobrze zrozumiałem to, co przeczytałem? I tym podobne. Kod pobieram albo z książki przykładów, albo za pomocą GitHuba. Chcę rozumieć, co czytam. Jak nie rozumiem to znaczy, że jednak wciąż jest coś nie tak z moim rozumieniem języka.

Po przejrzeniu paru projektów i zabawy z IDE, by poznać każdy krok poprawnie (breakpoints, step in, etc.) zaczynam się kodem bawić. Czy to idąc już dalej z książką przy komputerze, czy po prostu samemu, robiąc tutoriale w sieci i doczytując informacje o rzeczach, których nie rozumiem/nie umiem.

Tutaj wyrabiam sobie opinie o języku - o tym, jak mi się z nim pracuje, na co muszę zwracać uwagę. Staram się przeczytać kilka best practices i zobaczyć, czy jestem wstanie je zastosować. Celem jednak nie jest poznanie kolejnej technologii, a języka.

Jeżeli mam możliwość biorę udział w projekcie open-source lub w projekcie społecznościowym. Jeżeli takiej możliwości nie mam, staram się coś samemu wymyślić. Robię tutaj wszystkie rzeczy, których w poznawaniu nowej technologii w postaci biblioteki nie robię :) Chcę mieć po prostu jak najwięcej styczność z tym językiem, by się z nim oswoić.

Jeżeli nie mam możliwości własnego projektu czy projektu open-source - bo na przykład czas, który mogłem poświęcić na naukę minął - zabieram się za projekt komercyjny. Wiem już, że zajmie mi on dłużej i pewnie parę razy przepiszę aplikację, ale to już uwzględniłem we wstępnej wycenie czasochłonności :)

Dalej oczywiście czytam informacje na temat języka, mój RSS się powiększa o kolejne kanały, itp. itd. Jednak to jest ten moment, kiedy nauka przechodzi w praktykę.

Czas poświęcany na poznanie danej technologii

Poznanie nowego języka trwa u mnie do momentu kiedy wiem, że muszę zacząć się zajmować kodem dla projektu, lub kiedy widzę moment na to, by wprowadzić język do projektu. Cały wolny czas, który mogę poświęcić do tego momentu poświęcam na to, by poznać język i sposób jego wykorzystania.

Kiedy następuje moment, gdy nie mogę dłużej się nim bawić zaczynam z nim pracować (co też może być zabawą). Co wcale nie oznacza, że to koniec poznawania tego języka. 

Kiedy uważam, że mam wystarczającą płynność w technologii?

W przypadku języków programowania bardzo ciężko to określić. Język sam w sobie nie musi być skomplikowany, ale przeważnie wraz z nim przychodzi cały ekosystem. By móc powiedzieć, że mam płynność, muszę także wiedzieć jak z tego ekosystemu korzystać.

Na przykład teraz mogę powiedzieć, że mam płynność w trzech językach programowania: C#, JavaScript i HTML. Kiedyś do tej grupy zaliczała się Java, T-SQL i F#. Reszta wciąż jest w fazie nauki - lub zapomnienia, z powodu braku wykorzystania. 

Tak naprawdę nawet pisząc o swojej płynności w tych językach zdaję sobie sprawę z tego, że te języki wciąż potrafią mnie zaskoczyć. Zawsze się trafi na coś, co wydawałoby się, że działało inaczej, albo w poprzedniej wersji naprawdę działało inaczej, albo też doszło coś, co zmieniło trochę postać rzeczy :) Pomyślcie chociażby o Jon Skeet – to chyba jedyna osoba, która na temat języka C# wie tak wiele, jak jego twórcy (a czasami nawet trochę więcej), a jednak wciąż jest zaskakiwana jakimiś małymi sprawami. Nauka języka i jego ekosystemu trwa więc do momentu, kiedy język umiera i nie jest już rozwijany – wtedy jest szansa, że się pozna go w 100% :)

Nazwałbym płynność tym, że jak siadacie i piszecie np. aplikację w C# to wiecie, że jak macie property to tak naprawdę macie ukrytą metodę get i set. Jak macie foreach to jest to while, jak macie switch to macie goto, itp. itd. Poza tym wiecie, że jak chcecie sprawdzić, czy string rozpoczyna się od literki x to macie metodę do tego. Dodatkowo potraficie myśleć w tym języku. Ktoś mówi o projekcie, a wy potraficie zrobić sobie wstępną architekturę w pamięci (o ile projekt jest mały) i wstępnie powiedzieć, że wiecie jak to zrobić w danym języku - co wykorzystać, gdzie mogą być problemy, a gdzie lepiej sięgnąć po inne rozwiązanie. 

Stwierdzenie, że dalsza nauka danej technologii nie ma sensu - kiedy i na jakich warunkach? 

To chyba najprostsze ze wszystkiego :) Ma ono miejsce wtedy, gdy przestają mi płacić za język, nie widzę ROI, albo znalazłem inny język, który załatwia wszystkie sprawy, które potrzebowałem rozwiązać danym językiem.

Może będę tego żałował, ale jeżeli wiem, że nie potrzebuję danego języka, to się go uczyć dalej nie będę. Napiszę sobie jakieś podsumowanie, na co warto zwrócić uwagę, źródła, książki, zachowam swój testowy kod - tylko po to, żebym miał niezbędne informacje, gdybym miał do niego wracać i do tego, bym mógł sobie jak najwięcej w jak najkrótszym czasie przypomnieć.

<p>Loading...</p>