Lo que entendí y los problemas que encontré al crear un clon de Hacker News



De un traductor: este artículo es una traducción abreviada de la publicación original del desarrollador web Jesse Horne. Su trabajo y al mismo tiempo su hobby es el diseño web. Jesse a menudo comparte sus mejores prácticas y lecciones aprendidas con otros programadores, tanto experimentados como principiantes.

Hace algún tiempo escribí una publicación bastante voluminosa en Hacker News, que recibió un sólido apoyo de los lectores. Llamé la atención sobre las capacidades de este recurso y decidí intentar crear un clon para obtener una nueva experiencia y conocimiento.

Skillbox recomienda: Un curso práctico para desarrolladores PHP de un año.
Le recordamos: para todos los lectores de "Habr": un descuento de 10.000 rublos al registrarse en cualquier curso de Skillbox con el código de promoción "Habr".

Inicialmente, esto me pareció un gran objetivo, donde el conjunto de herramientas y tácticas de trabajo estaban predeterminadas. Anteriormente, trabajé en tareas más pequeñas usando diferentes lenguajes y marcos. Lo único que no existía era un proyecto importante que permitiera unir todo esto.

Decidí trabajar en un nuevo proyecto desde cero usando el lenguaje Crystal. Esta es una herramienta conveniente, que también es nueva. Es rápido, los principios para trabajar con él son similares a los de Ruby. Se escribe estadísticamente más es de código abierto. Pero solo un nuevo idioma tampoco es suficiente, así que decidí complicar mi tarea y no hacer un clon de Hacker News, sino una versión mejorada de este recurso.

Por cierto, pensé que crear un clon regular sería una tarea fácil. Y el hecho de que esto no sea así, me di cuenta un poco más tarde, comenzando a trabajar.

No barra demasiado alto

No quiero decir que no debe establecer objetivos ambiciosos. Intenta alcanzar las estrellas, con o sin espinas. Soñar es útil, tratar de lograr lo que antes no podía hacer es necesario para avanzar con éxito en la escala profesional.

Le dije que no debería tratar de precipitarse de inmediato en la tarea de completar una tarea compleja y grande. Elija lo que necesita en un momento particular para implementar la idea. Además, recomiendo dividir los objetivos importantes en objetivos más pequeños. Si tiene demasiado código en el que hay mucha "basura", intente simplificar y estructurar todo.

Ni siquiera puedo expresar con palabras lo importante que es dividir una tarea grande en varias más pequeñas.

En mi caso, me encontré con varios problemas nuevos que no había encontrado antes. En primer lugar, solo trabajé con Crystal una vez, cuando estaba creando una aplicación cuya complejidad no era mucho mayor que la complejidad de un programa como "¡Hola, mundo!". En el pasado usé Python, Lua, PHP. El nuevo lenguaje fue el primer obstáculo para la implementación del proyecto.

El segundo fue el marco . Crystal, al ser un nuevo lenguaje, todavía no tiene demasiados marcos y documentación para ellos. Decidí usar Kemal para mi clon. Tenía la esperanza de que el marco sea intuitivo, ya que lo conocí en mi trabajo. Pero aquí había otro caso: las cosas individuales no eran fáciles de entender. Por ejemplo, algunas secciones del código parecían bastante normales, pero por alguna razón no funcionaron. Y fue difícil encontrar la causa del problema en Internet por la misma razón: la novedad del lenguaje y el marco en sí. En algunos casos, tuve que parar por mucho tiempo y tratar con la causa del problema. Hasta ahora, nunca he mirado la fuente, por ejemplo, el mismo Frasco.

El tercer obstáculo son los objetivos específicos que he elegido para el proyecto. Para hacer que mi clon sea más útil, decidí agregar una serie de características funcionales. Trabajé con Hacker News anteriormente, así que sé mucho sobre las ventajas y desventajas de este recurso. Se me ocurrió que sería bueno aprovechar los análisis proporcionados por GitHub. Utilizándolos, podría agregar estadísticas sobre el número de visitas y la actividad del usuario en el sitio.

Por lo tanto, decidí que mi clon debería mostrar al menos vistas y clics para cada publicación. Tal función probablemente sería útil para los usuarios, y su implementación sería una buena práctica para mí. ¡Pero no pensé que llevaría tanto tiempo! Ahora el proyecto es más una prueba de concepto que un recurso listo para usar. Además de las vistas y los clics, también decidí agregar una visualización de los comentarios que aparecen para que aparezcan en tiempo real. Si no fuera por esta tarea adicional, el proyecto se habría completado mucho más rápido.

Ahora el proyecto admite autorización, publicación y clasificación de publicaciones, interacción con otros usuarios comentando y viendo perfiles, etc.

El cuarto problema al que me enfrento es el caos. Las migraciones, modelos, vistas, controladores API, código CSS y JavaScript se acumulan muy rápidamente. Y todo esto se convierte en un desastre. Traté de resolver el problema y casi lo logré. Pero todavía existen lugares en parte problemáticos en el código de mi proyecto; puede notarlo fácilmente. Entonces, en muchos lugares el código se repite, los puntos finales no están organizados, la denominación es complicada, lo que lleva a un aumento en la cantidad de código y una gran cantidad de consultas a la base de datos. Poco a poco, resuelvo este problema.

En muchos lugares el código se repite.

Cuando comenzó el proyecto, resolví los problemas a medida que aparecían. Por ejemplo, fue necesario verificar si el usuario está autenticado, y encontré una solución original que tomó aproximadamente tres líneas dependiendo de la ruta. Tenía prisa por implementar las soluciones encontradas.



En general, tuve que seguir los principios de DRY desde el principio. ¡No te repitas! Necesitaba escribir un programa intermedio que hiciera lo que fuera necesario, y luego simplemente aplicar la solución encontrada en los casos en que fuera necesario. En el futuro, ajustaré mi proyecto según este principio.

Nombre y organización del punto final

Solía ​​desarrollar la API en el equipo de Pioneer. Utilizamos REST , un estilo de arquitectura que en realidad juré como nuevo miembro del equipo Pioneer. En este equipo, trabajé en los elementos pequeños de una gran aplicación. Pero en mi nuevo proyecto tuve que escribir todo desde cero.

Una "API RESTful" debe tener una interfaz uniforme, como dice el Wiki. En mi proyecto, organicé todo para que los puntos finales se definieran en archivos de origen, que se llamaban según la función o el propósito. El registro y la salida de la aplicación se registraron en "auth.cr". El nombre de usuario se registró en "user.cr".

Sin lugar a dudas, esta parte requiere procesamiento. En el futuro, organizaré todo para que las acciones se relacionen con el punto final "/ usuario", simplemente porque todo esto está relacionado con "Usuario". Por ejemplo, para mejorar la estructura del proyecto, dividiré el código en partes más convenientes y manejables con una gran cantidad de archivos. Crearé la carpeta "src / user / auth /", que contendrá las funciones de inicio de sesión, registro y salida de usuario de la aplicación.

1_6dy_OCE7_Cjj_Df7_A0s_Aj_3i_Q

Demasiadas solicitudes

En este proyecto, estoy tratando de escalar mis ideas. Actualmente se están realizando demasiadas consultas en la base de datos. Entonces, si la aplicación tuviera cien usuarios, me volvería loco tratando de averiguar cuántas consultas a la base de datos se realizan cada pocos segundos. Ahora el cliente actualiza el estado de los mensajes cada 10 minutos. Además, la publicación determina cíclicamente si ha sido vista por el usuario. Durante cada verificación, se produce una solicitud a la base de datos; esto se realiza de acuerdo con el filtro actual. Y todo esto carga significativamente el servidor.



Todo lo que se describe arriba son solo ejemplos de problemas que encuentro todo el tiempo. No puedo describirlos en su totalidad. Sin embargo, ahora estoy pensando en documentar mis problemas y soluciones. Espero que todo esto ayude a otros programadores a ver y comprender mis errores y evitar los suyos. Sé que si uso una combinación de Redis y MySQL o Postgres, puedo acelerar la ejecución de consultas. Pero por ahora me detendré en esto.

Espero que hayas disfrutado el artículo y que hayas podido aprender algo útil para ti.

Skillbox recomienda:

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


All Articles