Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Po čemu se Java razlikuje od drugih popularnih jezika? Zašto bi Java trebala biti prvi jezik za učenje? Hajde da napravimo plan koji će vam pomoći da naučite Javu od nule i primenom veština programiranja na drugim jezicima. Hajde da navedemo razlike između kreiranja proizvodnog koda u Javi i razvoja na drugim jezicima. Mikhail Zatepyakin je pročitao ovaj izvještaj na sastanku za buduće učesnike stažiranje Yandex i drugi programeri početnici - Java Junior susret.


— Zdravo svima, zovem se Miša. Ja sam programer sa Yandex.Marketa i danas ću vam reći zašto naučiti Javu i kako to učiniti efikasno. Možda ćete postaviti razumno pitanje: zašto ću ja pričati ovu priču, a ne neki jak programer sa dugogodišnjim iskustvom? Činjenica je da sam i sam studirao Javu nedavno, prije otprilike godinu i po dana, pa se još uvijek sjećam kako je to bilo i koje su zamke tu.

Prije godinu dana sam dobio praksu na Yandex.Marketu. Razvio sam backend za Beru, za sam Market, vjerovatno ste ga koristili. Sada nastavljam da radim tamo, u drugom timu. Kreiramo analitičku platformu za Yandex.Market za poslovne partnere.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Hajde da počnemo. Zašto učiti Javu sa praktične tačke gledišta? Činjenica je da je Java veoma poznat programski jezik. Ima veoma veliku zajednicu.

Na primjer, postoji takav TIOBE indeks, popularni indeks popularnosti programskih jezika, a Java je tu na prvom mjestu. Takođe, na sajtovima za zapošljavanje ćete verovatno primetiti da je većina slobodnih radnih mesta vezana za Javu, odnosno razvojem u Javi uvek možete pronaći posao.

Pošto je zajednica veoma velika, na svako pitanje koje imate naći ćete odgovor na nekim Stack Overflow ili drugim sajtovima. Takođe, kada razvijate u Javi, vi zapravo pišete kod na JVM-u, 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 efikasno. Yandex izvještaj

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

S druge strane, možete u potpunosti kontrolirati izvršni kod. Na primjer, imamo automobile, Yandex automobile bez vozača, njihov kod je napisan plusovima. Zašto? Java ima takvu stvar - Garbage Collector. Čisti RAM od nepotrebnih objekata. Ova stvar se pokreće spontano i zaustavlja svijet, odnosno zaustavlja ostatak programa i ide na brojanje objekata, čišćenje memorije objekata. Ako tako nešto radi u dronu, nije kul. Vaš dron će voziti pravo, u ovom trenutku očistiti svoje pamćenje i uopšte ne gledati u cestu. Stoga je dron napisan na profesionalcima.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Koje probleme rješava Java? To je prvenstveno jezik za razvoj velikih programa koje godinama pišu desetine ili stotine ljudi. Konkretno, veliki deo pozadinskog dela u Yandex.Marketu je napisan na Javi. Imamo raspoređeni tim u nekoliko gradova, po deset ljudi u svakom. A kod je jednostavan za održavanje, podržava ga deset godina ili više, a u isto vrijeme dolaze novi ljudi i razumiju ovaj kod.

Koje karakteristike jezik treba da ima da bi kod u njemu bio lako podržan i da bi se mogao lako razvijati u velikim timovima. Prije svega, to bi trebao biti čitljiv kod i trebao bi biti lak za implementaciju složenih arhitektonskih rješenja. Odnosno, trebalo bi da bude lako pisati apstrakcije visokog nivoa, itd. Sve ovo je ono što nam Java pruža. Ovo je objektno orijentisani jezik. Zaista je lako implementirati apstrakcije visokog nivoa i složene arhitekture.

Takođe postoji mnogo okvira i biblioteka za Javu, jer je jezik star više od 15 godina. Za to vrijeme na njemu je napisano sve što se moglo napisati, tako da postoji mnoštvo biblioteka za sve što vam može zatrebati.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Koje osnovne vještine, po mom mišljenju, treba da ima početnik JA igrač? Prije svega, ovo je poznavanje jezgra Java jezika. Sljedeća je neka vrsta okvira za ubrizgavanje zavisnosti. Sljedeći govornik, Kiril, će o tome detaljnije govoriti. Neću ići previše duboko. Sljedeća je arhitektura i obrasci dizajna. Moramo biti u stanju pisati arhitektonski lijep kod kako bismo pisali velike aplikacije. A ovo je neka vrsta SQL-a ili ORM-a za zadatke rada sa bazom podataka. A ovo se više odnosi na pozadinu.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Idi! Java jezgro. Neću zaista otkriti Ameriku ovdje - morate znati sam jezik. Na šta treba obratiti pažnju. Prvo, Java je izdala dosta verzija posljednjih godina, odnosno 2014-2015 je objavljena sedma, zatim osma, deveta, deseta, puno novih verzija, i puno novih cool stvari je uvedeno u njih , na primjer, Java Stream API, lambda, itd. Vrlo cool, svježe, cool stvari koje se koriste u produkcijskom kodu, o čemu pitaju na intervjuima i koje trebate znati. Stoga, ne bi trebalo da uzimate knjigu sa police u biblioteci Java-4 i da je naučite. Ovo je naš plan: učimo Java-8 ili noviji.

Veliku pažnju posvećujemo inovacijama kao što su Stream API, var, itd. Oni se pitaju tokom intervjua i stalno se koriste u produkciji. Odnosno, Stream API je mnogo hladniji od petlji, generalno, vrlo kul stvar. Obavezno obratite pažnju.

I postoje razne stvari kao što su iteratori, izuzeci i tako dalje. Stvari koje vam se čine nevažnim sve dok sami pišete neki mali kod. Ne trebaju vam ovi izuzeci, kome su uopće potrebni? Ali sigurno će ih pitati na intervjuima, sigurno će vam biti korisni u produkciji. Općenito, trebali biste obratiti pažnju na izuzetke, iteratore i druge stvari.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Strukture podataka. Ne možete bez struktura, ali bić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 strukturirane iznutra. Morate znati po čemu se razlikuju i kada koristiti koju.

Također će biti super ako znate kako ove strukture podataka rade interno. Odnosno, nije lako znati njihovu asimptotiku - koliko opklada radi, koliko dugo prolaz radi, ali kako struktura funkcionira iznutra - na primjer, što je kanta u HashMapu.

Također je vrijedno obratiti pažnju na stabla i grafove. To su stvari koje nisu baš uobičajene u produkcijskom kodu, ali su popularne u intervjuima. Shodno tome, morate biti u mogućnosti da prelazite stabla, grafikone po širini i dubini. Ovo su sve jednostavni algoritmi.

Čim počnete da pišete bilo koji veliki kod, složen, koristeći biblioteke, kod sa više klasa, shvatićete da vam je teško bez izgradnje sistema i rešavanja zavisnosti. To su prvenstveno Maven i Gradle. Oni vam omogućavaju da uvezete biblioteke u svoj projekat u jednom redu. To jest, pišete jednoredni xml i uvozite biblioteke u projekat. Odlični sistemi. Oni su otprilike isti, koristite bilo jedan - Maven ili Gradle.

Dalje - neka vrsta sistema kontrole verzija. Preporučujem Git jer je popularan i ima tone tutorijala. Skoro svi koriste Git, to je super stvar, ne možete živjeti bez njega.

I neka vrsta razvojnog okruženja. Preporučujem IntelliJ Idea. To uvelike ubrzava proces razvoja, puno vam pomaže, piše sav osnovni kod za vas, općenito, super je.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Linkovi sa slajda: SQLZOO, habrapost

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

Takođe je sjajno poznavati arhitekturu baze podataka. To su sve vrste ključeva, indeksa, normalizacije. Na Habréu postoji niz postova o tome.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

U Javi, pored SQL-a, postoje sve vrste objektno-relacijskih sistema 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 podataka korisnika, iz tabele, dobijaju se njihovi ID i nazivi.

Zatim, postoji određeni maper koji pretvara objekat iz baze u Java objekat. I postoji treći metod ispod koji zapravo izvršava ovaj kod. Sve se to može zamijeniti pomoću JPA sa jednom linijom, što je napisano ispod. Radi istu stvar - pronađite All ByIdIn. Odnosno, na osnovu naziva metode, generiše SQL upit za vas.

Vrlo kul stvar. I ja sam, kada nisam znao SQL, koristio JPA. Općenito, obratite pažnju. 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 efikasno. Yandex izvještaj

Proljeće. Ko je čuo za tako nešto kao što je Spring framework? Vidite li koliko vas ima? Ne bez razloga. Spring je uključen u zahtjeve svakog drugog Java backend upražnjenog mjesta. Bez toga, zaista nema nigde od velikog razvoja. Šta je proljeće? Prije svega, ovo je okvir za ubrizgavanje zavisnosti. I o ovome će reći sljedeći govornik. Ali ukratko, ovo je stvar koja vam omogućava da olakšate uvoz zavisnosti nekih klasa u druge. To jest, poznavanje zavisnosti je pojednostavljeno.

Spring Boot je dio Spring koji vam omogućava da pokrenete svoju serversku aplikaciju sa jednim dugmetom. Odete na THID, pritisnete nekoliko dugmadi i sada imate pokrenutu i pokrenutu serversku aplikaciju na lokalnom hostu 8080. Odnosno, još niste napisali niti jednu liniju koda, ali već radi. Vrlo kul stvar. Ako napišeš nešto svoje, pali!

Proljeće je veoma veliki okvir. Ne samo da preuzima vašu serversku aplikaciju i rješava ubacivanje zavisnosti. Omogućava vam da uradite gomilu stvari, uključujući kreiranje REST API metoda. To jest, napisali ste neku metodu i na nju priložili napomenu Get mapping. I sada već imate neki metod na lokalnom hostu koji vam piše Hello world. Dvije linije koda i radi. Cool stvari.

Proljeće 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 najnovija verzija je peta. Ima svega za testiranje, svakakve tvrdnje i ostalo.

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

Reći ćete da kada zahtjev dođe u ovu klasu s takvim i takvim ID-om, on vraća neko prezime, na primjer, Vasya Pupkin. I to će uspjeti. Odnosno, testiraćete svu funkcionalnost za mok one klase. Vrlo kul stvar.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Link sa slajda

Dizajnerski obrasci. Šta je to? Ovo su šabloni za rešavanje tipičnih problema koji se javljaju u razvoju. U razvoju se često javljaju identični ili slični problemi koje bi bilo sjajno nekako dobro riješiti. Stoga su ljudi došli do najboljih praksi, određenih šablona, ​​kako riješiti ove probleme.

Postoji web stranica sa najpopularnijim obrascima - refactoring.guru, možete ga pročitati, saznati koji obrasci postoje, pročitati gomilu teorije. Problem je što je praktično beskorisno. U stvari, obrasci bez prakse nisu posebno korisni.

Čut ćete o nekim uzorcima kao što su Singletone ili Builder. Ko je čuo ove riječi? Puno ljudi. Postoje tako jednostavni obrasci koje možete sami implementirati. Ali većina obrazaca: strategija, tvornica, fasada - nije jasno gdje ih primijeniti.

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

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Zašto su potrebni uzorci? 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 za inicijalizaciju korisnika? Postoje dvije opcije - ili konstruktor ili seter. Koji su nedostaci oba pristupa?

Konstruktor. novi korisnik (7, "Bond"), u redu. Sada recimo da nemamo User klasu, 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 kojoj svojini pripada. Dizajner nije sjajan.

Druga opcija je seter. Vi jasno pišete: setId(7), setName(“Bond”). Razumijete koje svojstvo pripada kojem polju. Ali seter ima problem. Prvo, možda ćete zaboraviti da nešto dodelite, a drugo, vaš objekat se ispostavi da je promenljiv. Ovo nije nit sigurno i malo smanjuje čitljivost koda. Zato su ljudi smislili kul obrazac - Builder.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

o čemu se radi? Pokušajmo kombinirati prednosti oba pristupa – postavljača i konstruktora – u jednom. Pravimo određeni objekat, Builder, koji će takođe imati polja Id i Name, koji će sam biti izgrađen na osnovu setera, i koji će imati Build metodu koja vam vraća novog korisnika sa svim parametrima. Dobijamo nepromjenjivi objekt i seter. Cool!

koji su problemi? Ovdje imamo klasični Builder. Problem je u tome što još uvijek možemo zaboraviti provjeriti u nekom polju. A ako smo zaboravili da posjetimo ID, u ovom slučaju u Builderu je inicijaliziran na nulu, jer tip int nije nullable. A ako napravimo Ime “Bond” i zaboravimo posjetiti ID ured, imat ćemo novog Korisnika sa ID-om “0” i imenom “Bond”. Nije kul.

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 efikasno. Yandex izvještaj

Ako pokušamo da kreiramo korisnika sa imenom “Bond”, zaboravljajući da unesemo njegov ID, dobićemo izuzetak null pokazivača, jer ID nije nullable, a Builder ima null, posebno pokazivač izuzetak.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

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

Pogledajmo posljednji primjer. U ovom slučaju, ako nekako stavimo null u ID runtime, bilo bi sjajno odmah znati da ste to učinili i nije cool da sada pravite grešku.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Morate izbaciti grešku ne u trenutku kreiranja korisnika, već kada postavite null na ID. Stoga ćemo u Builderu promijeniti integer integer u int, a on će se odmah zakleti da su izbacili null.

Ukratko, koja je poenta? Postoji jednostavan Builder obrazac, ali čak i njegova implementacija ima neke suptilnosti, tako da je vrlo cool pogledati različite implementacije obrazaca. Svaki obrazac ima desetine implementacija. Ovo je sve veoma interesantno.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Kako pišemo Builder u proizvodnom kodu? Ovdje je naš korisnik. Na njega prilažemo rotaciju Buildera iz Lombok biblioteke, a ona sama generiše Builder za nas. Odnosno, 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 skoro sve, uključujući Lombok, cool biblioteku koja vam omogućava da izbegnete pisanje šablona. Graditelj, GET.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Uzorci mogu biti arhitektonski - vezani ne samo za jednu klasu, već i za sistem u cjelini. Postoji tako kul princip u dizajnu sistema: princip jedinstvene odgovornosti. o cemu on prica? Činjenica da svaka klasa mora biti odgovorna za neku svoju funkcionalnost. U ovom slučaju imamo kontroler koji komunicira sa korisnicima, JSON objekte. Postoji Facade, koji pretvara JSON objekte u modele sa kojima će Java aplikacija tada raditi. Postoji usluga koja ima složenu logiku koja radi sa ovim modelima. Postoji objekt pristupa podacima koji ove modele stavlja u bazu podataka i preuzima ih iz baze podataka. A tu je i sama baza podataka. Drugim riječima, nije sve u jednom razredu, već pravimo pet različitih klasa, a to je drugi obrazac.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Nakon što ste manje-više naučili Javu, sjajno je napisati svoj vlastiti projekat koji će imati bazu podataka, raditi s drugim API-jima i izlagati vašu serversku aplikaciju REST API klijentima. Ovo bi bilo sjajno dodati svom životopisu, bio bi to cool završetak vašeg obrazovanja. Sa ovim možete otići i dobiti posao.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Evo primjera moje serverske aplikacije. Na drugoj godini, napisao sam seminarski rad sa momcima. Pisali su mobilnu aplikaciju za organizaciju događaja. Tamo su se korisnici mogli prijaviti putem VKontaktea, postaviti tačke na mapu, kreirati događaje, pozvati svoje prijatelje na njih, sačuvati slike događaja itd.

Šta sam radio u projektu? Napisao serversku aplikaciju u Spring Boot-u bez korištenja SQL-a. Nisam ga poznavao, koristio sam JPA. Šta bi to moglo učiniti? Prijavite se na VK preko OAuth-2. Uzmite korisnički token, idite s njim na VK, provjerite da li je to pravi korisnik. Primajte informacije o korisnicima putem VKontaktea. Bio je u mogućnosti da sačuva informacije u bazi podataka, takođe preko JPA. Vešto spremajte slike i druge datoteke u memoriju računara, a linkove do njih sačuvajte u bazi podataka. U to vrijeme nisam znao da postoje CLOB objekti u bazi podataka, pa sam to uradio na ovaj način. Postojao je REST API za korisnike, klijentske aplikacije. A postojali su i jedinični testovi za osnovnu funkcionalnost.

[…] Mali primjer mog uspješnog učenja Jave. Na mojoj prvoj godini na univerzitetu, učili su me C# i dali su mi razumijevanje za OOP programiranje – šta su klase, interfejsi, apstrakcija i zašto su potrebni. To mi je puno pomoglo. Bez toga je učenje Jave prilično teško; nije jasno zašto su potrebne klase.

Zašto naučiti Javu i kako to učiniti efikasno. Yandex izvještaj

Na mojoj drugoj godini univerziteta ponovo su predavali Java jezgro, ali nisam stao na tome, već sam otišao da učim Spring i napisao kurs, moj projekat, koji sam pomenuo gore. I uz sve to, otišao sam na praksu u Yandex, prošao intervju i ušao u Yandex.Market. Tamo 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 drugi tim u okviru istog Marketa. Radimo analitiku za poslovne partnere. Mi smo u analitičkoj platformi, nas je troje na backendu, tako da ja imam jako veliki udio u projektu. Veoma je interesantno, zapravo. Odnosno, mi zapravo dajemo podatke o tržištu – kakva je prodaja, u kojim kategorijama, u kojim modelima, za poslovne partnere, velike poznate kompanije. I samo nas je troje, pišemo ovaj kod, i to je jako cool.

Hvala ti! Korisni linkovi:
- "Java 8. Vodič za početnike".
- Strukture podataka.
- SQLZOO.
- Normalizacija baze podataka.
- Design Patterns.
- Uzorci dizajna.
- Clean Code.
- Efektivna Java.

izvor: www.habr.com

Dodajte komentar