El autor del material, cuya traducción publicamos, recopiló 19 ideas que pueden ser útiles para aquellos desarrolladores de Node.js que desean mejorar su nivel profesional en 2019. El mundo de JavaScript es enorme, por lo que dominar todo lo que se discutirá aquí es simplemente poco realista. Es poco probable que haya alguien que posea todo esto perfectamente. Sin embargo, algo en esta revisión puede ser útil para usted.

1. Piensa en escribir. Presta atención a TypeScript
Está comprobado que la programación en JavaScript, utilizando el enfoque de mecanografía utilizado en él, conduce a una disminución de la productividad laboral y a la aparición de errores. Esto no significa que debas esforzarte por asegurarte de que todo el código esté bien escrito. Más bien, estamos hablando del hecho de que sería bueno, al desarrollar en JavaScript, elegir un cierto enfoque para trabajar con tipos y apegarse a él. Tales enfoques difieren, entre otras cosas, por el nivel de restricciones asociadas con los tipos de datos impuestos al código. Por ejemplo, puede ser algo muy simple, como organizar cheques usando el
paquete jsonschema (o
joi ). Si cree que necesita un control de tipo más estricto, puede considerar el uso de anotaciones de tipo en código JS regular (aquí el
flujo de Facebook lo ayudará). Y si está listo para escribir código casi completamente escrito, preste atención a
TypeScript .
Cabe señalar que en 2018 TypeScript ganó una gran popularidad, además, existe la sensación de que existen todos los requisitos previos para que se establezca firmemente en Node.js. Si está estudiando seriamente TypeScript, debe preguntarse si solo está pensando en escribir o en otras características del lenguaje. El punto aquí es que trabajar con algo como interfaces y clases abstractas significará que se encontrará en un entorno en el que, pensando principalmente en escribir, difícilmente podría entrar en él.
2. Presta atención a las capacidades de linter
Linters en estos días se dan por sentados. Después de una configuración simple, tiene a su disposición una herramienta para ayudarlo a encontrar errores en el código. Atrás quedaron los días en que el código de línea principal significaba principalmente controlar su diseño (algo como la presencia o ausencia de punto y coma). Ahora los linters pueden identificar problemas graves, como errores que no se manejan adecuadamente, promesas que nunca se resuelven y otros problemas similares que nadie incluirá conscientemente en su código. Por lo tanto, si aún no está utilizando el linter, ahora es el momento de hacerlo, sin olvidar su configuración reflexiva. Aquí, por ejemplo, hay un complemento para
ESLint ,
eslint-plugin-chai-expect , que puede detectar pruebas compuestas erróneamente. Aquí está el
complemento eslint-plugin-promise que detecta promesas no resueltas (el código con tales promesas, sin razón aparente, simplemente se detiene). Usando el
complemento eslint-plugin-security, es posible encontrar expresiones regulares inseguras en el código que puede usar un atacante para realizar ataques DOS.
3. Profundice su conocimiento de la arquitectura de proyectos de software aprendiendo del mundo Java y olvidando mucho del mundo Ruby
El ecosistema de Node.js plantea con poca frecuencia el tema de la arquitectura y el diseño de sistemas de información. Por lo tanto, todos hablan de microservicios, pero muy pocos hablan de su estructura interna. Como resultado, la mayoría de las aplicaciones de Node.js son ejemplos de implementación de conceptos MVC y otros patrones dudosos del mundo Ruby. ¿Qué tiene de malo eso? La plantilla MVC, por ejemplo, se creó para optimizar el trabajo con datos, pero esta plantilla no es adecuada para diseñar partes confiables de servidores de aplicaciones. Bob Martin, por ejemplo,
dice que MVC es un mecanismo para entregar datos a un usuario, no una arquitectura de aplicación. ¿Es posible describir la lógica empresarial de una aplicación de microservicio, las reglas de su funcionamiento, las características de acceso a datos, la interacción con otros microservicios utilizando solo dos clases:
Controller
y
Model
?
Cabe señalar que no quiero recomendar el uso de plantillas Java / Spring en Node.js aquí (después de todo, ¿no fue una coincidencia que cambiamos a Node.js para desarrollar programas de servidor?). Le aconsejaría que tome prestadas solo algunas ideas que, por un lado, pueden tener un efecto beneficioso en la arquitectura de la aplicación, y por otro lado, no harán que se vuelvan demasiado complicadas.
Aquí hay algunas pautas para aquellos que se preocupan por la arquitectura de los proyectos Node.js:
- Lea la primera sección de este artículo sobre la arquitectura de la aplicación Node.js.
- Intente no mezclar la lógica empresarial de la aplicación con los objetos Express, lea acerca de los principios del diseño impulsado por dominio (DDD) y la arquitectura hexagonal .
- El uso del patrón Active Record, que es muy popular entre los desarrolladores que usan Mongoose y Sequelize, conduce fácilmente a la aparición de objetos sobrecargados que son difíciles de probar. Considere usar el patrón Data Mapper en lugar del patrón Active Record.
- Consulte el código de este proyecto Node.js de plantilla bien hecho, que presenta una arquitectura de calidad que implementa los principios de DDD.
4. Piense en cómo usar el nuevo Node.js-API async_hooks cuando trabaje con código asincrónico
El modelo de ejecución de código de subproceso único utilizado en JavaScript tiene un inconveniente grave: las operaciones asincrónicas, por ejemplo, las solicitudes, pierden contexto. No se guarda durante el ciclo de vida de la consulta, ya que las operaciones asincrónicas están involucradas en su ejecución. ¿Por qué es esto malo? Por ejemplo, los desarrolladores a menudo buscan incluir identificadores de consulta únicos en las entradas del diario, lo que, al analizar dichos registros, permite identificar aquellos que se relacionan con la misma consulta. Hoy, en 2018, esto no es tan fácil. El año que viene, algo nuevo nos espera, a saber, estamos hablando de ganchos asíncronos, la API
async_hooks . Esto no quiere decir que esta sea una oportunidad completamente nueva, el punto es que pronto debería abandonar el régimen experimental. En pocas palabras, los ganchos asíncronos permiten a un desarrollador ejecutar código nativo en ciertos puntos del ciclo de vida de una operación asincrónica. Con esto en mente, puede coordinar acciones realizadas por código asíncrono y mantener el contexto. Esta característica sienta las bases para desarrollar paquetes que llevarán a Node.js a un nuevo nivel en el seguimiento de operaciones asincrónicas y el trabajo con contexto.
Por ejemplo, el paquete
cls-hooked le permite organizar el uso de variables y contexto a lo largo del ciclo de vida de una operación asincrónica. El paquete
jaeger-client le permite visualizar el proceso de pasar una solicitud a través de sistemas, incluso a través de microservicios y servidores (aquí se implementa el estándar Javascript OpenTracing API 1.0).
Aquí está el material para obtener más información sobre el uso de la API async_hooks.
5. Comprender las últimas tecnologías "sin servidor" que ya están listas para proyectos serios y capaces de matar a Kubernetes
Aquí usamos los conceptos de FaaS (Función como servicio, función como servicio) y "tecnologías sin servidor" como sinónimos, aunque no significan lo mismo. En particular, a continuación hablaremos sobre los servicios de FaaS en la nube.
Inicialmente, la tecnología FaaS estaba destinada a desarrollar micro tareas y no a crear aplicaciones de "microservicios" completas. La creciente popularidad de las plataformas FaaS ha llevado a un aumento en el interés de los proveedores de servicios en la nube, las plataformas FaaS han ganado nuevas características. Como resultado, aunque esto es inesperado, existe la sensación de que en 2019 las plataformas FaaS pueden convertirse en la base de proyectos serios. ¿Pueden estas plataformas competir con Kubernetes y ser utilizadas para alojar grandes aplicaciones? Algunos ven en la informática sin servidor y las tecnologías FaaS algo completamente nuevo, pero en la práctica, cada creador de una aplicación en la nube tendrá que elegir entre las tres tecnologías en 2019. Esta opción, literalmente, se presenta en los sitios web de los proveedores de servicios en la nube. Es decir, estamos hablando de elegir una de tres opciones:
- Servidor en la nube normal (por ejemplo, VDS de RUVDS)
- Kubernetes
- FaaS
Como resultado, en nuestro tiempo es muy importante poder comparar las capacidades de Kubernetes con FaaS y anticipar las consecuencias de elegir una tecnología en particular.
6. Echa un vistazo a las innovaciones de JavaScript que pronto serán estándar.
No puedo llamarme partidario de la búsqueda y el uso de las últimas funciones del lenguaje, ya que a veces su uso perjudica la simplicidad y la comprensión del código. Pero de vez en cuando, aparecen características de JavaScript realmente valiosas (como la construcción asíncrona / espera hace dos años), por lo que es útil mirar
la lista de ofertas
TC39 y el recurso
node.green para saber de antemano sobre las nuevas características que pueden adaptarse a usted. Esto es lo interesante que encontré allí:
- Los campos de clase ahora están en la 3 (última) etapa de aprobación, pueden ingresar al estándar en 2019.
- El tipo de datos BigInt también pasa por la etapa final de reconciliación. El uso de números de este tipo puede ayudar a organizar la interacción con microservicios o cualquier sistema, durante el cual se utilizan grandes números.
- Los iteradores asíncronos y el método de promesa finally () ya han sido aceptados. Si aún no les ha prestado atención, léalos.
7. Domina al menos una tecnología para crear una API. Presta atención a GraphQL
REST-API es una gran herramienta para resolver una determinada clase de tareas. Es decir, estamos hablando de gestionar consultas y modificar registros en bases de datos. ¿Está su sistema enfocado en trabajar con datos financieros? Probablemente, para garantizar su funcionamiento, es necesario observar las restricciones más estrictas y utilizar un modelo de datos cuidadosamente desarrollado que no permita ambigüedades. La tecnología REST es adecuada para usted en este caso, pero no se muestra muy bien en otras situaciones muy comunes, por ejemplo, cuando la ejecución de la misma solicitud puede conducir a la recepción de diferentes conjuntos de datos. Lo mismo se aplica al trabajo en condiciones de baja velocidad de conexión, cuando es necesario que se transmita la menor cantidad de datos posible cuando se trabaja con una determinada API. Tales situaciones incluyen conexiones entre computadoras, donde la comunicación de alta velocidad se destaca. ¿Vale la pena en tales casos cambiar a algo nuevo? No, no vale la pena. Es mejor agregar algo nuevo a lo que ya está en uso. Una API no es una arquitectura de aplicación. Esto es solo un punto de acceso a la aplicación, lo que significa que las API creadas con diferentes herramientas pueden coexistir. Incluso si todos están construidos sobre un marco web único como Express.
¿Qué tecnología estudiar? Probablemente, en las condiciones actuales, vale la pena apostar por la tecnología GraphQL, que se está volviendo cada vez más popular. El ecosistema de esta tecnología ha madurado significativamente, sirve algunos escenarios de datos muy populares, como la búsqueda dinámica y la interacción con fuentes de datos jerárquicas. Por otro lado, la tecnología gRPC sigue siendo una solución altamente especializada que se adapta bien para la comunicación entre servidores en situaciones en las que durante el intercambio de datos es deseable transferir la menor información posible sobre el servicio (por ejemplo, estamos hablando de sistemas de intercambio de datos basados en el " editor-suscriptor ", o sobre aquellos en los que se usan mensajes y colas de mensajes). Aquí hay algunas publicaciones útiles sobre este tema:
8. ¿Usando pruebas unitarias y de integración? Eche un vistazo a las nuevas técnicas de prueba.
¿Ya está familiarizado con la pirámide de prueba, con la unidad, la integración y las pruebas de extremo a extremo? Si es así, genial. Todo esto subyace a las estrategias de prueba exitosas. Sin embargo, debe tenerse en cuenta que en los últimos 10 años, el mundo del desarrollo de software ha cambiado muy seriamente, y los modelos de prueba se han mantenido igual, lo que nos plantea preguntas sobre cómo probar microservicios, aplicaciones de Internet enriquecidas, sistemas sin servidor. Algunos enfoques modernos para las pruebas complementan el conjunto tradicional de tecnologías, y algunos incluso pueden reemplazarlo, mejorando así la estrategia y los resultados de las pruebas. Esto es lo que puedes leer y ver:
- Los sistemas de prueba basados en el patrón de Contratos dirigidos por el consumidor ayudan a evitar que las API de servidor utilizadas por microservicios o clientes fallen.
- Las pruebas con instantáneas se pueden usar no solo en la interfaz, sino también en proyectos de servidor.
- La prueba de componentes es un enfoque equilibrado para probar microservicios.
- Aquí hay un video sobre enfoques modernos para probar proyectos de Node.js.
9. Adapte su sistema de monitoreo de aplicaciones a las mejores prácticas de SRE / DevOps
En 2019, incluso una aplicación de tamaño medio puede consistir en docenas de componentes. Con el fin de garantizar el buen funcionamiento de dicha infraestructura, debe supervisarse cuidadosamente. A pesar de lo obvio de lo anterior, la mayoría de los desarrolladores aún no consideran importante estudiar y utilizar esas recomendaciones para monitorear aplicaciones y crear un sistema de alertas sobre los problemas que pueden darles los especialistas responsables de la confiabilidad de los proyectos web. Por ejemplo, los desarrolladores a menudo se centran en los indicadores internos del rendimiento del sistema, como la velocidad del procesador o la RAM, en lugar de preocuparse por las métricas que afectan directamente a los usuarios finales. En particular, estamos hablando de la frecuencia de errores y demoras. Esto se
llama "monitoreo basado en síntomas". Tales indicadores orientados al usuario a veces se denominan "señales de oro", y usted, posiblemente introduciendo un sistema de monitoreo, decide comenzar con la introducción de tales métricas. Aquí están los materiales relacionados:
10. Mejore la seguridad de los proyectos mirándolos desde el punto de vista de un atacante, y aprendiendo cómo llevar a cabo ataques y herramientas de hackers
Si no puede pensar como alguien que quiere atacar su sistema, significa que no puede pensar como pensaría el defensor de este sistema. En 2019, no debe transferir tareas para proteger proyectos a terceros, ni confiar solo en analizadores de seguridad estáticos. Hoy en día hay una gran cantidad de tipos de ataques (las últimas tendencias en esta área son los
ataques a la infraestructura de desarrollo y a npm). Al mismo tiempo, las aplicaciones cambian muy, muy rápidamente: ayer se reconoció que el proyecto estaba bien protegido y mañana pueden agregar varios servicios nuevos de AWS, varios tipos nuevos de bases de datos y un nuevo rol de IAM. Al mismo tiempo, no será pronto para analizar la seguridad del proyecto. El resultado es que los desarrolladores representan el mayor riesgo de seguridad para sus propios proyectos. La solución a este problema es su entrenamiento. Esto significa que cada desarrollador de proyectos web necesita llevar la implementación de reglas de seguridad casi al automatismo, y haga lo que haga, siempre recuerde la seguridad.
Después de que decide moverse en esta dirección, resulta que tener en cuenta la seguridad al realizar cualquier trabajo no es tan aterrador. Digamos, habiéndote familiarizado con los métodos y herramientas comunes para atacar, dibuja un diagrama de la arquitectura de tu aplicación y piensa en cómo lo atacarías. Con el tiempo, sin siquiera darse un informe sobre esto, comenzará a tener en cuenta los problemas de seguridad, tomará cada decisión arquitectónica e ingresará cada nueva línea de código en el editor. Aquí hay algunas ideas para gestionar problemas de seguridad:
- Pruebe OWASP ZAP , una herramienta multifuncional para investigar sistemas y piratería, que permite que incluso un principiante aprenda el nivel de seguridad de la aplicación.
- Consulte esta lista de recomendaciones de seguridad de Node.js para obtener más de dos docenas de ideas de ataque y ejemplos de código JavaScript.
- Programe una reunión mensual de análisis de amenazas donde el equipo del proyecto estudiará su arquitectura y ofrecerá ataques contra ella. Si tal idea le parece aburrida, puede gamificar tales reuniones. Digamos que aquellos que encuentran vulnerabilidad pueden ser recompensados de alguna manera. También puede, por ejemplo, dividir a los participantes de dicha reunión en dos equipos y organizar una competencia entre ellos para encontrar vulnerabilidades.
11. Diseñe e implemente una estrategia de actualización del paquete npm. 2018 mostró que la prisa al actualizarlos es peligrosa
Por lo general, los equipos de desarrollo se adhieren a una de dos "estrategias" para actualizar los paquetes npm. O los actualizan lo más rápido posible después del lanzamiento de sus nuevas versiones, a veces incluso automatizan este proceso, o no tienen una estrategia de actualización de paquetes. Con este enfoque, los paquetes se actualizan de manera irregular y, al comenzar este proceso, se guían por algo así como un pensamiento repentino: "¿Deberíamos actualizarnos hoy?" Aunque el primero de estos enfoques se ve mejor que el segundo, inesperadamente resultó estar asociado con un mayor riesgo en 2018 que el segundo. La comunidad descubrió problemas, como el que sucedió con el paquete de
flujo plano , en unas pocas docenas de días, y los que no tenían prisa por actualizar estaban a salvo.
Considere formalizar la estrategia para actualizar los paquetes de los que depende su proyecto; considere usar herramientas de automatización para este proceso. Encuentre el punto medio entre rechazar actualizaciones y actualizar paquetes con demasiada frecuencia. Aquí, el programa
npq puede ayudarlo, que comprueba los paquetes durante la instalación y le da recomendaciones. Puedes echar un vistazo a proyectos comerciales como
greenkeeper . La desventaja de tales soluciones es que no pueden posponer la instalación hasta el momento en que quede absolutamente claro que cierto paquete es seguro.
12. Eche un vistazo más de cerca a la implementación por fases de proyectos
Tal vez en 2019 considere razonable implementar proyectos en producción utilizando un esquema por fases, en lugar de enviar instantáneamente todo lo que estaba antes en el proceso de desarrollo a un servidor de combate. Este proceso se llama "implementación canaria", brinda un mayor nivel de protección del proyecto que la implementación simultánea de un nuevo código. Generalmente distingue las siguientes tres etapas:
- Despliegue El nuevo código se implementa en un nuevo entorno de producción aislado (en el nuevo servicio Kubernetes, en un nuevo servidor virtual). En esta etapa, el código aún no sirve a nadie, por lo tanto, las fallas en él no pueden causar daño.
- Pruebas Ahora, varios especialistas pueden trabajar con el nuevo código en condiciones lo más cercanas posible a las reales, ya que el código se implementa en producción.
- Lanzamiento Después de que las pruebas han demostrado la operatividad del nuevo código, gradualmente se le está dando acceso a un número cada vez mayor de usuarios, y después de que resulta que funciona de manera suficientemente confiable, su versión anterior se deja de usar gradualmente.
Un punto importante a destacar aquí es que realizar implementaciones canarias a gran escala en 2019 seguirá siendo un placer muy costoso. El hecho es que esto requiere la coordinación del trabajo de los elementos de infraestructura del proyecto, como el enrutamiento y el monitoreo. Por lo tanto, si desea aplicar una técnica similar, debe comenzar con una implementación canaria simple, en parte manual. En particular, esto consiste en el hecho de que después de completar con éxito las primeras pruebas, teniendo en cuenta los indicadores de monitoreo, se realiza la adición manual de servidores con una nueva versión del software al sistema. Lea más sobre los lanzamientos de canarios
aquí . Si desea automatizar el proceso de realizar dichos lanzamientos, preste atención a la plataforma
Spinnaker .
13. Echa un vistazo a la tecnología de Kubernetes que ha conquistado el mundo.
Kubernetes (K8S) , . - . . Kubernetes , , 54% K8S-. —
. K8S — , :
, , Kubernetes, .
14. -,
- — . , .
15. , , ,
, — . , . . , (,
tensorflow.js brain.js , , ).
16.
, . , , . , — .
17. Linux, —
Linux- , , . — , ( — ), Docker, . , , , , , .
, Linux.
18. , Node.js
( Node.js): « . , ». , , ( ). , Node.js, , V8 libuv. , 2019 — , Node.js, , , libuv. , , , Node.js - , .
, .
, npm- C/C++.
Node.js.
Node.js RUVDS.
19. ,
, , . , , , , , . , , , , . JavaScript-, . , JavaScript, . , , TypeScript . flow , , . , - flow, , , , « , ». ? , , «
». , - . , , , — . . , - , , , . , . , 2019 , — .
.
, . — , , , , , , . , , , , , .
Resumen
19 , Node.js-, - , 2019 . , - , .
Estimados lectores! Node.js- 2019 ?
