Hace poco noté que algunas compañías / desarrolladores, migraron o adoptaron el lenguaje Go sobre Node.js. ¿Porqué es eso?

Recientemente elegimos Elixir / Erlang como nuestro principal lenguaje de fondo en Taskworld, alejándonos de una solución 100% Node.js.

El equipo evaluó 4 alternativas diferentes, construyendo una API REST simple usando Go (usando Gorilla), Rust (Hierro, níquel), Scala (Spray) y Elixir / Erlang (Phoenix, Cowboy).

Elixir ganó por un ligero margen (sobre Go ).

Todavía usamos Node and React / Flux para nuestro front-end.
Es perfecto para nosotros ya que renderizamos previamente nuestros componentes React en el servidor y confiamos en Browserify y Gulp como parte de nuestro ciclo de desarrollo.

Pero decidimos que no queríamos construir un back-end grande en JavaScript , por varias razones;

1. La mutabilidad de los objetos JavaScript.

Este es bastante simple; Los desarrolladores pasan objetos a funciones por referencia y luego terminan mutando esos objetos ; de hecho, el lenguaje los alienta a hacerlo.
Esto puede conducir a errores sutiles y difíciles de detectar.

Al escribir el código React ( Flux almacena en particular), debemos solucionar este problema clonando constantemente los objetos a cambio porque los objetos JavaScript también se devuelven por referencia (los objetos se asignan en el montón).

Tener que hacer un seguimiento de lo que debe seguir siendo una referencia y lo que debe clonarse / copiarse es más que una molestia, es ineficiente ya que la clonación de objetos grandes es lenta.

Este problema se magnifica cuando se escribe un back-end grande, que lleva al punto número dos.

2. Tener que probar TODO.

No hay que apoyarse en el compilador al escribir JavaScript.

Los problemas normalmente se detectan en tiempo de ejecución, y eso aumenta la necesidad de realizar pruebas.
No me malinterpretes; Las pruebas son importantes sin importar el idioma que uses.
Pero la cantidad de pruebas necesarias para obtener una cobertura decente difiere mucho de un idioma a otro.

Los lenguajes de tipo estático como Go , Rust y Scala le permiten detectar muchos errores en el momento de la compilación (Rust es especialmente bueno en esto), eliminando la necesidad de realizar algunas pruebas unitarias.

Elegimos Elixir / Erlang, a pesar de que utiliza la escritura dinámica, principalmente debido a sus tipos inmutables.
El estilo funcional de Elixir , junto con la coincidencia de patrones y las especificaciones, crean un código más sólido.

Dado que los tipos de JavaScript son lo que son (es decir, inconsistentes), obliga a los desarrolladores a realizar pruebas más exhaustivas.

3. Programación asincrónica y E / S sin bloqueo.

Si bien esto tiene ventajas y podría decirse que es el principal beneficio del uso de Node.js , su implementación en la API Node.js , con la introducción de la convención de devolución de llamada Node, genera un código de aspecto extraño.

Sin embargo, eliges lidiar con las devoluciones de llamada en Node.js , ya sea a través de Fibers, Q / ES6 Promises o Async (los hemos usado todos, pero nos inclinamos hacia Q ), teniendo que trabajar constantemente alrededor del “infierno de devolución de llamada” envolviendo funciones las llamadas envejecen después de un tiempo.

Las tareas de programación de back-end más comunes requieren un flujo síncrono estándar; es decir, recuperar datos, procesar los datos, obtener más datos en función del resultado, realizar más procesamiento, etc.

Tener que compensar el modelo de programación asíncrono de Node.js el 75% o más del tiempo simplemente no puede considerarse “correcto”.

Preferimos procesos en elixir, o rutinas Go, para hacer paralelismo en el back-end.

ACTUALIZAR:

Para obtener más información sobre por qué el equipo elige Elixir sobre Go, eche un vistazo a mi respuesta en los comentarios .

Salud.

La escritura fuerte es extremadamente útil cuando se escribe algo más grande que unos cientos de líneas. El tiempo dedicado a esperar a que se ejecute un compilador es devuelto muchas veces por los errores trivialmente capturados por el compilador. (Y el compilador Go es rápido, de todos modos).

No puedo hablar por node.js específicamente, ya que desprecio el lenguaje JavaScript por completo y prefiero escribir un back-end en código C directo que cualquier cosa que use JavaScript. Puedo decir que descarté una aplicación de red social en la que estaba trabajando en PHP para ir a Ir, y estoy muy contento con los resultados hasta ahora. Entre el compilador y el sistema de registro fácil de usar, puedo detectar errores sin escribir muchos conjuntos de pruebas o pasar horas en un depurador. Casi todo lo que pueda desear en el lado del servidor está allí en las bibliotecas.

Y muy importante: el código Go es fácil de leer. Miro mi código después de dejarlo por meses y aún puedo leerlo. Puedo leer el código en las bibliotecas estándar con bastante facilidad. No puedo decir esto sobre la mayoría de los lenguajes / frameworks.

En primer lugar, Node se basa en un bucle de eventos y un despacho asincrónico. Una vez escuché a alguien decir que el bucle de eventos es “la concurrencia de un hombre pobre”, y esto es muy adecuado. Es un modelo agradable y simple para aplicaciones modestas, pero para una programación concurrente seria, desea algo mucho más robusto. Ver La caída de la casa del nodo.

En segundo lugar, usar Node significa tener que programar en JavaScript, el peor lenguaje de programación que pueda imaginar.

Tercero, Go es un lenguaje maravillosamente práctico para la ingeniería de software compleja a gran escala. Esto fue por diseño. Por lo tanto, no es sorprendente que en los 6 años cortos desde su nacimiento , Go se haya disparado a la cima de la mayoría de las clasificaciones de idiomas … # 8 en The Eng Language Index, # 10 en IEEE Spectrum y CodeEval, # 11 en HackerRank, # 15 en Redmonk, y # 19 en TIOBE. Espero que Go ingrese al primer nivel de idiomas en breve, ¡el primer idioma en hacerlo en más de 20 años!

Construí un servidor de socket en Node.js y lo porté a Go

Estoy seguro de que hay soluciones para evitar todo esto en Node.js, pero estos problemas se resolvieron de forma inherente para mí en Go:

  1. Error de tiempo de compilación y verificación de tipo
  2. Prueba de framework (aunque no lo uso tanto como debería)
  3. Motor de aplicación estándar
  4. Código más limpio y fácil de leer
  5. Estabilidad (a menudo relacionada con el n. ° 1: errores de tiempo de ejecución que solo se debieron a errores estúpidos debido a la mutabilidad)
  6. Codificación más rápida (también relacionada con el n. ° 1: me encanta que el compilador me grite)
  7. Se siente como menos hinchazón (node_modules parece menos contaminado en comparación con gopath)
  8. Ayuda más clara de desarrolladores profesionales: si hago una pregunta js, generalmente obtendré respuestas en varios estilos … devoluciones de llamada, promesas, cierres … la misma respuesta puede parecer * muy * diferente y pasar fácilmente a discusiones no relacionadas o, con demasiada frecuencia, a un código incorrecto oler. En Go, si un “aficionado” tiene una solución, generalmente es un código de alta calidad y / o fácil de hacer un poco más idiomático.

Por otro lado, solía odiar escribir en Javascript en general, pero lo estoy pasando bastante bien con React para cosas DOM típicas y PIXI para cosas más gamificadas … así que encuentro Go como una solución de API / Servicios y JS para que la solución del lado del cliente sea una combinación bastante buena

Tu aplicación crece.

Un desarrollador junior busca el lenguaje definitivo. Un desarrollador experimentado sabe que un producto tiene diferentes necesidades de herramientas cuando está en beta en comparación con un producto que ha estado en producción durante uno o dos años.

A medida que los humanos cambian de pareja, viven arreglos, pasatiempos, hábitos y alimentos a medida que envejecemos, las aplicaciones tendrán diferentes necesidades.

Go es un lenguaje de pseudo-sistema hecho específicamente para la concurrencia. Si bien Node.js es una excelente manera de obtener un servicio basado en mensajes con un rendimiento decente a un precio muy bajo, es menos ideal una vez que su aplicación comienza a madurar. La flexibilidad de Node.js ya no es tan importante para usted, ya que hoy en día sabe cuál es su aplicación, a diferencia de los primeros días, cuando ni siquiera estaba seguro de si su aplicación era una buena idea en primer lugar. Ahora, su aplicación tiene éxito y cambia menos, y está más dispuesto a sacrificar esa flexibilidad para facilitar el mantenimiento y la estabilidad.


Plug descarado: si te gustan mis divagaciones sobre la programación en Quora, puedes disfrutar de mi programa de YouTube: Fun Fun Function

JavaScript es un lenguaje horrible para mi gusto. Lo usé durante muchos años, nunca me gustó, nunca lo haré. Pero no tiene otra opción cuando se trata de la codificación de la interfaz de usuario web. De hecho, es el estándar de un navegador.

Idealmente, me gustaría codificar en un lenguaje coherente, no importa dónde esté la interfaz de usuario o el back-end. Este es el punto principal de Node.js.

El segundo punto es la naturaleza humana. ¿Por qué algo se vuelve muy importante y luego olvidado? Se aplica a todo, los lenguajes de computadora no están excluidos. Entonces, mientras más personas se unan a Node.js, más gravedad tiene y el ciclo se repite hasta que alcanza el punto de saturación.

Además, JavaScript fue utilizado principalmente por los codificadores de la interfaz de usuario, trajeron la nueva sangre a la programación principal. Rompieron muchas cosas, que debían romperse y es solo una pequeña revolución. Entonces, estamos en el medio ahora mismo.

Nuevamente, JavaScript sería mi última opción, pero no obstante seguiré el mercado y me uniré oficialmente a Node.js. Tiene una gran comunidad de seguidores y el ecosistema es probablemente el más grande.

Como se esperaba, el bombo alrededor de Node.js se está reduciendo. No es que Node.js sea una mala tecnología: introduce muchas cosas interesantes, pero creo que es difícil crear aplicaciones complejas con ella.

A pesar de lo que dijo el entusiasta de Node.js, el infierno de devolución de llamada está aquí, y hay una manera mucho más fácil de hacer multitareas colaborativas que esto.

Como resultado, los creadores de tendencias se están moviendo a la próxima tecnología genial, que actualmente es Go, que resuelve algunos problemas de node.js, pero como siempre, introduce nuevos problemas.

Pero como consejo, ambos son interesantes de conocer y son posibles soluciones, dependiendo de su problema …

Recientemente, ha habido críticas sobre el valor de usar Node.js en un entorno de aplicaciones en red de alto rendimiento, y algunos desarrolladores se han mudado al lenguaje Go.

También hay varios ejemplos corporativos de alto perfil que cambian al uso de Go, más allá del creador del lenguaje, Google. Dropbox se mudó a Go, alegando aumentos significativos en el rendimiento, y los desarrolladores del sistema de virtualización Docker también están usando Go.

Sin embargo, es importante tener en cuenta que Node.js todavía es utilizado por un público mucho más amplio, tiene más módulos, es más fácil de usar y no irá a ningún lado en el corto plazo. Además, si está haciendo una aplicación web, Node.js probablemente será su idioma de elección, ya que Go se usa más como un lenguaje de script cuando la prioridad es la concurrencia y la velocidad.

En este artículo, analizaremos las diferencias entre Node.js y Go desde el punto de vista del desarrollador para descubrir las fortalezas y debilidades de cada entorno.Node.js vs Golang: Battle of the Next-Gen Languages ​​- HostingAdvice. com

¿Cuáles son las ventajas que Go lang tiene sobre Node.js (desde la perspectiva del desarrollador web)? – Hashnode

¿Qué ventajas tiene Go sobre Node.js? • r / golang

Ruby, NodeJS y Go: ventajas y desventajas para el desarrollo de backend

Parece que Go es mejor que Node.js en términos de rendimiento (no es un gran margen) y sintaxis, entonces, ¿por qué Node.js es mucho más popular que Go?

¿Cuáles son los pros y los contras de Node.js versus Go?

Cómo hacer el cambio de Node.js a Golang Tutorial | Codeship

El nodo es un bucle de evento único que se ejecuta infinitamente y genera devoluciones de llamada cuando se activan. No puede paralelizar tareas o aprovechar las plataformas de hardware de múltiples núcleos con mucha facilidad. Entonces, esencialmente las aplicaciones de nodo no se escalan con gracia. Go utiliza algunas de las mejores construcciones de concurrencia y lenguaje paralelo. Las plataformas serias aún se basan en lenguajes como Erlang (Couchbase), C ++ (un millón de ejemplos) o Go (próximamente)

Si permanece en la programación el tiempo suficiente, notará que cada 2 años hay un lenguaje nuevo y actual.

Node celebró todo el bombo en 2012-2013. Ir y Swift parecen ser los favoritos de 2014-2015.

Ambos idiomas tienen ventajas y desventajas. Ambos son increíblemente poderosos. La parte difícil de un nuevo lenguaje no es ganar exageración. Lo está manteniendo. Tendré curiosidad por ver dónde están estos idiomas en diez años.

La característica que lo hace más agradable que Javascript es poder usar hilos y mensajes separados entre ellos muy fácilmente. Entonces puede usar la CPU de múltiples núcleos en lugar de tener un solo bucle de eventos como en nodejs (aunque creo que los sitios que usan nodejs ejecutan varias instancias y usan un nginx front-end para obtener una mayor utilización del núcleo).
Go tiene tipos estáticos para que pueda detectar varias clases de error en tiempo de compilación. También tiene un soporte de biblioteca bastante bueno, por lo que puede codificar en una especie de estilo Erlang pero con tipos estáticos y una sintaxis tipo C, lo que significa que puede ser bastante productivo con bastante rapidez. Usar Erlang o Haskell probablemente sería un gran salto cuando provenga de Javascript o C.

A veces es simplemente una cuestión de usar la herramienta adecuada para el trabajo: me encuentro haciendo la mayor parte de mis tareas de front-end con Node, pero me avergüenzo cuando estoy construyendo un servicio si no puedo usar Go.

¿Mi atracción por ir?

Hay algunas herramientas eléctricas realmente serias en el entorno Go (formateo, depuración, prueba).

Su flujo de trabajo cambiará drásticamente en función del idioma con el que termine ejecutando y, a menudo, ese es un factor importante en el proceso de toma de decisiones.

Siempre tendrás lo nuevo que sale. Pero mucha gente que solo hacía cosas de “frontend” ahora, de repente, con una inversión mínima, también puede trabajar en el “backend”. Y bueno, simplemente funciona y la velocidad es bastante buena. ¿Por qué no usarlo? Y todo depende de lo que estés construyendo. Soy más del tipo para este proyecto, usaré X y para el proyecto Y usaré Z. Cada proyecto tiene sus propias necesidades y, a veces, debes salir de tu zona de confort, ya que X no siempre es la mejor manera de hazlo

Mis principales razones para usar Go
– es más fácil de mantener
– no hay devolución de llamada infierno
– velocidad de ejecución loca
– la curva de aprendizaje es muy pequeña
– simplemente funciona

Callback Hell

Porque las personas piensan que pueden gestionar la complejidad utilizando el sistema de tipos Go es fácil de vender porque es simplemente C en esteroides con GC.

More Interesting

¿Cuál es la mejor empresa proveedora de servicios de reubicación en Bangalore?

¿Cuáles son las principales empresas de análisis de datos en Delhi NCR?

¿Cómo se introducen en las principales empresas para proporcionar servicios de software profesional?

¿Cuáles son las principales empresas de alojamiento web en Pakistán?

¿Cuáles son las mejores empresas de software en Indonesia?

¿Qué compañía produce los mejores videos en África?

¿Las compañías de cigarrillos hacen que sus cigarrillos sean más adictivos?

¿Qué compañía es mejor para el sistema de gestión de datos clínicos? WorkSure es capaz de diseñar e implementar un Sistema de Gestión de Datos Clínicos (CDMS) utilizando ensayos clínicos que cumplan totalmente con las pautas de la industria y los requisitos de la FDA. Servicios de gestión de datos clínicos

¿Qué pasos debe seguir una empresa que planea contratar empleados en California?

¿Es posible una guerra nuclear 'limitada' entre Estados Unidos y Rusia o se desatarían demasiadas armas nucleares para que los humanos sobrevivan?

Cómo eliminar directores de una compañía india, incluso si los artículos de asociación mencionan al director no se pueden eliminar

¿Por qué algunas empresas no tienen un programa de fidelización?

¿Qué compañías importantes están probando / apoyando criptomonedas?

¿Dónde puedo encontrar información sobre patentes de empresas?

¿Qué pueden hacer las empresas de alta tecnología de Japón para volver al crecimiento y la rentabilidad?