Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

In che modo Java è diverso dagli altri linguaggi popolari? Perché Java dovrebbe essere la prima lingua da imparare? Creiamo un piano che ti aiuterà a imparare Java sia da zero che applicando competenze di programmazione in altri linguaggi. Elenchiamo le differenze tra la creazione di codice di produzione in Java e lo sviluppo in altri linguaggi. Mikhail Zatepyakin ha letto questo rapporto in una riunione per i futuri partecipanti tirocini Yandex e altri sviluppatori principianti: incontro Java Junior.


— Ciao a tutti, mi chiamo Misha. Sono uno sviluppatore di Yandex.Market e oggi ti dirò perché imparare Java e come farlo in modo efficace. Potresti porre una domanda ragionevole: perché racconterò questa storia e non qualche sviluppatore forte con molti anni di esperienza? Il fatto è che io stesso ho studiato Java di recente, circa un anno e mezzo fa, quindi ricordo ancora com'era e quali insidie ​​​​ci sono.

Un anno fa ho ottenuto uno stage presso Yandex.Market. Ho sviluppato il backend per Beru, per il mercato stesso, probabilmente lo hai usato. Adesso continuo a lavorare lì, in un team diverso. Creiamo una piattaforma analitica per Yandex.Market per i partner commerciali.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Iniziamo. Perché imparare Java da un punto di vista pratico? Il fatto è che Java è un linguaggio di programmazione molto famoso. Ha una comunità molto grande.

Ad esempio, esiste un indice TIOBE, un indice popolare della popolarità dei linguaggi di programmazione, e Java è al primo posto. Inoltre, sui siti di lavoro, probabilmente noterai che la maggior parte dei posti vacanti riguarda Java, ovvero sviluppando in Java puoi sempre trovare un lavoro.

Poiché la community è molto vasta, qualsiasi domanda tu abbia troverà una risposta su alcuni Stack Overflow o altri siti. Inoltre, quando sviluppi in Java, stai effettivamente scrivendo codice sulla JVM, quindi puoi passare facilmente a Kotlin, Scala e altri linguaggi che utilizzano la JVM.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Cosa c'è di buono in Java da un punto di vista ideologico? Esistono diversi linguaggi di programmazione. Risolvono diversi problemi, lo sai. Ad esempio, Python è ottimo per scrivere script di una riga per risolvere problemi rapidi.

Il lato positivo è che puoi controllare completamente il codice eseguibile. Ad esempio, abbiamo automobili, auto senza conducente Yandex, il loro codice è scritto in più. Perché? Java ha una cosa del genere: Garbage Collector. Cancella la RAM dagli oggetti non necessari. Questa cosa parte spontaneamente e fa stop-the-world, cioè ferma il resto del programma e va a contare gli oggetti, a cancellare la memoria degli oggetti. Se una cosa del genere funziona in un drone, non è bello. Il tuo drone andrà dritto, in questo momento cancellerà la memoria e non guarderà affatto la strada. Pertanto, il drone è scritto sui professionisti.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Quali problemi risolve Java? È principalmente un linguaggio per sviluppare programmi di grandi dimensioni scritti nel corso degli anni, da dozzine o centinaia di persone. In particolare, gran parte del backend di Yandex.Market è scritto in Java. Abbiamo un team distribuito in diverse città, dieci persone ciascuna. E il codice è facile da mantenere, è supportato da dieci anni o più e allo stesso tempo nuove persone arrivano e capiscono questo codice.

Quali caratteristiche dovrebbe avere un linguaggio affinché il codice in esso contenuto sia facilmente supportato e possa essere facilmente sviluppato in grandi team. Prima di tutto, dovrebbe essere un codice leggibile e dovrebbe essere facile implementare soluzioni architettoniche complesse. Cioè, dovrebbe essere facile scrivere astrazioni di alto livello, ecc. Tutto questo è ciò che Java ci fornisce. Questo è un linguaggio orientato agli oggetti. È davvero semplice implementare astrazioni di alto livello e architetture complesse.

Esistono anche molti framework e librerie per Java, poiché il linguaggio ha più di 15 anni. Durante questo periodo, tutto ciò che poteva essere scritto è stato scritto su di esso, quindi ci sono tantissime biblioteche per tutto ciò di cui potresti aver bisogno.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Quali competenze di base, secondo me, dovrebbe avere un giocatore principiante di JA? Prima di tutto, questa è la conoscenza del linguaggio di base Java. Il prossimo è una sorta di framework di Dependency Injection. Il prossimo relatore, Kirill, ne parlerà in modo più approfondito. Non andrò troppo in profondità. La prossima è l'architettura e i modelli di design. Dobbiamo essere in grado di scrivere codice architettonicamente bello per poter scrivere applicazioni di grandi dimensioni. E questa è una sorta di SQL o ORM per le attività di lavoro con il database. E questo vale maggiormente per il backend.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Andare! Nucleo Java. Non scoprirò davvero l’America qui: devi conoscere la lingua stessa. A cosa dovresti prestare attenzione. In primo luogo, Java ha rilasciato molte versioni negli ultimi anni, ovvero nel 2014-2015 è stata rilasciata la settima, poi l'ottava, la nona, la decima, molte nuove versioni e sono state introdotte molte nuove cose interessanti , ad esempio, l'API Java Stream, lambda, ecc. Cose molto interessanti, fresche e interessanti che vengono utilizzate nel codice di produzione, cosa chiedono nelle interviste e cosa devi sapere. Pertanto, non dovresti prendere un libro dallo scaffale della libreria Java-4 e andare a impararlo. Questo è il nostro piano: impariamo Java-8 o versione successiva.

Prestiamo molta attenzione alle innovazioni come Stream API, var, ecc. Vengono poste durante le interviste e vengono costantemente utilizzate nella produzione. Cioè, l'API Stream è molto più interessante dei loop, in generale, una cosa molto interessante. Assicurati di prestare attenzione.

E ci sono tutti i tipi di cose come iteratori, eccezioni e così via. Cose che ti sembrano non importanti finché scrivi tu stesso qualche piccolo codice. Non hai bisogno di queste Eccezioni, chi ne ha bisogno comunque? Ma ti verranno sicuramente chiesti durante i colloqui, ti saranno sicuramente utili nella produzione. In generale, dovresti prestare attenzione alle eccezioni, agli iteratori e ad altre cose.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Strutture dati. Non puoi fare a meno delle strutture, ma sarebbe fantastico se non sapessi solo che ci sono set, dizionari e fogli. E anche diverse implementazioni di strutture. Ad esempio, lo stesso dizionario in Java ha molte implementazioni, tra cui HashMap e TreeMap. Hanno asintotici diversi, sono strutturati diversamente all'interno. È necessario sapere in cosa differiscono e quando utilizzare quale.

Sarebbe anche molto interessante se sapessi come funzionano queste strutture dati internamente. Cioè, non è facile conoscere i loro asintotici - quanto funziona la scommessa, per quanto tempo funziona il passaggio, ma come funziona la struttura all'interno - ad esempio, cos'è un secchio in HashMap.

Vale anche la pena prestare attenzione agli alberi e ai grafici. Queste sono cose che non sono molto comuni nel codice di produzione, ma sono popolari nelle interviste. Di conseguenza, devi essere in grado di attraversare alberi, grafici in larghezza e profondità. Questi sono tutti semplici algoritmi.

Non appena inizi a scrivere codice di grandi dimensioni, complesso, utilizzando librerie, codice multiclasse, ti renderai conto che è difficile per te senza creare sistemi e risolvere dipendenze. Questi sono principalmente Maven e Gradle. Ti consentono di importare librerie nel tuo progetto in una riga. Cioè, scrivi un xml di una riga e importi le librerie nel progetto. Grandi sistemi. Sono più o meno gli stessi, usane uno: Maven o Gradle.

Successivamente: una sorta di sistema di controllo della versione. Raccomando Git perché è popolare e ci sono tantissimi tutorial. Quasi tutti usano Git, è una cosa interessante, non puoi vivere senza.

E una sorta di ambiente di sviluppo. Raccomando IntelliJ Idea. Accelera notevolmente il processo di sviluppo, ti aiuta molto, scrive tutto il codice standard per te, in generale, è fantastico.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Link dalla diapositiva: SQLZOO, habrapost

SQL. Un po' di backend. In realtà c'è stato un caso divertente qui. Due giorni prima del mio secondo colloquio di stage, una ragazza delle risorse umane mi ha chiamato e mi ha detto che tra due giorni mi avrebbero chiesto di SQL e HTTP, dovevo impararlo. E non sapevo quasi nulla di SQL o HTTP. E ho trovato questo bel sito - SQLZOO. Ho imparato SQL in 12 ore, intendo la sintassi SQL, come scrivere query SELECT, JOIN, ecc. Sito molto interessante, lo consiglio vivamente. Infatti in 12 ore ho imparato il 90% di quello che so adesso.

Ed è anche bello conoscere l'architettura del database. Questi sono tutti i tipi di chiavi, indici, normalizzazione. C'è una serie di post a riguardo su Habré.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

In Java, oltre a SQL, esistono tutti i tipi di sistemi di mappatura relazionale a oggetti come JPA. C'è del codice. Nel primo metodo è presente del codice SQL: SELECT id name FROM info.users WHERE id IN userIds. Dal database degli utenti, dalla tabella, si ottengono i loro ID e nomi.

Successivamente, c'è un certo mapper che trasforma un oggetto dalla base in un oggetto Java. E c'è un terzo metodo di seguito che esegue effettivamente questo codice. Tutto ciò può essere sostituito utilizzando JPA con una riga, che è scritta di seguito. Fa la stessa cosa: trova All ByIdIn. Cioè, in base al nome del metodo, genera una query SQL per te.

Cosa molto interessante. Io stesso, quando non conoscevo SQL, usavo JPA. In generale, prestare attenzione. Se sei troppo pigro per imparare SQL, è un disastro. E, in generale, fuoco!

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Primavera. Chi ha mai sentito parlare del quadro di primavera? Vedete quanti siete? Non senza motivo. Spring è inclusa nei requisiti di ogni secondo posto vacante nel backend Java. Senza di esso, non c’è davvero nulla in un grande sviluppo. Cos'è la primavera? Prima di tutto, questo è un framework di Dependency Injection. Anche su questo dirà prossimo oratore. Ma in breve, questa è una cosa che permette di rendere più semplice l'importazione delle dipendenze di alcune classi su altre. Cioè, la conoscenza delle dipendenze è semplificata.

Spring Boot è un pezzo di Spring che ti consente di eseguire la tua applicazione server con un solo pulsante. Vai su THID, premi un paio di pulsanti e ora hai la tua applicazione server attiva e funzionante su localhost 8080. Cioè, non hai ancora scritto una sola riga di codice, ma funziona già. Cosa molto interessante. Se scrivi qualcosa di tuo, fuoco!

La primavera è un quadro molto ampio. Non solo rileva l'applicazione server e risolve l'inserimento delle dipendenze. Ti consente di fare un sacco di cose, inclusa la creazione di metodi API REST. Cioè, hai scritto un metodo e hai allegato l'annotazione Ottieni mappatura. E ora hai già un metodo su localhost che ti scrive Hello world. Due righe di codice e funziona. Roba forte.

La primavera facilita anche le prove di scrittura. Non c'è modo di fare a meno dei test nello sviluppo su larga scala. Il codice deve essere testato. A questo scopo, Java ha una fantastica libreria JUnit 5. E JUnit in generale, ma l'ultima versione è la quinta. C'è tutto per testare, ogni sorta di asserzioni e altre cose.

E c'è un fantastico framework Mockito. Immagina di avere alcune funzionalità che desideri testare. La funzionalità fa molte cose, incluso, da qualche parte nel mezzo, accede a VKontakte con il tuo ID, ad esempio, e riceve il nome e il cognome dell'utente VKontakte dall'ID. Probabilmente non includerai VKontakte nei test, è strano. Ma devi testare la funzionalità, quindi hai creato questa lezione, usando Mockito, mok it, imitalo.

Dirai che quando una richiesta arriva a questa classe con un ID tale e tale, restituisce un cognome, ad esempio Vasya Pupkin. E funzionerà. Cioè, testerai tutte le funzionalità per mok one class. Cosa molto interessante.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Collegamento dalla diapositiva

Modelli di progettazione. Cos'è? Questi sono modelli per risolvere i problemi tipici che si presentano durante lo sviluppo. Nello sviluppo sorgono spesso problemi identici o simili che sarebbe bello risolvere in qualche modo bene. Pertanto, le persone hanno elaborato le migliori pratiche, determinati modelli, su come risolvere questi problemi.

C'è un sito Web con i modelli più popolari: refactoring.guru, puoi leggerlo, scoprire quali modelli ci sono, leggere un sacco di teoria. Il problema è che è praticamente inutile. In effetti, i modelli senza pratica non sono particolarmente utili.

Sentirai parlare di alcuni modelli come Singletone o Builder. Chi ha sentito queste parole? Molte persone. Ci sono modelli così semplici che puoi implementare tu stesso. Ma la maggior parte degli schemi: strategia, fabbrica, facciata, non è chiaro dove applicarli.

E finché non vedi in pratica nel codice di un'altra persona il punto in cui viene applicato questo modello, non sarai in grado di applicarlo tu stesso. Pertanto, la pratica è molto importante con i modelli. E solo leggerli su refactoring.guru non è di grande aiuto, ma vale sicuramente la pena farlo.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Perché sono necessari i modelli? Diciamo che hai una certa classe Utente. Ha un ID e un Nome. Ogni Utente deve avere sia un Id che un Nome. In alto a sinistra c'è l'aula.

Quali sono i modi per inizializzare l'utente? Ci sono due opzioni: un costruttore o un setter. Quali sono gli svantaggi di entrambi gli approcci?

Costruttore. nuovo Utente (7, "Bond"), ok. Ora diciamo che non abbiamo una classe User, ma un'altra, con sette campi numerici. Avrai un costruttore contenente sette numeri consecutivi. Non è chiaro quali siano questi numeri e quale di essi appartenga a quale proprietà. Il designer non è eccezionale.

La seconda opzione è il setter. Scrivi chiaramente: setId(7), setName(“Bond”). Capisci quale proprietà appartiene a quale campo. Ma il setter ha un problema. In primo luogo, potresti dimenticare di assegnare qualcosa e, in secondo luogo, il tuo oggetto risulta essere mutabile. Questo non è thread-safe e riduce leggermente la leggibilità del codice. Ecco perché le persone hanno inventato un modello interessante: Builder.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Cosa riguarda? Proviamo a combinare i vantaggi di entrambi gli approcci, setter e costruttore, in uno solo. Creiamo un certo oggetto, Builder, che avrà anche i campi Id e Nome, che a sua volta sarà costruito in base al setter e che avrà un metodo Build che restituisce un nuovo Utente con tutti i parametri. Otteniamo un oggetto immutabile e un setter. Freddo!

Quali sono i problemi? Qui abbiamo il classico Builder. Il problema è che possiamo ancora dimenticare di controllare qualche campo. E se ci siamo dimenticati di visitare l'ID, in questo caso nel Builder viene inizializzato a zero, perché il tipo int non è nullable. E se creiamo il nome “Bond” e dimentichiamo di visitare l'ufficio ID, avremo un nuovo utente con ID “0” e il nome “Bond”. Non bello.

Proviamo a combattere questo. Nel Builder cambieremo int in int in modo che sia nullable. Ora è tutto fantastico.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Se proviamo a creare un Utente con il nome “Bond”, dimenticandoci di inserire il suo ID, otterremo un'eccezione di puntatore nullo, perché l'ID non è nullable, e il Builder ha un'eccezione di puntatore nullo, in particolare.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Ma possiamo ancora dimenticare di inserire un nome, quindi impostiamo la riproduzione dell'oggetto su null. Ora, quando costruiamo il nostro oggetto da Builder, controlla che il campo non sia annullabile. E non è tutto.

Diamo un'occhiata all'ultimo esempio. In questo caso, se in qualche modo mettessimo null nell'ID runtime, sarebbe bello sapere immediatamente che l'hai fatto e non è bello che tu stia commettendo un errore adesso.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

È necessario generare un errore non al momento della creazione dell'utente, ma quando si imposta null sull'ID. Pertanto, nel Builder cambieremo il setter Integer in int e lui giurerà immediatamente di aver eliminato null.

In breve, qual è il punto? Esiste un semplice pattern Builder, ma anche la sua implementazione presenta alcune sottigliezze, quindi è molto interessante osservare diverse implementazioni di pattern. Ogni modello ha dozzine di implementazioni. Tutto questo è molto interessante.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Come scriviamo Builder nel codice di produzione? Ecco il nostro Utente. Alleghiamo ad esso una rotazione Builder dalla libreria Lombok e lei stessa genera un Builder per noi. Cioè non scriviamo nessun codice, ma Java pensa già che questa classe abbia un Builder, e possiamo chiamarla così.

Ho già detto che Java ha librerie per quasi tutto, inclusa Lombok, una libreria interessante che ti consente di evitare di scrivere boilerplate. Costruttore, OTTIENI.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

I modelli possono essere architettonici, relativi non solo a una classe, ma al sistema nel suo insieme. Esiste un principio davvero interessante nella progettazione del sistema: il principio di responsabilità unica. Di cosa sta parlando? Il fatto che ciascuna classe debba essere responsabile di alcune delle proprie funzionalità. In questo caso abbiamo un Controller che comunica con gli utenti, oggetti JSON. C'è Facade, che converte gli oggetti JSON in modelli con cui l'applicazione Java funzionerà. Esiste un servizio che ha una logica complessa che funziona con questi modelli. Esiste un oggetto di accesso ai dati che inserisce questi modelli nel database e li recupera dal database. E c'è il database stesso. In altre parole, non è tutto in una classe, ma stiamo creando cinque classi diverse, e questo è un altro schema.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Una volta che hai più o meno imparato Java, è fantastico scrivere il tuo progetto che avrà un database, funzionerà con altre API ed esporrà la tua applicazione server ai client API REST. Sarebbe un'ottima cosa da aggiungere al tuo curriculum, sarebbe una bella conclusione per la tua istruzione. Con questo puoi andare a trovarti un lavoro.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Ecco un esempio della mia applicazione server. Nel mio secondo anno, ho scritto una tesina con i ragazzi. Stavano scrivendo un'applicazione mobile per l'organizzazione di eventi. Lì gli utenti potevano accedere tramite VKontakte, posizionare punti sulla mappa, creare eventi, invitare i propri amici, salvare immagini di eventi, ecc.

Cosa ho fatto nel progetto? Ha scritto un'applicazione server in Spring Boot senza utilizzare SQL. Non lo conoscevo, ho usato JPA. Cosa potrebbe fare? Accedi a VK tramite OAuth-2. Prendi il token dell'utente, vai su VK con esso, controlla che sia un utente reale. Ricevi informazioni sugli utenti tramite VKontakte. È stato in grado di salvare le informazioni in un database, anche tramite JPA. Salvare abilmente immagini e altri file nella memoria del computer e salvare i collegamenti ad essi nel database. A quel tempo non sapevo che ci fossero oggetti CLOB nel database, quindi ho fatto in questo modo. Esisteva un'API REST per utenti, applicazioni client. E c'erano test unitari per le funzionalità di base.

[…] Un piccolo esempio del mio apprendimento riuscito di Java. Nel mio primo anno di università, mi è stato insegnato C# e mi è stata data una comprensione della programmazione OOP: cosa sono le classi, le interfacce, l'astrazione e perché sono necessarie. Mi ha aiutato molto. Senza questo, imparare Java è piuttosto difficile, non è chiaro il motivo per cui sono necessarie le lezioni.

Perché imparare Java e come farlo in modo efficace. Rapporto Yandex

Nel mio secondo anno all'università, hanno insegnato di nuovo Java core, ma non mi sono fermato qui, sono andato a studiare io stesso Spring e ho scritto un articolo del corso, il mio progetto, di cui ho parlato sopra. E con tutto questo, ho fatto uno stage presso Yandex, ho superato un colloquio e sono entrato in Yandex.Market. Lì ho scritto il backend per Beru, questo è il nostro mercato e per lo stesso Yandex.Market.

Successivamente, sei mesi fa, mi sono trasferito in un'altra squadra all'interno dello stesso Mercato. Effettuiamo analisi per i partner commerciali. Siamo nella piattaforma analitica, siamo in tre sul backend, quindi ho una grande influenza sul progetto. È molto interessante, in realtà. Cioè, forniamo effettivamente dati sul mercato: quali sono le vendite, in quali categorie, in quali modelli, per partner commerciali, grandi aziende rinomate. E siamo solo in tre, scriviamo questo codice ed è molto bello.

Grazie! Link utili:
- "Java 8. Guida per principianti".
- Strutture dati.
- SQLZOO.
- Normalizzazione del database.
- Modelli di progettazione.
- Modelli di progettazione.
- Codice pulito.
- Java efficace.

Fonte: habr.com

Aggiungi un commento