Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

En quoi Java est-il différent des autres langages populaires ? Pourquoi Java devrait-il être le premier langage à apprendre ? Créons un plan qui vous aidera à apprendre Java à partir de zéro et en appliquant vos compétences en programmation dans d'autres langages. Énumérons les différences entre la création de code de production en Java et le développement dans d'autres langages. Mikhaïl Zatepyakin a lu ce rapport lors d'une réunion pour les futurs participants des stages Yandex et autres développeurs débutants - Meetup Java Junior.


— Bonjour à tous, je m'appelle Misha. Je suis un développeur de Yandex.Market et aujourd'hui, je vais vous expliquer pourquoi apprendre Java et comment le faire efficacement. Vous pouvez vous poser une question raisonnable : pourquoi vais-je raconter cette histoire, et non un développeur solide avec de nombreuses 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 de ce que c'était et des pièges qui existent.

Il y a un an, j'ai obtenu un stage chez Yandex.Market. J'ai développé le backend pour Beru, pour le Market lui-même, vous l'avez probablement utilisé. Maintenant, je continue à travailler là-bas, dans une autre équipe. Nous créons une plateforme analytique pour Yandex.Market pour les partenaires commerciaux.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

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

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

La communauté étant très vaste, toutes vos questions trouveront une réponse sur certains Stack Overflow ou d'autres sites. De plus, lorsque vous développez en Java, vous écrivez réellement du code sur la JVM, vous pouvez donc facilement passer à Kotlin, Scala et à d'autres langages qui utilisent la JVM.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Qu’est-ce qui est bien avec Java 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, Python est idéal pour écrire des scripts sur une seule ligne afin de résoudre rapidement des problèmes.

Du côté positif, vous pouvez contrôler entièrement le code exécutable. Par exemple, nous avons des voitures, des voitures sans conducteur Yandex, leur code est écrit en plus. Pourquoi? Java a une telle chose - Garbage Collector. Il efface la RAM des objets inutiles. Cette chose démarre spontanément et arrête le monde, c'est-à-dire qu'elle arrête le reste du programme et va compter les objets, effacer la mémoire des objets. Si un truc pareil marche dans un drone, ce n'est pas cool. Votre drone roulera tout droit, effacera à ce moment sa mémoire et ne regardera plus du tout la route. Par conséquent, le drone est écrit pour les pros.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Quels problèmes Java résout-il ? C'est avant tout un langage permettant de développer de grands programmes écrits au fil des années, par des dizaines ou des centaines de personnes. En particulier, une grande partie du backend de Yandex.Market est écrite 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 de nouvelles personnes arrivent et 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 puisse être facilement développé dans de grandes équipes. Tout d’abord, il doit s’agir d’un code lisible et il doit être facile de mettre en œuvre des solutions architecturales complexes. Autrement dit, il devrait être facile d'écrire des abstractions de haut niveau, etc. C'est tout cela que Java nous offre. Il s'agit d'un langage orienté objet. Il est très simple 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 cette période, tout ce qui pouvait être écrit y était écrit, il existe donc des tonnes de bibliothèques pour tout ce dont vous pourriez avoir besoin.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Quelles compétences de base, à mon avis, un joueur JA débutant devrait-il posséder ? Tout d’abord, il s’agit de la connaissance du langage de base Java. Vient ensuite une sorte de framework d’injection de dépendances. Le prochain intervenant, Kirill, en parlera plus en détail. Je n'irai pas trop loin. Vient ensuite l’architecture et les modèles de conception. Nous devons être capables d'écrire du code d'une belle architecture afin d'écrire des applications volumineuses. Et c'est une sorte de SQL ou d'ORM pour les tâches de travail avec la base de données. Et cela s’applique davantage au backend.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Aller! Noyau Java. Je ne découvrirai pas vraiment l’Amérique ici, il faut connaître la langue elle-même. Ce à quoi vous devez faire attention. Premièrement, Java a publié de nombreuses versions ces dernières années, c'est-à-dire qu'en 2014-2015, la septième a été publiée, puis la huitième, la neuvième, la dixième, de nombreuses nouvelles versions et beaucoup de nouvelles choses intéressantes y ont été introduites. , par exemple, l'API Java Stream , lambda, etc. Des choses très cool, fraîches et cool qui sont utilisées dans le code de production, ce qu'ils demandent dans les interviews et que vous devez savoir. Par conséquent, vous ne devriez pas prendre un livre sur l'étagère de la bibliothèque Java-4 et aller l'apprendre. C'est notre plan : nous apprenons 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 boucles, 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. Des choses qui vous semblent sans importance tant que vous écrivez vous-même un petit code. Vous n’avez pas besoin de ces exceptions, qui en a besoin de toute façon ? Mais ils vous seront certainement demandés lors des entretiens, ils vous seront certainement utiles en production. En général, vous devez faire attention aux exceptions, aux itérateurs et à d'autres éléments.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Structures de données. Vous ne pouvez pas vous passer de structures, mais ce serait formidable si vous ne sachiez pas qu'il existe des ensembles, des dictionnaires et des feuilles. Et aussi différentes implémentations de structures. Par exemple, le même dictionnaire en Java a de nombreuses implémentations, notamment HashMap et TreeMap. Ils ont des asymptotiques différentes, ils sont structurés différemment à l'intérieur. Vous devez savoir en quoi ils diffèrent et quand utiliser lequel.

Ce sera également très cool si vous savez comment ces structures de données fonctionnent en interne. Autrement dit, il n'est pas facile de connaître leurs asymptotiques - combien le pari fonctionne, combien de temps la passe fonctionne, mais 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 courantes dans le code de production, mais qui sont populaires dans les interviews. En conséquence, vous devez être capable de parcourir des arbres, des graphiques en largeur et en profondeur. Ce sont tous des algorithmes simples.

Dès que vous commencerez à écrire du code volumineux, complexe, en utilisant des bibliothèques, du code multi-classes, vous réaliserez qu'il est difficile pour vous de ne pas construire de systèmes et 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 un fichier XML sur une ligne et importez des bibliothèques dans le projet. Grands systèmes. Ils sont à peu près les mêmes, utilisez-en un - Maven ou Gradle.

Ensuite - une sorte de système de contrôle de version. Je recommande Git car il est populaire et il existe des tonnes de tutoriels. Presque tout le monde utilise Git, c’est une bonne chose, vous ne pouvez pas vous en passer.

Et une sorte d'environnement de développement. Je recommande IntelliJ Idea. Cela accélère considérablement le processus de développement, vous aide beaucoup, écrit tout le code passe-partout pour vous, en général, c'est cool.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Liens de la diapositive : SQLZOO, Habrapost

SQL. Un peu sur les backenders. Il y a eu en fait un cas amusant ici. Deux jours avant mon deuxième entretien de stage, une responsable RH m'a appelé et m'a dit que dans deux jours, elle me poserait des questions sur SQL et HTTP, je devais les apprendre. Et je ne connaissais presque rien à SQL ou HTTP. Et j'ai trouvé ce site sympa - SQLZOO. J'ai appris SQL dessus en 12 heures, je veux dire, la syntaxe SQL, comment écrire des requêtes SELECT, JOIN, etc. Site très cool, je le recommande vivement. En fait, en 12 heures, j'ai appris 90 % de ce que je sais actuellement.

Et c'est également formidable de connaître l'architecture des bases de données. Ce sont toutes sortes de clés, d'index, de normalisation. Il existe une série d’articles à ce sujet sur Habré.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

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

Ensuite, il existe un certain mappeur qui transforme un objet de la base en un objet Java. Et il existe une troisième méthode ci-dessous qui exécute réellement ce code. Tout cela peut être remplacé en utilisant JPA par une seule ligne, écrite ci-dessous. Cela fait la même chose : recherchez All ByIdIn. Autrement dit, en fonction du nom de la méthode, elle génère une requête SQL pour vous.

Chose très cool. Moi-même, quand je ne connaissais pas SQL, j'utilisais JPA. En général, faites attention. Si vous êtes trop paresseux pour apprendre SQL, c'est un désastre. Et, en général, le feu !

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Printemps. Qui a entendu parler du framework Spring ? Voyez-vous combien vous êtes ? Non sans raison. Spring est inclus dans les exigences d’un poste vacant de backend Java sur deux. Sans cela, il n’y a vraiment aucun développement à grande échelle. Qu’est-ce que le printemps ? Tout d’abord, il s’agit d’un framework d’injection de dépendances. A propos de ça aussi dira prochain intervenant. Mais bref, c'est quelque chose qui permet de faciliter l'importation des dépendances de certaines classes sur d'autres. Autrement dit, la connaissance des dépendances est simplifiée.

Spring Boot est un élément de Spring qui vous permet d'exécuter votre application serveur avec un seul bouton. Vous accédez à THID, appuyez sur quelques boutons et votre application serveur est maintenant opérationnelle sur localhost 8080. Autrement dit, vous n’avez pas encore écrit une seule ligne de code, mais cela fonctionne déjà. Chose très cool. Si vous écrivez quelque chose de votre choix, feu !

Spring est un très grand framework. Il récupère non seulement votre application serveur et résout l’injection de dépendances. Il vous permet de faire un tas de choses, notamment de créer des méthodes API REST. Autrement dit, vous avez écrit une méthode et y avez attaché l'annotation Get mapping. Et maintenant, vous disposez déjà d’une méthode sur localhost qui vous écrit Hello World. Deux lignes de code et ça marche. Truc cool.

Spring facilite également l'écriture des tests. Il n'y a aucun moyen sans tester dans le cadre d'un développement à grande échelle. Le code doit être testé. À cet effet, Java dispose d'une bibliothèque intéressante JUnit 5. Et JUnit en général, mais la dernière version est la cinquième. Il y a tout pour tester, toutes sortes d'assertions et autres choses.

Et il existe un superbe framework Mockito. Imaginez que vous souhaitez tester une fonctionnalité. La fonctionnalité fait beaucoup de choses, y compris, quelque part au milieu, elle se connecte à VKontakte avec votre identifiant, par exemple, et reçoit le prénom et le nom de l'utilisateur de VKontakte à partir de l'ID. Vous n’inclurez probablement pas VKontakte dans les tests, c’est étrange. Mais vous devez tester la fonctionnalité, vous avez donc créé cette classe en utilisant Mockito, en la mokant, en l'imitant.

Vous direz que lorsqu'une requête arrive à cette classe avec un identifiant tel ou tel, elle renvoie un nom de famille, par exemple Vasya Pupkin. Et ça marchera. Autrement dit, vous testerez toutes les fonctionnalités de mok one class. Chose très cool.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Lien de la diapositive

Modèles de conception. Ce que c'est? Ce sont des modèles pour résoudre les problèmes typiques qui surviennent lors du développement. Lors du développement, des problèmes identiques ou similaires surviennent souvent qu'il serait formidable de bien résoudre d'une manière ou d'une autre. Par conséquent, les gens ont proposé les meilleures pratiques, certains modèles, sur la façon de résoudre ces problèmes.

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

Vous entendrez parler de certains modèles comme Singletone ou Builder. Qui a entendu ces mots ? Beaucoup de gens. 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 jusqu'à ce que vous voyiez en pratique dans le code d'une autre personne un endroit auquel 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 le simple fait de lire à leur sujet sur refactoring.guru n'est pas très utile, mais cela vaut vraiment la peine.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Pourquoi les modèles sont-ils nécessaires ? Disons que vous avez une certaine classe d'utilisateurs. Il a un identifiant et un nom. Chaque utilisateur doit avoir à la fois un identifiant et un nom. En haut à gauche, la salle de classe.

Quelles sont les manières d’initialiser l’utilisateur ? Il existe deux options : soit un constructeur, soit un passeur. Quels sont les inconvénients des deux approches ?

Constructeur. nouvel utilisateur (7, "Bond"), d'accord. Supposons maintenant que nous n'ayons pas de classe User, mais une autre, avec sept champs numériques. Vous aurez un constructeur contenant sept nombres consécutifs. On ne sait pas exactement quels sont ces numéros et lesquels d’entre eux appartiennent à quelle propriété. Le designer 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 le passeur a un problème. Premièrement, vous risquez d'oublier d'attribuer quelque chose, et deuxièmement, votre objet s'avère mutable. Ceci n’est pas thread-safe et réduit légèrement la lisibilité du code. C'est pourquoi les gens ont imaginé un modèle sympa : Builder.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Ca parle de quoi? Essayons de combiner les avantages des deux approches (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 en fonction du setter, et qui aura une méthode Build qui vous renvoie un nouvel utilisateur avec tous les paramètres. Nous obtenons un objet immuable et un setter. Cool!

Quels sont les problèmes? Ici, nous avons le Builder classique. Le problème est que nous pouvons encore oublier de vérifier certains champs. Et si nous avons oublié de visiter l'ID, dans ce cas dans Builder, il est initialisé à zéro, car le type int n'est pas nullable. Et si nous créons le nom « Bond » et oublions de visiter le bureau d'identité, nous aurons un nouvel utilisateur avec l'identifiant « 0 » et le nom « Bond ». Pas cool.

Essayons de lutter contre cela. Dans Builder, nous changerons int en int pour qu'il soit nullable. Maintenant, tout va bien.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Si nous essayons de créer un utilisateur avec le nom « Bond », en oubliant de mettre son identifiant, nous obtiendrons une exception de pointeur nul, car l'ID n'est pas nullable et le constructeur a une exception nulle, spécifiquement de pointeur.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Mais nous pouvons toujours oublier de mettre un nom, nous définissons donc la relecture de l'objet sur null. Désormais, 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 mettons null d’une manière ou d’une autre dans le runtime ID, ce serait formidable de savoir immédiatement que vous l’avez fait et ce n’est pas cool que vous fassiez une erreur maintenant.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Vous devez générer une erreur non pas au moment de la création de l'utilisateur, mais lorsque vous définissez null sur l'ID. Par conséquent, dans Builder, nous remplacerons le setter Integer par int, et il jurera immédiatement qu'ils ont rejeté null.

Bref, à quoi ça sert ? Il existe un modèle Builder simple, mais même sa mise en œuvre comporte quelques subtilités, il est donc très intéressant d'examiner différentes implémentations de modèles. Chaque modèle a des dizaines d'implémentations. Tout cela est très intéressant.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

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

J'ai déjà dit que Java possède des bibliothèques pour presque tout, y compris Lombok, une bibliothèque intéressante qui vous permet d'éviter d'écrire des passe-partout. Constructeur, GET.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Les modèles peuvent être architecturaux – liés non seulement à une classe, mais au système dans son ensemble. Il existe un principe vraiment intéressant dans la conception de systèmes : le principe de responsabilité unique. De quoi parle-t-il? Le fait que chaque classe doit être responsable de certaines de ses propres fonctionnalités. Dans ce cas, nous avons un Controller qui communique avec les utilisateurs, des objets JSON. Il existe Facade, qui convertit les objets JSON en modèles avec lesquels l'application Java fonctionnera ensuite. Il existe un service doté d'une logique complexe qui fonctionne 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 récupère de la base de données. Et il y a la base de données elle-même. En d’autres termes, tout n’est pas dans une seule classe, mais nous créons cinq classes différentes, et c’est un autre modèle.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Une fois que vous avez plus ou moins appris Java, c'est formidable d'écrire votre propre projet qui aura une base de données, fonctionnera avec d'autres API et exposera votre application serveur aux clients API REST. Ce serait une bonne chose à ajouter à votre CV, ce serait une belle fin à vos études. Avec cela, vous pouvez aller chercher du travail.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Voici un exemple de mon application serveur. Au cours de ma deuxième année, j'ai rédigé une dissertation avec les gars. Ils écrivaient une application mobile pour organiser des événements. Là, les utilisateurs pouvaient se connecter via VKontakte, placer des points sur la carte, créer des événements, inviter leurs amis, enregistrer des images d'événements, etc.

Qu’ai-je fait dans le projet ? J'ai écrit une application serveur dans Spring Boot sans utiliser SQL. Je ne le connaissais pas, j'ai utilisé JPA. Que pourrait-il faire ? Connectez-vous à VK via OAuth-2. Prenez le jeton de l'utilisateur, allez sur VK avec, vérifiez qu'il s'agit d'un véritable utilisateur. Recevez des informations sur les utilisateurs via VKontakte. Il a pu enregistrer des 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 les liens vers eux dans la base de données. À cette époque, je ne savais pas qu'il y avait des objets CLOB dans la base de données, alors je l'ai fait de cette façon. Il existait une API REST pour les utilisateurs et les applications clientes. Et il y a eu 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é, j'ai appris le C# et j'ai compris la programmation POO : ce que sont les classes, les interfaces, l'abstraction et pourquoi elles sont nécessaires. Cela m'a beaucoup aidé. Sans cela, apprendre Java est assez difficile, on ne sait pas pourquoi des cours sont nécessaires.

Pourquoi apprendre Java et comment le faire efficacement. Rapport Yandex

Au cours de ma deuxième année à l'université, ils ont de nouveau enseigné le noyau Java, mais je ne me suis pas arrêté là, je suis allé étudier Spring moi-même et j'ai rédigé un document de cours, mon projet, que j'ai mentionné ci-dessus. Et avec tout cela, je suis allé faire un stage chez Yandex, j'ai passé un entretien et je suis entré dans Yandex.Market. Là, j'ai écrit le 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, j'ai donc une très grande part d'influence sur le projet. C'est très intéressant, en fait. Autrement dit, nous fournissons réellement des données sur le marché - quelles sont les 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.

Merci! Liens utiles:
- "Java 8. Guide du débutant".
- Structures de données.
- SQLZOO.
- Normalisation de la base de données.
- Modèles de conception.
- Modèles de conception.
- Code propre.
- Java efficace.

Source: habr.com

Ajouter un commentaire