Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Jak se Java liší od jiných populárních jazyků? Proč by měla být Java prvním jazykem, který se naučíte? Pojďme vytvořit plán, který vám pomůže naučit se Javu jak od nuly, tak pomocí programovacích dovedností v jiných jazycích. Uveďme si rozdíly mezi tvorbou produkčního kódu v Javě a vývojem v jiných jazycích. Michail Zatepyakin četl tuto zprávu na setkání pro budoucí účastníky stáží Yandex a další začínající vývojáři - Java Junior meetup.


— Ahoj všichni, jmenuji se Míša. Jsem vývojář z Yandex.Market a dnes vám řeknu, proč se učit Javu a jak to dělat efektivně. Můžete si položit rozumnou otázku: proč budu tento příběh vyprávět já a ne nějaký silný vývojář s mnohaletými zkušenostmi? Faktem je, že já sám jsem Javu studoval nedávno, asi před rokem a půl, takže si dodnes pamatuji, jaké to bylo a jaká to má úskalí.

Před rokem jsem získal stáž na Yandex.Market. Backend jsem vyvíjel pro Beru, pro samotný Market, pravděpodobně jste ho použili. Teď tam pracuji dál, v jiném týmu. Vytváříme analytickou platformu pro Yandex.Market pro obchodní partnery.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Začněme. Proč se učit Javu z praktického hlediska? Faktem je, že Java je velmi známý programovací jazyk. Má velmi velkou komunitu.

Existuje například takový index TIOBE, oblíbený index oblíbenosti programovacích jazyků a Java je tam na prvním místě. Na pracovních stránkách si také pravděpodobně všimnete, že většina volných míst je o Javě, to znamená, že vývojem v Javě si práci vždy najdete.

Protože komunita je velmi rozsáhlá, na jakoukoli otázku, kterou máte, najdete odpověď na některém Stack Overflow nebo jiných stránkách. Při vývoji v Javě také ve skutečnosti píšete kód na JVM, takže můžete snadno přejít na Kotlin, Scala a další jazyky, které používají JVM.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Co je na Javě dobrého z ideologického hlediska? Existují různé programovací jazyky. Řeší různé problémy, to víte. Například Python je skvělý pro psaní jednořádkových skriptů pro řešení rychlých problémů.

Pozitivní je, že můžete plně ovládat spustitelný kód. Máme například auta, auta bez řidiče Yandex, jejich kód je napsaný v plusech. Proč? Java má takovou věc - Garbage Collector. Vyčistí RAM od nepotřebných objektů. Tato věc se spustí spontánně a provede stop-the-world, to znamená, že zastaví zbytek programu a jde spočítat objekty, vyčistit paměť objektů. Pokud něco takového funguje v dronu, není to cool. Váš dron pojede rovně, v tuto chvíli si vyčistí paměť a vůbec se nebude dívat na silnici. Proto je dron napsán na profících.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Jaké problémy Java řeší? Je to především jazyk pro vývoj velkých programů, které jsou napsány v průběhu let desítkami nebo stovkami lidí. Zejména velká část backendu v Yandex.Market je napsána v Javě. Máme rozdělený tým v několika městech, v každém je deset lidí. A kód se snadno udržuje, je podporován deset a více let a zároveň přicházejí noví lidé, kteří tomuto kódu rozumí.

Jaké vlastnosti by měl mít jazyk, aby kód v něm byl snadno podporován a aby se dal snadno vyvíjet ve velkých týmech. Především by to měl být čitelný kód a mělo by být snadné implementovat složitá architektonická řešení. To znamená, že by mělo být snadné psát abstrakce na vysoké úrovni atd. To vše nám Java poskytuje. Jedná se o objektově orientovaný jazyk. Je opravdu snadné implementovat abstrakce na vysoké úrovni a složité architektury.

Pro Javu je také spousta frameworků a knihoven, protože jazyk je více než 15 let starý. Během této doby na něm bylo napsáno vše, co se dalo napsat, takže existují tuny knihoven pro vše, co byste mohli potřebovat.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Jaké základní dovednosti by podle mě měl mít začínající hráč JA? V první řadě je to znalost základního jazyka Java. Další je nějaký framework Dependency Injection. Další řečník, Kirill, o tom bude hovořit podrobněji. Nepůjdu příliš hluboko. Další je architektura a designové vzory. Abychom mohli psát velké aplikace, musíme být schopni psát architektonicky krásný kód. A to je nějaký druh SQL nebo ORM pro úkoly práce s databází. A to platí spíše pro backend.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Jít! jádro Java. Ameriku tady opravdu neobjevím – musíte znát samotný jazyk. Čemu byste měli věnovat pozornost. Za prvé, Java v posledních letech vydala spoustu verzí, to znamená, že v letech 2014-2015 vyšla sedmá, pak osmá, devátá, desátá, spousta nových verzí a v nich byla představena spousta nových skvělých věcí , například Java Stream API , lambda atd. Velmi cool, fresh, cool věci, které se používají v produkčním kódu, na co se ptají v rozhovorech a které potřebujete vědět. Proto byste neměli vzít knihu z police v knihovně Java-4 a jít se ji učit. Toto je náš plán: naučíme se Java-8 nebo vyšší.

Velkou pozornost věnujeme inovacím jako Stream API, var atd. Jsou dotazovány při pohovorech a jsou neustále využívány ve výrobě. To znamená, že Stream API je mnohem chladnější než smyčky, obecně velmi cool věc. Určitě věnujte pozornost.

A existují nejrůznější věci jako iterátory, výjimky a tak dále. Věci, které se vám zdají nedůležité, pokud sami napíšete nějaký malý kód. Nepotřebujete tyto výjimky, kdo je vlastně potřebuje? Určitě se ale budou ptát na pohovorech, určitě se vám budou hodit ve výrobě. Obecně byste měli věnovat pozornost Výjimkám, iterátorům a dalším věcem.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Datové struktury. Bez struktur se neobejdete, ale bude skvělé, když nebudete vědět, že existují sady, slovníky a listy. A také různé realizace konstrukcí. Například stejný slovník v Javě má ​​mnoho implementací, včetně HashMap a TreeMap. Mají různou asymptotiku, jsou uvnitř jinak strukturované. Musíte vědět, jak se liší a kdy použít který z nich.

Bude také velmi cool, když víte, jak tyto datové struktury interně fungují. To znamená, že není snadné znát jejich asymptotiku – jak moc funguje sázka, jak dlouho funguje pass, ale jak funguje struktura uvnitř – například co je bucket v HashMap.

Za pozornost stojí i stromy a grafy. To jsou věci, které nejsou v produkčním kódu příliš běžné, ale na pohovorech jsou oblíbené. V souladu s tím musíte být schopni procházet stromy, grafy na šířku a hloubku. To vše jsou jednoduché algoritmy.

Jakmile začnete psát jakýkoli velký kód, složitý, pomocí knihoven, kódu s více třídami, uvědomíte si, že bez sestavení systémů a vyřešení závislostí je to pro vás těžké. Jedná se především o Maven a Gradle. Umožňují vám importovat knihovny do vašeho projektu v jednom řádku. To znamená, že napíšete jednořádkový xml a importujete knihovny do projektu. Skvělé systémy. Jsou přibližně stejné, použijte buď jeden - Maven nebo Gradle.

Další - nějaký druh systému správy verzí. Doporučuji Git, protože je populární a existuje spousta návodů. Téměř každý používá Git, je to skvělá věc, nemůžete bez něj žít.

A nějaké vývojové prostředí. Doporučuji IntelliJ Idea. Velmi to urychluje proces vývoje, hodně vám pomáhá, píše za vás veškerý standardní kód, obecně je to skvělé.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Odkazy ze snímku: SQLZOO, habrapost

SQL. Něco málo o backenderech. Ve skutečnosti zde došlo k úsměvnému případu. Dva dny před druhým pohovorem na stáži mi volala personalistka, že za dva dny se mě zeptají na SQL a HTTP, musím se to naučit. A o SQL nebo HTTP jsem nevěděl téměř nic. A našel jsem tento skvělý web - SQLZOO. Naučil jsem se na něm SQL za 12 hodin, tedy syntaxi SQL, jak psát SELECT dotazy, JOIN atd. Velmi povedené stránky, vřele doporučuji. Ve skutečnosti jsem se za 12 hodin naučil 90 % toho, co vím teď.

A také je skvělé znát architekturu databáze. To jsou všelijaké klíče, indexy, normalizace. Na Habrém je o tom řada příspěvků.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

V Javě kromě SQL existují všechny druhy objektově relačních mapovacích systémů, jako je JPA. Existuje nějaký kód. V první metodě je nějaký SQL kód - SELECT id jméno FROM info.users WHERE id IN userIds. Z databáze uživatelů, z tabulky, se získají jejich ID a jména.

Dále existuje určitý mapovač, který změní objekt ze základny na objekt Java. A níže je ještě třetí metoda, která tento kód skutečně spustí. To vše lze pomocí JPA nahradit jedním řádkem, který je napsán níže. Dělá to to samé – najít All ByIdIn. To znamená, že na základě názvu metody vám vygeneruje SQL dotaz.

Velmi cool věc. Já sám, když jsem neznal SQL, používal JPA. Obecně věnujte pozornost. Pokud jste příliš líní učit se SQL, je to katastrofa. A obecně, oheň!

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Jaro. Kdo slyšel o něčem takovém, jako je Spring framework? Vidíš, kolik vás je? Ne bez důvodu. Jaro je zahrnuto v požadavcích každé druhé volné pozice Java backendu. Bez toho opravdu není kam velký vývoj. co je jaro? V první řadě se jedná o framework Dependency Injection. O tomhle taky řekne další řečník. Ale ve zkratce jde o věc, která vám umožňuje usnadnit import závislostí některých tříd do jiných. To znamená, že znalost závislostí je zjednodušena.

Spring Boot je část Spring, která vám umožňuje spouštět serverovou aplikaci jedním tlačítkem. Přejdete na THID, stisknete několik tlačítek a nyní máte spuštěnou serverovou aplikaci na localhost 8080. To znamená, že jste ještě nenapsali jediný řádek kódu, ale už to funguje. Velmi cool věc. Pokud napíšete něco vlastního, palte!

Jaro je velmi rozsáhlý rámec. Nejen, že zvedne vaši serverovou aplikaci a vyřeší Dependency Injection. Umožňuje vám dělat spoustu věcí, včetně vytváření metod REST API. To znamená, že jste napsali nějakou metodu a připojili k ní anotaci Get mapping. A teď už máte na localhost nějakou metodu, která vám napíše Hello world. Dva řádky kódu a funguje to. Skvělé věci.

Jaro také usnadňuje psaní testů. Bez testování ve velkém vývoji to nejde. Kód je potřeba otestovat. Pro tento účel má Java skvělou knihovnu JUnit 5. A JUnit obecně, ale poslední verze je pátá. Je tam vše pro testování, všemožná tvrzení a další věci.

A existuje úžasný rámec Mockito. Představte si, že máte nějaké funkce, které chcete otestovat. Funkce dělá spoustu věcí, včetně toho, že se někde uprostřed přihlásí do VKontakte například pomocí vašeho ID a z ID obdrží jméno a příjmení uživatele VKontakte. VKontakte pravděpodobně do testů nezahrnete, to je zvláštní. Ale musíte otestovat funkčnost, takže jste vytvořili tuto třídu pomocí Mockito, mok it, napodobit to.

Řeknete, že když do této třídy přijde požadavek s takovým a takovým ID, vrátí nějaké příjmení, například Vasya Pupkin. A bude to fungovat. To znamená, že vyzkoušíte všechny funkce pro mok one class. Velmi cool věc.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Odkaz ze snímku

Designové vzory. co to je? Jedná se o šablony pro řešení typických problémů, které při vývoji vznikají. Ve vývoji se často objevují stejné nebo podobné problémy, které by bylo skvělé nějak dobře vyřešit. Lidé proto přišli s osvědčenými postupy, určitými šablonami, jak tyto problémy řešit.

Existuje webová stránka s nejoblíbenějšími vzory - refactoring.guru, můžete si to přečíst, zjistit, jaké vzory existují, přečíst si spoustu teorie. Problém je, že je to prakticky k ničemu. Ve skutečnosti vzory bez praxe nejsou nijak zvlášť užitečné.

Uslyšíte o některých vzorech jako Singletone nebo Builder. Kdo slyšel tato slova? Hodně lidí. Existují takové jednoduché vzory, které můžete implementovat sami. Ale většina vzorů: strategie, továrna, fasáda - není jasné, kde je aplikovat.

A dokud v praxi neuvidíte v kódu někoho jiného místo, na které je tento vzor aplikován, nebudete jej schopni aplikovat sami. Proto je u vzorů velmi důležitá praxe. A pouhé čtení o nich na refactoring.guru není moc užitečné, ale rozhodně to stojí za to.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Proč jsou vzory potřeba? Řekněme, že máte určitou třídu uživatele. Má ID a jméno. Každý uživatel musí mít ID i jméno. Vlevo nahoře je učebna.

Jaké jsou způsoby inicializace uživatele? Jsou dvě možnosti – buď konstruktor, nebo setter. Jaké jsou nevýhody obou přístupů?

Konstruktér. nový uživatel (7, "Bond"), dobře. Nyní řekněme, že nemáme třídu User, ale nějakou jinou, se sedmi číselnými poli. Budete mít konstruktor obsahující sedm po sobě jdoucích čísel. Není jasné, jaká jsou tato čísla a která z nich patří ke které nemovitosti. Návrhář není skvělý.

Druhá možnost je setr. Jasně píšete: setId(7), setName(“Bond”). Chápete, která vlastnost patří do kterého oboru. Ale setr má problém. Zaprvé můžete zapomenout něco přiřadit a zadruhé se váš objekt ukáže být proměnlivý. To není bezpečné pro vlákna a mírně to snižuje čitelnost kódu. Proto lidé přišli s cool vzorem – Builder.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

O čem to je? Zkusme spojit výhody obou přístupů – nastavovače a konstruktoru – v jeden. Vytvoříme určitý objekt, Builder, který bude mít také pole Id a Name, který sám bude vytvořen na základě setteru a který bude mít metodu Build, která vám vrátí nového uživatele se všemi parametry. Získáme neměnný objekt a setter. Chladný!

jaké jsou problémy? Zde máme klasického Buildera. Problém je, že stále můžeme zapomenout na kontrolu v některém poli. A pokud jsme zapomněli navštívit ID, v tomto případě v Builderu je inicializováno na nulu, protože typ int nemá hodnotu null. A pokud uděláme jméno „Bond“ a zapomeneme navštívit ID kancelář, budeme mít nového uživatele s ID „0“ a jménem „Bond“. Není vpohodě.

Zkusme s tím bojovat. V Builderu změníme int na int, aby bylo možné nullovat. Nyní je vše skvělé.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Pokud se pokusíme vytvořit uživatele se jménem „Bond“ a zapomeneme zadat jeho ID, dostaneme výjimku nulového ukazatele, protože ID není možné nulovat a Tvůrce má nulovou, konkrétně výjimku ukazatele.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Stále ale můžeme zapomenout zadat jméno, takže nastavíme opakované přehrávání objektu na null. Nyní, když vytváříme náš objekt z Builderu, zkontroluje, zda pole nemá hodnotu null. A to není vše.

Podívejme se na poslední příklad. V tomto případě, pokud nějakým způsobem vložíme do běhového prostředí ID hodnotu null, bylo by skvělé okamžitě vědět, že jste to udělali, a není skvělé, že teď děláte chybu.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Chybu musíte vyvolat ne v okamžiku vytvoření uživatele, ale když nastavíte hodnotu null na ID. Proto v Builderu změníme setter Integer na int a hned bude přísahat, že vyhodili null.

Stručně řečeno, jaký to má smysl? Existuje jednoduchý vzor Builder, ale i jeho implementace má určité jemnosti, takže je velmi cool podívat se na různé implementace vzorů. Každý vzor má desítky implementací. To vše je velmi zajímavé.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Jak zapíšeme Builder do produkčního kódu? Zde je náš uživatel. K němu připojíme rotaci Buildera z knihovny Lombok a ona nám sama vygeneruje Builder. To znamená, že nepíšeme žádný kód, ale Java si již myslí, že tato třída má Builder, a můžeme to nazvat takto.

Už jsem řekl, že Java má knihovny téměř pro všechno, včetně Lomboku, skvělé knihovny, která vám umožní vyhnout se psaní standardních. Stavitel, GET.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Vzory mohou být architektonické – vztahující se nejen k jedné třídě, ale k systému jako celku. V návrhu systému existuje takový skvělý princip: Princip jednotné odpovědnosti. o čem to mluví? Skutečnost, že každá třída musí být zodpovědná za některé své vlastní funkce. V tomto případě máme Controller, který komunikuje s uživateli, objekty JSON. Existuje Facade, který převádí JSON objekty na modely, se kterými bude Java aplikace následně pracovat. Existuje služba, která má složitou logiku, která pracuje s těmito modely. Existuje objekt pro přístup k datům, který vloží tyto modely do databáze a načte je z databáze. A je tu samotná databáze. Jinými slovy, není to všechno v jedné třídě, ale děláme pět různých tříd, a to je jiný vzorec.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Jakmile se víceméně naučíte Javu, je skvělé napsat svůj vlastní projekt, který bude mít databázi, pracovat s jinými API a vystavit vaši serverovou aplikaci klientům REST API. To by bylo skvělé přidat do vašeho životopisu, byl by to skvělý konec vašeho vzdělávání. S tím můžete jít a získat práci.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Zde je příklad mé serverové aplikace. Ve druhém ročníku jsem s kluky napsal semestrální práci. Psali mobilní aplikaci pro pořádání akcí. Tam se uživatelé mohli přihlásit přes VKontakte, umisťovat body na mapu, vytvářet události, zvát na ně své přátele, ukládat obrázky událostí atd.

Co jsem v projektu dělal? Napsal serverovou aplikaci v Spring Boot bez použití SQL. Neznal jsem ho, používal jsem JPA. Co by to mohlo udělat? Přihlaste se do VK přes OAuth-2. Vezměte token uživatele, přejděte s ním do VK a zkontrolujte, zda se jedná o skutečného uživatele. Získejte informace o uživatelích prostřednictvím VKontakte. Byl schopen ukládat informace do databáze, také prostřednictvím JPA. Dovedně ukládejte obrázky a další soubory do paměti počítače a ukládejte na ně odkazy do databáze. V té době jsem nevěděl, že v databázi jsou objekty CLOB, tak jsem to udělal takto. Existovalo REST API pro uživatele, klientské aplikace. A proběhly jednotkové testy na základní funkčnost.

[…] Malý příklad mého úspěšného učení Javy. V prvním roce na univerzitě jsem se naučil C# a pochopil jsem OOP programování – co jsou třídy, rozhraní, abstrakce a proč jsou potřeba. Hodně mi to pomohlo. Bez toho je učení Java docela obtížné; není jasné, proč jsou potřebné třídy.

Proč se učit Javu a jak to dělat efektivně. Zpráva Yandex

Ve druhém ročníku na univerzitě opět učili Java core, ale nezůstal jsem jen u toho, sám jsem šel studovat Spring a napsal jsem seminární práci, svůj projekt, o kterém jsem se zmínil výše. A s tím vším jsem šel na stáž do Yandexu, absolvoval pohovor a dostal se na Yandex.Market. Tam jsem napsal backend pro Beru, to je naše tržiště, a pro samotný Yandex.Market.

Poté, před šesti měsíci, jsem přestoupil do jiného týmu na stejném trhu. Provádíme analýzy pro obchodní partnery. Jsme v analytické platformě, na backendu jsme tři, takže mám velký podíl na projektu. Je to vlastně velmi zajímavé. To znamená, že vlastně poskytujeme data o trhu – jaké jsou prodeje, v jakých kategoriích, v jakých modelech, pro obchodní partnery, velké známé firmy. A jsme jen tři, píšeme tento kód a je to velmi cool.

Děkuji! Užitečné odkazy:
- "Java 8. Průvodce pro začátečníky".
- Datové struktury.
- SQLZOO.
- Normalizace databáze.
- Designové vzory.
- Designové vzory.
- Čistý kód.
- Efektivní Java.

Zdroj: www.habr.com

Přidat komentář