Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Kako se Java razlikuje od drugih popularnih jezika? Zašto bi Java trebala biti prvi jezik za učenje? Kreirajmo plan koji će ti pomoći da naučiš Javu od nule i primjenom vještina programiranja na drugim jezicima. Navedimo razlike između stvaranja proizvodnog koda u Javi i razvoja u drugim jezicima. Mikhail Zatepyakin pročitao je ovo izvješće na sastanku za buduće sudionike pripravnički staž Yandex i drugi programeri početnici - Java Junior susret.


— Pozdrav svima, moje ime je Misha. Ja sam programer iz Yandex.Marketa i danas ću vam reći zašto naučiti Javu i kako to učiniti učinkovito. Možete postaviti razumno pitanje: zašto ću ja pričati ovu priču, a ne neki jaki programer s dugogodišnjim iskustvom? Činjenica je da sam Javu studirao nedavno, prije otprilike godinu i pol, pa se još uvijek sjećam kako je to bilo i kakve zamke postoje.

Prije godinu dana dobio sam praksu u Yandex.Marketu. Razvio sam backend za Beru, za sam Market, vjerojatno ste ga koristili. Sada nastavljam raditi tamo, u drugom timu. Izrađujemo analitičku platformu za Yandex.Market za poslovne partnere.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Započnimo. Zašto naučiti Javu s praktične točke gledišta? Činjenica je da je Java vrlo poznat programski jezik. Ima vrlo veliku zajednicu.

Primjerice, postoji takav TIOBE indeks, popularni indeks popularnosti programskih jezika, i tu je Java na prvom mjestu. Također, na stranicama za zapošljavanje vjerojatno ćete primijetiti da je većina natječaja vezana uz Javu, odnosno razvojem u Javi uvijek možete pronaći posao.

Budući da je zajednica vrlo velika, na svako pitanje koje imate pronaći ćete odgovor na nekim Stack Overflow ili drugim stranicama. Također, kada razvijate u Javi, vi zapravo pišete kod na JVM, tako da se lako možete prebaciti na Kotlin, Scala i druge jezike koji koriste JVM.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Što je dobro u Javi s ideološke točke gledišta? Postoje različiti programski jezici. Oni rješavaju različite probleme, znate to. Na primjer, Python je izvrstan za pisanje skripti u jednom retku za rješavanje brzih problema.

S pozitivne strane, možete u potpunosti kontrolirati izvršni kod. Na primjer, imamo automobile, Yandex automobile bez vozača, njihov kod je napisan u plusevima. Zašto? Java ima takvu stvar - Garbage Collector. Čisti RAM od nepotrebnih objekata. Ova stvar se pokreće spontano i radi stop-the-world, odnosno zaustavlja ostatak programa i ide na brojanje objekata, brisanje memorije objekata. Ako takvo što funkcionira u dronu, nije cool. Vaš dron će voziti ravno, u ovom trenutku očistiti memoriju i uopće neće gledati na cestu. Stoga je dron zapisan na plusevima.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Koje probleme rješava Java? To je primarno jezik za razvijanje velikih programa koje godinama pišu deseci ili stotine ljudi. Konkretno, velik dio pozadine u Yandex.Marketu napisan je u Javi. Imamo raspoređen tim u nekoliko gradova, po deset ljudi. A kod je jednostavan za održavanje, ima podršku deset i više godina, a u isto vrijeme dolaze novi ljudi koji razumiju ovaj kod.

Koje karakteristike treba imati jezik kako bi se kod u njemu lako podržavao i kako bi se mogao lako razvijati u velikim timovima. Prije svega, to bi trebao biti čitljiv kod i trebao bi biti jednostavan za implementaciju složenih arhitektonskih rješenja. To jest, trebalo bi biti jednostavno pisati apstrakcije visoke razine, itd. Sve je to ono što nam Java pruža. Ovo je objektno orijentirani jezik. Zaista je lako implementirati apstrakcije visoke razine i složene arhitekture.

Također postoji mnogo okvira i biblioteka za Javu, jer je jezik star više od 15 godina. Za to vrijeme na njemu je ispisano sve što se moglo napisati, tako da postoje tone biblioteka za sve što bi vam moglo zatrebati.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Koje bi osnovne vještine, po mom mišljenju, trebao imati početnik JA igrač? Prije svega, ovo je poznavanje Java core jezika. Sljedeća je neka vrsta Dependency Injection frameworka. Sljedeći govornik, Kirill, govorit će o tome detaljnije. Neću ići preduboko. Sljedeći su obrasci arhitekture i dizajna. Moramo biti u stanju napisati arhitektonski lijep kod kako bismo pisali velike aplikacije. A ovo je neka vrsta SQL-a ili ORM-a za zadatke rada s bazom podataka. A ovo se više odnosi na pozadinu.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Ići! Java jezgra. Neću baš otkriti Ameriku ovdje - morate znati sam jezik. Na što treba obratiti pozornost. Prvo, Java je izdala puno verzija zadnjih godina, odnosno 2014-2015 izašla je sedma, zatim osma, deveta, deseta, puno novih verzija, i puno novih cool stvari je uvedeno u njih , na primjer, Java Stream API, lambda, itd. Jako cool, svježe, cool stvari koje se koriste u proizvodnom kodu, o čemu se pitaju na intervjuima i koje morate znati. Stoga ne biste trebali uzeti knjigu s police u knjižnici Java-4 i otići je učiti. Ovo je naš plan: učimo Javu-8 ili noviju.

Veliku pozornost posvećujemo inovacijama kao što su Stream API, var, itd. Postavljaju se tijekom intervjua i stalno se koriste u proizvodnji. Odnosno, Stream API je puno hladniji od petlji, općenito, vrlo cool stvar. Obavezno obratite pozornost.

I postoje razne stvari poput iteratora, iznimaka i tako dalje. Stvari koje vam se čine nevažnima sve dok sami pišete neki mali kod. Ne trebaju vam ove iznimke, tko ih uopće treba? Ali sigurno će ih se pitati na razgovorima, sigurno će vam koristiti u proizvodnji. Općenito, trebali biste obratiti pozornost na iznimke, iteratore i druge stvari.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Strukture podataka. Ne možete bez struktura, ali bit će sjajno ako ne znate samo da postoje setovi, rječnici i listovi. I također različite implementacije struktura. Na primjer, isti rječnik u Javi ima mnogo implementacija, uključujući HashMap i TreeMap. Imaju različite asimptotike, drugačije su strukturirani iznutra. Morate znati po čemu se razlikuju i kada koju koristiti.

Također će biti vrlo cool ako znate kako te strukture podataka interno funkcioniraju. Odnosno, nije lako znati njihovu asimptotiku - koliko ulog funkcionira, koliko dugo prolazi prolaz, ali kako unutarnja struktura funkcionira - na primjer, što je kanta u HashMapu.

Također vrijedi obratiti pozornost na stabla i grafikone. To su stvari koje nisu baš uobičajene u produkcijskom kodu, ali su popularne u intervjuima. U skladu s tim, morate biti u mogućnosti prelaziti stabla, grafikone u širinu i dubinu. Sve su to jednostavni algoritmi.

Čim počnete pisati bilo kakav veliki kod, složen, koristeći biblioteke, multi-class kod, shvatit ćete da vam je teško bez izgradnje sustava i rješavanja ovisnosti. To su prvenstveno Maven i Gradle. Omogućuju vam uvoz knjižnica u vaš projekt u jednom retku. To jest, pišete xml u jednom retku i uvozite biblioteke u projekt. Sjajni sustavi. Otprilike su isti, koristite bilo koji - Maven ili Gradle.

Dalje - neka vrsta sustava kontrole verzija. Preporučujem Git jer je popularan i ima gomilu tutorijala. Gotovo svi koriste Git, to je cool stvar, ne možete živjeti bez njega.

I nekakvo razvojno okruženje. Preporučam IntelliJ Idea. Uvelike ubrzava razvojni proces, puno vam pomaže, piše sav šablonski kod za vas, općenito je super.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Linkovi sa slajda: SQLZOO, habrapost

SQL. Malo o backenderima. Ovdje je zapravo bio smiješan slučaj. Dva dana prije drugog intervjua za praksu me nazvala cura iz HR-a i rekla da će me za dva dana pitati za SQL i HTTP, moram to naučiti. I nisam znao gotovo ništa o SQL-u ili HTTP-u. I našao sam ovu cool stranicu - SQLZOO. Naučio sam SQL na njemu u 12 sati, mislim, SQL sintaksu, kako napisati SELECT upite, JOIN, itd. Vrlo cool stranica, toplo je preporučujem. Zapravo, u 12 sati naučio sam 90% onoga što sada znam.

Također je sjajno poznavati arhitekturu baze podataka. To su sve vrste ključeva, indeksa, normalizacija. Postoji niz objava o tome na Habréu.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

U Javi, uz SQL, postoje sve vrste sustava objektno-relacijskog mapiranja kao što je JPA. Postoji neka šifra. U prvoj metodi postoji neki SQL kod - SELECT id name FROM info.users WHERE id IN userIds. Iz baze korisnika, iz tablice, dobivaju se njihovi ID-ovi i imena.

Zatim, postoji određeni maper koji objekt iz baze pretvara u Java objekt. Postoji i treća metoda u nastavku koja zapravo izvršava ovaj kod. Sve se to može zamijeniti korištenjem JPA s jednim redom, koji je napisan ispod. Radi istu stvar - pronalazi All ByIdIn. To jest, na temelju naziva metode, generira SQL upit za vas.

Jako cool stvar. I sam sam, kada nisam znao SQL, koristio JPA. Općenito, obratite pozornost. Ako ste previše lijeni da naučite SQL, to je katastrofa. I, općenito, vatra!

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Proljeće. Tko je čuo za tako nešto kao Spring framework? Vidite li koliko vas je? Ne bez razloga. Spring je uključen u zahtjeve za svako drugo slobodno radno mjesto u Java backendu. Bez toga nema stvarno nigdje velikog razvoja. Što je proljeće? Prije svega, ovo je Dependency Injection framework. I o ovome reći ću sljedeći govornik. Ali ukratko, ovo je stvar koja vam omogućuje da olakšate uvoz ovisnosti nekih klasa o drugima. Odnosno, znanje o ovisnostima je pojednostavljeno.

Spring Boot je dio Springa koji vam omogućuje pokretanje vaše poslužiteljske aplikacije jednim gumbom. Idete na THID, pritisnete nekoliko gumba i sada imate svoju poslužiteljsku aplikaciju pokrenutu na localhost 8080. Odnosno, još niste napisali niti jednu liniju koda, ali već radi. Jako cool stvar. Ako napišeš nešto svoje, pali!

Proljeće je vrlo velik okvir. Ne samo da preuzima vašu poslužiteljsku aplikaciju i rješava Dependency Injection. Omogućuje vam da radite hrpu stvari, uključujući stvaranje REST API metoda. To jest, napisali ste neku metodu i priložili joj napomenu Get mapping. I sad već imate neku metodu na localhostu koja vam piše Hello world. Dvije linije koda i radi. Cool stvari.

Spring također olakšava pisanje testova. Nema načina bez testiranja u velikom razvoju. Kod treba testirati. Za tu svrhu Java ima cool biblioteku JUnit 5. I JUnit općenito, ali zadnja verzija je peta. Ima svega za testiranje, svakakvih tvrdnji i ostalog.

A tu je i sjajan okvir Mockito. Zamislite da imate neku funkcionalnost koju želite testirati. Funkcionalnost radi puno toga, uključujući, negdje u sredini, prijavljuje se na VKontakte s vašim ID-om, na primjer, i prima ime i prezime VKontakte korisnika iz ID-a. Vjerojatno nećete uključiti VKontakte u testove, to je čudno. Ali morate testirati funkcionalnost, pa ste napravili ovu klasu, koristeći Mockito, mok, imitaciju.

Reći ćete da kada zahtjev dođe u ovu klasu s takvim i takvim ID-om, vraća neko prezime, na primjer, Vasya Pupkin. I uspjet će. Odnosno, testirat ćete sve funkcionalnosti za mok one class. Jako cool stvar.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Link sa slajda

Dizajn uzorci. Što je? Ovo su predlošci za rješavanje tipičnih problema koji se javljaju u razvoju. U razvoju se često javljaju identični ili slični problemi koje bi bilo super riješiti nekako dobro. Stoga su ljudi došli do najboljih praksi, određenih predložaka, kako riješiti te probleme.

Postoji web stranica s najpopularnijim uzorcima - refactoring.guru, možete ga pročitati, saznati koji uzorci postoje, pročitati hrpu teorije. Problem je što je praktički beskoristan. Zapravo, uzorci bez prakse nisu osobito korisni.

Čut ćete za neke obrasce kao što su Singletone ili Builder. Tko je čuo ove riječi? Mnogo ljudi. Postoje tako jednostavni obrasci koje možete sami implementirati. Ali većina uzoraka: strategija, tvornica, fasada - nije jasno gdje ih primijeniti.

I dok u praksi ne vidite u kodu neke druge osobe mjesto na koje se primjenjuje ovaj obrazac, nećete ga moći sami primijeniti. Stoga je vrlo važna praksa kod krojeva. I samo čitanje o njima na refactoring.guru nije od velike pomoći, ali svakako vrijedi.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Zašto su uzorci potrebni? Recimo da imate određenu korisničku klasu. Ima ID i ime. Svaki korisnik mora imati i ID i ime. Gore lijevo je učionica.

Koji su načini inicijalizacije korisnika? Postoje dvije opcije - ili konstruktor ili postavljač. Koji su nedostaci oba pristupa?

Konstruktor. novi korisnik (7, "Bond"), u redu. Sada recimo da nemamo klasu User, već neku drugu, sa sedam numeričkih polja. Imat ćete konstruktor koji sadrži sedam uzastopnih brojeva. Nije jasno koji su to brojevi i koji od njih pripada kojem posjedu. Dizajner nije sjajan.

Druga opcija je postavljač. Jasno pišete: setId(7), setName(“Bond”). Razumijete koja imovina pripada kojem polju. Ali postavljač ima problem. Prvo, možete zaboraviti nešto dodijeliti, a drugo, vaš objekt se može promijeniti. Ovo nije sigurno niti i malo smanjuje čitljivost koda. Zato su ljudi smislili cool uzorak - Builder.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

o cemu se radi Pokušajmo kombinirati prednosti oba pristupa - postavljača i konstruktora - u jednom. Napravimo određeni objekt, Builder, koji će također imati polja Id i Name, koji će sam biti izgrađen na temelju settera, a koji će imati Build metodu koja vam vraća novog korisnika sa svim parametrima. Dobivamo nepromjenjivi objekt i postavljač. cool!

Koji su problemi? Ovdje imamo klasičnog Graditelja. Problem je što još uvijek možemo zaboraviti provjeriti neko polje. A ako smo zaboravili posjetiti ID, u ovom slučaju u Builderu on se inicijalizira na nulu, jer tip int nije nullable. A ako napravimo Naziv “Bond” i zaboravimo posjetiti ID ured, imat ćemo novog Korisnika s ID-om “0” i imenom “Bond”. Nije cool.

Pokušajmo se boriti protiv ovoga. U Builderu ćemo promijeniti int u int tako da bude nullable. Sada je sve super.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Ako pokušamo stvoriti korisnika s imenom “Bond”, zaboravljajući staviti njegov ID, dobit ćemo iznimku null pokazivača, jer ID nije nullable, a Builder ima null, konkretno iznimku pokazivača.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Ali još uvijek možemo zaboraviti staviti ime, pa postavljamo replay objekta na null. Sada, kada gradimo naš objekt iz Buildera, on provjerava da polje nije nullable. I to nije sve.

Pogledajmo posljednji primjer. U ovom slučaju, ako nekako stavimo null u vrijeme izvođenja ID-a, bilo bi sjajno odmah znati da ste to učinili i nije cool što sada griješite.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Morate izbaciti pogrešku ne u trenutku stvaranja korisnika, već kada postavite null za ID. Stoga ćemo u Builderu postavljača Integera promijeniti u int, a on će se odmah zakleti da su izbacili null.

Ukratko, koja je poanta? Postoji jednostavan Builder obrazac, ali čak i njegova implementacija ima neke suptilnosti, tako da je vrlo cool pogledati različite implementacije uzoraka. Svaki uzorak ima desetke implementacija. Sve je ovo jako zanimljivo.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Kako pišemo Builder u proizvodnom kodu? Ovdje je naš korisnik. Prilažemo mu rotaciju Graditelja iz knjižnice Lombok, a on sam generira Graditelja za nas. Odnosno, mi ne pišemo nikakav kod, ali Java već misli da ova klasa ima Builder i možemo je nazvati ovako.

Već sam rekao da Java ima biblioteke za gotovo sve, uključujući Lombok, cool biblioteku koja vam omogućuje da izbjegnete pisanje šablona. Graditelj, DOBITI.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Uzorci mogu biti arhitektonski - vezani ne samo za jednu klasu, već i za sustav u cjelini. Postoji tako cool načelo u dizajnu sustava: načelo jedinstvene odgovornosti. O čemu on priča? Činjenica da svaka klasa mora biti odgovorna za neku svoju funkcionalnost. U ovom slučaju imamo Controller koji komunicira s korisnicima, JSON objektima. Postoji Facade, koji pretvara JSON objekte u modele s kojima će onda raditi Java aplikacija. Postoji usluga koja ima složenu logiku koja radi s ovim modelima. Postoji Data Access Object koji te modele stavlja u bazu podataka i dohvaća ih iz baze podataka. A tu je i sama baza podataka. Drugim riječima, nije sve u jednoj klasi, nego radimo pet različitih klasa, a to je još jedan obrazac.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Nakon što više-manje naučite Javu, super je napisati vlastiti projekt koji će imati bazu podataka, raditi s drugim API-jima i izložiti svoju poslužiteljsku aplikaciju REST API klijentima. Ovo bi bilo sjajno dodati svom životopisu, bio bi to super završetak vašeg obrazovanja. S ovim možete otići i naći posao.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Evo primjera moje poslužiteljske aplikacije. Na drugoj godini sam s dečkima napisao seminarski rad. Pisali su mobilnu aplikaciju za organizaciju događanja. Tamo su se korisnici mogli prijaviti putem VKontaktea, postavljati točke na karti, stvarati događaje, pozivati ​​svoje prijatelje na njih, spremati slike događaja itd.

Što sam napravio u projektu? Napisao poslužiteljsku aplikaciju u Spring Bootu bez korištenja SQL-a. Nisam ga poznavao, koristio sam JPA. Što bi to moglo učiniti? Prijavite se u VK putem OAuth-2. Uzmite korisnički token, idite s njim u VK, provjerite je li to pravi korisnik. Primajte informacije o korisnicima putem VKontakte. Mogao je spremiti informacije u bazu podataka, također putem JPA. Vješto spremajte slike i druge datoteke u memoriju računala, a poveznice na njih spremajte u bazu podataka. U to vrijeme nisam znao da postoje CLOB objekti u bazi podataka, pa sam to napravio na ovaj način. Postojao je REST API za korisnike, klijentske aplikacije. A bilo je i jediničnih testova za osnovnu funkcionalnost.

[…] Mali primjer mog uspješnog učenja Jave. Na mojoj prvoj godini sveučilišta učili su me C# i dali su mi razumijevanje OOP programiranja - što su klase, sučelja, apstrakcija i zašto su potrebni. Puno mi je pomoglo. Bez toga je učenje Jave prilično teško; nije jasno zašto su potrebni časovi.

Zašto naučiti Javu i kako to učiniti učinkovito. Yandex izvješće

Na mojoj drugoj godini sveučilišta, opet su predavali Java core, ali nisam tu stao, već sam sam otišao studirati Spring i napisao kolegij, svoj projekt, koji sam gore spomenuo. Uz sve to, otišao sam na praksu u Yandex, prošao intervju i ušao u Yandex.Market. Tu sam napisao backend za Beru, ovo je naše tržište, i za sam Yandex.Market.

Nakon toga, prije šest mjeseci, prešao sam u drugu ekipu unutar istog Marketa. Radimo analitiku za poslovne partnere. Mi smo u analitičkoj platformi, troje nas je na backendu, tako da imam jako veliki udio utjecaja na projekt. Vrlo je zanimljivo, zapravo. Odnosno, mi zapravo dajemo podatke o tržištu - kolika je prodaja, u kojim kategorijama, u kojim modelima, za poslovne partnere, velike poznate tvrtke. I samo nas je troje, mi pišemo ovaj kod i jako je cool.

Hvala vam! Korisni linkovi:
- "Java 8. Vodič za početnike".
- Strukture podataka.
- SQLZOO.
- Normalizacija baze podataka.
- Dizajn uzorci.
- Uzorci dizajna.
- Čisti kod.
- Učinkovita Java.

Izvor: www.habr.com

Dodajte komentar