admin 0Comment

Około roku temu, gdzieś na początku mojej samodzielnej edukacji, zastanawiałem się, kiedy osiągnę jeden z zakładanych celów, czyli zajmowanie się programowaniem zawodowo.  Jak możecie dowiedzieć się z tekstu opisującego mój projekt, plan skupienia się na programistycznej edukacji rozłożyłem na osiem miesięcy a jego realizację rozpocząłem mniej więcej na początku tego roku. Z tego prosty wniosek, że moje „wejście” na rynek programistycznej pracy powinno odbyć się około sierpnia-września bieżącego roku.  Jednak wszystkie sprawy potoczyły się szybciej niż planowałem i oto już teraz, w maju mogę napisać z wielką radością:

Zostałem zaproszony do współpracy na stanowisko Junior Python Developera!

Oczywiście wszystkie szczegóły tej współpracy pozostaną między mną a  firmą, która zdecydowała się na ten krok, jednak chciałbym wstępnie podsumować tutaj kwestie związane z sama nauką i tym, jaką drogę przebyłem w ciągu circa ostatnich kilkunastu miesięcy.

Zacznijmy od hard data. Okres mojej edukacji możemy podzielić na dwa etapy. W pierwszym, uczyłem się programowania w bardzo ograniczonym zakresie czasowym, wynoszącym (uśredniając) niewiele więcej niż godzinę dziennie. Związane to było z mocno angażującą pracą, jaką wykonywałem w tamtym okresie. Na czym skupiałem się w tamtym czasie? Przede wszystkim realizowałem internetowy kurs, który już zawsze będę polecał, jako pierwszy kontakt z językiem Python i programowaniem w ogóle, czyli Automate the Boring Stuff with Python. Dla mnie, jeśli chodzi o sposób przekazywania oraz utrwalania wiedzy, był on zdecydowanym strzałem w dziesiątkę, ale o tym piszę szerzej w tekście o samym kursie, nie ma sensu się tutaj powtarzać. Tematycznie kurs obejmuje podstawy podstaw, takie jak typy danych, działania na zmiennych, flow control, funkcje a także praktyczne korzystanie z niektórych bibliotek, umożliwiających m.in. obsługę wyrażeń regularnych, debugowanie kodu, web scraping, pracę z plikami docx/pdf/csv/json/jpg czy GUI automation.

Oprócz realizowania zadań samego kursu tworzyłem też swoje własne, niewielkie programy, bazujące na zdobywanych przeze mnie umiejętnościach. Z racji tego, że nie jest to kurs nakierowany stricte na zostanie programistą, nie dotyka on takich kwestii jak np. programowanie zorientowane obiektowo czy pisanie testów jednostkowych. Doskonale wprowadza natomiast w to, co można określić, jako „programistyczne podejście do problemu” oraz w podstawy języka Python. Czasowo, ta część zajęła mi nieco ponad 200h.

Drugi etap, to ten, o którym piszę na blogu, czyli projekt zakładający skupienie się na programowaniu, i poświęcenie temu zagadnieniu większości swojego czasu (na poziomie około ośmiu godzin dziennie, przez pięć dni w tygodniu). Więcej we wspomnianym już temacie. Tutaj, oprócz ciągłego pogłębiania wiedzy dotyczącej samego Pythona, zająłem się też przyswojeniem podstaw innego języka programowania, czyli Javy. Z perspektywy czasu uznaję to za świetny pomysł – pozwoliło mi to spojrzeć na programistyczny „szerszy obrazek” i porównać ogólne zasady (dobrego) programowania, a szczególnie paradygmatu programowania zorientowanego obiektowo, z zasadami tego, przecież bardzo specyficznego języka, jakim jest Python. Dopiero z tej perspektywy zrozumiałem jak oryginalne jest podejście Pythona m.in. do takich kwestii jak prywatność i hermetyzacja, czy zrozumiałem konsekwencje zastosowania statycznego/dynamicznego typowania w danym języku. Dodatkowo, pisząc nawet proste programy w Javie, nie mogłem nie zauważyć na ile szybciej udałoby mi się osiągnąć ten sam efekt w Pythonie.

Kolejnym ważnym elementem było „przestawienie” się na pisanie zorientowane obiektowo, a wraz ze wzrostem stopnia skomplikowania kolejnych ćwiczeniowych projektów, docenienie wagi etapu projektowania aplikacji. Oczywiste stało się też to, że pisanie prostych skryptów pomagających rozwiązywać drobne problemy ma się nijak do praktyki programowania zawodowego, tak więc zdecydowałem się na poznanie jednego z najpopularniejszych pythonowskich frameworków, jakim jest Django – który (nie od początku, ale jednak…) polubiłem i doceniłem, a także, jak się okazuje, który będę wykorzystywał w mojej pierwszej pracy, jako developer.

Jednak sam język to za mało. Programowanie nieodłącznie związane jest też z innymi zagadnieniami, które starałem się zgłębiać, takimi jak praca z GITem, obsługa baz danych, pisanie testów, wiedza na temat wzorców projektowych etc. Dodatkowo, nawet dochodząc do wniosku, że jestem zadeklarowanym back-endowcem, szybko zrozumiałem, że nie jestem w stanie uciec od front-endu, czyli języków takich jak HTML i CSS, a także JavaScript. Mimo, że na początku pochodziłem do tego zagadnienia z dużą dozą nieufności, i trochę na zasadzie „jeśli trzeba to trudno, trzeba”, to na przestrzeni ostatnich tygodniu zdążyłem polubić pracę z front-endem, a przede wszystkim docenić znaczenie obu tych płaszczyzn w programistycznym rozwoju.

Skupienie się na programowaniu pozwoliło mi nadać mojej nauce odpowiednie tempo, a w ciągu ostatnich kilku miesięcy byłem w stanie poświęcić na programistyczą edukację aż około 600h mojego czasu.

Podsumowując więc liczby – ostatni rok minął mi pod znakiem około ośmiuset godzin poświęconych stricte na naukę (i praktykę!) programowania, a do tego można dodać całkiem spory czas poświęcony na generalny research tego fascynującego tematu. Jaki znowu research mam w tym momencie na myśli? Jako samouk, musiałem często poświęcić dużo czasu na samo zorientowanie się CO powinienem jeszcze opanować, a potem – W JAKI SPOSÓB, czyli z jakich źródeł skorzystać by nie tracić niepotrzebnie czasu. Szczerze, zabierało to zaskakująco dużo czasu.

 

Co dalej, czy to koniec?

 

Wprost przeciwnie, to dopiero początek :). I to na aż trzech polach.

Po pierwsze – moja dalsza, samodzielna nauka. Jestem świadomy, że jako programista, edukować (chociażby po to, by nadążyć za dynamicznie zmieniającą się rzeczywistością tego tematu) musimy się w zasadzie stale, i dla mnie jest to jeden z plusów tego zajęcia. Lubię wyzwania a także lubię poznawać nowe zagadnienia i stawać się w nich coraz to lepszy, a mam wrażenie, że programowanie zapewni mi je w ogromnej ilości. Dodatkowo, mimo, że już zaproponowano mi współpracę, to podjęcie przeze mnie pracy nastąpi dopiero za jakiś czas, który mam zamiar wykorzystać na zapoznanie się z kilkoma nowymi, a także poszerzenie kilku zagadnień, z którymi miałem już do czynienia.  Te zagadnienia to oczywiście dalsze poznawanie możliwości frameworka Django ale też algorytmy czy poszerzenie wiedzy front-endowej i zapoznanie się z JavaScript. Dodatkowo chciałbym zapoznać się z systemem operacyjnym Linux – jeśli kilka osób po kolei mówi ci, że na pewnym programistycznym etapie Windows jako twój OS to ślepa ścieżka – wiedz, że coś jest na rzeczy 😉

 

Po drugie – praca jako Junior Developer. Oczywiście samo zdobycie pierwszej pracy to jedynie wstęp. I tak szczerze – lekki stres jest :). Mam tutaj na myśli konfrontację sytuacji, w której edukujesz się w swoim tempie, zajmujesz się swoimi, ćwiczeniowymi programiami vs. rzeczywistość pracy przy złożonym i produkcyjnym kodzie oraz spędzanie nad nim czasu, za który ktoś płaci.

 

Last but not least – ten blog. Od początku moja aktywność tutaj miała być formą mobilizacji oraz usystematyzowania pewnej wiedzy, jaką zdobywam.  Blog to także okazja by oszczędzić czas innych osób, które podjęły podobną decyzję i chcą posiąść programistyczną wiedzę samodzielnie, poprzez udokumentowanie tutaj mojego doświadczenia w tym temacie. Na pewno chciałbym (w co najmniej kilku wpisach) odnieść się do stworzonego przeze mnie systemu nauki i tego, co było w nim ok a co niespecjalnie, co z dzisiejszej perspektywy bym zmienił, etc. etc. Mimo, że sama propozycja współpracy może być traktowana jako dowód na sukces mojej nauki, to jestem też świadomy, że zostanie to zrewidowane w pełni dopiero po jakimś czasie pracy w zawodzie – i to także jest świetnym materiałem na dalszy rozwój bloga. Na ten moment wiem na pewno, że dostałem potężny strzał motywacji do dalszego rozwoju, a także rozwoju mojego miejsca w internecie.

 

Kilka wniosków na tę chwilę

Sądzę, że ocenienie planu mojej programistycznej edukacji będzie w pełni możliwe dopiero po jakimś czasie pracy jako junior developer a także, że jest to temat na niejeden wpis. Dzisiaj jednak chciałbym napisać „na szybko” o kilku wnioskach, jakie przychodzą mi do głowy, a w przyszłości rozwinąć je w osobnym wpisie (lub wpisach) na blogu. Oto one:

 

Sama „nauka programowania” to pojęcie zbyt szerokie.

Na początku na pewno pomoże ci próba odpowiedzi na dwa pytania: „Czym dokładnie chciałbym zajmować się jako programista?”. Tutaj możliwe odpowiedzi to m.in. tworzenie gier, aplikacji webowych czy też aplikacji mobilnych. Drugie (w przypadku tworzenia stron czy też aplikacji webowych) to określenie czy bardziej interesuje cię front-end czy też back-end.

 

Zdecydowanie warto postawić na naukę bazującą na praktycznych projektach.

Z wielu powodów. Między innymi dlatego, że (przynajmniej tak było w moim przypadku) dobrze określony cel (stworzenie aplikacji o danej funkcjonalności) pomaga zmobilizować się bardziej niż realizowanie tutoriala za tutorialem czy też ciągłe rozwiązywanie teoretycznych, oderwanych od rzeczywistości, zagadek programistycznych (które jednak, w odpowiedniej dawce, są bardzo fajnym sposobem nabycia „programistycznego sposobu myślenia”!). Druga kwestia to możliwość pokazania w przyszłości potencjalnemu pracodawcy na konkretnym przykładzie tego, co już udało nam się stworzyć i przez to – na jakim etapie rozwoju w danej dziedzinie jesteśmy.

 

Nie nastawiaj się na jeden język, i nie nastawiaj się na jego perfekcyjne opanowanie.

Nie spędzaj duże ilości czasu nad wyborem języka, w którym zaczniesz swoją naukę. I tak będziesz musiał poznać przynajmniej podstawy innych języków. Uzyskanie kompetencji na poziomie osoby, która będzie rozważana na stanowisko juniorskie oznacza, że będziesz musiał poznać nie tylko swój „główny” język programowania, ale też chociażby podstawy HTML, CSS i być może JavaScript, a także podstawy SQL, niezbędne do komunikacji z bazami danych.

 

Nie bój się wprowadzać do planu zmian, kiedy coś nie działa.

Podczas nauki rewiduj na bieżąco, na ile wybrany przez ciebie sposób działa, zarówno, jeśli chodzi o metody nauki (kwestie źródeł, z których korzystasz, stosunek przyswajania teorii do ćwiczenia praktycznego jej zastosowania etc.) ale też o same zagadnienia. Przykładowo, na pewnym etapie mojej nauki stwierdziłem, że muszę zwiększyć ilość praktycznych ćwiczeń a także zastosować JIT (Just In Time Learning), a także zdarzyło mi się zrezygnować z dopiero co rozpoczętej nauki tworzenia GUI dla programów Pythona.

 

***

 

To dopiero początek listy wniosków, jednak resztę zostawię na osobny wpis na blogu. Podsumowując – mam nadzieję, że ten wpis będzie mobilizujący dla osób, które także postanowiły się przebranżowić, niezależnie od tego czy obrały drogę samodzielnej nauki czy też np. skorzystania z bootcampu lub systemu mentoringu ze strony doświadczonego programisty. Jednocześnie zdaję sobie sprawę, że (mimo wszystko) była to ta łatwiejsza część a prawdziwe wyzwania czekają mnie w momencie rozpoczęcia pracy jako web developer. I świetnie – nie mogę się doczekać 🙂

Dodaj komentarz