Ce que j'ai compris et quels problèmes j'ai rencontrés lors de la création d'un clone de Hacker News



D'un traducteur: Cet article est une traduction abrégée de la publication originale du développeur Web Jesse Horne. Son travail et en même temps son hobby est le webdesign. Jesse partage souvent ses meilleures pratiques et leçons apprises avec d'autres programmeurs, expérimentés et débutants.

Il y a quelque temps, j'ai écrit un article assez volumineux sur Hacker News, qui a reçu un solide soutien des lecteurs. J'ai attiré l'attention sur les capacités de cette ressource et j'ai décidé d'essayer d'en créer un clone afin d'acquérir de nouvelles expériences et connaissances.

Skillbox recommande: Un cours de développeur PHP pratique d'un an.
Nous vous rappelons: pour tous les lecteurs de «Habr» - une remise de 10 000 roubles lors de l'inscription à un cours Skillbox en utilisant le code promo «Habr».

Au départ, cela me semblait être un grand objectif, où l'ensemble d'outils et de tactiques de travail était prédéterminé. Auparavant, j'ai travaillé sur des tâches plus petites en utilisant différents langages et cadres. La seule chose qui n'existait pas était un projet majeur qui permettrait de rassembler tout cela.

J'ai décidé de travailler sur un nouveau projet à partir de zéro en utilisant le langage Crystal. Il s'agit d'un outil pratique, qui est également nouveau. C'est rapide, les principes de travail avec lui sont similaires à Ruby. Il est typé statistiquement et est open source. Mais juste une nouvelle langue ne suffit pas non plus, j'ai donc décidé de compliquer ma tâche, et de ne pas faire un clone de Hacker News, mais une version améliorée de cette ressource.

Soit dit en passant, je pensais que la création d'un clone normal serait une tâche facile. Et le fait que ce ne soit pas le cas, je m'en suis rendu compte un peu plus tard, en commençant le travail.

Ne pas balayer trop haut

Je ne veux pas dire que vous ne devez pas vous fixer d’objectifs ambitieux. Essayez d'atteindre les étoiles, avec ou sans épines. Rêver est utile, essayer de réaliser ce que je ne pouvais pas faire avant est nécessaire pour réussir sur l'échelle professionnelle.

J'ai dit que vous ne devriez pas essayer de vous précipiter immédiatement dans l'embrasure d' une tâche complexe et vaste. Choisissez ce dont vous avez besoin à un moment particulier pour mettre en œuvre l'idée. De plus, je recommande de diviser les objectifs importants en objectifs plus petits. Si vous avez trop de code dans lequel il y a beaucoup de «déchets», essayez de simplifier et de tout structurer.

Je ne peux même pas mettre en mots à quel point il est important de diviser une grande tâche en plusieurs plus petites.

Dans mon cas, j'ai rencontré divers nouveaux problèmes que je n'avais pas rencontrés auparavant. Tout d'abord, je n'ai travaillé qu'une seule fois sur Crystal - lorsque je créais une application dont la complexité n'était pas beaucoup plus élevée que la complexité d'un programme comme «Hello, world!». Dans le passé, j'utilisais Python, Lua, PHP. La nouvelle langue a été le premier obstacle à la mise en œuvre du projet.

Le second était le cadre . Crystal, étant un nouveau langage, n'a toujours pas trop de frameworks et de documentation pour eux. J'ai décidé d'utiliser Kemal pour mon clone. J'espérais que le cadre est intuitif, car je l'ai rencontré dans mon travail. Mais voici un autre cas - les choses individuelles n'étaient pas faciles à comprendre. Par exemple, certaines sections du code semblaient tout à fait normales, mais pour une raison quelconque, cela ne fonctionnait pas. Et il était difficile de trouver la cause du problème sur Internet pour la même raison - la nouveauté du langage et du cadre lui-même. Dans certains cas, j'ai dû m'arrêter longtemps et m'occuper de la cause du problème. Jusqu'à présent, je n'ai jamais regardé la source, par exemple, le même flacon.

Le troisième obstacle est les objectifs spécifiques que j'ai choisis pour le projet. Afin de rendre mon clone plus utile, j'ai décidé d'ajouter un certain nombre de fonctionnalités fonctionnelles. J'ai travaillé avec Hacker News plus tôt, donc je connais beaucoup les avantages et les inconvénients de cette ressource. Il m'est venu à l'esprit qu'il serait bon de puiser dans les analyses fournies par GitHub. En les utilisant, j'ai pu ajouter des statistiques sur le nombre de vues et l'activité des utilisateurs sur le site.

J'ai donc décidé que mon clone devrait afficher au moins les vues et les clics pour chaque publication. Une telle fonction serait probablement utile pour les utilisateurs, et sa mise en œuvre serait une bonne pratique pour moi. Mais je ne pensais pas que ça prendrait si longtemps! Maintenant, le projet est plus une preuve de concept qu'une ressource toute faite. En plus des vues et des clics, j'ai également décidé d'ajouter un affichage des commentaires qui apparaissent afin qu'ils apparaissent en temps réel. Sans cette tâche supplémentaire, le projet aurait été achevé beaucoup plus rapidement.

Maintenant, le projet prend en charge l'autorisation, la publication et le tri des messages, l'interaction avec d'autres utilisateurs en commentant et en affichant les profils, etc.

Le quatrième problème auquel je suis confronté est le chaos. Les migrations, les modèles, les vues, les contrôleurs API, le code CSS et JavaScript s'accumulent très rapidement. Et tout cela devient un gâchis. J'ai essayé de résoudre le problème et j'ai presque réussi. Mais des endroits partiellement problématiques dans le code de mon projet se produisent toujours - vous pouvez facilement le remarquer. Ainsi, dans de nombreux endroits, le code est répété, les points de terminaison ne sont pas organisés, la dénomination est compliquée, ce qui entraîne une augmentation de la quantité de code et un grand nombre de requêtes vers la base de données. Petit à petit, je résous ce problème.

Dans de nombreux endroits, le code est répété

Lorsque le projet a commencé, j'ai résolu les problèmes tels qu'ils se présentaient. Par exemple, il était nécessaire de vérifier si l'utilisateur était authentifié - et j'ai trouvé une solution originale qui prenait environ trois lignes selon l'itinéraire. J'étais pressé de mettre en œuvre les solutions trouvées.



En général, j'ai dû suivre les principes de DRY dès le début. Ne vous répétez pas! J'avais besoin d'écrire un programme intermédiaire qui ferait ce qui était nécessaire, puis d'appliquer simplement la solution trouvée dans les cas où elle était requise. À l'avenir, j'ajusterai mon projet en fonction de ce principe.

Désignation et organisation des points de terminaison

J'avais l'habitude de développer l'API dans l'équipe Pioneer. Nous avons utilisé REST , un style d'architecture que j'ai juré en tant que nouveau membre de l'équipe Pioneer. Dans cette équipe, j'ai travaillé sur les petits éléments d'une énorme application. Mais dans mon nouveau projet, j'ai dû tout écrire à partir de zéro.

Une «API RESTful» doit avoir une interface uniforme, comme le Wiki le dit. Dans mon projet, j'ai tout organisé pour que les points de terminaison soient définis dans des fichiers sources, qui étaient appelés en fonction de la fonction ou du but. L'enregistrement et la sortie de l'application ont été enregistrés dans "auth.cr". Le nom d'utilisateur a été enregistré dans "user.cr".

Sans aucun doute, cette partie nécessite un traitement. À l'avenir, je vais tout organiser pour que les actions se rapportent au point de terminaison "/ user", simplement parce que tout cela est lié à "User". Par exemple, pour améliorer la structure du projet, je vais diviser le code en parties plus pratiques et gérables avec un grand nombre de fichiers. Je vais créer le dossier «src / user / auth /», qui contiendra les fonctions de connexion, d'enregistrement et de sortie utilisateur de l'application.

1_6dy_OCE7_Cjj_Df7_A0s_Aj_3i_Q

Trop de demandes

Dans ce projet, j'essaie de faire évoluer mes idées. Trop de requêtes sont actuellement effectuées dans la base de données. Donc, si l'application comptait une centaine d'utilisateurs, je deviendrais fou en essayant de savoir combien de requêtes de base de données sont effectuées toutes les quelques secondes. Désormais, le client met à jour l'état des messages toutes les 10 minutes. De plus, la publication détermine cycliquement si elle a été consultée par l'utilisateur. Lors de chaque vérification, une requête est envoyée à la base de données, qui est effectuée conformément au filtre actuel. Et tout cela charge considérablement le serveur.



Tout ce qui est décrit ci-dessus n'est que des exemples de problèmes que je rencontre tout le temps. Je ne peux pas les décrire en entier. Cependant, je pense maintenant à documenter mes problèmes et mes solutions. J'espère que tout cela aidera d'autres programmeurs à voir et à comprendre mes erreurs et à éviter les leurs. Je sais que si j'utilise une combinaison de Redis et MySQL ou Postgres, je peux accélérer l'exécution des requêtes. Mais pour l'instant, je m'attarderai là-dessus.

J'espère que vous avez apprécié l'article et que vous avez pu apprendre quelque chose d'utile par vous-même.

Skillbox recommande:

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


All Articles