Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Mille poolest Java erineb teistest populaarsetest keeltest? Miks peaks Java olema esimene keel, mida õppida? Koostame plaani, mis aitab Java keelt õppida nii nullist kui ka teistes keeltes programmeerimisoskusi rakendades. Loetleme erinevused Java-s tootmiskoodi loomise ja teistes keeltes arendamise vahel. Mihhail Zatepyakin luges seda aruannet tulevaste osalejate koosolekul praktikakohad Yandex ja teised alustavad arendajad - Java Junior kohtumine.


— Tere kõigile, minu nimi on Misha. Olen Yandex.Marketi arendaja ja täna ütlen teile, miks õppida Java-d ja kuidas seda tõhusalt teha. Võite küsida mõistliku küsimuse: miks räägin seda lugu mina, mitte mõni tugev paljude aastate kogemusega arendaja? Fakt on see, et ma ise õppisin Java keelt hiljuti, umbes poolteist aastat tagasi, nii et mäletan siiani, milline see oli ja millised lõksud seal on.

Aasta tagasi sain praktikale Yandex.Marketis. Arendasin taustaprogrammi Beru jaoks, turu enda jaoks, ilmselt kasutasite seda. Nüüd jätkan tööd seal, teises meeskonnas. Loome äripartneritele Yandex.Marketi jaoks analüütilise platvormi.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Alustame. Miks õppida Java-t praktilisest vaatenurgast? Fakt on see, et Java on väga kuulus programmeerimiskeel. Sellel on väga suur kogukond.

Näiteks on olemas selline TIOBE indeks, populaarne programmeerimiskeelte populaarsuse indeks ja Java on seal esikohal. Samuti märkad ilmselt töölehtedel, et enamus vabu töökohti puudutab Java ehk Java-s arendades leiab alati tööd.

Kuna kogukond on väga suur, leiavad kõik teie küsimused vastuse mõnel Stack Overflow'l või mõnel muul saidil. Samuti kirjutate Java-s arendades koodi JVM-is, nii et saate hõlpsalt lülituda Kotlini, Scala ja muude JVM-i kasutavate keelte juurde.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Mis on Javas ideoloogilisest vaatenurgast head? Programmeerimiskeeli on erinevaid. Nad lahendavad erinevaid probleeme, teate seda. Näiteks Python sobib suurepäraselt üherealiste skriptide kirjutamiseks kiirete probleemide lahendamiseks.

Positiivne on see, et saate käivitatavat koodi täielikult juhtida. Näiteks on meil autod, Yandexi juhita autod, nende kood on kirjutatud plussidega. Miks? Javas on selline asi – prügikoguja. See puhastab RAM-i mittevajalikest objektidest. See asi algab spontaanselt ja peatab maailma, st peatab ülejäänud programmi ja läheb objekte loendama, objektide mälu puhastama. Kui selline asi droonis töötab, pole see lahe. Teie droon sõidab otse, sel hetkel tühjendab oma mälu ja ei vaata üldse teed. Seetõttu on droon kirjutatud plussidele.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Milliseid probleeme Java lahendab? See on peamiselt keel suurte programmide arendamiseks, mis on kirjutatud aastate jooksul, kümnete või sadade inimeste poolt. Eelkõige on suur osa Yandex.Marketi taustaprogrammist kirjutatud Java keeles. Meil on mitmes linnas hajutatud meeskond, igas kümme inimest. Ja koodi on lihtne hooldada, seda on toetatud juba kümme aastat või rohkem ja samal ajal tulevad uued inimesed ja saavad sellest koodist aru.

Millised omadused peaksid ühel keelel olema, et selles olev kood oleks hõlpsasti toetatud ja et seda saaks suurtes meeskondades hõlpsasti arendada. Esiteks peaks see olema loetav kood ja sellega peaks olema lihtne teostada keerulisi arhitektuurseid lahendusi. See tähendab, et peaks olema lihtne kirjutada kõrgetasemelisi abstraktsioone jne. Kõik see on see, mida Java meile pakub. See on objektorienteeritud keel. Kõrgetasemelisi abstraktsioone ja keerulisi arhitektuure on tõesti lihtne rakendada.

Java jaoks on ka palju raamistikke ja teeke, sest keel on rohkem kui 15 aastat vana. Selle aja jooksul kirjutati sellele kõik, mida sai kirjutada, nii et kõige vajaliku jaoks on palju teeke.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Millised põhioskused peaksid minu arvates olema alustaval JA mängijal? Esiteks on see Java põhikeele tundmine. Järgmine on mingi sõltuvuse süstimise raamistik. Järgmine esineja Kirill räägib sellest põhjalikumalt. Ma ei lähe liiga sügavale. Järgmine on arhitektuur ja disainimustrid. Suurte rakenduste kirjutamiseks peame suutma kirjutada arhitektuuriliselt ilusat koodi. Ja see on mingi SQL või ORM andmebaasiga töötamiseks. Ja see kehtib rohkem taustaprogrammi kohta.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Mine! Java tuum. Ma ei avasta siin Ameerikat tegelikult – peate keelt ise teadma. Millele peaksite tähelepanu pöörama. Esiteks on Java viimastel aastatel välja andnud palju versioone, ehk siis aastatel 2014-2015 ilmus seitsmes, siis kaheksas, üheksas, kümnes, palju uusi versioone ja palju uusi ägedaid asju tutvustati neis. , näiteks Java Stream API , lambda jne. Väga lahedad, värsked, ägedad asjad, mida tootmiskoodis kasutatakse, mille kohta küsitakse intervjuudes ja mida peab teadma. Seetõttu ei tohiks võtta Java-4 raamatukogu riiulilt raamatut ja minna seda õppima. See on meie plaan: õpime Java-8 või uuema versiooni.

Pöörame suurt tähelepanu uuendustele nagu Stream API, var jne. Neid küsitakse intervjuude käigus ja neid kasutatakse pidevalt tootmises. See tähendab, et Stream API on palju lahedam kui silmused, üldiselt väga lahe asi. Pöörake kindlasti tähelepanu.

Ja seal on igasuguseid asju nagu iteraatorid, erandid ja nii edasi. Asjad, mis tunduvad teile ebaolulised, kuni kirjutate ise väikese koodi. Teil pole neid erandeid vaja, kellel neid ikkagi vaja on? Kuid neid küsitakse kindlasti intervjuudel, need on teile tootmises kindlasti kasulikud. Üldiselt peaksite pöörama tähelepanu eranditele, iteraatoritele ja muudele asjadele.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Andmestruktuurid. Te ei saa ilma struktuurideta, kuid see on suurepärane, kui te lihtsalt ei tea, et on olemas komplektid, sõnastikud ja lehed. Ja ka erinevad struktuuride teostused. Näiteks Java-sõnastikus on palju rakendusi, sealhulgas HashMap ja TreeMap. Neil on erinev asümptootikum, nad on sees erinevalt üles ehitatud. Peate teadma, kuidas need erinevad ja millal millist kasutada.

Samuti on väga lahe, kui teate, kuidas need andmestruktuurid sisemiselt töötavad. See tähendab, et pole lihtne teada nende asümptootikat - kui palju panus töötab, kui kaua pass töötab, aga kuidas see struktuur töötab - näiteks, mis on HashMapis kopp.

Tähelepanu tasub pöörata ka puudele ja graafikutele. Need on asjad, mida tootmiskoodis väga ei kohta, aga intervjuudes on need populaarsed. Sellest lähtuvalt peate suutma läbida puid, graafikuid laiuses ja sügavuses. Need kõik on lihtsad algoritmid.

Niipea, kui hakkate kirjutama suurt, keerulist koodi, kasutades teeke, mitme klassi koodi, mõistate, et ilma süsteemide loomise ja sõltuvuste lahendamiseta on teil raske. Need on peamiselt Maven ja Gradle. Need võimaldavad teil importida teeke oma projekti ühe reaga. See tähendab, et kirjutate üherealise xml-i ja impordite teegid projekti. Suurepärased süsteemid. Need on ligikaudu samad, kasutage ühte - Maven või Gradle.

Järgmine - mingi versioonikontrollisüsteem. Soovitan Gitit, sest see on populaarne ja seal on palju õpetusi. Peaaegu kõik kasutavad Giti, see on lahe asi, ilma selleta ei saa elada.

Ja mingi arengukeskkond. Soovitan IntelliJ Ideat. See kiirendab oluliselt arendusprotsessi, aitab teid palju, kirjutab teie eest kogu põhikoodi, üldiselt on see lahe.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Lingid slaidilt: SQLZOO, habrapost

SQL. Natuke tagamängijatest. Siin oli tegelikult üks naljakas juhtum. Kaks päeva enne teist praktikaintervjuud helistas mulle HR-tüdruk ja ütles, et kahe päeva pärast küsivad nad minult SQL-i ja HTTP kohta, ma pean selle ära õppima. Ja ma ei teadnud SQL-ist ega HTTP-st peaaegu midagi. Ja ma leidsin selle laheda saidi - SQLZOO. Õppisin sellel SQL-i 12 tunniga, mõtlen SQL-i süntaksit, SELECT päringute kirjutamist, JOIN-i jne. Väga lahe sait, soovitan soojalt. Tegelikult õppisin 12 tunniga 90% sellest, mida ma praegu tean.

Samuti on tore teada andmebaasi arhitektuuri. Need on igasugused võtmed, indeksid, normaliseerimine. Habres on selle kohta rida postitusi.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Javas on lisaks SQL-ile kõikvõimalikud objektide relatsiooni kaardistamise süsteemid nagu JPA. Seal on mingi kood. Esimeses meetodis on mingi SQL-kood - SELECT id nimi FROM info.users WHERE id IN userIds. Kasutajate andmebaasist, tabelist saadakse nende ID-d ja nimed.

Järgmiseks on teatud kaardistaja, mis muudab objekti baasist Java objektiks. Ja allpool on kolmas meetod, mis tegelikult selle koodi käivitab. Seda kõike saab JPA abil asendada ühe reaga, mis on kirjas allpool. See teeb sama – otsige üles All ByIdIn. See tähendab, et meetodi nime põhjal genereerib see teie jaoks SQL-päringu.

Väga lahe asi. Ma ise, kui ma SQL-i ei teadnud, kasutasin JPA-d. Üldiselt pöörake tähelepanu. Kui olete SQL-i õppimiseks liiga laisk, on see katastroof. Ja üldiselt tuld!

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Kevad. Kes on kuulnud sellisest asjast nagu kevadine raamistik? Kas näete, kui palju teid on? Mitte ilma põhjuseta. Kevad sisaldub iga teise Java taustaprogrammi vaba töökoha nõuetes. Ilma selleta pole suurt arengut tegelikult kusagil. Mis on kevad? Esiteks on see sõltuvuse süstimise raamistik. Ka selle kohta ütlen järgmine kõneleja. Lühidalt öeldes on see asi, mis võimaldab teil hõlbustada mõne klassi sõltuvuste importimist teistesse klassidesse. See tähendab, et sõltuvuste tundmine on lihtsustatud.

Spring Boot on Spring Boot, mis võimaldab teil oma serverirakendust käivitada ühe nupuga. Te lähete THID-i, vajutate paari nuppu ja nüüd on teie serverirakendus kohalikus hostis 8080 töös. See tähendab, et te pole veel ühtegi koodirida kirjutanud, kuid see juba töötab. Väga lahe asi. Kui kirjutad midagi oma, tule!

Kevad on väga suur raamistik. See mitte ainult ei võta teie serverirakendust ega lahenda sõltuvuse süstimist. See võimaldab teil teha palju asju, sealhulgas luua REST API meetodeid. See tähendab, et kirjutasite mõne meetodi ja lisasite sellele märkuse Hangi kaardistus. Ja nüüd on teil localhostis juba mõni meetod, mis kirjutab teile Hello world. Kaks rida koodi ja see töötab. Lahedad asjad.

Kevad teeb ka kontrolltööde kirjutamise lihtsamaks. Suures arenduses pole testimiseta mingit võimalust. Koodi tuleb testida. Javal on selleks otstarbeks lahe teek JUnit 5. Ja JUnit üldiselt, aga viimane versioon on viies. Testimiseks on kõik olemas, kõikvõimalikud väited ja muu.

Ja seal on suurepärane Mockito raamistik. Kujutage ette, et teil on mõni funktsioon, mida soovite testida. Funktsionaalsus teeb palju asju, sealhulgas logib see kuskil keskel sisse näiteks teie ID-ga VKontakte'i ja saab ID-lt VKontakte'i kasutaja ees- ja perekonnanime. Tõenäoliselt ei kaasa te VKontaktet testidesse, see on kummaline. Kuid peate funktsionaalsust testima, nii et tegite selle klassi, kasutades Mockito, mok it, imiteerides seda.

Te ütlete, et kui sellesse klassi tuleb päring sellise ja sellise ID-ga, tagastab see mõne perekonnanime, näiteks Vasja Pupkin. Ja see toimib. See tähendab, et testite kõiki mok ühe klassi funktsioone. Väga lahe asi.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Link slaidilt

Disaini mustrid. Mis see on? Need on mallid arenduses tekkivate tüüpiliste probleemide lahendamiseks. Arenduses tekivad sageli identsed või sarnased probleemid, mida oleks tore kuidagi hästi lahendada. Seetõttu mõtlesid inimesed välja parimad tavad, teatud mallid, kuidas neid probleeme lahendada.

Kõige populaarsemate mustritega on olemas veebisait - refactoring.guru, saate seda lugeda, uurida, millised mustrid on olemas, lugeda hunnikut teooriat. Probleem on selles, et see on praktiliselt kasutu. Tegelikult pole mustrid ilma harjutamiseta eriti kasulikud.

Saate kuulda mõnest mustrist, nagu Singleton või Builder. Kes neid sõnu kuulis? Palju inimesi. Seal on selliseid lihtsaid mustreid, mida saate ise rakendada. Kuid enamik mustreid: strateegia, tehas, fassaad - pole selge, kuhu neid rakendada.

Ja kuni te ei näe praktikas mõne teise inimese koodis kohta, millele seda mustrit rakendatakse, ei saa te seda ise rakendada. Seetõttu on praktika mustrite puhul väga oluline. Ja pelgalt nende kohta refaktoring.guru lugemine pole eriti kasulik, kuid seda tasub kindlasti teha.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Miks on mustreid vaja? Oletame, et teil on teatud kasutajaklass. Sellel on ID ja nimi. Igal kasutajal peab olema nii ID kui ka nimi. Üleval vasakul on klassiruum.

Millised on kasutaja lähtestamise viisid? On kaks võimalust – kas konstruktor või seadja. Millised on mõlema lähenemisviisi puudused?

Konstruktor. uus kasutaja (7, "Bond"), olgu. Nüüd oletame, et meil pole mitte kasutajaklass, vaid mõni muu seitsme numbriväljaga klass. Teil on konstruktor, mis sisaldab seitset järjestikust numbrit. Mis need numbrid on ja milline neist millisele kinnistule kuulub, pole selge. Disainer pole suurepärane.

Teine võimalus on seadja. Kirjutate selgelt: setId(7), setName("Bond"). Saate aru, milline vara mis valdkonda kuulub. Kuid setteril on probleem. Esiteks võite unustada midagi määrata ja teiseks osutub teie objekt muutuvaks. See ei ole lõime ohutu ja vähendab veidi koodi loetavust. Seetõttu mõtlesid inimesed välja laheda mustri – Builder.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Millest see jutt käib? Proovime kombineerida mõlema lähenemisviisi – seadja ja konstruktori – eelised ühes. Teeme kindla objekti Builder, millel on ka väljad Id ja Name, mis ise ehitatakse üles seadja põhjal ja millel on Build meetod, mis tagastab sulle uue Kasutaja koos kõigi parameetritega. Saame muutumatu objekti ja setteri. Lahe!

Millised on probleemid? Siin on meil klassikaline Builder. Probleem on selles, et me võime ikkagi unustada mõnes valdkonnas kontrollimise. Ja kui me unustasime ID-d külastada, siis antud juhul Builderis lähtestatakse see nulliks, kuna int-tüüpi ei saa nullida. Ja kui teeme nimeks “Võlakiri” ja unustame ID-kontorit külastada, saame uue Kasutaja ID-ga “0” ja nimega “Võlakiri”. Pole lahe.

Proovime selle vastu võidelda. Builderis muudame int väärtuseks int, nii et see on nullitav. Nüüd on kõik suurepärane.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Kui proovime luua Kasutajat nimega “Bond”, unustades sisestada tema ID, saame null pointeri erandi, kuna ID ei ole nulleeritav ja Builderil on null, täpsemalt pointer erand.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Kuid me võime siiski unustada nime panna, seega määrame objekti taasesituse väärtuseks null. Nüüd, kui ehitame oma objekti Builderist, kontrollib see, et väli poleks nullitav. Ja see pole veel kõik.

Vaatame viimast näidet. Sel juhul, kui paneksime ID käitusajale kuidagi nulli, oleks tore kohe teada, et tegite seda ja pole lahe, et praegu vea teete.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Vea tuleb esitada mitte kasutaja loomise hetkel, vaid siis, kui määrate ID-le null. Seetõttu muudame Builderis seadja Integer väärtuseks int ja ta vannub kohe, et nad viskasid välja nulli.

Lühidalt, mis mõte sellel on? On olemas lihtne Builderi muster, kuid isegi selle rakendamisel on mõningaid nüansse, seega on väga lahe vaadata erinevaid mustrite rakendusi. Igal mustril on kümneid rakendusi. See kõik on väga huvitav.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Kuidas kirjutada Builder tootmiskoodi? Siin on meie kasutaja. Kinnitame sellele Lomboki teegist Builderi rotatsiooni ja see ise loob meile Builderi. See tähendab, et me ei kirjuta ühtegi koodi, kuid Java arvab juba, et sellel klassil on Builder ja me saame seda niimoodi nimetada.

Olen juba öelnud, et Java-l on teegid peaaegu kõige jaoks, sealhulgas Lomboki jaoks, lahe teegi jaoks, mis võimaldab vältida katlakivi kirjutamist. Ehitaja, GET.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Mustrid võivad olla arhitektuursed – seotud mitte ainult ühe klassiga, vaid kogu süsteemiga. Süsteemi disainis on selline lahe põhimõte: Single Responsibility Principle. Millest ta räägib? Asjaolu, et iga klass peab vastutama mõne oma funktsionaalsuse eest. Sel juhul on meil kontroller, mis suhtleb kasutajate, JSON-objektidega. Seal on Facade, mis teisendab JSON-objektid mudeliteks, millega Java rakendus siis töötab. Nende mudelitega töötab keeruka loogikaga teenus. Seal on Data Access Object, mis paneb need mudelid andmebaasi ja hangib need andmebaasist välja. Ja seal on andmebaas ise. Teisisõnu, see pole kõik ühes klassis, vaid me teeme viis erinevat klassi ja see on teine ​​muster.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Kui olete Java enam-vähem selgeks õppinud, on suurepärane kirjutada oma projekt, millel on andmebaas, mis töötab teiste API-dega ja paljastab teie serverirakenduse REST API klientidele. See oleks suurepärane asi, mida oma CV-sse lisada, see oleks lahe lõpp teie haridusele. Sellega saate minna ja tööd saada.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Siin on näide minu serverirakendusest. Teisel kursusel kirjutasin poistega kursusetööd. Nad kirjutasid ürituste korraldamiseks mobiilirakendust. Seal said kasutajad VKontakte kaudu sisse logida, kaardile punkte paigutada, sündmusi luua, sõpru neile külla kutsuda, sündmuste pilte salvestada jne.

Mida ma projektis tegin? Kirjutas Spring Booti serverirakenduse ilma SQL-i kasutamata. Ma ei tundnud teda, kasutasin JPA-d. Mida see teha võiks? Logige VK-sse sisse OAuth-2 kaudu. Võtke kasutaja tunnus, minge sellega VK-sse, kontrollige, kas tegemist on päris kasutajaga. Saate kasutajate kohta teavet VKontakte'i kaudu. See suutis salvestada teavet andmebaasi, ka JPA kaudu. Salvestage oskuslikult pilte ja muid faile arvuti mällu ning salvestage nende lingid andmebaasi. Sel ajal ma ei teadnud, et andmebaasis on CLOB-objekte, nii et tegin seda nii. Seal oli REST API kasutajatele, kliendirakendustele. Ja põhifunktsionaalsuse jaoks tehti seadmetestid.

[…] Väike näide minu edukast Java õppimisest. Esimesel ülikooliaastal õpetati mulle C# ja anti arusaam OOP programmeerimisest – mis on klassid, liidesed, abstraktsioon ja miks neid vaja on. See aitas mind palju. Ilma selleta on Java õppimine üsna keeruline; pole selge, miks klasse vaja on.

Miks õppida Java-d ja kuidas seda tõhusalt teha. Yandexi aruanne

Teisel ülikooliaastal õpetasid nad taas Java tuuma, kuid ma ei peatunud sellega, läksin ise kevadet õppima ja kirjutasin kursusetöö, oma projekti, mida eespool mainisin. Ja kõige selle juures läksin Yandexi praktikale, läbisin intervjuu ja pääsesin Yandex.Marketisse. Seal kirjutasin taustaprogrammi Beru jaoks, see on meie turg, ja Yandex.Marketi enda jaoks.

Pärast seda läksin kuus kuud tagasi üle sama Marketi teise meeskonda. Teeme äripartneritele analüütikat. Oleme analüütilises platvormis, tagaprogrammis on meid kolm, seega on mul projektis väga suur mõju. See on tegelikult väga huvitav. See tähendab, et me tegelikult esitame andmeid turu kohta - milline on müük, mis kategooriates, millistes mudelites, äripartneritele, suurtele tuntud ettevõtetele. Ja meid on ainult kolm, me kirjutame selle koodi ja see on väga lahe.

Aitäh! Kasulikud lingid:
- "Java 8. Juhend algajatele".
- Andmestruktuurid.
- SQLZOO.
- Andmebaasi normaliseerimine.
- Kujundusmustrid.
- Disainimustrid.
- Puhas kood.
- Tõhus Java.

Allikas: www.habr.com

Lisa kommentaar