Ostatnio odpowiedziałem na pytania zadane daawno temu na temat tego jak podchodzę do nauki nowej biblioteki/frameworku. Dziś odpowiem na te same pytania ale pod względem tego jak ja podchodzę do nauki nowego języka programowania.

W następnym tygodniu postaram się podsumować wszystkie wasze komentarze (zachęcam do odpowiadania:)) plus to co ja napisałem. Zobaczymy jak mi to wyjdzie, na pewno przydałoby się więcej odpowiedzi niż 5 które teraz są :)

Odpowiedzi

W jaki sposób wybieracie nową technologię…

W przypadku języka dość łatwo mi to przychodzi, wystarczy, że na jedno z pytań odpowiedź jest twierdząca:

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

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

Inna ważną rzeczą jest, ż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 istnieje coś takiego jak, w językach obcych – im więcej języków znasz tym szybciej uczysz się nowego, ale 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 (patrz Ruby i Albacore czy też PowerShell i psake czy LESS). 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 nawet kłopot z przeczytaniem kodu źródłowego.

Co jest waszym celem …

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 jak on działa, przychodzi 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.

Jakie są wasze pierwsze kroki …

Po pierwsze zorientowanie się co jest mi potrzebne by postawić środowisko dev – czy to będzie system operacyjny, czy odpowiednie aplikacje, nie ważne – następnie zainstalować wszystko i odpalenie pierwszej najbardziej banalnej aplikacji jaką się da – może to być console app co kompletnie nic nie robi, 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 to wiem czy nie wiem :)

Mając taką aplikację patrzę na kod i zastanawiam się czy go rozumiem :) jak go rozumiem, to plus dla mnie (będzie mi łatwiej się języka nauczyć), jak nie rozumiem zaczynam się martwić w co ja się wpakowałem ;)

Zanim jednak przejdę dalej próbuje samemu napisać Hello, World – to 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.

Jakie są wasze kolejne kroki…

Nie zależnie od tego czy mi się udało z Hello, World robię pierwszy tutorial – jakiś prosty, jeżeli to jest aplikacja na WP8 to 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ć co wyklikać bez wiedzy na temat języka i IDE. Z tego nic nie zapamiętuje, 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ą 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 – ja chcę wiedzieć dlaczego tak jest, składnia ok, ale dlaczego tak się to wszystko zachowuje.

Kiedy uważam, że zaczynam mieć pojęcie na temat języka, co on może, 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? Itp. Kod pobieram albo z książki przykładów, albo za pomocą GitHub. Chcę także rozumieć co ja 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 (breakpoints, step in etc by poznać każdy krok poprawnie), 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 (na przykład CoreData) a języka.

Jeżeli mam możliwość to biorę udział w projekcie open-source lub w projekcie społecznościowym, jeżeli takiej możliwości nie mam, to 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 na własny projekt czy projekt open-source bo na przykład czas który mogłem poświęcić na naukę minął, to zabieram się za projekt komercyjny – wiedząc, że zajmie mi on dłużej i pewnie parę razy przepiszę aplikację, ale to już uwzględniłem w 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ę.

Jak długo poświęcacie na to by poznać daną technologię?

Z językami do momentu kiedy wiem, że muszę zacząć się zajmować kodem dla projektu, lub kiedy widzę moment na to by wprowadzić język do projektu. Czyli 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.

Jak następuje moment kiedy nie mogę dłużej się nim bawić zaczynam z nim pracę (co też może być zabawą).

Co wcale nie oznacza, że to koniec poznawania tego języka, ale w rozumieniu tego pytania plus odpowiedź do poprzedniego pytania, to pytanie raczej można traktować jako wyczerpująco rozwinięte :)

Kiedy uważacie, że macie już wystarczającą płynność w technologii? …

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

Na przykład mogę powiedzieć teraz, że płynność mam w 3 językach programowania, C#, JavaScript i HTML (kiedyś do tej grupy zaliczała się Java, T-SQL i F#), reszta wciąż jest w trakcie uczenie się lub zapomnienia z powodu braku wykorzystania.

Tak naprawdę pisząc nawet to, że mam płynność w tych językach zdaje sobie sprawę z tego, że te języki wciąż mnie potrafią zaskoczyć– zawsze się natrafi na coś co wydawałoby się, że działało inaczej, albo w poprzedniej wersji naprawdę działało inaczej, czy też coś doszło co zmieniło trochę postać rzeczy :) Popaczcie chociażby na Jon Skeet – to jest chyba jedyna osoba, która tak wiele wie na temat języka C# jak jego Twórcy (a czasami nawet trochę więcej), a jednak wciąż jest zaskakiwany jakimiś małymi sprawami.

Nauka języka i jego ekosystemu trwa więc do mementu kiedy język umiera i nie jest już rozwijany – wtedy jest szansa, że się pozna go w 100% :) tak to, nazwijmy płynność tym, że siadacie i jak piszecie 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. oraz wiecie, że jak chcecie sprawdzić czy string rozpoczyna się od literki x to macie metodę do tego itp. Dodatkowo potraficie myśleć w tym języku, ktoś mówi o projekcie a wy potraficie sobie zrobić wstępna architekturę w pamięci (jak 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. Dla mnie chyba właśnie to jest płynnością, zgadzacie się?

Kiedy i na jakich warunkach stwierdzacie, że nie ma sensu się dalej uczyć tej technologii bo ona się nie nadaje do niczego?

To chyba najprostsze ze wszystkiego jest :) Kiedy mi przestają płacić za język, ja 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 nie potrzebuje tego języka i wiem, że go już nie potrzebuje 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, że jakbym miał do niego wracać to żebym miał niezbędne informacje do tego bym mógł sobie jak najwięcej w jak najkrótszym czasie przypomnieć.

Podsumowanie

To co opisałem jest tym co zaobserwowałem u siebie, starałem się to ująć w jak najlepsze słowa, choć nie wiem czy mi się to udało.

A jak wy podchodzicie do nauki nowego języka programowania?