Co trzeba umieć, aby zostać programistą? (3/3)

Ten artykuł należy do serii Przebranżowienie i praca programisty. Listę wszystkich artykułów w tej serii znajdziesz tutaj.

W tym artykule przedstawiam technologie i narzędzia, które należy moim zdaniem znać, aby ubiegać się o pracę jako Młodszy Programista Java. Wspomnę także o kilku przydatnych umiejętnościach. Nie stanowią one kompletnej listy – wybrałem te z nich, które są moim zdaniem najistotniejsze, aby osoba przychodząca do pracy mogła czuć się w niej pewnie. Przy każdym z zagadnień znajdziesz:

  • krótki opis czym jest dana technologia/narzędzie i do czego służy,
  • wymagany poziom znajomości.

Ciężko w prosty sposób określić wymagany poziom wiedzy, dlatego będą pokrótce opisywał, co powinniśmy na dany temat wiedzieć lub co powinieneś być w stanie zrobić.

Gdybyśmy wybrali inny język programowania jako nasz cel, to większość z opisanych tu narzędzi i technologii by się nie zmieniła. Wiele z nich jest niezależnych od języka programowania, z którego korzystamy. Przy omawianych zagadnieniach umieszczę informację, czy są one raczej związane z pracą jako programista Java, czy też daną technologię/narzędzie znajdziemy też na innych projektach.

Zwrócę jeszcze uwagę na jeden fakt: każdy projekt jest inny. Na projektach stosowane są różne narzędzia, biblioteki i technologie. W związku z tym, przy omawianiu niektórych z nich umieściłem alternatywy, z którymi można się spotkać pracując jako programista.

Artykuł podzielony jest na trzy części:

Część 3 – Dodatkowe technologie i narzędzia, które warto znać

Docker

Docker to popularne narzędzie pozwalające na tworzenie wirtualnych środowisk, zwanych kontenerami, w których uruchamiane są aplikacje tworzone przez programistów.

Docker umożliwia tworzenie środowisk dopasowanych do aplikacji, które mają na nim działać. Środowiska te konfigurowane są przez specjalne pliki opisujące m. in. jaki system operacyjny ma być dostępny na wirtualnym środowisku, jakie programy mają być na nim zainstalowane itp.

Docker jest darmowy i można go pobrać z oficjalnej strony, na której znajdują się także tutoriale: https://www.docker.com.

Warto znać podstawy tworzenia konfiguracji Dockera oraz uruchamiania aplikacji nimi opisanych.

Alternatywa: poza użyciem Dockera, maszyny wirtualne tworzone są także za pomocą takich narzędzi jak VMware oraz VirtualBox. Jeżeli na projekcie nie ma Dockera, to raczej nie będziesz odpowiedzialny za wirtualizację i konfigurację maszyn wirtualnych.

Czy występuje tylko na projektach Java: nie, Docker nie zależy od języka programowania używanego na projekcie.

Groovy

Groovy to język programowania, który działa na Maszynie Wirtualnej Java. Oznacza to, że możemy uruchamiać programy napisane w Groovy na komputerach, które mają Maszynę Wirtualną Java. Dodatkowo, możemy korzystać ze wszystkich funkcjonalności języka Java i Biblioteki Standardowej Java, a także tworzyć systemy, których kod źródłowy składa się zarówno z kodu Java, jak i kodu napisanego w języku Groovy. Możesz korzystać z IntelliJ IDEA, aby tworzyć programy napisane w Groovy.

Groovy posiada bardzo wiele przydatnych funkcjonalności, których brakuje w języku Java. W szczególności szybkie pisanie skryptów wykonujących różne zadania jest bardzo wygodne i zajmuje zdecydowanie mniej czasu, niż podobne programy w języku Java. Dla przykładu, wypisanie treści pliku na ekran w Groovy to tylko jedna linia kodu:

println new File("a.txt").text

Jeżeli chcesz nauczyć się języka Groovy, to zajrzyj do oficjalnej dokumentacji – znajdziesz tam bardzo dużo materiałów, dzięki którym po krótkim czasie będziesz w stanie używać języka Groovy do własnych potrzeb.

Z mojego doświadczenia mogę powiedzieć, że pisanie kodu w języku Groovy jest wyjątkowo satysfakcjonujące i jest to mój ulubiony język programowania. Używam języka Groovy m. in. w skrypcie, który generuje w moich artykułach spisy treści oraz nawigację pomiędzy rozdziałami.

Groovy jest dość popularnym rozwiązaniem do pisania testów jednostkowych i integracyjnych w projektach, które używają języka Java. W szczególności w połączeniu z biblioteką Spock, która umożliwia opisowe tworzenie testów, które są łatwo zrozumiałe i wyglądają często bardziej jak zwykły tekst niż kod źródłowy.

Przykład testu jednostkowego zapisanego w języku Groovy z wykorzystaniem biblioteki Spock:

def "HashMap accepts null key"() {
  given:
  def map = new HashMap()

  when:
  map.put(null, "elem")

  then:
  notThrown(NullPointerException)
}

źródło powyższego kodu: dokumentacja Spock Framework

Jeżeli chcesz nauczyć się korzystać ze Spocka, to zajrzyj do oficjalnej dokumentacji.

Groovy to przydatny język – jeżeli znajdziesz czas, to warto zaznajomić się z podstawami z oficjalnej dokumentacji. Dodatkowo, możesz spróbować skorzystać ze Spocka – istnieje spora szansa, że prędzej czy później trafisz na niego na jednym z projektów.

Alternatywa: jeżeli chcesz szybko pisać użytkowe skrypty, to możesz skorzystać z np. języka Python.

Czy występuje tylko na projektach Java: Groovy to wygodny język do pisania skryptów, więc używanie języka Java na projekcie nie jest wymogiem, aby spotkać tam Groovy. Są też projekty, na których to Groovy jest głównym językiem programowania.

JavaScript

JavaScript to bardzo popularny język programowania stosowany na stronach internetowych. Pozwala on na tworzenie dynamicznych stron reagujących na działania użytkownika. W zasadzie nie ma ograniczeń jeśli chodzi o to, co możemy osiągnąć za pomocą JavaScript. Java i JavaScript mają co prawda podobną nazwę, ale na tym podobieństwo się kończy.

Domeną JavaScript przez wiele lat był frontend, czyli ta część aplikacji, która odpowiedzialna jest głównie za interakcję z użytkownikiem. Od pewnego jednak czasu może on być także wykorzystywany w aplikacjach backendowych dzięki środowisku o nazwie Node. Node pozwala na tworzenie zaawansowanych sieciowych aplikacji w języku JavaScript. W ten sposób możemy za pomocą JavaScript napisać zarówno frontend, jak i backend aplikacji.

Świat aplikacji frontendowych rozwija się bardzo dynamicznie. Powstają coraz to nowe frameworki, które wspomagają proces tworzenia oprogramowania. Popularnymi frameworkami do tworzenia zaawansowanych aplikacji webowych są m. in. Angular, React & Redux, oraz Vue. Jeśli chodzi o nowinki technologiczne i trendy, to programiści JavaScript nie mają łatwego życia.

Obecnie często oferty o pracę dla programistów Java zawierają wymóg znajomości języka JavaScript lub któregoś z frameworków takich jak Angular lub React. Programistów będących w stanie tworzyć zarówno backend, jak i frontend, nazywa się czasem fullstackami.

Alternatywa: Java oferuje technologię JSF, czyli Java Server Faces, której można używać do tworzenia aplikacji webowych, jednak JavaScript jest zdecydowanie bardziej popularny.

Czy występuje tylko na projektach Java: nie, wykorzystanie JavaScript jest niezależne od języka Java.

Serwery aplikacji

Serwery aplikacji to środowiska, w których możemy uruchamiać aplikacje napisane w języku Java. Posiadają one szereg funkcjonalności, z których aplikacje mogą korzystać. Udostępniają biblioteki, zarządzają uprawnieniami, automatycznie uruchamiają aplikacje, zapewniają logowanie zdarzeń i wiele innych. Uruchamianie nowej wersji aplikacji na serwerze aplikacyjnym nazywamy deploy'owaniem aplikacji.

Jednym z popularnych serwerów aplikacji dla programów napisanych w języku Java jest darmowy Wildfly. Dobrze jest wiedzieć, jak uruchomić Wildfly, znać podstawy konfigurowania tego narzędzia, umieć deploy'ować proste aplikacje oraz być w stanie odnaleźć się w strukturze katalogów Wildfly'a, aby, na przykład, znaleźć logi i pliki konfiguracyjne.

Wiele dużych korporacji takich jak Amazon i Microsoft udostępnia własne serwery aplikacji, działające w chmurze. Są to, odpowiednio, AWS oraz Microsoft Azure. Innym dostawcą serwerów jest Heroku, które umożliwia łatwe deploy'owanie aplikacji bezpośrednio z repozytorium Gita.

Alternatywa: aplikacje mogą być deploy'owane na serwery takie jak Microsoft Azure zamiast na lokalne serwery aplikacji.

Czy występuje tylko na projektach Java: nie, serwery aplikacji używane są na różnych projektach.

GitHub, Bitbucket, GitLab

Gdy korzystamy z Gita, opisanego w jednym z poprzednich rozdziałów, do wersjonowania plików, większość komend, które wykonujemy, działa na lokalnym repozytorium. Git nie wymaga nawet połączenia z Internetem.

Dopiero, gdy chcemy skorzystać z takich komend jak push, pull, oraz fetch, Git będzie potrzebował połączenie sieciowego. Te trzy komendy służą do dzielenia się swoimi zmianami z innymi programistami pracującymi na tym samym repozytorium, oraz pobierania ich zmian do naszego lokalnego repozytorium.

Abyśmy jednak mieli dokąd wysyłać nasze zmiany i pobierać commity innych osób, nasze repozytorium musi być hostowane (czyli przechowywane) na pewnym serwerze. Takie serwery oferują firmą tworzące strony Bitbucket, GitHub, oraz GitLab.

Przykładowa reprezentacja repozytorium Gita hostowanego na GitHubie:

Przykład repozytorium na GitHub

Narzędzia te, poza przechowywaniem repozytoriów i udostępnianiem ich programistom, oferują m. in. możliwość tworzenia Pull Requestów (zwanych także Merge Requestami). Są to zmiany wprowadzone przez jednego z programistów, które chce on włączyć do "głównej" wersji systemu. W ramach Pull Requestów, inni programiści wykonują najpierw Code Review, omawiane w jednym z poprzednich rozdziałów.

Bitbucket, GitHub, oraz GitLab udostępniają na swoich stronach interfejs do przeglądania zmian wprowadzanych w ramach Pull Requestów. W łatwy sposób możemy przeglądać zmiany, komentować je i prowadzić dyskusje.

Każde z narzędzi posiada darmową wersję, dzięki czemu możesz poćwiczyć używanie ich do pracy na własnych repozytoriach.

Warto umieć tworzyć nowe repozytoria w jednym z tych narzędzi, oraz przeglądać już istniejące. Poza tym, dobrze zaznajomić się z Pull Requestami i Code Review.

Alternatywa: repozytoria mogą być przechowywane na dedykowanych dla firmy serwerach Gita takich jak np. GitBlit.

Czy występuje tylko na projektach Java: nie, Git oraz powiązane narzędzia są niezależne od języków programowania.

Algorytmika i złożoność algorytmiczna

Algorytmika to dziedzina informatyki związana z tworzeniem algorytmów. Algorytm to sposób na rozwiązanie pewnego zadania.

Algorytmy mają bardzo dużo znaczenie w programowaniu, ponieważ, podobnie jak z wieloma innymi rzeczami w życiu, dany problem można rozwiązać na wiele sposobów. Sposoby te zazwyczaj różnią się czasem, jaki jest wymagany, aby ten problem rozwiązać.

Dla przykładu, załóżmy, że chcesz w poniższym ciągu liczb znaleźć konkretną liczbę, np. 5:

1, -65, 200, 0, 1, 1501, 510, -24, 241, 85451

Aby znaleźć szukaną liczbę w programie komputerowym, musisz po kolei sprawdzić kolejne liczby tego ciągu i porównać je do tej, której szukasz. W tym przypadku liczba porównań, jakie musisz wykonać, rośnie liniowo wraz ze wzrostem długości ciągu liczb – jeżeli liczb jest 10, musisz (w najgorszym przypadku, gdy liczba jest na końcu bądź w ogóle jej nie ma) wykonać 10 porównań. Jeżeli ciąg będzie dwa razy dłuższy, tzn. będzie w nim 20 liczb, to będziesz musiał wykonać dwa razy więcej porównań, czyli 20 (w najgorszym przypadku).

Aby porównać różne algorytmy rozwiązujące ten sam problem, stosujemy pojęcie złożoności algorytmicznej. Dzieli się ona na złożoność czasową oraz złożoność pamięciową. Pierwsza oznacza, ile operacji "głównych" trzeba wykonać w algorytmie w zależności od rozmiaru danych. Operacja główna to np. porównywanie liczb w algorytmie, który szuka konkretnej liczby w ciągu liczb. Złożoność pamięciowa określa jak dużo pamięci komputera potrzebuje algorytm, aby wykonać swoje zadanie.

Złożoność czasowa opisanego powyżej algorytmu szukania liczby w ciągu liczb wynosi n, ponieważ rośnie liniowo wraz ze wzrostem długości ciągu liczb. Istnieją inne, szybsze algorytmy wyszukiwania. Wyszukiwanie binarne, dla przykładu, ma złożoność log n, ale wymaga, by liczby w ciągu były posortowane. Algorytm ten działa jednak o wiele szybciej, niż opisany powyżej odpowiednik.

O ile nie będziesz pracować w firmie, które głównie zajmuje się tworzeniem algorytmów dla różnych firm lub tworzy specyficzne systemy, które będą wymagały zaprojektowania nowych algorytmów, to raczej rzadko będziesz musiał pisać w pracy algorytmy.

Warto jednak wiedzieć, że na rozwiązanie pewnego problemu zazwyczaj dostępnych mamy kilka algorytmów, które różnią się złożonością algorytmiczną. Ma to szczególnie duże znaczenie, gdy korzystamy z kolekcji w języku Java – różne implementacje interfejsów takich jak Set czy List będą różniły się złożonością algorytmiczną metod do np. dodawania i usuwania elementów.

Czy występuje tylko na projektach Java: nie, algorytmika to pojęcie związane z informatyką.

Wyrażenia regularne

Wyrażenia regularne (regular expressions) to wzorce, za pomocą których opisujemy tekst. Wyrażenia regularne są często używane w programowaniu do wyszukiwania i zastępowania tekstu w plikach tekstowych. Ponadto, stosuje się je, aby opisać ciąg znaków, który musi spełnić pewne założenia.

Proste wyrażenia regularne są bardzo pomocne i można dzięki nim łatwo wyszukiwać tekst oraz nim manipulować. Im wyszukiwany tekst jest bardziej złożony, tym wyrażenie regularne staje się dłuższe, trudniejsze w napisaniu i zrozumieniu, a co za tym idzie, w utrzymaniu i testowaniu. W moim skrypcie do generowania spisów treści w moich artykułach używam następującego wyrażenia regularnego:

/(?ms)<(h[0-9]) id="([^"]*)">([^<]*)<\/h[0-9]>/

Służy ono do szukania nagłówków w plikach HTML i wybierania ID nagłówka oraz jego nazwy. Na pierwszy, drugi, i trzeci rzut oka, ciężko powiedzieć o co w tym wyrażeniu regularnym w zasadzie chodzi. Ale działa 😉

Wyrażenia regularne składają się z liter oraz znaków specjalnych, który stosujemy w określonych celach. Dla przykładu, użycie * (gwiazdki) po pewnym znaku oznacza, że znak ten może wystąpić dowolną liczbę razy (od 0 do dowolnej liczby). Plus + oznacza, że znak musi wystąpić co najmniej raz. Nawiasy ( ) oznaczają grupy znaków. Znak dolara $ wymusza, aby szukany ciąg znaków był na końcu linii, a daszek ^ by ten ciąg znaków był na początku linii. Kropka . oznacza dowolny znak.

Spójrz na poniższy fragment tekstu, od którego zaczyna się ten rozdział:

Wyrażenia regularne (regular expressions) to wzorce, za pomocą których opisujemy tekst. Wyrażenia regularne są często używane w programowaniu do wyszukiwania i zastępowania tekstu w plikach tekstowych. Ponadto, stosuje się je, aby opisać ciąg znaków, który musi spełnić pewne założenia.

Poniżej znajdziesz przykładowe, proste wyrażenia regularne wraz z oznaczeniem, które fragmenty powyższego tekstu do nich pasują:

  • ^Wyr^ oznacza, że szukany ciąg znaków Wyr musi być na początku linii.
  • je$$ oznacza, że szukany ciąg znaków je musi być na końcu linii,
  • .ch – pasuje do każdego ciągu znaków składającego się z trzech znaków, kończących się na ch – kropka na początku oznacza dowolny znak,
  • expres+ions – pasuje do podanego ciągu znaków, który ma w środku co najmniej jedną literę s.

Warto wiedzieć, do czego służą wyrażenia regularne i jak z nich korzystać do szukania i zastępowania prostych fragmentów tekstu. Dobrze zaznajomić się ze znakami specjalnymi oraz odnoszeniem się do grup znalezionych fragmentów tekstu. Uwaga: w różnych językach programowania i edytorach tekstu używane są różne "silniki" obsługujące wyrażenia regularne, więc używane w nich wyrażenia regularne mogą się od siebie nieco różnić.

Czy występuje tylko na projektach Java: nie, wyrażenia regularne można stosować w wielu językach programowania i różnego rodzaju edytorach tekstu.

JIRA

JIRA to narzędzie tworzone przez firmę Atlassian, która jest m. in. twórcą Bitbucketa opisywanego przy okazji serwerów do hostingu repozytoriów Gita.

JIRA to aplikacja webowa, z której korzystamy przez przeglądarkę internetową. Pozwala ona na tworzenie zadań związanych z tworzeniem oprogramowania. Użytkownicy mogą tworzyć zgłoszenia, opisywać je, przypisywać im priorytety i statusy, oraz toczyć dyskusję w komentarzach z programistami. Każdy użytkownik ma swoje konto i może przeglądać przypisane do niego zgłoszenia, zwane także ticketami. Tickety przynależą do pewnego nazwanego projektu i mają swój numer. Programiści często posługują się w pracy numerami zgłoszeń, kiedy rozmawiają o aktualnych zadaniach. Tickety są także często umieszczane w opisach commitów w repozytorium Gita, np. "PROD-32 Optymalizacja raportu dot. zamówień". JIRA służy także do nielubianej przez programistów czynności jaką jest logowanie czasu spędzonego na zadaniach.

JIRA stała się bardzo popularna w ostatnich latach i jest często spotykana na projektach programistycznych. Warto wiedzieć, do czego służy i jak tworzyć zgłoszenia, zmieniać ich opisy, oraz statusy. Możesz założyć darmowe konto i swoją własną JIRĘ, na której będziesz mógł przećwiczyć korzystanie z niej na oficjalnej stronie.

Jak wygląda JIRA możesz zobaczyć zaglądając do publicznej JIRY projektu Apache Maven.

Czy występuje tylko na projektach Java: nie, JIRA jest nie jest zależna od języka programowania używanego na projekcie.

Scrum

Scrum to metodologia tworzenia oprogramowania. Założeniem Scruma jest wytwarzanie oprogramowania o wysokiej jakości przez małe zespoły programistów w krótkich iteracjach, zwanych sprintami, które zazwyczaj trwają tydzień bądź dwa tygodnie. Każdy zespół ma wyznaczoną listę zadań do wykonania w swoim sprincie, które wzięte zostały z tzw. backlogu. Backlog to po prostu lista zadań, które trzeba wykonać, aby wytworzyć pewne oprogramowanie.

Istotą Scruma jest bliska współpraca z użytkownikami systemu, aby jak najlepiej zrozumieć ich potrzeby i jak najszybciej dostarczyć oprogramowanie, które będzie spełniało wymagania osób, które będą z niego korzystały. Osobą, która stoi na czele wyznaczania kierunku, w którym tworzony system powinien podążać, jest Product Owner. Na projektach scrumowych pracują także tzw. Scrum Masterzy, którzy dbają, aby zasady Scruma były przestrzegane i by zespoły mogły w spokoju pracować nad swoimi zadaniami.

Każdego dnia programiści spotykają się na kilkuminutowym spotkaniu nazywanym daily, na którym krótko informują pozostałych członków zespołu: co osiągnęli poprzedniego dnia, czy napotkali jakieś problemy, oraz nad czym planują pracować dzisiaj.

Po każdym ze sprintów nowa funkcjonalność systemu prezentowana jest użytkownikom na spotkaniu nazywanym review. Poza prezentacją zmian w systemie, zespół przeprowadza także wewnętrzną retrospekcję, podczas której programiści omawiają, co w ostatnim sprincie mogło zostać zrobione lepiej, oraz co poszło dobrze. Przed rozpoczęciem nowego sprintu na spotkaniu nazywanym planowaniem zespół obiera cel na kolejny sprint i przez kolejny np. tydzień stara się dostarczyć ustalone funkcjonalności. W trakcie sprintów zespół przeprowadza jeszcze jeden rodzaj spotkań, nazywany refinementem, na których analizowane i przygotowywane są zadania na kolejne sprinty.

Niestety, z mojego doświadczenia wynika, że teoria niewiele ma wspólnego z praktyką. Jeżeli na ofercie o pracę uwzględniony jest Scrum, to jest spora szansa na to, że metodologia faktycznie stosowana na projekcie nie ma ze Scrumem wiele wspólnego. Mam w planach napisać osobny artykuł na ten temat i umieszczę tutaj do niego link, kiedy to nastąpi.

Przychodząc na projekt, na którym stosowany jest Scrum, warto wiedzieć, jakie są założenia tej metodologii oraz do czego służą poszczególne rodzaje spotkań.

Alternatywa: inną popularną metodologią jest Kanban. Poza tym, na wielu projektach nie stosuje się żadnej konkretnej metodologii.

Czy występuje tylko na projektach Java: nie, metodologia Scrum nie jest zależna od języka programowania.

Microsoft Office i Open Office

Dokumenty i arkusze kalkulacyjne można spotkać w zasadzie na wszystkich projektach, na których wytwarza się oprogramowanie. Microsoft Office to zbiór narzędzi pozwalających m. in. na tworzenie dokumentów (Word), arkuszy kalkulacyjnych (Excel), oraz prezentacji (PowerPoint).

Dokumenty napisane w programie Word służą głównie do opisywania wymagań dotyczących nowych systemów bądź zmian w już istniejących aplikacjach.

Arkusze kalkulacyjne często zawierają przykłady, w których zawarte są biznesowe reguły, które mają zostać zaimplementowane w systemie informatycznym. Takie przykłady ułatwiają programistom zrozumienie, jak system, który mają napisać, ma działać. Mogą też z nich skorzystać w celu porównania wyników wyliczonych w napisanym przez siebie kodzie systemu.

Arkusze kalkulacyjne są także często stosowane do przechowywania danych z wygenerowanych raportów. Dane z raportów są często eksportowane do formatu .xlsx (Microsoft Excel) bezpośrednio z systemu informatycznego.

Microsoft Office jest zdecydowanie bardziej popularny niż jego darmowy, open source'owy odpowiednik – Open Office. O ile znajomość Open Office'a nie jest wymagana, tak Microsoft Office Word oraz Microsoft Office Excel należy znać w stopniu podstawowym, ponieważ istnieje mała szansa, by na projekcie nie było używane chociaż jedno z tych narzędzi. Od czasu do czasu zdarza się także, że trzeba przygotować prezentację w programie PowerPoint.

Alternatywa: Atlassian, autor narzędzi Bitbucket oraz JIRA, ma w repertuarze jeszcze inną aplikację webową – Confluence. Jest to narzędzie, które pozwala tworzyć dokumenty online, które będą dostępne dla pracowników firmy, która wykupi licencję. Z mojego doświadczenia wynika, że Confluence nie jest w stanie zastąpić Microsoft Office, ponieważ spełnia inne wymagania. Confluence jest o tyle alternatywą, że pracując na projekcie, na którym jest zarówno Microsoft Office, jak i Confluence, masz do wyboru, w czym napiszesz dany dokument (o ile nie ma z góry określonej potrzeby wykorzystania jednego bądź drugiego narzędzia).

Czy występuje tylko na projektach Java: nie, Microsoft Office jest powszechnie stosowany.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Nie musisz podawać swojego imienia, e-mailu, ani strony www, aby opublikować komentarz. Komentarze muszą zostać zatwierdzone, aby były widoczne na stronie.