Kā Java atšķiras no citām populārām valodām? Kāpēc Javai vajadzētu būt pirmajai valodai, kas jāapgūst? Izveidosim plānu, kas palīdzēs apgūt Java gan no nulles, gan pielietojot programmēšanas prasmes citās valodās. Uzskaitīsim atšķirības starp ražošanas koda izveidi Java un izstrādi citās valodās. Mihails Zatepjakins nolasīja šo ziņojumu nākamo dalībnieku sanāksmē Yandex un citi iesācēji izstrādātāji - Java Junior meetup.

- Sveiki visiem, mani sauc Miša. Es esmu Yandex.Market izstrādātājs, un šodien es jums pastāstīšu, kāpēc mācīties Java un kā to izdarīt efektīvi. Jūs varat uzdot saprātīgu jautājumu: kāpēc es stāstīšu šo stāstu, nevis kāds spēcīgs izstrādātājs ar daudzu gadu pieredzi? Fakts ir tāds, ka es pats nesen, apmēram pirms pusotra gada, studēju Java, tāpēc es joprojām atceros, kā tas bija un kādas ir tās nepilnības.
Pirms gada es stažējos Yandex.Market. Izstrādāju aizmuguri priekš Beru, pašam tirgum, tu droši vien izmantoji. Tagad turpinu tur strādāt, citā komandā. Mēs izveidojam analītisko platformu Yandex.Market biznesa partneriem.

Sāksim. Kāpēc mācīties Java no praktiskā viedokļa? Fakts ir tāds, ka Java ir ļoti slavena programmēšanas valoda. Tajā ir ļoti liela kopiena.
Piemēram, ir tāds TIOBE indekss, populārs programmēšanas valodu popularitātes indekss, un Java tur ieņem pirmo vietu. Tāpat darba vietnēs, iespējams, pamanīsit, ka lielākā daļa vakanču ir par Java, proti, attīstoties Java, vienmēr var atrast darbu.
Tā kā kopiena ir ļoti liela, uz jebkuru jūsu jautājumu atbildi atradīsiet dažās Stack Overflow vai citās vietnēs. Turklāt, izstrādājot Java, jūs faktiski rakstāt kodu JVM, lai jūs varētu viegli pārslēgties uz Kotlin, Scala un citām valodām, kurās tiek izmantots JVM.

Kas ir labs Java no ideoloģiskā viedokļa? Ir dažādas programmēšanas valodas. Viņi atrisina dažādas problēmas, jūs to zināt. Piemēram, Python ir lieliski piemērots vienas rindas skriptu rakstīšanai, lai atrisinātu ātras problēmas.
Pozitīvi ir tas, ka varat pilnībā kontrolēt izpildāmo kodu. Piemēram, mums ir automašīnas, Yandex bezvadītāja automašīnas, to kods ir rakstīts plusos. Kāpēc? Javai ir tāda lieta - Garbage Collector. Tas attīra RAM no nevajadzīgiem objektiem. Šī lieta sākas spontāni un aptur pasauli, tas ir, tā aptur pārējo programmu un dodas uz objektu skaitīšanu, notīrot objektu atmiņu. Ja tāda lieta darbojas dronā, tas nav forši. Jūsu drons brauks taisni, šajā brīdī iztīrīs atmiņu un vispār neskatīsies uz ceļu. Tāpēc drons ir rakstīts uz plusiem.

Kādas problēmas risina Java? Tā galvenokārt ir valoda lielu programmu izstrādei, kuras ir rakstījuši gadu gaitā desmitiem vai simtiem cilvēku. Jo īpaši liela daļa Yandex.Market aizmugursistēmas ir rakstīta Java valodā. Mums ir sadalīta komanda vairākās pilsētās, katrā pa desmit cilvēkiem. Un kodu ir viegli uzturēt, tas tiek atbalstīts desmit vai vairāk gadus, un tajā pašā laikā ienāk jauni cilvēki un saprot šo kodu.
Kādām īpašībām vajadzētu būt valodai, lai tajā esošais kods būtu viegli atbalstīts un lai to varētu viegli izstrādāt lielās komandās. Pirmkārt, tam ir jābūt salasāmam kodam, un tajā jābūt viegli īstenojamiem sarežģītiem arhitektūras risinājumiem. Tas nozīmē, ka jābūt viegli rakstīt augsta līmeņa abstrakcijas utt. Tas viss ir tas, ko Java mums sniedz. Šī ir uz objektu orientēta valoda. Ir patiešām viegli ieviest augsta līmeņa abstrakcijas un sarežģītas arhitektūras.
Javai ir arī daudz ietvaru un bibliotēku, jo valodai ir vairāk nekā 15 gadu. Šajā laikā tajā tika uzrakstīts viss, ko varēja uzrakstīt, tāpēc ir daudz bibliotēku visam, kas jums varētu būt nepieciešams.

Kādām pamatprasmēm, manuprāt, vajadzētu būt iesācējam JA spēlētājam? Pirmkārt, tās ir Java pamatvalodas zināšanas. Nākamais ir sava veida atkarības injekcijas ietvars. Nākamais runātājs Kirils par to runās pilnīgāk. Es neiedziļināšos. Nākamais ir arhitektūras un dizaina modeļi. Mums ir jāspēj uzrakstīt arhitektoniski skaistu kodu, lai rakstītu lielas lietojumprogrammas. Un tas ir sava veida SQL vai ORM uzdevumiem darbam ar datu bāzi. Un tas vairāk attiecas uz aizmuguri.

Aiziet! Java kodols. Ameriku es šeit īsti neatklāšu — jums ir jāzina pati valoda. Kam vajadzētu pievērst uzmanību. Pirmkārt, Java pēdējos gados ir izlaidusi daudz versiju, tas ir, 2014.-2015. gadā tika izlaista septītā, pēc tam astotā, devītā, desmitā, tajās tika ieviests daudz jaunu versiju un daudz jaunu foršu lietu. , piemēram, Java Stream API , lambda utt. Ļoti foršas, svaigas, foršas lietas, kas tiek izmantotas ražošanas kodā, par ko viņi jautā intervijās un kas jums jāzina. Tāpēc nevajadzētu ņemt grāmatu no plaukta Java-4 bibliotēkā un doties mācīties. Šis ir mūsu plāns: mēs apgūstam Java-8 vai jaunāku versiju.
Mēs pievēršam lielu uzmanību jauninājumiem, piemēram, Stream API, var uc Tie tiek jautāti interviju laikā un tiek pastāvīgi izmantoti ražošanā. Tas ir, Stream API ir daudz foršāka nekā cilpas, kopumā ļoti forša lieta. Noteikti pievērsiet uzmanību.
Un ir visādas lietas, piemēram, iteratori, izņēmumi un tā tālāk. Lietas, kas jums šķiet nesvarīgas, ja vien jūs pats uzrakstāt nelielu kodu. Jums šie izņēmumi nav vajadzīgi, kam tie vispār ir vajadzīgi? Bet viņi noteikti tiks jautāti intervijās, viņi noteikti jums noderēs ražošanā. Kopumā jums vajadzētu pievērst uzmanību izņēmumiem, iteratoriem un citām lietām.

Datu struktūras. Jūs nevarat iztikt bez struktūrām, taču tas būs lieliski, ja nezināt, ka ir komplekti, vārdnīcas un lapas. Un arī dažādas konstrukciju realizācijas. Piemēram, tai pašai Java vārdnīcai ir daudz implementāciju, tostarp HashMap un TreeMap. Viņiem ir atšķirīga asimptotika, tie ir atšķirīgi strukturēti iekšpusē. Jums jāzina, kā tie atšķiras un kad kuru izmantot.
Būs arī ļoti forši, ja zināt, kā šīs datu struktūras darbojas iekšēji. Tas ir, nav viegli zināt viņu asimptotiku - cik daudz derības darbojas, cik ilgi darbojas caurlaide, bet gan to, kā darbojas struktūra iekšpusē - piemēram, kas ir spainis programmā HashMap.
Ir vērts pievērst uzmanību arī kokiem un grafikiem. Tās ir lietas, kas ražošanas kodā nav īpaši izplatītas, taču tās ir populāras intervijās. Attiecīgi jums ir jāspēj šķērsot kokus, grafikus platumā un dziļumā. Tie visi ir vienkārši algoritmi.
Tiklīdz jūs sākat rakstīt lielu kodu, sarežģītu, izmantojot bibliotēkas, vairāku klašu kodu, jūs sapratīsit, ka jums ir grūti bez sistēmu veidošanas un atkarību novēršanas. Tie galvenokārt ir Maven un Gradle. Tie ļauj vienā rindā importēt bibliotēkas savā projektā. Tas nozīmē, ka jūs rakstāt vienas rindas xml un importējat bibliotēkas projektā. Lieliskas sistēmas. Tie ir aptuveni vienādi, izmantojiet vienu - Maven vai Gradle.
Nākamais - kaut kāda versiju kontroles sistēma. Es iesaku Git, jo tas ir populārs un ir daudz pamācību. Gandrīz visi izmanto Git, tā ir lieliska lieta, bez tā nevar dzīvot.
Un kaut kāda attīstības vide. Es iesaku IntelliJ Idea. Tas ievērojami paātrina izstrādes procesu, ļoti palīdz, uzraksta visu standarta kodu, kopumā tas ir forši.

Saites no slaida: ,
SQL. Mazliet par backenderiem. Patiesībā šeit bija smieklīgs gadījums. Divas dienas pirms manas otrās intervijas prakses laikā man piezvanīja HR meitene un teica, ka pēc divām dienām man jautās par SQL un HTTP, man tas jāiemācās. Un es gandrīz neko nezināju par SQL vai HTTP. Un es atradu šo foršo vietni - . Es uzzināju SQL 12 stundās, proti, SQL sintaksi, kā rakstīt SELECT vaicājumus, JOIN utt. Ļoti forša vietne, ļoti iesaku. Patiesībā 12 stundu laikā es uzzināju 90% no tā, ko zinu tagad.
Ir arī lieliski zināt datu bāzes arhitektūru. Tie ir visu veidu atslēgas, indeksi, normalizācija. Vietnē Habré ir virkne ziņu par to.

Java valodā papildus SQL ir arī visa veida objektu relāciju kartēšanas sistēmas, piemēram, JPA. Ir kāds kods. Pirmajā metodē ir kāds SQL kods - SELECT id name FROM info.users WHERE id IN userIds. No lietotāju datu bāzes, no tabulas tiek iegūti viņu ID un vārdi.
Tālāk ir noteikts kartētājs, kas objektu no bāzes pārvērš par Java objektu. Un tālāk ir trešā metode, kas faktiski izpilda šo kodu. To visu, izmantojot JPA, var aizstāt ar vienu rindiņu, kas rakstīta zemāk. Tas dara to pašu — atrodiet All ByIdIn. Tas ir, pamatojoties uz metodes nosaukumu, tā ģenerē jums SQL vaicājumu.
Ļoti forša lieta. Es pats, kad nezināju SQL, izmantoju JPA. Kopumā pievērsiet uzmanību. Ja esat pārāk slinks, lai apgūtu SQL, tā ir katastrofa. Un vispār – uguns!

Pavasaris. Kurš ir dzirdējis par tādu lietu kā pavasara karkass? Vai jūs redzat, cik daudz jūsu ir? Ne velti. Pavasaris ir iekļauts katras otrās Java aizmugursistēmas vakances prasībās. Bez tā nav īsti nekur lielas attīstības. Kas ir pavasaris? Pirmkārt, šī ir atkarības injekcijas sistēma. Arī par šo nākamais runātājs. Bet īsi sakot, šī ir lieta, kas ļauj vieglāk importēt dažu klašu atkarības uz citām. Tas ir, zināšanas par atkarībām ir vienkāršotas.
Spring Boot ir Spring daļa, kas ļauj palaist servera lietojumprogrammu ar vienu pogu. Jūs atverat THID, nospiežat pāris pogas, un tagad jūsu servera lietojumprogramma ir izveidota un darbojas uz localhost 8080. Tas ir, jūs vēl neesat uzrakstījis nevienu koda rindiņu, bet tas jau darbojas. Ļoti forša lieta. Ja raksti kaut ko savu, uguns!
Pavasaris ir ļoti liels ietvars. Tas ne tikai uztver jūsu servera lietojumprogrammu un atrisina atkarības injekciju. Tas ļauj veikt vairākas darbības, tostarp izveidot REST API metodes. Tas ir, jūs uzrakstījāt kādu metodi un pievienojāt tai anotāciju Iegūt kartēšanu. Un tagad jums jau ir kāda metode vietnē localhost, kas jums raksta Hello world. Divas koda rindas un tas darbojas. Foršas lietas.
Pavasaris atvieglo arī kontroldarbu rakstīšanu. Nav izejas bez testēšanas lielajā attīstībā. Kods ir jāpārbauda. Šim nolūkam Java ir forša bibliotēka JUnit 5. Un JUnit vispār, bet jaunākā versija ir piektā. Ir viss testēšanai, visādi apgalvojumi un citas lietas.
Un ir lieliska Mockito sistēma. Iedomājieties, ka jums ir kāda funkcionalitāte, kuru vēlaties pārbaudīt. Funkcionalitāte veic daudzas lietas, tostarp, kaut kur pa vidu, tā, piemēram, piesakās VKontakte ar jūsu ID, un no ID saņem VKontakte lietotāja vārdu un uzvārdu. Jūs, iespējams, neiekļausit VKontakte testos, tas ir dīvaini. Bet jums ir jāpārbauda funkcionalitāte, tāpēc jūs izveidojāt šo klasi, izmantojot Mockito, mok it, imitējot to.
Jūs teiksiet, kad uz šo klasi atnāk pieprasījums ar tādu un tādu ID, tas atgriež kādu uzvārdu, piemēram, Vasja Pupkina. Un tas darbosies. Tas ir, jūs pārbaudīsit visu mok vienas klases funkcionalitāti. Ļoti forša lieta.

Dizaina modeļi. Kas tas ir? Šīs ir veidnes tipisku problēmu risināšanai, kas rodas izstrādes procesā. Izstrādē bieži rodas identiskas vai līdzīgas problēmas, kuras būtu lieliski atrisināt kaut kā labi. Tāpēc cilvēki nāca klajā ar labāko praksi, noteiktas veidnes, kā šīs problēmas atrisināt.
Ir vietne ar populārākajiem modeļiem - refaktoring.guru, to var palasīt, uzzināt, kādi modeļi ir, palasīt teoriju gūzmu. Problēma ir tā, ka tas ir praktiski bezjēdzīgi. Patiesībā modeļi bez prakses nav īpaši noderīgi.
Jūs dzirdēsit par dažiem modeļiem, piemēram, Singletone vai Builder. Kurš dzirdēja šos vārdus? Daudz cilvēku. Ir tik vienkārši modeļi, kurus varat īstenot pats. Bet lielākā daļa modeļu: stratēģija, rūpnīca, fasāde - nav skaidrs, kur tos piemērot.
Un, kamēr praksē neredzat citas personas kodā vietu, kurai tiek piemērots šis modelis, jūs pats nevarēsit to lietot. Tāpēc prakse ir ļoti svarīga ar modeļiem. Un tikai lasīšana par tām vietnē refaktoring.guru nav īpaši noderīga, taču to noteikti ir vērts darīt.

Kāpēc ir nepieciešami modeļi? Pieņemsim, ka jums ir noteikta lietotāju klase. Tam ir ID un nosaukums. Katram lietotājam ir jābūt gan ID, gan vārdam. Augšējā kreisajā stūrī ir klase.
Kādi ir lietotāja inicializācijas veidi? Ir divas iespējas – vai nu konstruktors, vai noteicējs. Kādi ir abu pieeju trūkumi?
Konstruktors. jauns lietotājs (7, "Bond"), labi. Tagad pieņemsim, ka mums nav Lietotāju klase, bet kāda cita, ar septiņiem ciparu laukiem. Jums būs konstruktors, kas satur septiņus secīgus skaitļus. Kādi ir šie skaitļi un kurš no tiem kuram īpašumam pieder, nav skaidrs. Dizaineris nav izcils.
Otrā iespēja ir iestatītājs. Jūs skaidri rakstāt: setId(7), setName(“Bond”). Jūs saprotat, kurš īpašums kuram laukam pieder. Bet seterim ir problēma. Pirmkārt, jūs varat aizmirst kaut ko piešķirt, un, otrkārt, jūsu objekts izrādās mainīgs. Tas nav pavedienam drošs un nedaudz samazina koda lasāmību. Tāpēc cilvēki izdomāja foršu modeli – Builder.

Par ko ir runa? Mēģināsim apvienot abu pieeju — iestatītāja un konstruktora — priekšrocības vienā. Mēs izveidojam noteiktu objektu Builder, kuram būs arī lauki Id un Name, kas pats tiks izveidots, pamatojoties uz iestatītāju, un kuram būs Build metode, kas atgriež jums jaunu lietotāju ar visiem parametriem. Mēs iegūstam nemainīgu objektu un seteru. Forši!
Kādas ir problēmas? Šeit mums ir klasiskais Builder. Problēma ir tā, ka mēs joprojām varam aizmirst pārbaudīt kādā laukā. Un, ja mēs aizmirsām apmeklēt ID, šajā gadījumā Builder tas tiek inicializēts uz nulli, jo int tips nav nullējams. Un, ja mēs izveidosim Vārdu “Bond” un aizmirsīsim apmeklēt ID biroju, mums būs jauns Lietotājs ar ID “0” un vārdu “Bond”. Nav forši.
Mēģināsim ar to cīnīties. Programmā Builder mēs mainīsim int uz int, lai tas būtu nullējams. Tagad viss ir lieliski.

Ja mēģināsim izveidot Lietotāju ar vārdu “Bond”, aizmirstot ievietot viņa ID, mēs saņemsim nulles rādītāja izņēmumu, jo ID nav nullējams, un Builder ir nulles, konkrēti pointera izņēmums.

Bet mēs joprojām varam aizmirst ievietot nosaukumu, tāpēc objekta atkārtošanu iestatījām uz nulli. Tagad, kad mēs veidojam objektu no Builder, tas pārbauda, vai lauks nav nullējams. Un tas vēl nav viss.
Apskatīsim pēdējo piemēru. Šajā gadījumā, ja ID izpildlaikā kaut kādā veidā ievietotu nulli, būtu lieliski uzreiz uzzināt, ka jūs to izdarījāt, un nav forši, ka tagad pieļaujat kļūdu.

Kļūda jāmet nevis Lietotāja izveides brīdī, bet gan tad, kad ID iestatāt nulli. Tāpēc programmā Builder mēs nomainīsim iestatītāju Integer uz int, un viņš nekavējoties zvēr, ka viņi izmeta nulli.
Īsāk sakot, kāda jēga? Ir vienkāršs Builder modelis, taču pat tā ieviešanai ir daži smalkumi, tāpēc ir ļoti forši aplūkot dažādus modeļu ieviešanas veidus. Katram modelim ir desmitiem ieviešanu. Tas viss ir ļoti interesanti.

Kā mēs ierakstām Builder ražošanas kodā? Šeit ir mūsu lietotājs. Mēs tam pievienojam Builder rotāciju no Lombok bibliotēkas, un tas pats mums ģenerē Builder. Tas ir, mēs nerakstām nekādu kodu, bet Java jau domā, ka šai klasei ir Builder, un mēs to varam saukt šādi.
Es jau teicu, ka Java ir bibliotēkas gandrīz visam, ieskaitot Lombok — foršu bibliotēku, kas ļauj izvairīties no teksta rakstīšanas. Celtnieks, GET.

Raksti var būt arhitektoniski – saistīti ne tikai ar vienu klasi, bet ar visu sistēmu kopumā. Sistēmas projektēšanā ir tik foršs princips: vienotas atbildības princips. par ko viņš runā? Fakts, ka katrai klasei ir jāatbild par savu funkcionalitāti. Šajā gadījumā mums ir kontrolieris, kas sazinās ar lietotājiem, JSON objektiem. Ir Fasāde, kas pārveido JSON objektus modeļos, ar kuriem tad darbosies Java lietojumprogramma. Ir pakalpojums, kuram ir sarežģīta loģika, kas darbojas ar šiem modeļiem. Ir datu piekļuves objekts, kas šos modeļus ievieto datu bāzē un izgūst no datu bāzes. Un tur ir pati datubāze. Citiem vārdiem sakot, tas viss nav vienā klasē, bet mēs veidojam piecas dažādas klases, un tas ir cits modelis.

Kad esat vairāk vai mazāk apguvis Java, ir lieliski uzrakstīt savu projektu, kuram būs datu bāze, darbs ar citiem API un pakļauts jūsu servera lietojumprogrammai REST API klientiem. Tas būtu lieliski, ko pievienot savam CV, tas būtu foršs beigas jūsu izglītībai. Ar to jūs varat doties un iegūt darbu.

Šeit ir mana servera lietojumprogrammas piemērs. Otrajā kursā kopā ar puišiem rakstīju kursa darbu. Viņi rakstīja mobilo aplikāciju pasākumu organizēšanai. Tur lietotāji varēja pieteikties, izmantojot VKontakte, izvietot punktus kartē, izveidot pasākumus, uzaicināt uz tiem savus draugus, saglabāt notikumu attēlus utt.
Ko es darīju projektā? Uzrakstīja servera lietojumprogrammu Spring Boot, neizmantojot SQL. Es viņu nepazinu, izmantoju JPA. Ko tas varētu darīt? Piesakieties VK, izmantojot OAuth-2. Paņemiet lietotāja marķieri, dodieties uz VK ar to, pārbaudiet, vai tas ir īsts lietotājs. Saņemiet informāciju par lietotājiem, izmantojot VKontakte. Tā varēja saglabāt informāciju datu bāzē, arī ar APA starpniecību. Prasmīgi saglabājiet attēlus un citus failus datora atmiņā un saglabājiet saites uz tiem datu bāzē. Toreiz es nezināju, ka datu bāzē ir CLOB objekti, tāpēc es to darīju šādi. Bija REST API lietotājiem, klientu lietojumprogrammām. Un bija vienību testi pamata funkcionalitātei.
[…] Neliels piemērs manai veiksmīgai Java apguvei. Pirmajā universitātes gadā man mācīja C# un deva izpratni par OOP programmēšanu – kas ir klases, saskarnes, abstrakcija un kāpēc tās ir vajadzīgas. Tas man ļoti palīdzēja. Bez tā Java apguve ir diezgan sarežģīta; nav skaidrs, kāpēc ir vajadzīgas nodarbības.

Manā otrajā kursā universitātē viņi atkal mācīja Java kodolu, bet es neapstājos ar to, es pats devos studēt pavasari un uzrakstīju kursa darbu, savu projektu, par kuru es minēju iepriekš. Un ar visu to es devos uz praksi Yandex, nokārtoju interviju un iekļuvu Yandex.Market. Tur es uzrakstīju aizmugurprogrammu Beru, tas ir mūsu tirgus, un pašam Yandex.Market.
Pēc tam pirms sešiem mēnešiem es pārgāju uz citu komandu tajā pašā tirgū. Mēs veicam analīzi biznesa partneriem. Mēs atrodamies analītiskajā platformā, aizmugurē esam trīs, tāpēc man ir ļoti liela ietekme uz projektu. Tas ir ļoti interesanti, patiesībā. Tas ir, mēs faktiski sniedzam datus par tirgu – kādi ir pārdošanas apjomi, kādās kategorijās, kādos modeļos, biznesa partneriem, lieliem pazīstamiem uzņēmumiem. Un mēs esam tikai trīs, mēs rakstām šo kodu, un tas ir ļoti forši.
Paldies! Noderīgas saites:
Sākot no .
Sākot no .
Sākot no .
Sākot no .
Sākot no .
Sākot no .
Sākot no .
Sākot no .
Avots: www.habr.com
