Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Ako sa Java líši od iných populárnych jazykov? Prečo by mala byť Java prvým jazykom, ktorý sa treba naučiť? Poďme si vytvoriť plán, ktorý vám pomôže naučiť sa Javu od začiatku aj pomocou programovania v iných jazykoch. Uveďme si rozdiely medzi tvorbou produkčného kódu v Jave a vývojom v iných jazykoch. Michail Zatepyakin čítal túto správu na stretnutí pre budúcich účastníkov stáže Yandex a ďalší začínajúci vývojári - stretnutie Java Junior.


- Ahojte všetci, volám sa Misha. Som vývojár z Yandex.Market a dnes vám poviem, prečo sa učiť Java a ako to robiť efektívne. Môžete si položiť rozumnú otázku: prečo budem tento príbeh rozprávať ja a nie nejaký silný vývojár s dlhoročnými skúsenosťami? Faktom je, že sám som Javu študoval nedávno, asi pred rokom a pol, takže si dodnes pamätám, aké to bolo a aké sú tam úskalia.

Pred rokom som dostal stáž na Yandex.Market. Backend som vyvinul pre Beru, pre samotný Market, pravdepodobne ste ho použili. Teraz tam pokračujem v práci v inom tíme. Vytvárame analytickú platformu pre Yandex.Market pre obchodných partnerov.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Začnime. Prečo sa učiť Javu z praktického hľadiska? Faktom je, že Java je veľmi známy programovací jazyk. Má veľmi veľkú komunitu.

Existuje napríklad taký index TIOBE, populárny index obľúbenosti programovacích jazykov a Java je tam na prvom mieste. Na pracovných stránkach si tiež pravdepodobne všimnete, že väčšina voľných pracovných miest je o Jave, to znamená, že vývojom v Jave si prácu vždy nájdete.

Keďže komunita je veľmi veľká, na každú otázku, ktorú máte, nájdete odpoveď na niektorých stránkach Stack Overflow alebo iných. Pri vývoji v Jave tiež v skutočnosti píšete kód na JVM, takže môžete ľahko prejsť na Kotlin, Scala a ďalšie jazyky, ktoré používajú JVM.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Čo je dobré na Jave z ideologického hľadiska? Existujú rôzne programovacie jazyky. Riešia rôzne problémy, veď to poznáte. Napríklad Python je skvelý na písanie jednoriadkových skriptov na riešenie rýchlych problémov.

Pozitívom je, že môžete plne ovládať spustiteľný kód. Napríklad máme autá, autá bez vodiča Yandex, ich kód je napísaný v plusoch. prečo? Java má niečo také - Garbage Collector. Vyčistí RAM od nepotrebných predmetov. Táto vec sa spustí spontánne a vykoná stop-the-world, to znamená, že zastaví zvyšok programu a ide počítať objekty, vyčistiť pamäť objektov. Ak niečo také funguje v drone, nie je to v pohode. Váš dron bude jazdiť rovno, v tejto chvíli si vyčistí pamäť a nebude sa vôbec pozerať na cestu. Preto je dron napísaný na plusoch.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Aké problémy rieši Java? Je to predovšetkým jazyk na vývoj veľkých programov, ktoré sú napísané v priebehu rokov desiatkami alebo stovkami ľudí. Najmä veľa backendu v Yandex.Market je napísaných v jazyku Java. Máme rozmiestnený tím vo viacerých mestách, v každom desať ľudí. A kód sa ľahko udržiava, je podporovaný desať a viac rokov a zároveň prichádzajú noví ľudia a rozumejú tomuto kódu.

Aké vlastnosti by mal mať jazyk, aby bol kód v ňom ľahko podporovaný a aby sa dal ľahko rozvíjať vo veľkých tímoch. V prvom rade by to mal byť čitateľný kód a malo by sa dať ľahko implementovať zložité architektonické riešenia. To znamená, že by malo byť ľahké písať abstrakcie na vysokej úrovni atď. Toto všetko nám poskytuje Java. Toto je objektovo orientovaný jazyk. Je skutočne jednoduché implementovať abstrakcie na vysokej úrovni a zložité architektúry.

Pre Javu je tiež veľa frameworkov a knižníc, pretože jazyk je starý viac ako 15 rokov. Počas tejto doby bolo na ňom napísané všetko, čo sa dalo napísať, takže existujú tony knižníc pre všetko, čo by ste mohli potrebovať.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Aké základné zručnosti by podľa mňa mal mať začínajúci hráč JA? V prvom rade je to znalosť základného jazyka Java. Ďalej je tu nejaký rámec Dependency Injection. Ďalší rečník, Kirill, o tom bude hovoriť podrobnejšie. Nepôjdem príliš hlboko. Ďalej je to architektúra a dizajnové vzory. Aby sme mohli písať veľké aplikácie, musíme byť schopní písať architektonicky krásny kód. A to je nejaký druh SQL alebo ORM pre úlohy práce s databázou. A to platí skôr pre backend.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Choď! Jadro Java. Ameriku tu naozaj neobjavím – musíte poznať samotný jazyk. Čomu by ste mali venovať pozornosť. Po prvé, Java v posledných rokoch vydala veľa verzií, to znamená, že v rokoch 2014-2015 bola vydaná siedma, potom ôsma, deviata, desiata, veľa nových verzií a v nich bolo predstavených veľa nových skvelých vecí. , napríklad Java Stream API , lambda atď. Veľmi cool, čerstvé, skvelé veci, ktoré sa používajú v produkčnom kóde, na čo sa pýtajú na pohovoroch a ktoré potrebujete vedieť. Preto by ste nemali brať knihu z police v knižnici Java-4 a ísť sa ju učiť. Toto je náš plán: učíme sa Java-8 alebo vyššiu.

Veľkú pozornosť venujeme inováciám ako Stream API, var a pod. Pýtame sa na ne pri rozhovoroch a neustále sa využívajú vo výrobe. To znamená, že Stream API je oveľa chladnejšie ako slučky, vo všeobecnosti je to veľmi cool vec. Určite venujte pozornosť.

A sú tu všelijaké veci ako iterátory, výnimky a tak ďalej. Veci, ktoré sa vám zdajú nedôležité, pokiaľ sami napíšete nejaký malý kód. Nepotrebujete tieto výnimky, kto ich vlastne potrebuje? Ale určite sa ich budú pýtať na pohovoroch, určite sa vám budú hodiť pri výrobe. Vo všeobecnosti by ste mali venovať pozornosť Výnimkám, iterátorom a iným veciam.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Dátové štruktúry. Bez štruktúr sa nezaobídete, ale bude skvelé, ak neviete, že existujú sady, slovníky a listy. A tiež rôzne realizácie stavieb. Napríklad ten istý slovník v Jave má mnoho implementácií, vrátane HashMap a TreeMap. Majú rôznu asymptotiku, vo vnútri sú inak štruktúrované. Musíte vedieť, ako sa líšia a kedy použiť ktorý z nich.

Bude tiež veľmi cool, ak viete, ako tieto dátové štruktúry interne fungujú. To znamená, že nie je ľahké poznať ich asymptotiku - koľko funguje stávka, ako dlho funguje pass, ale ako funguje štruktúra vo vnútri - napríklad čo je vedro v HashMap.

Pozornosť sa oplatí venovať aj stromom a grafom. To sú veci, ktoré nie sú v produkčnom kóde veľmi bežné, no na pohovoroch sú obľúbené. V súlade s tým musíte byť schopní prechádzať stromami, grafmi na šírku a hĺbku. Všetko sú to jednoduché algoritmy.

Hneď ako začnete písať akýkoľvek veľký kód, zložitý, pomocou knižníc, kódu s viacerými triedami, zistíte, že bez budovania systémov a riešení závislostí je to pre vás ťažké. Sú to predovšetkým Maven a Gradle. Umožňujú vám importovať knižnice do vášho projektu v jednom riadku. To znamená, že napíšete jednoriadkový xml a importujete knižnice do projektu. Skvelé systémy. Sú približne rovnaké, použite buď jeden - Maven alebo Gradle.

Ďalej - nejaký systém správy verzií. Odporúčam Git, pretože je populárny a existuje veľa návodov. Takmer každý používa Git, je to skvelá vec, nemôžete bez neho žiť.

A nejaké vývojové prostredie. Odporúčam IntelliJ Idea. Výrazne to urýchľuje proces vývoja, veľa vám pomáha, píše za vás všetok štandardný kód, vo všeobecnosti je to v pohode.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Odkazy zo snímky: SQLZOO, habrapost

SQL. Trochu o backenderoch. V skutočnosti tu došlo k vtipnému prípadu. Dva dni pred druhým pohovorom na stáži mi volala personalistka, že o dva dni sa ma budú pýtať na SQL a HTTP, musím sa to naučiť. A o SQL alebo HTTP som nevedel takmer nič. A našiel som túto skvelú stránku - SQLZOO. Naučil som sa na ňom SQL za 12 hodín, teda syntax SQL, ako písať SELECT dotazy, JOIN atď. Veľmi super stránka, vrelo odporúčam. V skutočnosti som sa za 12 hodín naučil 90% toho, čo viem teraz.

A tiež je skvelé poznať databázovú architektúru. Sú to všetky druhy kľúčov, indexov, normalizácie. Na Habré je o tom séria príspevkov.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

V Jave sú okrem SQL všetky druhy objektovo-relačných mapovacích systémov, ako napríklad JPA. Existuje nejaký kód. V prvej metóde je nejaký SQL kód - SELECT id name FROM info.users WHERE id IN userIds. Z databázy užívateľov, z tabuľky, sa získajú ich ID a mená.

Ďalej je tu určitý mapovač, ktorý premení objekt zo základne na objekt Java. A nižšie je tretia metóda, ktorá tento kód skutočne vykonáva. Toto všetko sa dá nahradiť pomocou JPA jedným riadkom, ktorý je napísaný nižšie. Robí to isté – nájsť All ByIdIn. To znamená, že na základe názvu metódy vám vygeneruje SQL dotaz.

Veľmi super vec. Sám som, keď som nevedel SQL, používal JPA. Vo všeobecnosti dávajte pozor. Ak ste príliš leniví učiť sa SQL, je to katastrofa. A vo všeobecnosti oheň!

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Jar. Kto počul o niečom takom, ako je Spring framework? Vidíš koľko vás je? Nie bezdôvodne. Spring je zahrnutá v požiadavkách každej druhej voľnej pozície Java backendu. Bez toho skutočne nie je kam vo veľkom rozvoji. čo je jar? V prvom rade ide o rámec Dependency Injection. Aj o tomto povie ďalší reproduktor. Ale v skratke ide o vec, ktorá vám umožňuje jednoduchšie importovať závislosti niektorých tried do iných. To znamená, že znalosť závislostí je zjednodušená.

Spring Boot je kúsok Spring, ktorý vám umožňuje spustiť vašu serverovú aplikáciu jedným tlačidlom. Prejdete na THID, stlačíte niekoľko tlačidiel a teraz máte svoju serverovú aplikáciu spustenú na localhost 8080. To znamená, že ste ešte nenapísali ani jeden riadok kódu, ale už to funguje. Veľmi super vec. Ak napíšete niečo vlastné, pálite!

Jar je veľmi rozsiahly rámec. Nielenže zachytí vašu serverovú aplikáciu a vyrieši závislosť Injection. Umožňuje vám robiť veľa vecí vrátane vytvárania metód REST API. To znamená, že ste napísali nejakú metódu a pripojili ste k nej anotáciu Get mapping. A teraz už máte na localhoste nejakú metódu, ktorá vám napíše Hello world. Dva riadky kódu a funguje to. Dobré veci.

Jar uľahčuje aj písanie testov. Bez testovania vo veľkom vývoji to nejde. Kód je potrebné otestovať. Na tento účel má Java skvelú knižnicu JUnit 5. A JUnit všeobecne, no najnovšia verzia je už piata. Je tam všetko na testovanie, všelijaké tvrdenia a iné veci.

A je tu úžasný rámec Mockito. Predstavte si, že máte nejakú funkcionalitu, ktorú chcete otestovať. Funkcia robí veľa vecí, vrátane toho, že sa niekde uprostred prihlási do VKontakte napríklad pomocou vášho ID a získa meno a priezvisko používateľa VKontakte z ID. Pravdepodobne nezahrniete VKontakte do testov, to je zvláštne. Ale musíte otestovať funkčnosť, takže ste vytvorili túto triedu pomocou Mockito, mok it, napodobniť to.

Poviete si, že keď do tejto triedy príde požiadavka s takým a takým ID, vráti nejaké priezvisko, napríklad Vasya Pupkin. A bude to fungovať. To znamená, že otestujete všetky funkcie pre mok one class. Veľmi super vec.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Odkaz zo snímky

Dizajnové vzory. Čo to je? Sú to šablóny na riešenie typických problémov, ktoré vznikajú pri vývoji. Vo vývoji často vznikajú rovnaké alebo podobné problémy, ktoré by bolo skvelé nejako dobre vyriešiť. Preto ľudia prišli s osvedčenými postupmi, určitými šablónami, ako tieto problémy riešiť.

Existuje webová stránka s najpopulárnejšími vzormi - refactoring.guru, môžete si to prečítať, zistiť, aké vzory existujú, prečítať si veľa teórie. Problém je, že je to prakticky zbytočné. V skutočnosti vzory bez praxe nie sú obzvlášť užitočné.

Budete počuť o niektorých vzoroch ako Singletone alebo Builder. Kto počul tieto slová? Veľa ľudí. Existujú také jednoduché vzory, ktoré môžete implementovať sami. Ale väčšina vzorov: stratégia, továreň, fasáda - nie je jasné, kde ich aplikovať.

A kým v praxi neuvidíte v kóde inej osoby miesto, na ktoré je tento vzor aplikovaný, nebudete ho môcť použiť sami. Preto je pri vzoroch veľmi dôležitá prax. A len čítanie o nich na refactoring.guru nie je super užitočné, ale určite to stojí za to.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Prečo sú potrebné vzory? Povedzme, že máte určitú triedu používateľov. Má ID a meno. Každý používateľ musí mať ID aj meno. Vľavo hore je trieda.

Aké sú spôsoby inicializácie používateľa? Sú dve možnosti – buď konštruktor alebo nastavovač. Aké sú nevýhody oboch prístupov?

Konštruktér. nový používateľ (7, "Bond"), dobre. Teraz povedzme, že nemáme triedu User, ale nejakú inú, so siedmimi číselnými poľami. Budete mať konštruktor obsahujúci sedem po sebe idúcich čísel. Nie je jasné, o aké čísla ide a ktoré z nich patrí ku ktorej nehnuteľnosti. Dizajnér nie je skvelý.

Druhá možnosť je nastavovač. Jasne napíšete: setId(7), setName(“Bond”). Rozumiete, ktorá nehnuteľnosť patrí do ktorej oblasti. Ale seter má problém. Po prvé, môžete zabudnúť niečo priradiť a po druhé, váš objekt sa ukáže ako premenlivý. Toto nie je bezpečné pre vlákna a mierne to znižuje čitateľnosť kódu. Preto ľudia vymysleli cool vzor – Staviteľ.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

O čom to je? Pokúsme sa spojiť výhody oboch prístupov – nastavovača a konštruktéra – do jedného. Vytvoríme určitý objekt, Builder, ktorý bude mať aj polia Id a Name, ktorý sám bude zostavený na základe nastavovača a ktorý bude mať metódu Build, ktorá vám vráti nového používateľa so všetkými parametrami. Získame nemenný objekt a setra. Super!

Aké sú problémy? Máme tu klasického Buildera. Problém je, že stále môžeme zabudnúť na kontrolu v niektorom poli. A ak sme zabudli navštíviť ID, v tomto prípade sa v Builderi inicializuje na nulu, pretože typ int nie je nullable. A ak vytvoríme meno „Bond“ a zabudneme navštíviť ID office, budeme mať nového používateľa s ID „0“ a názvom „Bond“. Nie je v pohode.

Skúsme s tým bojovať. V Builderi zmeníme int na int, aby bolo možné nulovať. Teraz je všetko skvelé.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Ak sa pokúsime vytvoriť používateľa s menom „Bond“, pričom zabudneme zadať jeho ID, dostaneme výnimku s nulovým ukazovateľom, pretože ID nie je možné nulovať a Builder má nulovú, konkrétne výnimku ukazovateľa.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Stále však môžeme zabudnúť zadať názov, a tak nastavíme opakované prehrávanie objektu na hodnotu null. Teraz, keď vytvárame náš objekt z Buildera, skontroluje, či pole nemá hodnotu null. A to nie je všetko.

Pozrime sa na posledný príklad. V tomto prípade, ak by sme do runtime ID nejakým spôsobom vložili hodnotu null, bolo by skvelé okamžite vedieť, že ste to urobili a nie je skvelé, že teraz robíte chybu.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Chybu musíte vyhodiť nie v momente vytvárania používateľa, ale pri nastavení null na ID. Preto v Builderi zmeníme nastavovač Integer na int a hneď bude prisahať, že vyhodili null.

Aký to má v skratke zmysel? Existuje jednoduchý vzor Builder, ale aj jeho implementácia má určité jemnosti, takže je veľmi cool pozrieť sa na rôzne implementácie vzorov. Každý vzor má desiatky implementácií. Toto všetko je veľmi zaujímavé.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Ako napíšeme Builder do produkčného kódu? Tu je náš používateľ. K nej pripojíme rotáciu Buildera z knižnice Lombok a tá nám sama vygeneruje Buildera. To znamená, že nepíšeme žiadny kód, ale Java si už myslí, že táto trieda má Builder a môžeme to nazvať takto.

Už som povedal, že Java má knižnice takmer na všetko, vrátane Lomboku, skvelej knižnice, ktorá vám umožňuje vyhnúť sa písaniu štandardných. Staviteľ, GET.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Vzory môžu byť architektonické – súvisiace nielen s jednou triedou, ale so systémom ako celkom. V dizajne systému existuje taký skvelý princíp: princíp jednotnej zodpovednosti. o čom to hovorí? Skutočnosť, že každá trieda musí byť zodpovedná za niektoré zo svojich funkcií. V tomto prípade máme Controller, ktorý komunikuje s používateľmi, objektmi JSON. Existuje Facade, ktorý prevádza JSON objekty na modely, s ktorými bude Java aplikácia následne pracovať. Existuje služba, ktorá má komplexnú logiku, ktorá pracuje s týmito modelmi. Existuje objekt prístupu k údajom, ktorý vkladá tieto modely do databázy a získava ich z databázy. A je tu samotná databáza. Inými slovami, nie je to všetko v jednej triede, ale robíme päť rôznych tried, a to je iný vzor.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Keď sa už viac-menej naučíte Javu, je skvelé napísať si vlastný projekt, ktorý bude mať databázu, bude pracovať s inými API a vystaví vašu serverovú aplikáciu klientom REST API. Toto by bolo skvelé pridať do svojho životopisu, bol by to skvelý koniec vášho vzdelávania. S týmto môžete ísť a nájsť si prácu.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

Tu je príklad mojej serverovej aplikácie. V druhom ročníku som písal s chalanmi semestrálnu prácu. Písali mobilnú aplikáciu na organizovanie podujatí. Používatelia sa tam mohli prihlásiť cez VKontakte, umiestňovať body na mapu, vytvárať udalosti, pozývať na ne svojich priateľov, ukladať obrázky udalostí atď.

Čo som v projekte urobil? Napísal serverovú aplikáciu v Spring Boot bez použitia SQL. Nepoznal som ho, používal som JPA. Čo by to mohlo urobiť? Prihláste sa do VK cez OAuth-2. Vezmite token používateľa, prejdite s ním do VK a skontrolujte, či ide o skutočného používateľa. Prijímajte informácie o používateľoch prostredníctvom VKontakte. Dokázal ukladať informácie do databázy aj prostredníctvom JPA. Zručne uložte obrázky a iné súbory do pamäte počítača a uložte si na ne odkazy do databázy. Vtedy som nevedel, že v databáze sú objekty CLOB, tak som to urobil takto. Pre používateľov, klientske aplikácie existovalo REST API. A existovali testy jednotiek na základnú funkčnosť.

[…] Malý príklad môjho úspešného učenia sa jazyka Java. V prvom ročníku na univerzite som sa naučil C# a pochopil som OOP programovanie – čo sú triedy, rozhrania, abstrakcia a prečo sú potrebné. Veľmi mi to pomohlo. Bez toho je učenie Java dosť ťažké; nie je jasné, prečo sú potrebné triedy.

Prečo sa učiť Javu a ako to robiť efektívne. Správa Yandex

V druhom ročníku na univerzite opäť vyučovali Java core, ale nezostal som tam, sám som išiel študovať Spring a napísal som seminárnu prácu, môj projekt, ktorý som spomenul vyššie. A s tým všetkým som išiel na stáž do Yandexu, absolvoval som pohovor a dostal som sa na Yandex.Market. Tam som napísal backend pre Beru, toto je náš trh, a pre samotný Yandex.Market.

Potom, pred šiestimi mesiacmi, som prestúpil do iného tímu v rámci toho istého trhu. Robíme analýzy pre obchodných partnerov. Sme v analytickej platforme, na backende sme traja, takže mám veľký podiel na projekte. V skutočnosti je to veľmi zaujímavé. To znamená, že vlastne poskytujeme údaje o trhu – aké sú tržby, v akých kategóriách, v akých modeloch, pre obchodných partnerov, veľké známe spoločnosti. A sme len traja, píšeme tento kód a je to veľmi cool.

Ďakujem! Užitočné odkazy:
- "Java 8. Príručka pre začiatočníkov".
- Dátové štruktúry.
- SQLZOO.
- Normalizácia databázy.
- Dizajnové vzory.
- Dizajnové vzory.
- Čistý kód.
- Efektívna Java.

Zdroj: hab.com

Pridať komentár