Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Czym Java różni się od innych popularnych języków? Dlaczego Java powinna być pierwszym językiem, którego należy się uczyć? Stwórzmy plan, który pomoże Ci nauczyć się języka Java zarówno od podstaw, jak i poprzez zastosowanie umiejętności programowania w innych językach. Wymieńmy różnice pomiędzy tworzeniem kodu produkcyjnego w Javie a programowaniem w innych językach. Michaił Zatepyakin przeczytał ten raport na spotkaniu dla przyszłych uczestników staże Yandex i inni początkujący programiści - spotkanie Java Junior.


— Witam wszystkich, mam na imię Misza. Jestem programistą z Yandex.Market i dziś powiem Ci dlaczego warto uczyć się Javy i jak robić to skutecznie. Możesz zadać rozsądne pytanie: dlaczego ja będę opowiadał tę historię, a nie jakiś silny programista z wieloletnim doświadczeniem? Fakt jest taki, że sam studiowałem Javę niedawno, jakieś półtora roku temu, więc do dziś pamiętam, jak to było i jakie były tam pułapki.

Rok temu odbyłem staż w Yandex.Market. Opracowałem backend dla Beru, dla samego Marketu, prawdopodobnie go używałeś. Teraz nadal tam pracuję, w innym zespole. Tworzymy platformę analityczną dla Yandex.Market dla partnerów biznesowych.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Zacznijmy. Po co uczyć się języka Java z praktycznego punktu widzenia? Faktem jest, że Java jest bardzo znanym językiem programowania. Ma bardzo dużą społeczność.

Istnieje na przykład taki indeks TIOBE, popularny wskaźnik popularności języków programowania, a Java zajmuje tam pierwsze miejsce. Ponadto na stronach z ofertami pracy prawdopodobnie zauważysz, że większość ofert pracy dotyczy języka Java, czyli rozwijając się w Javie, zawsze możesz znaleźć pracę.

Ponieważ społeczność jest bardzo duża, na każde pytanie znajdziesz odpowiedź na niektórych stronach Stack Overflow lub innych. Ponadto, programując w Javie, tak naprawdę piszesz kod na JVM, dzięki czemu możesz łatwo przejść na Kotlin, Scala i inne języki korzystające z JVM.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Co jest dobrego w Javie z ideologicznego punktu widzenia? Istnieją różne języki programowania. Rozwiązują różne problemy, wiesz o tym. Na przykład Python świetnie nadaje się do pisania jednowierszowych skryptów w celu szybkiego rozwiązywania problemów.

Zaletą jest to, że możesz w pełni kontrolować kod wykonywalny. Na przykład mamy samochody, samochody bez kierowcy Yandex, ich kod jest zapisany plusami. Dlaczego? Java ma coś takiego - Garbage Collector. Czyści pamięć RAM ze zbędnych obiektów. Ta rzecz uruchamia się spontanicznie i faktycznie zatrzymuje świat, czyli zatrzymuje resztę programu i przechodzi do liczenia obiektów, czyszczenia pamięci obiektów. Jeśli coś takiego działa w dronie, to nie jest fajnie. Twój dron pojedzie prosto, w tym momencie wyczyści pamięć i w ogóle nie będzie patrzył na drogę. Dlatego dron jest pisany na plus.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Jakie problemy rozwiązuje Java? Jest to przede wszystkim język do tworzenia dużych programów, które są pisane latami, przez dziesiątki lub setki osób. W szczególności duża część backendu Yandex.Market jest napisana w Javie. Mamy rozproszony zespół w kilku miastach, po dziesięć osób w każdym. A kod jest łatwy w utrzymaniu, jest wspierany od dziesięciu lat lub dłużej, a jednocześnie przychodzą nowi ludzie i rozumieją ten kod.

Jakie cechy powinien mieć język, aby znajdujący się w nim kod był łatwo obsługiwany i aby można go było łatwo rozwijać w dużych zespołach. Przede wszystkim powinien to być kod czytelny i łatwy w implementacji skomplikowanych rozwiązań architektonicznych. Oznacza to, że pisanie abstrakcji wysokiego poziomu itp. powinno być łatwe. To wszystko zapewnia nam Java. Jest to język obiektowy. Implementowanie abstrakcji wysokiego poziomu i złożonych architektur jest naprawdę łatwe.

Istnieje również wiele frameworków i bibliotek dla Javy, ponieważ język ten ma ponad 15 lat. W tym czasie zapisano na nim wszystko, co można było napisać, więc istnieje mnóstwo bibliotek na wszystko, czego możesz potrzebować.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Jakie podstawowe umiejętności moim zdaniem powinien posiadać początkujący gracz JA? Przede wszystkim jest to znajomość rdzenia języka Java. Następny jest pewnego rodzaju framework wstrzykiwania zależności. Następny mówca, Cyryl, opowie o tym szerzej. Nie będę schodził zbyt głęboko. Następna jest architektura i wzorce projektowe. Aby pisać duże aplikacje, musimy umieć pisać piękny architektonicznie kod. A to jest coś w rodzaju SQL lub ORM do zadań związanych z pracą z bazą danych. Dotyczy to bardziej backendu.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Iść! Rdzeń Javy. Ameryki tak naprawdę nie odkryję tutaj – trzeba znać sam język. Na co warto zwrócić uwagę. Po pierwsze, Java wypuściła w ostatnich latach wiele wersji, czyli w latach 2014-2015 wydano siódmą, potem ósmą, dziewiątą, dziesiątą, dużo nowych wersji i wprowadzono w nich wiele nowych fajnych rzeczy np. Java Stream API, lambda itp. Bardzo fajne, świeże, fajne rzeczy, które są wykorzystywane w kodzie produkcyjnym, o co pytają na rozmowach kwalifikacyjnych i o czym trzeba wiedzieć. Dlatego nie powinieneś brać książki z półki w bibliotece Java-4 i uczyć się jej. Oto nasz plan: uczymy się Java-8 lub nowszego.

Zwracamy szczególną uwagę na innowacje takie jak Stream API, var itp. Są one zadawane podczas rozmów kwalifikacyjnych i są stale wykorzystywane w produkcji. Oznacza to, że Stream API jest znacznie fajniejsze niż pętle, ogólnie rzecz biorąc, bardzo fajna rzecz. Pamiętaj, aby zwrócić uwagę.

Istnieje wiele różnych rzeczy, takich jak iteratory, wyjątki i tak dalej. Rzeczy, które wydają ci się nieistotne, o ile sam napiszesz mały kod. Nie potrzebujesz tych wyjątków, kto ich w ogóle potrzebuje? Ale na pewno zostaną poproszeni na rozmowach kwalifikacyjnych, na pewno przydadzą Ci się na produkcji. Ogólnie rzecz biorąc, powinieneś zwrócić uwagę na wyjątki, iteratory i inne rzeczy.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Struktury danych. Nie obejdzie się bez struktur, ale będzie wspaniale, jeśli nie tylko będziesz wiedzieć, że istnieją zbiory, słowniki i arkusze. A także różne implementacje struktur. Na przykład ten sam słownik w Javie ma wiele implementacji, w tym HashMap i TreeMap. Mają różną asymptotykę, są odmiennie zbudowane wewnątrz. Musisz wiedzieć, czym się różnią i kiedy którego użyć.

Będzie również bardzo fajnie, jeśli wiesz, jak te struktury danych działają wewnętrznie. Oznacza to, że nie jest łatwo poznać ich asymptotykę – jak bardzo działa zakład, jak długo działa przepustka, ale jak działa struktura wewnątrz – na przykład, czym jest wiadro w HashMap.

Warto także zwrócić uwagę na drzewa i wykresy. Są to rzeczy, które nie są zbyt powszechne w kodzie produkcyjnym, ale są popularne podczas wywiadów. W związku z tym musisz być w stanie przemierzać drzewa, wykresy na szerokość i głębokość. To wszystko są proste algorytmy.

Gdy tylko zaczniesz pisać jakiś duży kod, złożony, korzystając z bibliotek, kod wieloklasowy, zdasz sobie sprawę, że jest Ci ciężko bez budowania systemów i rozwiązywania zależności. Są to przede wszystkim Maven i Gradle. Umożliwiają importowanie bibliotek do projektu w jednej linii. Oznacza to, że piszesz jednowierszowy plik XML i importujesz biblioteki do projektu. Świetne systemy. Są w przybliżeniu takie same, użyj jednego z nich - Mavena lub Gradle.

Dalej - jakiś system kontroli wersji. Polecam Git, ponieważ jest popularny i istnieje mnóstwo samouczków. Prawie każdy używa Gita, fajna rzecz, nie da się bez niego żyć.

I jakieś środowisko programistyczne. Polecam IntelliJ Idea. Znacznie przyspiesza proces programowania, bardzo ci pomaga, pisze za ciebie cały standardowy kod, ogólnie jest spoko.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Linki ze slajdu: SQLZOO, habrapost

SQL-a. Trochę o backenderach. Rzeczywiście był tu zabawny przypadek. Dwa dni przed drugą rozmową kwalifikacyjną zadzwoniła do mnie dziewczyna z HR i powiedziała, że ​​za dwa dni zapytają mnie o SQL i HTTP, muszę się tego nauczyć. I prawie nic nie wiedziałem o SQL i HTTP. I znalazłem tę fajną stronę - SQLZOO. Nauczyłem się na nim SQL w 12 godzin, mam na myśli składnię SQL, jak pisać zapytania SELECT, JOIN itp. Bardzo fajna strona, bardzo ją polecam. Tak naprawdę w ciągu 12 godzin nauczyłem się 90% tego, co wiem teraz.

Wspaniale jest także znać architekturę baz danych. Są to wszelkiego rodzaju klucze, indeksy, normalizacja. Na Habré można znaleźć serię postów na ten temat.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

W Javie, oprócz SQL, istnieją różnego rodzaju systemy mapowania obiektowo-relacyjnego, takie jak JPA. Jest jakiś kod. W pierwszej metodzie znajduje się kod SQL - WYBIERZ nazwę id FROM info.users GDZIE id IN userIds. Z bazy użytkowników, z tabeli pobierane są ich identyfikatory i nazwy.

Następnie istnieje pewien program mapujący, który zamienia obiekt z bazy w obiekt Java. Poniżej znajduje się trzecia metoda, która faktycznie wykonuje ten kod. Wszystko to można zastąpić za pomocą JPA jedną linijką, co opisano poniżej. Robi to samo - znajdź All ByIdIn. Oznacza to, że na podstawie nazwy metody generuje ona dla Ciebie zapytanie SQL.

Bardzo fajna rzecz. Ja sam, nie znając SQL, korzystałem z JPA. Ogólnie rzecz biorąc, zwróć uwagę. Jeśli jesteś zbyt leniwy, aby nauczyć się SQL, to katastrofa. I ogólnie ogień!

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Wiosna. Kto słyszał o czymś takim jak framework Spring? Widzisz ilu was jest? Nie bez powodu. Spring jest uwzględniany w wymaganiach co drugiego wolnego stanowiska w obszarze backendu Java. Bez tego naprawdę nie ma mowy o dużym rozwoju. Czym jest wiosna? Po pierwsze, jest to framework wstrzykiwania zależności. O tym też Powie następny mówca. Krótko mówiąc, jest to coś, co pozwala ułatwić importowanie zależności niektórych klas do innych. Oznacza to, że wiedza o zależnościach jest uproszczona.

Spring Boot to fragment Springa, który pozwala uruchomić aplikację serwerową za pomocą jednego przycisku. Idziesz do THID, naciskasz kilka przycisków i masz już uruchomioną aplikację serwerową na localhost 8080. Oznacza to, że nie napisałeś jeszcze ani jednej linii kodu, ale on już działa. Bardzo fajna rzecz. Jeśli napiszesz coś własnego, strzelaj!

Spring to bardzo duży framework. Nie tylko przejmuje aplikację serwera i rozwiązuje wstrzykiwanie zależności. Pozwala na wiele rzeczy, łącznie z tworzeniem metod REST API. Oznacza to, że napisałeś jakąś metodę i dołączyłeś do niej adnotację Pobierz mapowanie. A teraz masz już jakąś metodę na localhost, która pisze do ciebie Hello world. Dwie linijki kodu i działa. Fajne rzeczy.

Wiosna ułatwia także pisanie testów. Nie ma mowy bez testów w dużym rozwoju. Kod wymaga przetestowania. W tym celu Java ma fajną bibliotekę JUnit 5. I JUnit w ogóle, ale najnowsza wersja jest piąta. Jest wszystko do testowania, wszelkiego rodzaju twierdzenia i inne rzeczy.

Istnieje też niesamowity framework Mockito. Wyobraź sobie, że masz pewną funkcjonalność, którą chcesz przetestować. Ta funkcjonalność robi wiele rzeczy, w tym gdzieś pośrodku loguje się do VKontakte na przykład przy użyciu Twojego identyfikatora i odbiera imię i nazwisko użytkownika VKontakte z identyfikatora. Prawdopodobnie nie uwzględnisz VKontakte w testach, to dziwne. Ale musisz przetestować funkcjonalność, więc stworzyłeś tę klasę, używając Mockito, udając ją, imitując.

Powiecie, że gdy do tej klasy przyjdzie żądanie z takim a takim identyfikatorem, zwróci jakieś nazwisko, na przykład Vasya Pupkin. I to zadziała. Oznacza to, że przetestujesz całą funkcjonalność dla jednej klasy mok. Bardzo fajna rzecz.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Link ze slajdu

Wzorce projektowe. Co to jest? Są to szablony do rozwiązywania typowych problemów pojawiających się w fazie rozwoju. W fazie rozwoju często pojawiają się identyczne lub podobne problemy, które świetnie byłoby jakoś dobrze rozwiązać. Dlatego ludzie opracowali najlepsze praktyki, pewne szablony, jak rozwiązać te problemy.

Istnieje strona z najpopularniejszymi wzorcami - refactoring.guru, możesz ją przeczytać, dowiedzieć się, jakie istnieją wzorce, przeczytać trochę teorii. Problem w tym, że jest praktycznie bezużyteczny. Tak naprawdę wzorce bez praktyki nie są szczególnie przydatne.

Usłyszysz o niektórych wzorcach, takich jak Singletone lub Builder. Kto słyszał te słowa? Dużo ludzi. Istnieją takie proste wzorce, które możesz wdrożyć samodzielnie. Ale większość wzorców: strategia, fabryka, fasada – nie jest jasne, gdzie je zastosować.

I dopóki w praktyce nie zobaczysz w kodzie innej osoby miejsca, w którym ten wzór jest zastosowany, sam nie będziesz w stanie go zastosować. Dlatego praktyka jest bardzo ważna w przypadku wzorów. Samo czytanie o nich na stronie refactoring.guru nie jest zbyt pomocne, ale zdecydowanie warto to zrobić.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Dlaczego potrzebne są wzory? Załóżmy, że masz określoną klasę użytkownika. Ma identyfikator i nazwę. Każdy Użytkownik musi posiadać zarówno Identyfikator, jak i Nazwę. U góry po lewej stronie znajduje się sala lekcyjna.

Jakie są sposoby inicjowania użytkownika? Istnieją dwie opcje - albo konstruktor, albo setter. Jakie są wady obu podejść?

Konstruktor. nowy użytkownik (7, „Bond”), OK. Załóżmy teraz, że nie mamy klasy User, ale inną, z siedmioma polami numerycznymi. Będziesz miał konstruktora zawierającego siedem kolejnych liczb. Nie jest jasne, jakie są to liczby i która z nich należy do której własności. Projektant nie jest świetny.

Drugą opcją jest seter. Wyraźnie piszesz: setId(7), setName(“Bond”). Rozumiesz, która właściwość należy do którego pola. Ale rozgrywający ma problem. Po pierwsze, możesz zapomnieć o przypisaniu czegoś, a po drugie, Twój obiekt okazuje się zmienny. Nie jest to bezpieczne dla wątków i nieznacznie zmniejsza czytelność kodu. Dlatego ludzie wymyślili fajny wzór - Builder.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

O czym to jest? Spróbujmy połączyć zalety obu podejść – ustawiającego i konstruktora – w jednym. Tworzymy pewien obiekt Builder, który będzie miał również pola Id i Name, który sam zostanie zbudowany w oparciu o seter i który będzie miał metodę Build, która zwróci nowego użytkownika ze wszystkimi parametrami. Otrzymujemy niezmienny obiekt i setter. Fajny!

Jakie są problemy? Tutaj mamy klasycznego Buildera. Problem w tym, że wciąż możemy zapomnieć o zaznaczeniu jakiegoś pola. A jeśli zapomnieliśmy odwiedzić identyfikator, w tym przypadku w Builderze jest on inicjowany na zero, ponieważ typ int nie dopuszcza wartości null. A jeśli zrobimy Nazwę „Bond” i zapomnimy odwiedzić biuro tożsamości, będziemy mieli nowego Użytkownika o identyfikatorze „0” i nazwie „Bond”. Nie fajnie.

Spróbujmy z tym walczyć. W Builderze zmienimy int na int, aby dopuszczał wartość null. Teraz wszystko jest świetnie.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Jeśli spróbujemy utworzyć użytkownika o nazwie „Bond”, zapominając o umieszczeniu jego identyfikatora, otrzymamy wyjątek dotyczący wskaźnika zerowego, ponieważ identyfikator nie dopuszcza wartości zerowej, a Builder ma wyjątek zerowy, konkretnie dotyczący wskaźnika.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Ale nadal możemy zapomnieć o nazwie, więc ustawiamy odtwarzanie obiektu na null. Teraz, gdy budujemy nasz obiekt w programie Builder, sprawdza on, czy pole nie dopuszcza wartości null. A to jeszcze nie wszystko.

Spójrzmy na ostatni przykład. W tym przypadku, jeśli w jakiś sposób wstawimy wartość null do środowiska wykonawczego ID, byłoby wspaniale od razu wiedzieć, że to zrobiłeś i nie jest fajnie, że teraz popełniasz błąd.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Musisz zgłosić błąd nie w momencie tworzenia użytkownika, ale po ustawieniu wartości null na identyfikator. Dlatego w Builderze zmienimy setera Integer na int, a on od razu przysięgnie, że wyrzucił null.

Krótko mówiąc, o co chodzi? Istnieje prosty wzorzec Buildera, ale nawet jego implementacja ma pewne subtelności, dlatego bardzo fajnie jest przyjrzeć się różnym implementacjom wzorców. Każdy wzorzec ma dziesiątki implementacji. To wszystko jest bardzo interesujące.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Jak napisać Buildera w kodzie produkcyjnym? Oto nasz Użytkownik. Dołączamy do niego rotację Buildera z biblioteki Lombok, a ona sama generuje dla nas Buildera. Oznacza to, że nie piszemy żadnego kodu, ale Java już myśli, że ta klasa ma Buildera i możemy to nazwać w ten sposób.

Powiedziałem już, że Java ma biblioteki do prawie wszystkiego, w tym Lombok, fajną bibliotekę, która pozwala uniknąć pisania szablonów. Budowniczy, OTRZYMAJ.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Wzorce mogą mieć charakter architektoniczny - związany nie tylko z jedną klasą, ale z systemem jako całością. W projektowaniu systemów obowiązuje taka fajna zasada: zasada pojedynczej odpowiedzialności. O czym on mówi? Fakt, że każda klasa musi być odpowiedzialna za część swojej funkcjonalności. W tym przypadku mamy do czynienia z Kontrolerem komunikującym się z użytkownikami, obiektami JSON. Istnieje Facade, która konwertuje obiekty JSON na modele, z którymi aplikacja Java będzie następnie pracować. Istnieje usługa posiadająca złożoną logikę współpracującą z tymi modelami. Istnieje obiekt dostępu do danych, który umieszcza te modele w bazie danych i pobiera je z bazy danych. Jest jeszcze sama baza danych. Innymi słowy, nie wszystko jest w jednej klasie, ale tworzymy pięć różnych klas i to jest inny wzorzec.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Kiedy już mniej więcej nauczysz się języka Java, wspaniale będzie napisać własny projekt, który będzie zawierał bazę danych, współpracował z innymi interfejsami API i udostępniał aplikację serwerową klientom REST API. Byłoby wspaniale dodać to do swojego CV, byłoby to fajne zakończenie Twojej edukacji. Dzięki temu możesz iść i znaleźć pracę.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Oto przykład mojej aplikacji serwerowej. Na drugim roku pisałem z chłopakami pracę semestralną. Pisali aplikację mobilną do organizacji wydarzeń. Tam użytkownicy mogli logować się za pośrednictwem VKontakte, umieszczać punkty na mapie, tworzyć wydarzenia, zapraszać do nich znajomych, zapisywać obrazy wydarzeń itp.

Co zrobiłem w projekcie? Napisano aplikację serwerową w Spring Boot bez użycia SQL. Nie znałem go, korzystałem z JPA. Co mogłoby zrobić? Zaloguj się do VK poprzez OAuth-2. Weź token użytkownika, udaj się z nim do VK, sprawdź, czy to prawdziwy użytkownik. Otrzymuj informacje o użytkownikach za pośrednictwem VKontakte. Udało mu się zapisać informacje w bazie danych, także poprzez JPA. Umiejętnie zapisuj zdjęcia i inne pliki w pamięci komputera, a linki do nich zapisuj w bazie danych. Nie wiedziałem wtedy jeszcze, że w bazie danych znajdują się obiekty CLOB, więc zrobiłem to w ten sposób. Nie było REST API dla użytkowników, aplikacji klienckich. Były też testy jednostkowe dla podstawowej funkcjonalności.

[…] Mały przykład mojej udanej nauki Javy. Na pierwszym roku studiów uczono mnie języka C# i zrozumiano programowanie OOP – czym są klasy, interfejsy, abstrakcja i dlaczego są potrzebne. Bardzo mi to pomogło. Bez tego nauka języka Java jest dość trudna; nie jest jasne, po co potrzebne są zajęcia.

Po co uczyć się Javy i jak robić to skutecznie. Raport Yandexa

Na drugim roku na uniwersytecie znowu uczyli rdzenia Java, ale na tym nie poprzestałem, sam poszedłem studiować Springa i napisałem pracę kursową, mój projekt, o którym wspomniałem powyżej. I po tym wszystkim pojechałem na staż do Yandex, przeszedłem rozmowę kwalifikacyjną i dostałem się do Yandex.Market. Tam napisałem backend dla Beru, to jest nasz rynek i dla samego Yandex.Market.

Następnie, sześć miesięcy temu, przeniosłem się do innego zespołu w ramach tego samego rynku. Wykonujemy analizy dla partnerów biznesowych. Jesteśmy na platformie analitycznej, na backendzie jest nas trzech, więc mam bardzo duży wpływ na projekt. Właściwie to bardzo interesujące. Czyli tak naprawdę dostarczamy dane o rynku – jaka jest sprzedaż, w jakich kategoriach, w jakich modelach, dla partnerów biznesowych, dużych, znanych firm. A jest nas tylko trzech, piszemy ten kod i jest bardzo fajnie.

Dziękuję! Przydatne linki:
- „Java 8. Przewodnik dla początkujących”.
- Struktury danych.
- SQLZOO.
- Normalizacja bazy danych.
- Wzorce projektowe.
- Wzory projektowe.
- Wyczyść kod.
- Efektywna Java.

Źródło: www.habr.com

Dodaj komentarz