Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

En quoi Java est-il différent des autres langages populaires? Pourquoi Java est-il le premier langage à apprendre? Faisons un plan qui vous aidera à apprendre Java à partir de zéro et à utiliser des compétences de programmation dans d'autres langages. Nous listons les différences entre la création de code de production en Java et le développement dans d'autres langages. Mikhail Zatepjakin a lu ce rapport lors d'une réunion pour les futurs participants au stage de Yandex et d'autres développeurs novices - Meetup Java Junior.


- Bonjour à tous, mon nom est Misha. Je suis un développeur de Yandex.Market, et aujourd'hui je vais vous dire pourquoi apprendre Java et comment le faire efficacement. Vous pouvez poser une question raisonnable: pourquoi je vais le dire, et pas un développeur solide avec un tas d'années d'expérience? Le fait est que j'ai moi-même étudié Java récemment, il y a environ un an et demi, donc je me souviens encore comment c'était et quels étaient les pièges.

Il y a un an, j'ai obtenu un stage chez Yandex.Market. Développer un backend pour "I take", pour le marché lui-même, vous l'avez probablement utilisé. Maintenant, je continue à travailler là-bas, dans une autre équipe. Nous fabriquons la plateforme analytique Yandex.Market pour les partenaires commerciaux.



Commençons. Pourquoi apprendre Java d'un point de vue pratique? Le fait est que Java est un langage de programmation très célèbre. Il a une très grande communauté.

Par exemple, il existe un tel index TIOBE, un index populaire de la popularité des langages de programmation, et Java y occupe la première place. De plus, sur les sites avec des postes vacants, vous remarquerez probablement que la plupart des postes vacants concernent Java, c'est-à-dire que vous développez en Java, vous pouvez toujours vous trouver un emploi.

Étant donné que la communauté est très vaste, toutes vos questions recevront une réponse sur certains débordements de pile ou sur d'autres sites. Et lors du développement en Java, vous écrivez en fait du code à l'aide de la JVM, vous pouvez donc facilement basculer vers Kotlin, Scala et d'autres langages qui utilisent la JVM.



Qu'est-ce que Java est bon d'un point de vue idéologique? Il existe différents langages de programmation. Ils résolvent différents problèmes, vous le savez. Par exemple, en Python, il est formidable d'écrire des scripts sur une seule ligne pour résoudre des tâches rapides.

Sur les pros, vous pouvez contrôler complètement le code exécutable. Par exemple, nous conduisons des voitures, des véhicules sans pilote Yandex, leur code est écrit sur les pros. Pourquoi? Java a une telle chose - Garbage Collector. Il nettoie la RAM des objets inutiles. Cette chose démarre spontanément et fait arrêter le monde, c'est-à-dire qu'elle arrête le reste du programme et va compter les objets, vider la mémoire des objets. Si une telle chose fonctionne dans un drone, ce n'est pas cool. Votre drone ira droit, en ce moment pour effacer la mémoire et ne pas regarder la route. Par conséquent, le drone est écrit sur les pros.



Quelles tâches Java résout-il? Il s'agit principalement d'un langage pour développer de grands programmes écrits depuis des années, des dizaines ou des centaines de personnes. En particulier, beaucoup de backend dans Yandex.Market est écrit en Java. Nous avons une équipe répartie dans plusieurs villes, dix personnes chacune. Et le code est facile à maintenir, il est pris en charge depuis dix ans ou plus, et en même temps que de nouvelles personnes viennent, elles comprennent ce code.

Quelles caractéristiques un langage doit-il avoir pour que le code qu'il contient soit facilement pris en charge et qu'il soit facile à développer en grandes équipes. Tout d'abord, il doit s'agir d'un code lisible et il doit être facile d'implémenter des solutions architecturales complexes sur celui-ci. Autrement dit, il devrait être facile d'y écrire des abstractions de haut niveau, etc. Tout cela nous fournit simplement Java. Il s'agit d'un langage orienté objet. Il est vraiment facile d'implémenter des abstractions de haut niveau et des architectures complexes.

Il existe également de nombreux frameworks et bibliothèques pour Java, car le langage a plus de 15 ans. Pendant ce temps, tout ce qui pouvait être écrit était écrit dessus, il y a donc un tas de bibliothèques pour tout ce qui peut vous être utile.



Quelles sont les principales compétences, à mon avis, qu'un javiste débutant devrait avoir? Tout d'abord, c'est la connaissance du langage de base Java. De plus, il s'agit de n'importe quel cadre d'injection de dépendance. Le prochain orateur Kirill en parlera plus en détail. Je ne vais pas particulièrement approfondir. De plus, ce sont les modèles d'architecture et de design. Nous devons être en mesure d'écrire du code architecturalement beau pour écrire de grandes applications. Et c'est une sorte de SQL ou ORM pour les tâches de base de données. Et c'est plus sur le backend.



C'est parti! Noyau Java. Ici, je ne découvrirai pas spécialement l'Amérique - vous devez connaître la langue elle-même. À quoi vous devez faire attention. Premièrement, Java a publié de nombreuses versions ces dernières années, c'est-à-dire en 2014-2015, la septième, puis la huitième, la neuvième, la dixième, de nombreuses nouvelles versions ont été publiées, et elles ont introduit de nombreuses nouveautés intéressantes, par exemple, l'API Java Stream , lambda, etc. Très cool, des choses fraîches et cool qui sont utilisées dans le code de production, qui sont posées lors des interviews et que vous devez savoir. Par conséquent, vous ne devez pas prendre un livre d'une étagère dans la bibliothèque Java-4 et aller l'apprendre. Un tel plan: apprendre Java-8 ou supérieur.

Nous portons une attention particulière aux innovations telles que Stream API, var, etc. Elles sont posées lors des entretiens et sont constamment utilisées en production. Autrement dit, l'API Stream est beaucoup plus cool que les cycles, en général, une chose très cool. Assurez-vous de faire attention.

Et il y a toutes sortes de choses comme les itérateurs, les exceptions, etc. Ce qui vous semble sans importance pendant que vous écrivez vous-même un petit code. Vous n'avez pas besoin de ces exceptions, qui en a besoin? Mais ils seront certainement demandés lors des interviews, ils vous seront certainement utiles en production. En général, il convient de prêter attention aux exceptions, aux itérateurs et à d'autres choses.



Structures de données. Sans structures, nulle part, ce sera génial si vous ne savez pas seulement qu'il y a un ensemble, un dictionnaire, des feuilles. Et aussi différentes implémentations de structures. Par exemple, le même dictionnaire en Java a de nombreuses implémentations, y compris HashMap et TreeMap. Ils ont différentes asymptotiques, ils sont disposés différemment à l'intérieur. Vous devez savoir en quoi ils diffèrent, quand utiliser.

Ce sera également formidable si vous savez comment ces structures de données fonctionnent à l'intérieur. Autrement dit, il n'est pas facile de connaître leurs asymptotiques - combien fonctionne le pari, comment fonctionne le passage et comment fonctionne la structure à l'intérieur - par exemple, qu'est-ce qu'un seau dans HashMap.

Il convient également de prêter attention aux arbres et aux graphiques. Ce sont des choses qui ne sont pas très nombreuses dans le code de production, mais elles sont aimées dans les interviews. En conséquence, vous devez pouvoir contourner les arbres, les graphiques en largeur, en profondeur. Ce sont tous des algorithmes simples.

Dès que vous commencez à écrire du code qui est en quelque sorte volumineux, complexe, à l'aide de bibliothèques, de code multi-classes, vous vous rendrez compte que c'est difficile pour vous de ne pas créer de systèmes et de résoudre les dépendances. Il s'agit principalement de Maven et Gradle. Ils vous permettent d'importer des bibliothèques dans votre projet en une seule ligne. Autrement dit, vous écrivez du xml sur une seule ligne et importez dans le projet de bibliothèque. Grands systèmes. Ils sont à peu près les mêmes, utilisez Maven ou Gradle.

Vient ensuite un système de contrôle de version. Je recommande Git car il est populaire, il existe des tonnes de tutoriels. Presque tout le monde utilise Git, une chose sympa, sans lui partout.

Et - un environnement de développement. Je recommande Idée IntelliJ. Il accélère considérablement le processus de développement, vous aide beaucoup, chaque code passe-partout écrit pour vous, en général, cool.


Liens depuis la diapositive: SQLZOO , Habrapost

SQL Un peu sur les backenders. Ici, en fait, était un cas drôle. Deux jours avant mon deuxième entretien de stage, une fille RH m'a appelé et m'a dit que dans deux jours ils me demanderaient SQL et HTTP, j'ai besoin d'apprendre. Et je ne connaissais ni SQL ni HTTP. Et j'ai trouvé un site tellement cool - SQLZOO . Sur celui-ci, j'ai appris SQL pendant 12 heures, dans le sens, la syntaxe SQL, comment écrire des requêtes SELECT, JOIN, etc. Un site très cool, je le recommande vivement. En fait, en 12 heures, j'ai appris 90% de ce que je sais maintenant.

C'est également formidable de connaître l'architecture de la base de données. Ce sont toutes sortes de clés, d'indices, de normalisation. À ce sujet, il existe une série de messages sur Habré.



En Java, en plus de SQL, il existe toutes sortes de systèmes de mappage relationnel-objet tels que JPA. Il y a du code. Dans la première méthode, du code SQL est SELECT id name FROM info.users WHERE id IN userIds. De la base de données des utilisateurs, de la table, leurs identifiants et noms sont reçus.

Ensuite, il existe une sorte de mappeur qui transforme un objet d'une base en un objet Java. Et il y a une troisième méthode ci-dessous, qui, en fait, exécute ce code. Tout cela en utilisant JPA peut être remplacé par une seule ligne, qui est écrite ci-dessous. Elle fait la même chose - trouver All ByIdIn. Autrement dit, par le nom de la méthode, il génère une requête SQL pour vous.

Des trucs très cool. Quand je ne connaissais pas SQL, j'ai moi-même utilisé JPA. En général, faites attention. Si vous êtes trop paresseux pour apprendre SQL - feu. Et, en général, le feu!



Printemps Qui a entendu parler du cadre Spring? Vous voyez combien d'entre vous? Pour une bonne raison. Spring fait partie des exigences de chaque deuxième tâche pour le backend Java. Sans cela, il n'y a vraiment aucun endroit à développer. Qu'est-ce que le printemps? Il s'agit principalement d'un cadre d'injection de dépendance. L'orateur suivant en parlera également. Mais en bref, c'est une chose qui vous permet de faciliter l'importation des dépendances d'une classe à une autre. Autrement dit, la connaissance des dépendances est simplifiée.

Spring Boot est un tel élément de Spring qui vous permet d'augmenter votre application serveur en un seul clic. Vous allez dans THID, cliquez sur quelques boutons, et maintenant votre application serveur a été lancée sur localhost 8080. Autrement dit, vous n'avez pas écrit une seule ligne de code, mais cela fonctionne déjà. Des trucs très cool. Si vous écrivez quelque chose de vous-même, tirez!

Le printemps est un très grand cadre. Il vous soulève non seulement une application serveur et résout l'injection de dépendance. Il vous permet de faire un tas de tout, y compris la création de méthodes API REST. Autrement dit, vous avez écrit une méthode, y mettre l'annotation Get mapping. Et ici, vous avez déjà une méthode sur localhost qui vous écrit Hello world. Deux lignes de code, et ça marche. Des trucs sympas.

Spring facilite également l'écriture des tests. Sans test dans un grand développement en aucune façon. Le code doit être testé. Pour cela, Java a une bibliothèque JUnit 5. Et généralement JUnit, mais la dernière version est la cinquième. Il y a tout pour les tests, toutes sortes d'assertions et d'autres choses.

Et il y a un cadre Mockito génial. Imaginez que vous ayez des fonctionnalités à tester. La fonctionnalité fait beaucoup de choses, y compris quelque part au milieu, elle entre "VKontakte" avec votre identifiant, par exemple, et obtient le prénom et le nom de l'utilisateur "VKontakte" par ID. Probablement, vous n'entrerez pas dans VKontakte dans les tests, c'est étrange. Mais vous devez tester la fonctionnalité, donc cette classe, en utilisant Mockito, l'a rendue mok, son imitation.

Vous direz que lorsqu'une demande est accompagnée de cet ID avec un tel ID, elle renvoie un nom de famille, par exemple Vasya Pupkin. Et ça marchera. Autrement dit, vous testerez toutes les fonctionnalités de mok pour un type de classe. Des trucs très cool.


Lien depuis la diapositive

Modèles de conception. Qu'est ce que c'est Ce sont des modèles pour résoudre des problèmes de développement typiques. Lors du développement, des tâches identiques ou similaires surviennent souvent, ce qui serait formidable à résoudre d'une manière ou d'une autre. Par conséquent, les gens ont trouvé les meilleures pratiques, certains modèles, comment résoudre ces problèmes.

Il existe un site Web avec les modèles les plus populaires - refactoring.guru, vous pouvez lire, découvrir quels sont les modèles, lire un tas de théories. Le problème est qu'il est pratiquement inutile. En fait, les modèles sans pratique ne sont pas particulièrement avantageux.

Vous entendrez parler de certains modèles comme Singletone ou Builder. Qui a entendu ces mots? Beaucoup de monde. Il existe des modèles si simples que vous pouvez mettre en œuvre vous-même. Mais la plupart des modèles: stratégie, usine, façade - on ne sait pas où les appliquer.

Et tant que vous ne verrez pas en pratique dans un code étranger l'endroit où ce modèle est appliqué, vous ne pourrez pas l'appliquer vous-même. Par conséquent, la pratique est très importante avec les modèles. Et lire à leur sujet sur refactoring.guru n'est pas super utile, mais vous devez le faire.



Pourquoi des modèles sont-ils nécessaires? Laissez-vous avoir un utilisateur de classe. Il a un identifiant et un nom. Chaque utilisateur doit avoir à la fois un identifiant et un nom. En haut à gauche - classe.

Quels sont les moyens d'initialiser l'utilisateur? Deux options sont soit un constructeur ou un setter. Quels sont les inconvénients des deux approches?

Constructeur. nouvel utilisateur (7, "Bond"), ok. Maintenant, disons que nous n'avons pas de classe User, mais une autre, avec sept champs numériques. Vous aurez un constructeur dans lequel il y a sept nombres consécutifs. On ne sait pas exactement quels sont ces chiffres, lesquels appartiennent à quelle propriété. Le constructeur n'est pas génial.

La deuxième option est setter. Vous écrivez clairement: setId (7), setName ("Bond"). Vous comprenez quelle propriété appartient à quel domaine. Mais setter a un problème. Premièrement, vous pouvez oublier de faire apparaître quelque chose, et deuxièmement, votre objet se révèle être mutable. Ce n'est pas sûr pour les threads et réduit légèrement la lisibilité du code. Par conséquent, les gens ont trouvé un modèle cool - Builder.



De quoi s'agit-il? Nous allons essayer de rassembler les avantages des deux approches - à la fois setter et constructeur - en une seule. Nous créons un certain objet, Builder, qui aura également des champs Id et Name, qui lui-même sera construit sur la base de setter, et qui aura une méthode Build qui vous renverra un nouvel utilisateur avec tous les paramètres. Nous obtenons un objet et un setter immuables. Cool!

Quels sont les problèmes? Ici, nous avons le Builder classique. Le problème est que nous pouvons encore oublier de remplir un champ. Et si nous avons oublié de remplir un identifiant, dans ce cas dans Builder, il sera initialisé à zéro, car le type int n'est pas annulable. Et si nous faisons le nom «Bond» et oublions de visiter l'identifiant, nous aurons un nouvel utilisateur avec l'identifiant «0» et le nom «Bond». Pas cool.

Essayons de lutter contre cela. Dans Builder, remplacez int par int afin qu'il puisse être annulé. Maintenant, tout va bien.



Si nous essayons de créer un utilisateur avec le nom «Bond», en oubliant de lui donner un ID, nous obtiendrons une exception de pointeur nul, car l'ID n'est pas annulable, mais Builder a null, en particulier une exception de pointeur.



Mais nous pouvons toujours oublier de mettre le nom, donc nous attachons la relecture d'objet à null. Maintenant, lorsque nous construisons notre objet à partir de Builder, il vérifie que le champ n'est pas nullable. Et ce n’est pas tout.

Regardons le dernier exemple. Dans ce cas, si nous définissons d'une manière ou d'une autre la valeur NULL dans l'exécution de l'ID, et ce serait formidable de savoir tout de suite que vous l'avez fait et ce n'est pas cool que vous vous trompiez en ce moment.



Vous devez renvoyer une erreur non pas au moment de la création de l'utilisateur, mais lorsque vous définissez null sur l'identifiant. Par conséquent, dans le générateur, nous allons changer le setter Integer en int, et il jure immédiatement ici qu'il a jeté null.

Bref, à quoi ça sert? Il existe le modèle Builder le plus simple, mais même son implémentation a quelques subtilités, il est donc très cool de regarder différentes implémentations des modèles. Chaque modèle possède des dizaines d'implémentations. Tout cela est très intéressant.



Comment écrivons-nous Builder dans le code de production? Voici notre utilisateur. Nous y suspendons la rotation Builder de la bibliothèque Lombok, et elle nous génère elle-même le Builder. Autrement dit, nous n'écrivons pas de code, mais Java croit déjà que cette classe a un générateur, et nous pouvons l'appeler comme ça.

J'ai déjà dit qu'en Java, il y a des bibliothèques pour presque tout, y compris Lombok, une bibliothèque sympa qui vous permet de ne pas écrire de passe-partout. Constructeur, GET.



Il existe des modèles architecturaux liés non seulement à une classe, mais au système dans son ensemble. Il existe un tel principe sympa dans la conception du système: le principe de responsabilité unique. De quoi parle-t-il? Le fait que chaque classe doit être responsable de certaines de ses fonctionnalités. Dans ce cas, nous avons un contrôleur qui communique avec les utilisateurs, les objets JSON. Il y a Facade, qui convertit les objets JSON en modèles, qui continuera de fonctionner avec l'application Java. Il existe un service dans lequel il existe une logique complexe de travail avec ces modèles. Il existe un objet d'accès aux données qui place ces modèles dans la base de données et les supprime de la base de données. Et il y a la base de données elle-même. En d'autres termes, tout cela n'est pas dans la même classe, mais nous faisons cinq classes différentes, et c'est un autre modèle.



Lorsque vous avez plus ou moins appris Java, c'est génial d'écrire une sorte de votre propre projet, dans lequel il y aura une base de données, de travailler avec d'autres API et qui fournira à votre application serveur des clients d'API REST. Ce sera génial d'insérer une telle chose dans le CV, c'est une fin cool à votre formation. Avec cela, vous pouvez aller chercher un emploi.



Voici un exemple de mon application serveur. Au cours de la deuxième année, j'ai écrit un article à terme avec les gars. Ils ont écrit une application mobile pour organiser des événements. Là, les utilisateurs pouvaient se connecter via VKontakte, mettre des points sur la carte, créer des événements, appeler leurs amis dessus, enregistrer l'image des événements, etc.

Qu'est-ce que j'ai fait dans le projet? A écrit une application serveur sur Spring Boot sans utiliser SQL. Je ne le connaissais pas, j'ai utilisé JPA. Que peut-il faire? Connectez-vous à VK via OAuth-2. Prenez le jeton de l'utilisateur, allez avec lui à VK, vérifiez qu'il s'agit d'un vrai utilisateur. Recevez des informations sur les utilisateurs via VKontakte. Il stocke habilement les informations dans une base de données, également via JPA. Enregistrez habilement des images et d'autres fichiers dans la mémoire de l'ordinateur et enregistrez des liens vers ces derniers dans la base de données. Je ne savais pas encore qu'il y avait des objets CLOB dans la base de données, alors je l'ai fait de cette façon. Il y avait une API REST pour les utilisateurs, les applications clientes. Et il y avait des tests unitaires pour les fonctionnalités de base.

[...] Un petit exemple de mon apprentissage réussi de Java. Au cours de ma première année à l'université, ils m'ont enseigné le C # et m'ont donné une compréhension de la programmation OOP - quelles sont les classes, les interfaces, l'abstraction, pourquoi sont-elles nécessaires. Cela m'a beaucoup aidé. Sans cela, l'apprentissage de Java est assez difficile, on ne sait pas pourquoi les classes sont nécessaires.



Dans ma deuxième année à l'université, ils ont de nouveau donné Java core, mais je ne me suis pas arrêté là, suis allé étudier Spring moi-même et j'ai écrit un article à terme, mon propre projet, dont j'ai parlé plus haut. Et avec tout cela, j'ai fait un stage chez Yandex, j'ai passé une interview, je suis entré chez Yandex.Market. Là, j'ai écrit un backend pour Beru, c'est notre marché, et pour Yandex.Market lui-même.

Après cela, il y a six mois, j'ai été transféré dans une autre équipe au sein du même marché. Nous effectuons des analyses pour les partenaires commerciaux. Nous sommes dans la plateforme analytique, nous sommes trois sur le backend, donc j'ai une très grande part d'influence sur le projet. C'est très intéressant, en fait. Autrement dit, nous fournissons vraiment des données de marché - quelles ventes, dans quelles catégories, dans quels modèles, pour les partenaires commerciaux, les grandes entreprises bien connues. Et nous ne sommes que trois, nous écrivons ce code, et c'est très cool.

Je vous remercie! Liens utiles:
- "Java 8. Un guide pour les débutants . "
- Structures de données .
- SQLZOO .
- Normalisation des bases de données .
- Modèles de conception .
- Modèles de conception .
- Code propre .
- Java efficace .

Source: https://habr.com/ru/post/fr481688/


All Articles