Z Javą jest jak z językiem angielskim – podstawy są proste, dalej trzeba się już postarać
– Co takiego ma Java, czego np. nie dawał mi C++? Nie mam ochoty samodzielnie zarządzać pamięcią ani też zastanawiać się nad tym, pod jaki system operacyjny piszę swój kod. Autorzy Javy rozwiązują te problemy za mnie, a ja dzięki temu mogę dużo szybciej przelewać swoje myśli na działający kod – mówi Tomasz Więcław, Java Developer w Team International.
Spis treści
Programujesz w Javie. Skąd taki wybór?
Gdybym miał odpowiedź na to pytanie jednym zdaniem, to powiedziałbym, że trochę w tym było przypadku. Pierwsze kroki jako programista amator stawiałem w takich językach, jak Visual Basic czy Delphi. W szkole poznałem C oraz C++ i z tymi językami zaczynałem przygodę na studiach. W międzyczasie wylądowałem na innej uczelni zaczynając ponownie ten sam rok, ale z całkiem innym zestawem przedmiotów. Wśród nich była również Java – był to pierwszy język programowania, który naprawdę mi się spodobał i mimo iż tej uczelni również nie ukończyłem, to zauroczenie pozostało i postanowiłem zgłębić tajniki tego języka.
Oczywiście nie żałuję tej decyzji. Co takiego ma Java, czego np. nie dawał mi C++? Nigdy nie byłem fanem tego, co dzieję się tam bardzo nisko – nie interesuje mnie wydajność (no, może czasem tak), nie mam ochoty samodzielnie zarządzać pamięcią ani też zastanawiać się nad tym, pod jaki system operacyjny piszę swój kod. Autorzy Javy rozwiązują te problemy za mnie, a ja dzięki temu mogę dużo szybciej przelewać swoje myśli na działający kod – frajdę sprawia mi rozwiązanie problemów ludzi, a nie sprzętu.
Jak wyglądała Twoja ścieżka od juniora do seniora? Co w Twoim przypadku wpłynęło na awans?
Zacząłem dość szczęśliwie – miałem być testerem, ale dzięki temu, że w swoim CV umieściłem link do swoich amatorskich projektów. Początki były bardzo trudne, nie miałem żadnego znajomego, który mógłby mną pokierować, ale podobała mi się ta praca. Lubię wyzwania, więc dość szybko zacząłem dostawać coraz bardziej wymagające zadania. Po nieco ponad dwóch latach (cały czas w tej samej firmie) zacząłem również pełnić obowiązki team leadera. Z czasem tych obowiązków było coraz więcej, a czasu na tworzenie kodu coraz mniej – zapaliła mi się lampka, że czas zrobić krok w tył i wrócić do roli typowego programisty.
Zmieniłem pracę, na papierze wciąż byłem midem, chociaż oficjalnie dostawałem stawkę seniorską. Tym razem mogłem się skupić na nadrabianiu zaległości, jakie niestety spowodował okres, w którym to bardziej zajmowałem się zarządzaniem niż kodowaniem. Wtedy też zaczęła u mnie kiełkować świadomość, że sama praca nie wystarczy i trzeba jeszcze dołożyć przynajmniej te kilka godzin w tygodniu na dodatkowy rozwój.
Później było jakby z górki, wystarczająca wiedza, doświadczenie, znajomości i tak wylądowałem w Team International. Obecnie w Teamie to już mój trzeci projekt, chyba póki co najciekawszy ze wszystkich, w których miałem okazję pracować. Przez te 9 lat nigdy nie było jakoś ciężko, raczej wszystko dobrze się układało, a pieniądze same trafiały do portfela. To pewnie po części zasługa tego, że lubię tę pracę, a wiadomo, że jak coś sprawia przyjemność to trochę inaczej się wszystko układa, bardziej pozytywnie. Myślę, że to jednak dopiero początek poważnej kariery w IT 😉
Czy Java jest językiem trudnym, czy łatwym do nauczenia? Ile czasu należy poświęcić, żeby zgłębić podstawy pozwalające na aplikowanie na stanowiska juniorskie?
Z Javą jest podobnie jak z językiem angielskim – podstawy są dość proste i dość szybko można się ich nauczyć, natomiast żeby przejść na poziom zaawansowany, trzeba się już mocno postarać – dużo teorii, jeszcze więcej praktyki, żeby to wszystko utrwalić. Warto przy tym pamiętać, że Java cały czas ewoluuje, a więc mamy coraz więcej materiału do opanowania, także ciągły rozwój jest ważny, nie można pozostać przy tym, czego raz się nauczyliśmy. Na szczęście, im więcej wiemy oraz im więcej mamy praktyki, tym łatwiej przyswajamy kolejne elementy języka. Do znalezienia pracy na stanowisku juniora nie jest potrzebna nawet średniozaawansowana wiedza, podstawy w zupełności wystarczą – żeby sprawdzić, czy ten poziom minimum został osiągnięty, polecam zdać certyfikat OCA, około dwa-trzy miesiące intensywnej nauki powinny wystarczyć, żeby opanować materiał.
Niestety, sama Java to zbyt mało żeby móc bez problemu zacząć przygodę, próg wejścia jest nieco wyższy i wymaga jeszcze znajomości podstawowych frameworków tj. Spring, Hibernate, trzeba też wiedzieć coś o bazach danych i języku SQL oraz sporo innych potrzebnych rzeczy związanych z Javą, tworzeniem aplikacji webowych itp. Dobrym pomysłem może być zainwestowanie pieniędzy (kilka do kilkunastu tysięcy) w porządny kurs dający solidne podstawy do rozpoczęcia pracy jako junior Java developer – przy obecnych stawkach na rynku taka inwestycja zwraca się bardzo szybko.
O czym warto pamiętać, ucząc się Javy? Masz może jakieś przydatne wskazówki? Z jakich materiałów/kursów warto korzystać w tym celu?
Temat-rzeka, jeśli będziemy brać pod uwagę różne etapy swojej kariery, natomiast postaram się skupić na radach dla początkujących programistów, bądź tych, którzy dopiero myślą o karierze w tej branży. Moim zdaniem najważniejsza jest mentalność – im szybciej uświadomimy sobie, jaki cel chcemy osiągnąć i jaka praca się z tym wiąże, tym lepiej.
Polecam mierzyć wysoko, wiąże się to nie tylko z lepszymi pieniędzmi, ale też z ciekawszymi, bardziej rozwojowymi zadaniami. Najlepiej uświadomić sobie od razu, że sam czas spędzony w pracy nie wystarcza, trzeba dać od siebie więcej, koniecznie trzeba poświęcać dodatkowe godziny na rozwój – to jest bardzo dobra inwestycja, która zwraca się zaskakująco szybko. Ile godzin dodatkowo? Im więcej, tym lepiej, ale oczywiście bez przesady – przepracowanie też nie jest zdrowe. Jeżeli ktoś ma czas, to 10 godzin tygodniowo praktycznie gwarantuje szybki rozwój, zwłaszcza na początku ścieżki kariery. Trzymajmy się podstaw – frameworki nie są najistotniejsze w początkowym etapie rozwoju, trzeba najpierw zbudować mocne podstawy – zgłębić tajniki Javy, poznać wzorce projektowe, podstawy SQL-a, dowiedzieć się, co to jest czysty kod, TDD, SOLID i jak to stosować w praktyce. Frameworków oraz innych fajerwerków nauczymy w pracy, a na zgłębienie wiedzy w tym temacie przyjdzie czas później.
Materiałów i kursów jest mnóstwo, można się w tym zagubić. Ja najwięcej korzyści czerpałem z książek, a później z kursów na platformach takich jak udemy, przygotowywania się do egzaminów na certyfikat czy też podcastów związanych z branżą. Z książek mogę wymienić pozycje obowiązkowe, bez których nie wyobrażam sobie bycia tu, gdzie jestem teraz: Effective Java (Joshua Bloch), Clean Code (Robert C. Martin) oraz kontynuacje serii, a także OCA/OCP Study Guide (Boyarsky, Selikoff) i później oba egzaminy. Staram się czytać codziennie, choćby nawet miał to być tylko jeden rozdział, a wtedy, kiedy nie mogę czytać, bo np. jadę samochodem czy uprawiam jakiś sport, to słucham audiobooka/podcastu.
Jakie są zalety, a jakie wady Javy?
Ja jestem optymistą, bardzo trudno mi dostrzec wady, zwłaszcza jeśli mówimy o Javie, zacznę więc od zalet. Na pewno jest to bardzo popularny język programowania, wydaje mi się, że na polskim rynku nie ma takiej możliwości, żeby zabrakło ofert pracy z nim związanych. Język ciągle się rozwija, ale na tyle spokojnie, że można za tym rozwojem nadążyć, a w swojej obecnej formie ma już na tyle dużo ułatwień, że pisanie w tym języku to naprawdę przyjemność. Tak jak wspomniałem wcześniej, dla mnie zaletą Javy jest to, że nie muszę dbać o to, co dzieje się “pod spodem” – twórcy Javy zadbali o to za mnie, a ja mogę się skupić na tworzeniu oprogramowania, które ma rozwiązywać problemy ludzi, a nie komputerów.
Jeżeli ktoś ceni sobie stabilność rynku pracy, z Javą ma to zagwarantowane. Jeżeli ktoś ceni sobie innowacyjność/nowoczesność, to z pewnym opóźnieniem, ale regularnie pojawiają się coraz to nowsze ułatwienia i tzw. “ficzery”. Jeżeli ktoś chce przelewać swoje myśli na kod, nie zastanawiając się zbytnio nad tym, jak to tam w środku działa – w Javie ma tę możliwość.
Czy dla kontrastu mogę przytoczyć jakieś wady? Na pewno jakieś by się znalazły, ale musiałbym długo szukać. Osobiście nie podoba mi się fakt, że Java tak bardzo trzyma się polityki utrzymywania kompatybilności wstecznej, czyli ze starszymi wersjami języka – moim zdaniem hamuje to niepotrzebnie tempo rozwoju oraz w niektórych obszarach ten rozwój wręcz uniemożliwia. Poza tym naprawdę uważam, że dla mnie ten język nie ma liczących się wad – nie w obszarach gdzie widzę jego największe zastosowanie.
Frameworki Javy – z jakich korzystać? Co można powiedzieć o tych starszych (Struts, Hibernate)? Który polecasz i dlaczego?
Podstawowym, najbardziej pożytecznym i bardzo mocno rozpowszechnionym frameworkiem jest Spring wraz ze wszystkimi swoimi modułami. O Springu można pisać książki i rzeczywiście takie książki napisano, ja powiem krótko – nie wyobrażam sobie poważnego projektu Javowego bez Springa – Spring jest fundamentem, od którego zaczynam definiować stack technologiczny.
Inne ciekawe frameworki to te wspierające testowanie. Dla mnie numerem jeden jest tutaj Spock – niesamowita czytelność, ogromne ułatwienia przy tworzeniu nawet skomplikowanych testów no i ta magia Grooviego… (język oparty na JVM, kolejne ciekawe doświadczenie do zdobycia). Jeżeli nie mogę korzystać ze Spocka, to wtedy wybieram klasyczne połączenie JUnit 5 + Mockito – mniej eleganckie od Spocka, ale posiadający wszystko, co potrzeba do tworzenia porządnych testów.
Zostając przy temacie testów, ciekawym frameworkiem jest również Cucumber, który pozwala nam pisać testy językiem zrozumiałym dla ludzi biznesu, dzięki czemu mamy przy okazji bardzo ładną dokumentację na temat tego, co nasza aplikacji potrafi i do czego służy. Co do Hibernate to prawdą jest, że ma już swoje lata, jednak ciągle się rozwija. Wciąż jest to podstawowy framework do pracy z relacyjnymi bazami danych i póki co nie wyobrażam sobie, żeby miał odejść na zasłużoną emeryturę. Co prawda przez (lub dzięki, jak kto woli) Springa nie jest on już tak ważny jak kiedyś, ale wciąż wystarczająco ważny, żeby wymagać wiedzy o nim podczas rozmowy rekrutacyjnej.
Struts, JSF czy Java EE – miały swoje pięć minut, na pewno pchnęły rozwój programowania aplikacji webowych w Javie, ale nie przetrwały próby czasu i obecnie możemy je spotkać tylko w tzw. legacy projektach, do których nikt, kto myśli o rozwoju, nie idzie z własnej woli – uważam, że jest to obecnie wiedza bezużyteczna i nie należy poświęcać na te frameworki ani czasu, ani kalorii. Nasza branża rozwija się bardzo dynamicznie, a życie szybko weryfikuje, które gatunki należy uznać za wymarłe – nie próbujmy ich ratować na siłę.
Czego w ofertach pracy wymagano od Javy Developera jeszcze kilka lat temu? Jak te wymagania ewoluowały z Twojej perspektywy?
Wydaje mi się, że kiedy ja rozpoczynałem swoją karierę w branży, to rozmowy były trochę łatwiejsze – chętniej zatrudniano świeżaków. Musiałem znać podstawy języka, trochę SQL-a oraz wykazać zainteresowanie tematem. Obecnie próg wejścia jest znacznie wyższy, bez solidnego przygotowania teoretyczno-praktycznego będzie ciężko. Oczywiście nikt nie oczekuje cudów od osoby rozpoczynającej przygodę, ale zdecydowanie trzeba znać nie tylko podstawy języka czy SQL-a, do tego dochodzą jeszcze znajomości frameworków takich, jak Spring czy Hibernate, umiejętność pisania testów jednostkowych, choćby teoretyczna znajomość RESTa, zasady programowania obiektowego i wiele innych różnych rzeczy. Wydawać by się to mogło dziwne, ponieważ zapotrzebowanie na pracowników jest bardzo duże, ale tutaj chodzi bardziej o osoby z doświadczeniem, mid i wyżej. Juniorzy mają ciężko, więc żeby zwiększyć swoje szanse, należy porządnie się przygotować. Jeśli ktoś nie ma znajomych w branży, którzy będą w stanie pokierować, coś podpowiedzieć, to naprawdę warto zastanowić się nad jednym ze szkoleń, o których mówiłem wcześniej. Natomiast łatwiejsze stały się rozmowy na mida oraz seniora, właśnie ze względu na bardzo duże zapotrzebowanie na te stanowiska.
Na co teraz zwraca się uwagę przy rekrutacjach na Java Developera?
Ilu rekruterów, tyle różnych opinii można by sporządzić – naprawdę trudno to sprowadzić do jakiegoś uniwersalnego kryterium. Zmiennych jest mnóstwo: junior/mid/senior/może coś więcej?, czy do konkretnego projektu, czy chodzi o outsourcing czy do projektu wewnętrznego itp. itd. Ja bardzo rzadko chodzę na rozmowy, najczęściej dopiero wtedy, kiedy naprawdę chcę zmienić pracę, nie robię tego w celu rozeznania rynku. Pracę również zmieniam rzadko.
Natomiast w Team International jestem również jednym z rekruterów i tych rozmów na różne stanowiska przeprowadziłem już pewnie dziesiątki, mogę więc zdradzić, jak to u mnie wygląda. Przeważnie rekrutuję pod konkretny projekt, do konkretnego klienta. Wiem więc, czego dokładnie oczekuje się od kandydata na dane stanowisko i na tych wymaganiach skupiam się bardziej. Czasami bywa tak, że dana osoba jest generalnie doświadczona, ale niestety kompletnie nie trafia w to czego potrzebuje nasz klient i zostaje odrzucona. To są te momenty, których nie lubię, bo gdzieś w środku czuję, że marnuje się wtedy dobry zawodnik. Na szczęście nasza firma ewoluuje i już niebawem będziemy wprowadzać rekrutację na tzw. ławkę. Będziemy wtedy sprawdzać kandydatów bardzo wszechstronnie, tak żeby nie marnować potencjalnych możliwości.
Jakie inne możliwe ścieżki rozwoju ma Java Developer?
Inne poza byciem programistą Javy do końca kariery? Jest ich kilka. Jedną z takich popularnych ścieżek jest przekształcenie się w architekta oprogramowania. Najczęściej architektami zostają ci lepsi programiści, którzy albo nie chcą już spędzać czasu pracując nad poszczególnymi zadaniami, albo mają już tak wszechstronną wiedzę, że była to dla nich naturalna ścieżka ewolucji. “Awans” na architekta nie oznacza jednak, że można przestać się uczyć – wręcz przeciwnie, trzeba ciągle poznawać nowe rozwiązania, tak, żeby móc je później wprowadzać w nadzorowanych przez siebie projektach. Dobry architekt to skarb, słaby architekt (a spotkałem takich na swojej drodze), który posiada zbyt dużą władzę, potrafi utopić nawet najlepiej rokujący projekt. Jest to bardzo ciekawa propozycja dla tych bardziej ambitnych, ale wraz z oczekiwaniami co do kompetencji oraz większą odpowiedzialnością, w parze idą większe pieniądze. Nie będę ukrywać, że jest to jedna z opcji, które rozważam również dla siebie.
Kolejną opcją jest ewolucja w Team Leadera, a później może nawet Product Ownera/Product Managera. Team Leader jest często łączony ze stanowiskiem programisty, ale można się zacząć w tym specjalizować i wtedy stopniowo obowiązki zarządzania zespołem wypierają te związane z tworzeniem kodu – niektórzy po prostu czują powołanie w tę stronę i takie osoby też są potrzebne. Często bywa tak, że Product Ownerzy z techniczną przeszłością radzą sobie znakomicie, a programiści bardzo lubią z nimi pracować. Ja sam pełnię obecnie obowiązki Team Leadera, ale jest to tylko dodatek do tego, co robię jako programista i taki układ sił mi się podoba. Nie wyobrażam sobie jednak, żeby pełnić tę funkcję na pełny etat.
Jest też taka bardzo ciekawa ścieżka, w której łączymy kilka rzeczy: jesteśmy wybitnymi specjalistami jako programista Javy, do tego mamy ciągotki edukacyjne i w ten sposób możemy (na początku dodatkowo) “sprzedawać” swoją wiedzę – czy to prowadząc kursy, czy ucząc w szkole dla programistów, czy też pisząc książki albo wygłaszać konferencje – opcji jest wiele. Można też być świetnym specjalistą i wynajmować się jako konsultant do zadań specjalnych – przychodzimy do projektu na kilka miesięcy, robimy swoją robotę, po czym udajemy się z misją specjalną do kolejnego projektu. Jak widać możliwości jest wiele. Można też oczywiście do końca kariery być zwykłym programistą, ale to chyba najmniej ciekawa z opcji, przynajmniej w moich oczach.
Jakie dodatkowe kompetencje powinien posiadać Java Developer?
Podchwytliwe pytanie. Jeśli chodzi o dodatkowe poza tymi, które wymieniłem do tej pory, to na pewno będzie to umiejętność rozwiązywania problemów, bo o to przede wszystkim w naszej pracy chodzi. Pisanie kodu, projektowanie architektury, testowanie tego wszystkie – to są umiejętności drugorzędne. Najważniejszym zadaniem jest rozwiązywanie problemów. Trzeba rozwijać swój umysł, dokształcać się z branży, dla której aktualnie tworzymy oprogramowanie, trzeba chcieć podjąć ten wysiłek umysłowy.
Na pewno bardzo ważny jest język angielski – bez tego ani rusz. Cała aktualna wiedza związana z branżą jest dostępna właśnie w tym języku – polskie tłumaczenia często są błędne, a prawie zawsze są już przestarzałe. Angielski powinien być ćwiczony codziennie, w pewnym momencie ta umiejętność może się przełożyć na większe pieniądze niż moglibyśmy zdobyć wiedzą programistyczną.
Umiejętności miękkie też są ważne. Praca w IT to przede wszystkim praca w zespole, chcemy więc posiadać odpowiednie umiejętności żeby grać zespołowo, a nie indywidualnie. Trzeba umieć przekonać innych do swoich, często słusznych, racji, trzeba umieć przyjąć na klatę krytykę otrzymaną w code review, trzeba umieć negocjować dobre stawki podczas podpisywania nowego kontraktu. Dla osób chcących robić karierę jako Team Leader, czy później również Product Owner, Project Manager, kompetencje związane z zarządzaniem ludźmi mogą okazać się bardzo przydatne. Również znajomość metodologii Agile nie zaszkodzi, a może pomóc.
Co może zaskoczyć osoby wchodzące do branży IT?
Zaskoczyć może wiele. Mnie np. zaskoczyła ilość wiedzy, jaką musiałem przyswoić w krótkim czasie – pamiętam jak po pierwszym dniu pracy wróciłem do domu i byłem przerażony, nie wiedząc czy w ogóle podołam. Na szczęście dałem radę i teraz jestem tu gdzie jestem. Dla tych co myślą, że spróbują sił jako programista Javy bo tutaj łatwo zarobić duże pieniądze, to mogą się naprawdę mocno zdziwić. Owszem, pieniądze są nie najgorsze, natomiast na pewno nie jest łatwo. Jeśli programowanie nie jest czynnością sprawiającą nam przyjemność, to bardzo szybko można osiwieć z powodu stresu, jaki ta praca potrafi dostarczyć.
Może zaskoczyć też fakt, że wiedza, którą zdobyliśmy, np. odnośnie konkretnej wersji języka Javy, dość szybko się starzeje. Wszystko tutaj rozwija się bardzo szybko, nie jest to na pewno praca, w której osiągniemy jakiś poziom i już do końca życia możemy sobie spokojnie na nim pozostać. Jeżeli porzucimy rozwój życie szybko zweryfikuje, że już nie jesteśmy tyle warci co np. młodsi, ambitniejsi koledzy i nasze zarobki mogą poszybować w dół. Tutaj trzeba non stop poszerzać horyzonty, przyswajać nową wiedzę i non stop się starać. Ale może właśnie to sprawia, że ta praca jest tak ciekawa i rzadko się nudzi? Może znudzić się projekt, ale projekt zawsze można zmienić.
Pozytywnie może zaskoczyć to, że w większości firm IT to praca szuka człowieka, a nie człowiek pracy. Jeżeli już uda nam się gdzieś zacząć i zdobędziemy trochę doświadczenia, będziemy mogli później przebierać w niekończących się ofertach, co przekłada się często na bardzo komfortowe warunki, o których ludzie pracujący w innych branżach mogą tylko pomarzyć. Warto zostać programistą Javy – polecam serdecznie 🙂
Tomasz Więcław. Senior Java Developer w Team International. Prywatnie wędkarz, szachista amator, w wolnych chwilach gra na gitarze. Programowanie było jego hobby od najmłodszych lat.
Zdjęcie główne pochodzi z unsplash.com.