«Apprendre le printemps est une leçon absurde» - Josh Long, principal évangéliste du printemps dans la cuisine intérieure du projet

Aujourd'hui dans notre studio virtuel, le conférencier le plus célèbre au monde pour le printemps est Josh Long.


Ses rapports ouvrent des conférences Java à travers le monde. C'est lui qui répond aux questions de la communauté, publie Spring Tips sur YouTube, c'est son «Cette semaine au printemps» que nous lisons chaque semaine et bien plus encore.


Soit dit en passant, Josh a autorisé à utiliser tous les matériaux dans notre propre «Cette semaine à Java» , mais il le fait avec un volume et une profondeur tels que ces données n'ont jamais pu être compressées au format «Résumé de 15 minutes».


Parfois, il semble qu'il soit dans toutes les villes en même temps, lit des rapports et rédige des articles à un moment donné. Aujourd'hui, nous allons découvrir comment il le fait. Nous en apprenons davantage sur la «juridiction du code», les raisons de l'incroyable vitalité de Spring et comment il a réussi à vivre tant d'années sans réécriture mondiale à partir de zéro et d'autres astuces intéressantes.




Les membres


Josh Long, Spring Developer Advocate chez Pivotal


Evgeny Trifonov, Oleg Chirukhin - éditeurs du groupe JUG.ru



Tout le monde sait que vous voyagez beaucoup, mais il serait intéressant de donner quelques statistiques - combien de conférences vous avez visité l'année dernière, combien de vols vous avez fait, etc.



Bonne question. J'ai un tableau qui enregistre toutes les réunions auxquelles j'assiste pour l'année. Mon assistante, Tasha, m'aide à organiser le planning et ce tableau. Alors, ouvrons cette tablette sur le téléphone ... Deux cent quarante. En 2018, à l'heure actuelle, j'ai assisté à 240 événements différents. Certaines de ces réunions ont lieu en ligne (comme la nôtre), mais je dois m'envoler vers la plupart. Au cours de cette année, j'ai parcouru un demi-million de milles. Permettez-moi de vérifier la distance de la Terre à la Lune ... Il est de 239 mille kilomètres, afin que je puisse voler vers la Lune et vice-versa.



"Vers la Lune et retour du printemps." Bon titre pour le livre de Tolkien.



Les compagnies aériennes vous proposent-elles des offres spéciales parce que vous volez tellement?



Eh bien, je ne me plains pas du service. Je voyage souvent avec United Airlines et ils ont un programme Global Services. Vous ne pouvez y accéder qu'en recevant une invitation - vous-même ne pouvez pas la demander par vous-même, et ses critères sont inconnus. Chaque année, ils invitent les personnes qui volent le plus souvent. L'année dernière, quelqu'un a déclaré avoir sélectionné 1% des clients les plus fréquents dans le monde. Ou peut-être filtrent-ils selon le montant des coûts. D'une manière ou d'une autre, ils me traitent très bien. C'est sympa. Mais même dans ce cas, je pense que pour la plupart des gens, les vols sont un fardeau. Cela me concerne définitivement. Je ne vole pas pour les vols eux-mêmes, mais pour rencontrer des gens qui utilisent Spring. Je me téléporterais s'il y avait une telle opportunité. La vie serait beaucoup plus simple et plus intéressante.



Bonne raison d'attendre Hyperloop.



Oui, mais cela devra attendre longtemps.



Parlons d'un sujet plus proche du printemps. Vous en parlez avec des gens du monde entier - y a-t-il des différences régionales dans sa prévalence?



Je ne dirais pas. Spring a toujours été 100% open source, et tant que les gens écrivent des logiciels qui fonctionnent sur Internet, Spring continuera de réussir dans le monde entier. Certes, il existe d'autres projets open source dans lesquels la spécificité régionale est perceptible. Je ne peux pas confirmer les statistiques maintenant, mais il me semble que GridGain est très courant en Russie.



Oui c'est vrai.



Et en Chine, MyBatis est très populaire. Aux États-Unis et en Europe, je ne l'ai pas vu depuis 10 ans, et en Chine, c'est aussi commun que le printemps. Et, en fait, il n'y a rien de mal avec MyBatis, il est rapide et puissant - alors pourquoi ne pas l'utiliser?



Nous avons fait un projet dans lequel MyBatis travaille avec GridGain, il est là à l'intérieur.



(rires) Donc vous les utilisez tous les deux - super! J'aime ces deux technologies. Il n'y avait pas de support normal pour MyBatis, et je demandais constamment à plusieurs grandes entreprises en Chine qui faisaient des choses incroyables - pourquoi avaient-elles besoin de MyBatis avec Spring? Il existe de nombreuses autres options, Hibernate fonctionne très bien et MyBatis n'est pratiquement pas utilisé en Occident. En conséquence, j'ai décidé qu'une fois le programme utilisé, il est nécessaire d'assurer son fonctionnement normal. Si vous jetez un œil aux sources Spring Boot Starter pour MyBatis maintenant, vous y verrez mon nom. Je voulais que ceux qui ont besoin de ce programme dans l'Est puissent travailler normalement avec lui. En général, une part importante de mon travail provient du type de découvertes que je fais dans différents pays au cours de mes voyages.



Vous êtes l'avocat des développeurs Pivotal pour les projets Spring. Qu'est-ce que cela signifie dans la pratique? Que fais-tu exactement?



Une question difficile. Le concept de Developer Advocate s'est répandu grâce à Apple et, en particulier, à Microsoft. Cela a commencé il y a environ 30 ans, lorsque Microsoft s'est rendu compte que ce sont les développeurs qui avaient une réelle force. Si vous voulez que votre plateforme soit réussie et utile, vous avez besoin de développeurs pour créer de nouvelles choses précieuses sur cette plateforme. En conséquence, vous devez les convaincre des avantages de votre plateforme. Microsoft a commencé à essayer de motiver les développeurs de différentes manières. Ils ont rendu Visual Studio très bon marché, c'est-à-dire qu'ils ont fourni des outils abordables. Ils ont créé de nombreuses API très intéressantes avec lesquelles vous pouvez travailler sous Windows. En général, Microsoft s'est rendu compte qu'il était nécessaire de collaborer avec la communauté. Les gens ne font pas confiance aux logiciels, mais aux autres. Les gens n'ont aucun attachement émotionnel au logiciel. Vous pouvez imaginer autant que vous le souhaitez que vous deviendrez célèbre simplement en écrivant un programme dans la solitude dans votre chambre d'hôtel, et quiconque en aura besoin trouvera lui-même la documentation. Mais en réalité, cela ne se produit généralement pas. Une partie importante de mes responsabilités consiste à communiquer avec les gens de la communauté. J'écoute ce que les gens disent et je l'apporte aux développeurs, puis je transmets à la communauté ce que les développeurs disent. En d'autres termes, je suis une sorte de véhicule.

L'équipe Spring est bizarre et belle. Elle a déjà plus d'une décennie et demie. Au début, elle était très petite et les développeurs eux-mêmes étaient engagés dans le conseil. Ils ont constamment travaillé avec d'autres équipes, les aidant à créer leur propre logiciel, c'est-à-dire qu'ils ont résolu de vrais problèmes et ne se sont pas assis enfermés dans une tour d'ivoire. Ils ne prétendaient pas savoir à l'avance quel logiciel était nécessaire, mais écrivaient ce dont les autres avaient réellement besoin, et leur avantage était toujours leur principal critère. Ils ont partagé avec leurs clients leurs souffrances dans la résolution de problèmes. Nous ne créons pas de choses inutiles. Et cela, comme vous le savez, est souvent un problème lors de la création de logiciels. En fait, la première équipe de Spring était déjà composée de Developer Advocates. Ils n'étaient pas similaires à ce que les programmeurs représentent habituellement. Oui, ils étaient des développeurs talentueux, mais en même temps, ils ont vivement discuté de leurs idées avec d'autres personnes, assisté à des présentations, rencontré des personnes, fait des connaissances et mené des dialogues. Grâce à cela, le printemps a rapidement gagné en popularité.

Le problème est que cette approche n'est pas très évolutive. Il est impossible pour tous les développeurs de passer la moitié de leur temps à voyager, à discuter et à se rencontrer. Au moment où j'ai rejoint l'équipe, j'écrivais déjà du code pour Spring, car c'est un projet open source. De plus, j'avais déjà publié des livres, j'ai écrit des articles et fait des présentations. J'ai donc déjà essayé de présenter Spring au mieux à la communauté et de donner au plus grand nombre de personnes la possibilité de le connaître. Par conséquent, l'équipe Spring m'a invité à faire de même, mais de façon continue et pour de l'argent. Je pense que je suis développeur à 80% et programmeur à 20%, tandis que le reste de l'équipe de développeur est à 20% et à 80% programmeurs.

Dans l'ensemble, mon travail consiste à rester en contact avec la communauté, et il existe de nombreuses façons de le faire. J'écris mon sixième livre, il s'appelle Le livre du printemps réactif; mon précédent a été publié par O'Reilly appelé Cloud Native Java. J'ai créé de nombreux didacticiels vidéo que vous pouvez regarder sur Safari Books Online , dont chacun prend 4 à 5 heures. De plus, tous les mercredis, je publie des vidéos Spring Tips sur YouTube , chacune étant consacrée à un aspect étroit spécifique de l'écosystème. Ils durent généralement de 45 minutes à une heure, chaque année je fais au moins deux saisons, parfois trois. Ainsi, d'année en année, toutes les deux semaines, je prépare suffisamment de matériel pour un rapport complet à la conférence. À partir de janvier 2011, tous les mardis, sans exception, je fais une nouvelle entrée de blog, «Cette semaine au printemps» , dans laquelle je passe en revue tous les plus intéressants de l'écosystème. J'ai aussi d'autres blogs, les deux dernières soirées, je fais juste ça. En plus de cela, j'écris aussi du code et parle lors de conférences. Donc mon travail comprend le maximum d'une grande variété d'activités - mais je pourrais bien me limiter à une seule chose. Il y a des gens qui bloguent ou qui font des vidéos, et ils le font très bien. Certains ne voyagent même pas, mais organisent des séminaires en ligne. Mon approche est différente des autres, mais finalement, toute cette activité poursuit le même objectif.



Soit dit en passant, mes responsabilités incluent également la création de didacticiels, les blogs, etc. Pour moi, c'est très difficile et cela peut prendre un temps arbitraire. À quel point cela vous est-il difficile? Disons combien de temps faut-il pour préparer une vidéo Spring Tips?



J'ai oublié de dire - j'ai un nouveau podcast, rien n'en est encore sorti, mais sept interviews ont déjà été préparées :-) Quant au temps de préparation, ça se passe de différentes manières. Si je suis déjà familier avec le sujet que j'ai décidé de couvrir, alors je dois juste m'asseoir et enregistrer tout deux ou trois fois - je fais toujours beaucoup d'erreurs. Cela prend environ quatre heures une fois par semaine, c'est-à-dire un peu. Mais dans d'autres cas, cela ne suffit pas. Parfois, j'étudie un problème et j'en prends des notes pendant plusieurs mois, puis je décide que puisque ce travail a déjà été fait, pourquoi ne pas faire une vidéo de ces notes. J'apprends constamment, comme vous l'êtes probablement. Mais les situations où j'ai besoin d'apprendre quelque chose spécifiquement pour la vidéo sont rares. La partie la plus difficile ici est de décider ce dont vous avez besoin pour vous asseoir et approfondir le sujet, et non le processus d'étude lui-même.

Parfois, les programmeurs de notre équipe publient quelque chose que personne n'a jamais créé auparavant. Dans cette situation, les gens auront bien sûr des questions, et ces questions tomberont par défaut sur les programmeurs. Et je peux faire une vidéo où tout sera expliqué, et le pré-télécharger sur le réseau afin que les gens aient le temps de se connaître. Évidemment, dans cette situation, je dois aussi apprendre - puisque nous parlons de quelque chose de complètement nouveau.



Combien de projets existent actuellement au printemps?



Bonne question. Je pense que quelques dizaines. Il existe des modules très spécialisés, dont certains sont développés par la communauté, certains par l'équipe Spring de Pivotal ou d'autres grandes entreprises. Toute prise en charge de Google GCP a été effectuée dans Google, prise en charge de Microsoft Azure - dans Microsoft. Mais beaucoup - comme MyBatis, par exemple - est développé par la communauté. De plus, nous avons des modules séparés, par exemple, Spring Data Neo4j, un module pour la base de données de graphes Neo4j. Cela fait partie du projet Spring Data, mais cela a été fait en collaboration avec Neo4j, ils ont fait le travail principal sur ce projet, il vivait juste dans notre référentiel git. Il existe de nombreux exemples de ce type.

Quant à Spring Boot, nous avons un merveilleux mécanisme qui fonctionne avec lui appelé Auto-configuration. Il offre aux gens un moyen pratique de regrouper ce sur quoi ils travailleront. La personne télécharge simplement le fichier JAR dans son chemin de classe et il est automatiquement ajouté à l'application Spring Boot en cours d'exécution. Il y a beaucoup de telles configurations automatiques dans l'écosystème, je n'en connais tout simplement pas une partie importante. Ils fonctionnent comme des plugins.



Et comment comprendre les utilisateurs dans toute cette variété de projets? Y a-t-il une structure ou une idée générale?



Très probablement, vous n'aurez pas besoin de tous les projets. Désignez votre objectif et sélectionnez le projet souhaité en fonction de celui-ci. Je n'aime pas quand les gens essaient «d'apprendre le printemps» - c'est un exercice dénué de sens. La question devrait être posée comme ceci: j'ai besoin d'écrire, disons, une API REST. Ma première étape consiste à vous diriger vers spring.io/guides , où vous pouvez trouver un guide simple et abordable qui prend 10 à 15 minutes. Il aura tout ce que vous devez savoir: quel code écrire, dans quel dossier, comment le faire dans IntelliJ ou dans Eclipse ou dans autre chose. Nous essayons de tout expliquer en détail et n'omettons rien, car nous voulons que ces guides soient accessibles à tous. Quoi que vous fassiez - JMS, Neo4j, sécurité, disjoncteurs, Kafka - nous avons un guide séparé pour chaque sujet. Décidez de votre tâche et sélectionnez le guide approprié. Vous ne devez pas penser à Spring, mais à quoi vous allez intégrer votre système - Spring n'est qu'un outil qui permet cette intégration. Par conséquent, il est inutile d '«apprendre le printemps» - vous devez l'utiliser si cela peut simplifier votre tâche spécifique.



Quels sont, à votre avis, les projets les plus prometteurs du printemps? Ou le plus sous-estimé?



La bibliothèque Spring Retry est très populaire. Il a été développé à l'origine chez Spring Batch. Je ne sais pas si vous avez déjà utilisé Spring Batch, il vous permet de traiter de gros volumes de données transmises séquentiellement, par exemple, des documents du système de fichiers, XML, des fichiers CSP, etc. Dans un cas d'utilisation de cet outil, vous lisez un enregistrement puis l'écrivez - par exemple, d'un service Web vers une file d'attente de messages. Le traitement de ces données peut prendre des heures et il serait extrêmement indésirable que le système, en raison d'une erreur à la toute fin, annule tout le travail effectué pendant la nuit. Tu ne peux pas faire ça. Spring Batch fonctionne avec des paquets de données; il traite les enregistrements non pas un, mais dix ou mille. Même si le traitement de milliers d'enregistrements est perdu, tout le reste sera sauvegardé. De plus, lors de l'écriture de systèmes de packages, vous devez garder à l'esprit que vous devez accéder à d'autres services qui peuvent échouer. Il y a une nouvelle tentative de printemps pour cela. Cette bibliothèque vous permet de faire des appels répétés aux services. De plus, vous pouvez utiliser une vitesse d'obturation exponentielle. En plus de Spring Batch, Spring Retry est également utilisé dans Spring Integration, Spring Cloud Stream, Spring Cloud Data Flow. Dans les deux derniers, nous prenons en charge Spring Retry en raison de sa connexion avec d'autres choses. Ainsi, cette bibliothèque est utilisée dans de nombreux projets Spring, et je ne suis pas sûr que tout le monde le sache. Spring Retry est une bibliothèque très fréquemment utilisée qui est parfois simplement négligée. En général, nous avons beaucoup de choses réactives différentes. Ce sont généralement les plus intéressants.



Pourquoi exactement le réactivisme?



Nous avons une réactivité partout. L'avantage de Spring est que vous pouvez démarrer et terminer un projet avec. Cette semaine, nous avons annoncé notre soutien au projet Facebook RSocket . Il s'agit d'un analogue entièrement réactif de gRPC, mais nettement plus flexible. Il peut être utilisé pour le pub / sub, les données en streaming, la demande / réponse du client - en général, avec lui, vous pouvez implémenter de nombreux modèles de messagerie différents. Et il est utilisé sur Facebook. Il existe deux bundles, l'un en C ++, l'autre en Java. Celui de Java est écrit à l'aide de Reactor, notre bibliothèque réactive. Elle utilise Salesforce. Bien sûr, il existe d'autres options. Avez-vous entendu parler de gRPC de Google? Il est de très haute qualité et intéressant, mais il n'est pas réactif, par défaut il ne fonctionne pas bien avec les types réactifs. Salesforce gRPC n'a pas cet inconvénient. Il a un compilateur qui crée des services basés sur Spring Reactor. Facebook et Salesforce ont donc pu adapter Reactor à leurs besoins.

Le réacteur lui-même est l'un de nos projets les plus intéressants. RxJava est sorti plus tôt, mais Reactor a été le premier à fournir un support de thread réactif. Cela est largement dû au fait que le merveilleux programmeur David Karnock, chef de projet RxJava, a travaillé avec nous sur Reactor. Donc, une partie importante de toutes les choses nouvelles et intéressantes qui se sont produites dans notre écosystème ont touché en quelque sorte Reactor. Grâce à cela, le projet est devenu extrêmement attractif pour les entreprises qui créent de grands systèmes. Reactor est également sous-jacent au framework Spring WebFlux. En outre, sur la base de Reactor, nous avons pris en charge la messagerie réactive, les sockets Web réactives, Spring Cloud Stream, les disjoncteurs réactifs, etc. - tous ces composants peuvent être intégrés dans des applications réactives. Vous pouvez, bien sûr, simplement utiliser Spring, mais je préfère utiliser l'ensemble de l'écosystème avec ces types réactifs.

En plus de cela, nous avons récemment fait une annonce sur R2DBC - notre API pour accéder aux données basées sur SQL pour les pilotes réactifs. Le JDBC réactif n'existe pas encore. Le problème est que si vous utilisez du code réactif, vous ne pouvez pas utiliser le verrou. Si le verrouillage est utilisé, cette interaction doit être augmentée, augmentant le nombre de threads. Et cela contredit l'objectif initial, car nous voulons simplement éviter la mise à l'échelle en augmentant le nombre de threads - c'est trop cher. Par conséquent, R2DBC fournit une abstraction qui fournit un accès réactif aux données. Il existe des pilotes de base de données qui sont initialement réactifs - par exemple, Postgres. Vous pouvez donc utiliser R2DBC, entre autres, avec Postgres et travailler avec SQL réactif sans utiliser de verrou, car vous n'avez pas de threads. Tout ce sujet me semble extrêmement intéressant.



Peut-être pourriez-vous répondre à certaines questions techniques fréquemment posées? L'un des problèmes est que lors de l'utilisation de plusieurs projets Spring, de nombreuses annotations se produisent simultanément. Il devient difficile de comprendre ce que chacun d'eux fait - vous ne pouvez pas simplement cliquer dessus tout en maintenant Ctrl et aller à la définition. Comment se comporter dans une telle situation?



Il doit être exécuté avec l'option `--debug`. La plupart de l'écosystème Spring existe désormais en configuration automatique. Une partie est comme une configuration importée, si dans ce cas vous cliquez sur l'annotation, vous verrez l'inscription `@ Import`, qui indiquera alors sa classe. Si vous cliquez dessus, vous verrez les objets qui ont été créés pour vous. Mais parfois, Spring agit via le mécanisme de configuration automatique - dans cette situation, aucune annotation n'est créée. Il n'y a qu'une bibliothèque et un chemin de classe. Ensuite, il est vraiment difficile de comprendre ce qui se passe et pourquoi. Mais nous voulons que les gens le comprennent aussi facilement que possible. Pour cela, il y a le paramètre `--debug`, qui doit être entré au démarrage de l'application. Ensuite, vous verrez un rapport dans lequel toutes les étapes effectuées par l'application au démarrage seront décrites. L'application vérifie si certains champs ou classes existent et, en fonction de cela, elle décide de créer ou non des objets pour elle. Le rapport vous indique quelles conditions ont été remplies, lesquelles ne le sont pas et quelles configurations ne dépendaient d'aucun contrôle. Donc, si, disons, vous ne comprenez pas pourquoi votre connexion à Kafka ne fonctionne pas, vous pouvez regarder la condition correspondante - peut-être que vous n'avez pas la classe requise dans le chemin de classe.



Maintenant, il y aura une petite question à la traîne. Les opposants à Spring affirment souvent que c'est la cause d'une architecture de mauvaise qualité, car vous pouvez simplement utiliser @Autowired n'importe où et n'importe où. Êtes-vous d'accord avec cette opinion? Il y a dix ans, l'architecture a été créée en trois couches, les valeurs ont été transférées du constructeur au constructeur et des DTO ont été créés. Avec Spring, vous pouvez vous débarrasser de tout cela. Est-ce bon ou mauvais?



Le printemps est un outil. Il permet à plus de gens de créer des logiciels qui viennent en production et fonctionnent correctement, donc je ne pense pas que ce soit nocif. Ces dernières années, des millions de personnes ont créé des applications en l'utilisant, et tout fonctionne bien pour elles. Considérer que le printemps dans son ensemble est nocif est absurde, une telle opinion ne peut être qualifiée d'ignorante.

Au printemps, vous pouvez créer un câblage assez explicite. Si vous craignez qu'il ne soit pas clair d'où vient l'objet donné, vous pouvez le lier vous-même. Vous pouvez créer une configuration java dans laquelle une méthode en appellera une autre, et la valeur de sortie de la méthode appelée sera un bin - Spring s'en chargera. Même lorsque vous appelez le même bac à plusieurs reprises ou des milliers de fois, vous n'aurez jamais plus d'un lien si cet objet est un singleton. Vous voulez que tout soit explicite - cela peut être fait. Si vous le souhaitez, vous pouvez vous tourner vers une option encore plus ennuyeuse - XML. L'essentiel est que si vous ne souhaitez pas utiliser «@ Autowired», cela peut être complètement évité.

Si vous utilisez Spring Boot de la manière la plus courante, vous n'aurez qu'un seul bean. Vous savez que vous avez besoin d'un bean de type «ConnectionFactory» - dans ce cas, il n'y a aucun problème à faire une injection par type. Vous n'avez toujours qu'un seul objet, vous n'aurez pas deux `ConnectionFactory` pour un` Connection`. Vous n'aurez pas deux sessions Hibernate, donc rien ne vous empêche d'injecter `HibernateSession` - il existe toujours dans une seule instance. Si vous voulez que tout soit explicite, vous pouvez utiliser l'annotation `@ Qualifier`. Avec lui, vous marquez ce que vous injectez par type. Cela permettra de distinguer les différentes implémentations de bacs les unes des autres. Supposons que vous ayez un service avec lequel les applications d'un endroit peuvent communiquer avec iTunes, dans un autre - avec Amazon, dans le troisième - avec l'Android Play Store. Il s'agira de trois beans différents d'un type différent, mais chacun aura l'annotation «@ Qualifier». De plus, cette annotation peut être superposée à une autre annotation, assurant ainsi la sécurité du type. Vous lierez ce type, et vous aurez une annotation au-dessus, et lorsque le bean sera créé, il aura l'annotation «@ Qualifier», y compris sur le site du consommateur. Ainsi, ces annotations vous fourniront des liens, et même si vous avez trois implémentations pendant que le programme est en cours d'exécution, vous pouvez toujours trouver celle dont vous avez besoin.



C'est, en général, à votre avis, la flexibilité est une caractéristique positive. Est-ce que vous et l'équipe de Spring adhérez à certains principes fondamentaux comme le Zen Zen?



Oui, respectez. Soit dit en passant, je programme en Python depuis la fin des années 90, et je suis un grand partisan de Python Zen, il a une idée générale très correcte. Quant à votre question, vous devez ici parler de Jürgen Höller, co-fondateur de Spring et le deuxième développeur qui a travaillé sur le projet. C'est un homme chéri, très calme, l'un des meilleurs avec qui j'ai dû communiquer. Il est très facile de lui parler si, par exemple, vous l'avez rencontré lors d'une conférence. En même temps, il a un intellect puissant et sa contribution au printemps est difficile à surestimer. La conférence JAX - très importante, bien que, bien sûr, n'atteigne pas le Joker :) - lui a décerné un prix spécial pour un travail que personne d'autre n'avait reçu auparavant. Les récompenses sont généralement attribuées dans une catégorie spéciale, mais celle-ci est sans catégorie et n'appartient qu'à Jürgen. Spring est le seul projet de l'écosystème Java qui n'a jamais été réécrit depuis 15 ans - car il n'y en a pas besoin. Jürgen a une idée très claire de la façon d'écrire des modules, comment exprimer des types, en général - comment créer une base de code de haute qualité qui peut vivre pendant des décennies et facilement changer si nécessaire. Il n'y a pas d'autres projets de ce type dans l'écosystème Java. Une partie importante des projets n'existe plus, et même parmi ceux qui ont été réécrits à partir de zéro, très peu ont vécu 15 ans.

Sans être réécrit, seul le printemps a duré 15 ans, car il a été écrit très proprement dès le début. Jürgen nous a enseigné certains principes fondamentaux que nous suivons: comment créer des modules, comment créer des packages d'implémentation (par opposition à la partie publique), comment décrire le niveau de surface de l'API et les types de conception pour celui-ci, quels modèles doivent être utilisés. En utilisant Spring, vous vous familiarisez inévitablement avec les modèles de conception, et il en a toujours été ainsi. Un exemple du motif Pattern vient immédiatement à l'esprit. Spring Integration vous présente les modèles d'intégration d'entreprise, Spring MVC présente MVC. Tous ces modèles font partie du cadre et nous les utilisons sur la base de pratiques éprouvées. Notre zen est les principes que Jurgen nous a enseignés. À cet égard, nous sommes tous ses élèves. Jürgen est connu pour son approche un peu étrange de la façon d'écrire du code - à cause de sa manière même un terme spécial, «jurgenize» est apparu. Notre équipe a beaucoup de gens vraiment intelligents avec une grande expérience, certains ont déjà des diplômes et des correctifs chauves. Néanmoins, Jürgen apporte ses propres modifications à leur code. Parfois, ce sont de petites choses comme l'ajout d'espaces, le nettoyage, etc., mais parfois, il réécrit le code mille fois mieux, et en même temps, il ne change pas la paternité du code, c'est-à-dire qu'il s'engage sous le nom de l'auteur d'origine. Dans ces cas, il est dit que le code a été «légalisé», c'est-à-dire qu'il l'a corrigé. Grâce à Jürgen, notre code est très propre. Pour les outils d'analyse de code, il est considéré comme une marque de haute qualité de trouver au moins une sorte de dysfonctionnement au printemps, car il existe un code très propre. En général, je ne peux pas exposer nos principes en détail maintenant, mais ils sont là, ils ont été définis par Jürgen, et tous les projets Spring les suivent. Quant au Spring Boot, nous avons des règles très précises pour créer des modules, que nous appelons des starters.



Ok, merci pour la réponse. Ma dernière question portera sur les performances et Java 11. Pour autant que je sache, Spring génère toujours du contexte lors de l'exécution. Cela peut prendre de quelques minutes à plusieurs heures dans certains anciens programmes bancaires.



Allez? Je n'y crois pas.



Honnêtement, vu de mes propres yeux.



Mais ce ne peut pas être le printemps. Très probablement, quelque chose de terrible se fait là-bas avec Hibernate. Les haricots peuvent être générés par millions, un haricot vide peut être compilé et exécuté très rapidement. Le chargement des informations à partir de la base de données, la validation, etc. prennent du temps, ce qui peut retarder Spring. Mais le printemps lui-même est très rapide.



Oui, je pense qu'il y avait vraiment une sorte d'horreur avec Hibernate. Néanmoins, le printemps commence 30 secondes, parfois une minute ou deux - c'est encore assez long, vous ne pensez pas? Si, par exemple, nous l'exécutons dans Docker, nous avons besoin du conteneur pour démarrer immédiatement. Est-il possible de réduire le temps de démarrage de Spring?



Il me faut moins de deux secondes pour démarrer le printemps. Et avec Spring Cloud Function, ce temps peut être réduit à une demi-seconde ou moins. Nous avons des projets qui s'exécutent sans problème en une demi-seconde - par exemple, Spring Boot dans Spring Cloud Function. Donc, encore une fois, le problème n'est pas au printemps, mais dans ce que vous leur faites, ce qui se passe en arrière-plan - avez-vous accès à une autre source de données sur Internet, téléchargez-vous des fichiers depuis Internet, téléchargez-vous des données sur la grille . Si vous ne faites que de petits microservices, votre système devrait fonctionner très rapidement. Si votre application fonctionne depuis très longtemps, quelque chose ne va pas.



Je vois. Au fait, avez-vous entendu parler de GraalVM et AOT?



Oui Je vais vous en dire plus: nous avons un projet Spring Fu. Il est expérimental, j'ai tourné une vidéo de la série Spring Tips à son sujet. Nous l'avons écrit sur Kotlin, maintenant il a une API Java. Ce projet a été créé pour des environnements comme GraalVM. Spring Fu n'utilise pas de proxys générés dynamiquement ou de «@ Configuration». Le générateur d'images natif de GraalVM doit savoir quelles classes seront chargées. Mais si vous avez un chargement dynamique en utilisant cglib ou Byte Buddy, cela rend difficile l'utilisation de GraalVM. Hibernate, Spring et toutes les autres bibliothèques qui utilisent des proxys générés dynamiquement sont mal adaptés à la création d'une image native. Par conséquent, il n'y a rien de tel dans Spring Fu, cela est directement indiqué. Il utilise toujours Spring, mais l'approche de création d'applications est différente. Et l'un des avantages de Spring Fu est qu'il fonctionne bien avec GraalVM. Et maintenant, l'application démarre instantanément. Je veux dire, généralement instantanément: une fois qu'il est complètement en mémoire! Il ne faut pas oublier que le générateur d'images natif de GraalVM est encore à un stade très précoce de développement. Pour cette raison, des difficultés surviennent parfois, car il semble aux gens que l'application lancée par GraalVM commencera immédiatement à se charger très rapidement, et en runtime la vitesse sera la même qu'auparavant. Mais cela ne se passe pas comme ça, car dans le runtime GraalVM vous n'utilisez plus la JVM, le comportement du système sera différent. Testez donc la santé de ce projet, mais n'oubliez pas qu'il ne s'agit pas d'une accélération de lancement gratuite. Et pourtant, je suis ravi de GraalVM, leur équipe a mis beaucoup d'efforts pour le faire fonctionner mieux avec les frameworks.



Ma dernière question, bien sûr, portera sur Java 11.



Oui, elle est belle.



Qu'est-ce qui est utile pour le printemps?



Pour les développeurs Spring, il y a deux critères principaux par lesquels nous choisissons telle ou telle technologie: 1. si elle convient aux besoins de l'entreprise, 2. si elle nous convient en tant que programmeurs. Quant au premier critère, si cette technologie offre une vitesse plus élevée, une stabilité, si elle a un support à long terme. Tout cela est présent dans Java 11. La prise en charge de Java 8 prendra bientôt fin, il est donc logique de passer à la prochaine version avec une prise en charge à long terme. Au fait, mes amis, si vous passez à la prochaine version, prenez l'assemblage OpenJDK - il est excellent à tous points de vue. La version correcte est très facile à obtenir, j'ai déjà écrit à ce sujet sur Twitter. Cette version fonctionne très bien avec Spring - elle est stable. Vous pouvez au moins maintenant aller sur https://start.spring.io , générer un nouveau projet, sélectionner Java 11 et cela fonctionnera. La prise en charge de Java 11 est disponible dans IntelliJ et Eclipse.

Quant au deuxième critère, il n'y a pas de changements significatifs pour les développeurs Spring en Java 11. C'est bien que `var` et le client HTTP soient apparus, mais Spring avait déjà un WebClient réactif, donc je ne suis pas sûr que nous bénéficierons du client HTTP. Certaines choses pratiques ont été ajoutées dans Java 10 et Java 9. De plus, il est devenu possible d'exécuter le programme Java en tant que script - ce n'est pas mauvais. Je ne suis pas sûr que cela ait du sens de le faire avec Spring - bien que d'un autre côté, pourquoi pas. À quoi cela ressemblera, je ne sais pas.



A-t-il été difficile pour Spring de passer à Java 11?



Non. Au cœur du printemps se trouvent des bibliothèques de très haute qualité et l'écosystème. Gardez à l'esprit que le framework Spring lui-même prend en charge à la fois classpath et modulepath, mais personnellement je ne recommande pas d'utiliser modulepath. Pour l'utiliser correctement, tout le reste doit également prendre en charge modulepath. Et ce n'est pas encore possible, maintenant il y a trop peu de personnes qui prennent en charge modulepath dans les bibliothèques. Le mode classpath fonctionne plutôt bien. Nous avons eu des problèmes assez standard avec CGLib, AspectJ et les bibliothèques XML JAXB que tout le monde avait lors du passage à Java 9. Tous ces problèmes ont été résolus au cours de l'année dernière environ, ce qui nous a facilité la transition vers Java 11.



Soit dit en passant, nous prévoyons beaucoup de choses intéressantes pour les futures versions de Java, par exemple, le projet Loom est des fibres pour Java.



Sera-ce en Java 12?



Probablement pas, ils le feront pendant un certain temps.



Kotlin utilise également des coroutines, donc ce projet est très intéressant pour nous. Chaque fois qu'il sortira, il sera très utile. La capacité d'exprimer des pipelines réactifs sans créer de code réactif est très importante. Personnellement, j'attends avec impatience l'apparition de String multi-lignes. Ce n'est peut-être pas la meilleure façon de témoigner de moi - j'ai beaucoup de code qui nécessite un grand nombre de lignes, par exemple, des requêtes SQL et autres.



En effet, vous disposez d'une partie importante du code optimisé pour le diaporama. Sur les diapositives pendant les rapports, il sera pratique d'afficher la chaîne entière à l'écran.



Oui, sinon cela devient difficile à lire. Dans l'IDE, ils auront l'air beaucoup mieux. Encore une fois, Python, Kotlin, Scala, Groovy - n'importe quelle langue au cours des 20 dernières années a fourni un support de chaîne multi-lignes. À mon avis, c'est tout à fait naturel.



Vous souhaitez peut-être laisser quelques conseils à nos lecteurs? Cela peut concerner Spring ou Pivotal, et peut concerner Java dans son ensemble.



Comme pour toute technologie, la meilleure partie de Spring est sa communauté. Techniquement, Spring est un ensemble de projets extrêmement intéressant, mais le secret de sa longévité est une merveilleuse communauté. Personne n'a besoin de votre merveilleux logiciel si vous avez besoin de communiquer avec des personnes insupportables pour lui. Par conséquent, nous essayons d'être aussi amicaux que possible. Nos développeurs, y compris les chefs de projet, répondent aux questions sur Stack Overflow et y suivent diverses balises. Nous avons des salons de discussion sur Gitter, et chaque salon de discussion correspond à un référentiel sur GitHub. Par exemple, https://gitter.im/spring-projects/spring-boot . Vous y trouverez des développeurs Spring et posez les questions qui vous intéressent.


Les gens me demandent souvent comment aider le projet, comment commencer à écrire du code pour Spring. Nous avons beaucoup de problèmes avec des balises comme «idéal pour la contribution» sur GitHub. Nous sommes heureux de tout le monde, mais tous les projets ne conviennent pas à tout le monde, certains bugs sont plus compliqués que d'autres. Donc, si vous souhaitez travailler avec nous, recherchez ces balises et résolvez les problèmes. C'est ainsi que se fait la reconstitution de notre communauté. Nous apprécions le travail de tous ceux qui contribuent à améliorer notre écosystème.



Minute de publicité. Josh Long arrive à la conférence Joker 2018 avec une conférence sur le printemps réactif . Les billets peuvent être achetés sur le site officiel de la conférence .

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


All Articles