Hvordan er Java sammenlignet med andre populĂŠre sprĂ„k? Hvorfor bĂžr Java vĂŠre det fĂžrste sprĂ„ket du bĂžr lĂŠre? La oss lage en plan som hjelper deg med Ă„ lĂŠre Java bĂ„de fra bunnen av og ved Ă„ bruke programmeringsferdigheter pĂ„ andre sprĂ„k. Vi vil ogsĂ„ fremheve forskjellene mellom Ă„ lage produksjonskode i Java og Ă„ utvikle pĂ„ andre sprĂ„k. Mikhail Zatepyakin holdt dette foredraget pĂ„ et mĂžte for fremtidige deltakere. Yandex og andre hĂ„pefulle utviklere â Java Junior-mĂžte.

Hei alle sammen, jeg heter Misha. Jeg er utvikler hos Yandex.Market, og i dag skal jeg fortelle deg hvorfor du bÞr lÊre Java og hvordan du gjÞr det effektivt. Du lurer kanskje pÄ hvorfor jeg skulle fortelle deg dette i stedet for en erfaren utvikler med mange Ärs erfaring? Saken er at jeg lÊrte Java nylig, for omtrent halvannet Är siden, sÄ jeg husker fortsatt hvordan det var og fallgruvene.
For et Ă„r siden fikk jeg et internship hos Yandex.Market. Jeg utviklet backend-plattformen for Beru, for selve markedet â du har sikkert brukt den. Jeg jobber fortsatt der nĂ„, i et annet team. Vi bygger Yandex.Markets analyseplattform for forretningspartnere.

La oss komme i gang. Hvorfor lÊre Java fra et praktisk synspunkt? Faktum er at Java er et veldig kjent programmeringssprÄk. Det har et veldig stort fellesskap.
For eksempel finnes det TIOBE-indeksen, en populÊr indeks over programmeringssprÄks popularitet, og Java rangerer fÞrst. PÄ jobbsider vil du sannsynligvis ogsÄ legge merke til at de fleste stillingsutlysningene er i Java, noe som betyr at du alltid vil kunne finne en jobb med utvikling i Java.
Siden fellesskapet er sÄ stort, finner du svar pÄ alle spÞrsmÄl du mÄtte ha pÄ Stack Overflow eller andre nettsteder. NÄr du utvikler i Java, skriver du faktisk kode pÄ JVM, slik at du enkelt kan gÄ over til Kotlin, Scala og andre sprÄk som bruker JVM.

Hva er sÄ bra med Java fra et ideologisk perspektiv? Det finnes forskjellige programmeringssprÄk. De lÞser forskjellige problemer, som du vet. For eksempel er Python flott for Ä skrive enlinjeskript for Ä lÞse raske oppgaver.
Du kan kontrollere den kjÞrbare koden fullt ut ved Ä bruke "+"-tasten. For eksempel har vi biler, Yandex sine selvkjÞrende biler, og koden deres er skrevet med "+"-tasten. Hvorfor? Java har en ting som heter Garbage Collector. Den tÞmmer RAM for unÞdvendige objekter. Denne tingen kjÞrer spontant og utfÞrer en "stopp-verden"-operasjon, som betyr at den stopper resten av programmet og begynner Ä telle objekter, og tÞmmer minnet for objekter. Hvis denne tingen skulle kjÞre i en selvkjÞrende bil, ville det vÊre en stor sak. Din selvkjÞrende bil ville kjÞre rett frem, tÞmme minnet og ikke fÞlge med pÄ veien i det hele tatt. Det er derfor den selvkjÞrende bilen er skrevet med "+"-tasten.

Hvilke problemer lÞser Java? Det er fÞrst og fremst et sprÄk for Ä utvikle store programmer som tar Är Ä skrive, utviklet av dusinvis eller hundrevis av mennesker. Spesielt mye av backend-systemet hos Yandex.Market er skrevet i Java. Vi har et distribuert team pÄ tvers av flere byer, ti personer i hver. Og koden er enkel Ä vedlikeholde; den har blitt vedlikeholdt i ti Är eller mer, og nye folk kommer stadig inn og forstÄr den.
Hvilke egenskaper bÞr et sprÄk ha for Ä gjÞre kode lett vedlikeholdbar og enkel Ä utvikle i store team? FÞrst og fremst bÞr det vÊre lesbart, og det bÞr vÊre enkelt Ä implementere komplekse arkitekturlÞsninger. Det vil si at det bÞr vÊre enkelt Ä skrive abstraksjoner pÄ hÞyt nivÄ og sÄ videre. Java tilbyr alt dette. Det er et objektorientert sprÄk. Det er virkelig enkelt Ä implementere abstraksjoner pÄ hÞyt nivÄ og komplekse arkitekturer.
Det finnes ogsÄ mange rammeverk og biblioteker for Java fordi sprÄket er over 15 Är gammelt. I lÞpet av den tiden har alt som kunne skrives blitt skrevet i det, sÄ det finnes tonnevis av biblioteker for alt du mÄtte trenge.

Hva er de viktigste ferdighetene, etter min mening, som en spirende Java-utvikler bÞr ha? FÞrst og fremst kunnskap om kjernesprÄket Java. Deretter kommer et slags Dependency Injection-rammeverk. Den neste taleren, Kirill, vil dekke dette mer detaljert. Jeg vil ikke gÄ for mye inn pÄ detaljer. Deretter kommer arkitektur og designmÞnstre. Vi mÄ kunne skrive arkitektonisk vakker kode for Ä bygge store applikasjoner. Og sÄ er det en slags SQL eller ORM for databaseoppgaver. Og dette gjelder mer for backend.

La oss komme i gang! Java-kjernen. Jeg skal ikke avslĂžre mye her â du mĂ„ kunne selve sprĂ„ket. Her er hva som er verdt Ă„ vĂŠre oppmerksom pĂ„. For det fĂžrste har Java gitt ut mange versjoner de siste Ă„rene. Det vil si at i 2014â2015 ble versjon 7 utgitt, deretter 8, 9, 10 â mange nye versjoner, og de introduserte mange kule nye funksjoner, som Java Stream API, lambdaer og sĂ„ videre. Dette er virkelig kule, nye funksjoner som brukes i produksjonskode, blir spurt om i intervjuer, og som er viktige Ă„ vite. SĂ„ ikke bare ta en bok fra Java 4-bibliotekhyllen og begynn Ă„ lĂŠre den. Her er planen: lĂŠr Java 8 eller hĂžyere.
Vi fÞlger nÞye med pÄ nye funksjoner som Stream API, var og sÄ videre. De blir spurt om i intervjuer og brukes stadig i produksjon. Stream API er mye kraftigere enn looper; det er en skikkelig kul funksjon. SÞrg for Ä fÞlge med.
Og sĂ„ finnes det alle slags ting som iteratorer, unntak og sĂ„ videre. Ting som virker uviktige for deg nĂ„r du skriver litt liten kode selv. Du trenger ikke disse unntakene â hvem trenger dem uansett? Men de vil definitivt bli spurt om i intervjuer, og de vil definitivt komme godt med i produksjon. Alt i alt er det verdt Ă„ vĂŠre oppmerksom pĂ„ unntak, iteratorer og andre ting.

Datastrukturer. Strukturer er viktige, og det er nyttig Ä vite mer enn bare eksistensen av sett, ordbÞker og ark. Du mÄ ogsÄ kjenne til de ulike implementeringene av strukturer. Java har for eksempel mange implementeringer av ordbÞker, inkludert HashMap og TreeMap. De har ulik asymptotisk oppfÞrsel og er strukturert forskjellig internt. Du mÄ vite forskjellene og nÄr du skal bruke hver av dem.
Det hadde ogsĂ„ vĂŠrt flott om du visste hvordan disse datastrukturene fungerer internt. Det vil si at du ikke bare kjenner til deres asymptotiske oppfĂžrsel â hvor lang tid et spill tar, hvor lang tid et pass tar â men hvordan strukturen fungerer internt â for eksempel hva en bĂžtte er i en HashMap.
TrÊr og grafer er ogsÄ verdt Ä vÊre oppmerksom pÄ. Disse er ikke veldig vanlige i produksjonskode, men de er en favoritt i intervjuer. Derfor mÄ du kunne bevege deg gjennom trÊr og grafer med bredde fÞrst og dybde fÞrst. Dette er alle enkle algoritmer.
SÄ snart du begynner Ä skrive stor, kompleks, bibliotekbasert kode med flere klasser, vil du innse at du sliter uten byggesystemer og avhengighetslÞsning. Disse er primÊrt Maven og Gradle. De lar deg importere biblioteker til prosjektet ditt pÄ én linje. Det vil si at du skriver en XML-fil pÄ én linje og importerer bibliotekene til prosjektet. De er utmerkede systemer. De er omtrent like; bruk enten Maven eller Gradle.
Deretter, litt versjonskontrollsystem. Jeg anbefaler Git fordi det er populĂŠrt og det finnes massevis av veiledninger. Nesten alle bruker Git; det er en kul ting, du kan ikke klare deg uten det.
Og et slags utviklingsmiljÞ. Jeg anbefaler IntelliJ IDEA. Det Þker hastigheten pÄ utviklingsprosessen, hjelper deg mye, skriver all standardkoden for deg, og alt i alt er det fantastisk.

Lenker fra lysbildet: ,
SQL. Litt om backend-utviklere. Det var faktisk en morsom historie her. To dager fĂžr mitt andre internship-intervju ringte HR-jenta meg og fortalte at jeg ville bli spurt om SQL og HTTP om to dager, og at jeg mĂ„tte lĂŠre det. Jeg visste praktisk talt ingenting om SQL eller HTTP. SĂ„ fant jeg denne kule nettsidenâ Jeg lĂŠrte SQL pĂ„ omtrent 12 timer, altsĂ„ SQL-syntaks, hvordan man skriver SELECT-spĂžrringer, JOIN-er og sĂ„ videre. Det er en skikkelig kul nettside, jeg anbefaler den pĂ„ det sterkeste. Jeg lĂŠrte bokstavelig talt 90 % av det jeg kan nĂ„ pĂ„ 12 timer.
Og det er ogsÄ flott Ä kunne databasearkitektur. Det inkluderer nÞkler, indekser og normalisering. Det finnes en serie innlegg om det pÄ Habr.

I tillegg til SQL har Java diverse objektrelasjonelle kartleggingssystemer som JPA. Det finnes noe kode. I den fĂžrste metoden finnes det noe SQL-kode: SELECT id name FROM info.users WHERE id IN userIds. Fra brukerdatabasen, fra tabellen, henter vi ID-ene og navnene deres.
Deretter er det en mapper som konverterer databaseobjektet til et Java-objekt. Og under det er det en tredje metode som faktisk kjÞrer denne koden. Ved hjelp av JPA kan alt dette erstattes med den enkle linjen nedenfor. Den gjÞr det samme: finner All ByIdIn. Det vil si at den genererer en SQL-spÞrring for deg basert pÄ metodenavnet.
Det er skikkelig kult. Jeg brukte JPA da jeg ikke kunne SQL. SĂ„ fĂžlg med. Hvis du er for lat til Ă„ lĂŠre SQL, er dette fantastisk. Og virkelig, fantastisk!

Spring. Hvem har hÞrt om noe slikt som Spring-rammeverket? Ser du hvor mange av dere det er? Det er ingen tilfeldighet. Spring er oppfÞrt i kravene til alle andre Java backend-stillingsutlysninger. Det er virkelig essensielt i storskala utvikling. Hva er Spring? FÞrst og fremst er det et Dependency Injection-rammeverk. Det er ogsÄ et tema. Neste taler. Men kort sagt, det er en ting som lar deg forenkle import av avhengigheter fra én klasse til en annen. Med andre ord, det forenkler kunnskapen om avhengigheter.
Spring Boot er en del av Spring som lar deg starte serverapplikasjonen din med et enkelt klikk. Du gÄr til THID, klikker pÄ et par knapper, og vips, serverapplikasjonen din er oppe og kjÞrer pÄ localhost 8080. SÄ du har ikke engang skrevet en linje med kode ennÄ, og den kjÞrer allerede. Det er en veldig kul funksjon. Hvis du skriver din egen, er det fantastisk!
Spring er et veldig stort rammeverk. Det setter ikke bare opp en serverapplikasjon og lÞser avhengighetsinjeksjon. Det lar deg gjÞre en hel haug med ting, inkludert Ä lage REST API-metoder. SÄ du skriver en metode, legger til Get mapping-annotasjonen i den, og sÄ har du en metode pÄ localhost som sier "Hello, World". To linjer med kode, og det fungerer. Ganske kult.
Spring forenkler ogsÄ skriving av tester. Testing er viktig i storskala utvikling. Kode mÄ testes. Java har et flott bibliotek for dette kalt JUnit 5. Og JUnit generelt, men den nyeste versjonen er versjon 5. Den har alt du trenger for testing, inkludert assersjoner og andre ting.
Og det finnes et fantastisk rammeverk som heter Mockito. Tenk deg at du har en funksjonalitet du vil teste. Funksjonaliteten gjÞr mange ting, inkludert Ä logge inn pÄ VKontakte med for eksempel ID-en din, og hente brukerens for- og etternavn fra ID-en. Du vil sannsynligvis ikke logge inn pÄ VKontakte i testene dine; det er rart. Men du mÄ teste funksjonaliteten, sÄ du simulerte denne klassen ved hjelp av Mockito.
Du vil si at nÄr en forespÞrsel med ID-en «slik og slik» kommer inn i denne klassen, returnerer den et etternavn, som «Vasya Pupkin». Og det vil fungere. SÄ du vil teste all funksjonaliteten ved hjelp av én enkelt simulert klasse. En veldig kul ting.

DesignmÞnstre. Hva er det? De er maler for Ä lÞse vanlige problemer som oppstÄr i utvikling. I utvikling mÞter vi ofte de samme eller lignende oppgavene som det ville vÊrt flott Ä lÞse. SÄ folk har kommet opp med beste praksis, maler for Ä lÞse disse problemene.
Det finnes en nettside med de mest populĂŠre mĂžnstrene â refactoring.guru. Du kan lese den, lĂŠre om de forskjellige mĂžnstrene og lese massevis av teori. Problemet er at den er praktisk talt ubrukelig. Faktisk er ikke mĂžnstre uten Ăžvelse spesielt nyttige.
Du vil hĂžre om mĂžnstre som Singletone eller Builder. Hvem har hĂžrt de ordene? Mange mennesker. Det finnes enkle mĂžnstre som det som du kan implementere selv. Men de fleste mĂžnstre â strategi, fabrikk, fasade â har ingen klar anvendelse.
FÞr du ser dette mÞnsteret brukt i andres kode, vil du ikke kunne bruke det selv. Derfor er det sÄ viktig Ä Þve med mÞnstre. Bare det Ä lese om dem pÄ refactoring.guru er ikke sÄ nyttig, men det er helt nÞdvendig.

Hvorfor trenger vi mÞnstre? La oss si at du har en klasse som heter Bruker. Den har en ID og et navn. Hver bruker mÄ ha bÄde en ID og et navn. Klassen er Þverst til venstre.
Hvordan kan man initialisere en bruker? Det finnes to alternativer: en konstruktĂžr eller en setter. Hva er ulempene med begge tilnĂŠrmingene?
Constructor.new User(7, "Bond"), ok. La oss nÄ si at vi ikke har en User-klasse, men noe annet, med syv numeriske felt. Du vil ha en konstruktÞr med syv pÄfÞlgende tall. Det er uklart hva disse tallene er, eller hvilket som tilsvarer hvilken egenskap. En konstruktÞr er ikke god nok.
Det andre alternativet er en setter. Du skriver tydelig: setId(7), setName("Bond") . Du forstĂ„r hvilken egenskap som tilsvarer hvilket felt. Men settere har et problem. For det fĂžrste kan du glemme Ă„ sette noe, og for det andre blir objektet ditt muterbart. Dette er ikke trĂ„dsikkert og reduserer lesbarheten til koden litt. SĂ„ folk kom opp med et kult mĂžnster â Builder.

Hva handler alt dette om? Vi skal prĂžve Ă„ kombinere fordelene med begge tilnĂŠrmingene â setter og konstruktĂžr â til Ă©n. Vi skal opprette et objekt, en Builder, som ogsĂ„ vil ha feltene Id og Name, som i seg selv vil bli bygget basert pĂ„ setteren, og som vil ha en Build-metode som returnerer en ny bruker med alle parameterne. Vi vil ende opp med et uforanderlig objekt og en setter. Kult!
Hva er problemene? Her har vi en klassisk Builder. Problemet er at vi fortsatt kan glemme Ä fÄ tilgang til et felt. Og hvis vi glemmer Ä fÄ tilgang til ID-en, i dette tilfellet, initialiseres den til null i Builder fordi int-typen ikke kan nullstilles. Og hvis vi lager navnet "Bond" og glemmer Ä fÄ tilgang til ID-en, vil vi ha en ny bruker med ID-en "0" og navnet "Bond". Ikke kult.
La oss prĂžve Ă„ bekjempe dette. I Builder endrer vi int til int slik at den kan nullstilles. NĂ„ er alt i orden.

Hvis vi prÞver Ä opprette en bruker med navnet «Bond» uten Ä spesifisere en ID, fÄr vi et nullpekerunntak fordi ID-en ikke kan settes til null, og Builder er null, nÊrmere bestemt et pekerunntak.

Men vi kan fortsatt glemme Ä sette navnet, sÄ vi setter objektreplayet til null. NÄr vi nÄ konstruerer objektet vÄrt fra Builder, sjekker den at feltet ikke kan nullstilles. Og det er ikke alt.
La oss se pÄ det siste eksemplet. I dette tilfellet, hvis vi pÄ en eller annen mÄte setter null i ID-kjÞretiden, ville det vÊre fint Ä vite med en gang at du gjorde det, og det er ikke kult at du nÄ gjÞr en feil.

Du mÄ ikke gi en feilmelding nÄr du oppretter brukeren, men nÄr du setter ID-en til null. SÄ i Builder endrer vi setteren fra Integer til int, og den vil umiddelbart klage om Ä sette en null.
SÄ, hva er poenget? Det finnes et veldig enkelt Builder-mÞnster, men selv implementeringen har sine egne finesser, sÄ det er veldig kult Ä se pÄ forskjellige mÞnsterimplementeringer. Hvert mÞnster har dusinvis av implementeringer. Det er veldig interessant.

Hvordan skriver vi en Builder i produksjonskode? Her er vÄr User. Vi legger til en Builder-rotasjon fra Lombok-biblioteket til den, og den genererer automatisk en Builder for oss. SÄ vi skriver ikke noe kode, men Java antar allerede at denne klassen har en Builder, og vi kan kalle den slik.
Jeg har allerede nevnt at Java har biblioteker for nesten alt, inkludert Lombok, et kult bibliotek som lar deg unngÄ Ä skrive en standardtekst. Builder, GET.

Det finnes arkitektoniske mĂžnstre â mĂžnstre som ikke bare gjelder for en enkelt klasse, men for systemet som helhet. Det finnes et kult prinsipp innen systemdesign: prinsippet om enkeltansvar. Hva betyr det? Det sier at hver klasse skal vĂŠre ansvarlig for sin egen funksjonalitet. I dette tilfellet har vi en kontroller som kommuniserer med brukere og JSON-objekter. Det finnes en fasade som konverterer JSON-objekter til modeller, som Java-applikasjonen deretter vil jobbe med. Det finnes en tjeneste som inneholder kompleks logikk som fungerer med disse modellene. Det finnes et datatilgangsobjekt som lagrer disse modellene i og henter dem fra databasen. Og sĂ„ er det selve databasen. Med andre ord, ikke alt dette er i Ă©n klasse; vi lager fem forskjellige klasser, som er et annet mĂžnster.

NÄr du mer eller mindre har mestret Java, er det flott Ä skrive ditt eget prosjekt som inkluderer en database, samhandler med andre API-er og leverer serverapplikasjonen din til REST API-klienter. Dette ville vÊre et flott tillegg til CV-en din; det er en kul mÄte Ä avrunde lÊringen din pÄ. Med dette kan du gÄ og fÄ deg en jobb.

Her er et eksempel pÄ serverapplikasjonen min. I mitt andre Är skrev jeg en semesteroppgave med en gruppe studenter. De bygde en mobilapp for Ä organisere arrangementer. Brukere kunne logge inn via VKontakte, plassere punkter pÄ kartet, opprette arrangementer, invitere vennene sine, lagre arrangementsbilder og sÄ videre.
Hva gjorde jeg i prosjektet? Jeg skrev en serverapplikasjon i Spring Boot, uten Ä bruke SQL. Jeg visste ikke om det, sÄ jeg brukte JPA. Hva kunne den gjÞre? Logge inn pÄ VK via OAuth-2. Ta brukerens token, bruk den til Ä logge inn pÄ VK, og bekreft at det er en ekte bruker. Hent brukerinformasjon via VKontakte. Den kunne lagre informasjon i databasen, ogsÄ ved hjelp av JPA. Den kunne lagre bilder og andre filer i datamaskinens minne og lagre lenker til dem i databasen. Jeg visste ikke om CLOB-objekter i databasen den gangen, sÄ jeg gjorde det pÄ den mÄten. Det fantes et REST API for brukere og klientapplikasjoner. Og det fantes enhetstester for hovedfunksjonaliteten.
[âŠ] Et kort eksempel pĂ„ min vellykkede Java-lĂŠring. I mitt fĂžrste Ă„r pĂ„ universitetet lĂŠrte jeg C# og om OOP-programmering â hva klasser, grensesnitt og abstraksjoner er, og hvorfor de er nĂždvendige. Dette hjalp meg virkelig. Uten dette er det ganske vanskelig Ă„ lĂŠre Java; det er uklart hvorfor klasser er nĂždvendige.

I mitt andre Är pÄ universitetet lÊrte de meg Java Core igjen, men jeg stoppet ikke der. Jeg fortsatte med Ä lÊre Spring selv og skrev en semesteroppgave, mitt eget prosjekt, som jeg nevnte ovenfor. Og med alt dette i tankene fikk jeg et internship hos Yandex, bestod intervjuet og ble ansatt hos Yandex.Market. Der skrev jeg backend-delen for Beru, markedsplassen vÄr, og for selve Yandex.Market.
Etter det, for seks mĂ„neder siden, gikk jeg over til et annet team i samme marked. Vi driver med analyser for forretningspartnere. Vi er pĂ„ analyseplattformen, og vi er tre pĂ„ backend-plattformen, sĂ„ jeg har stor innflytelse pĂ„ prosjektet. Det er veldig interessant. Vi leverer faktisk markedsdata â salgstrender, i hvilke kategorier, for hvilke modeller â for forretningspartnere, store, kjente selskaper. Og det er bare tre av oss som skriver denne koden, og det er veldig kult.
Takk! Nyttige lenker:
- .
- .
- .
- .
- .
- .
- .
- .
Kilde: www.habr.com
