Respuesta también disponible en Quora: ¿Cuándo GoLang reemplazará a JavaScript?
Go no reemplazará a JavaScript, porque ambos tienen diferentes objetivos. Es decir, fueron diseñados para realizar tareas específicas incluso en entornos y situaciones diversos.
Lo cual por supuesto no significa que no puedas usar (sí quieres) ambos para cosas similares. Actualmente Go ha incrementado y sigue incrementando su popularidad entre los cuales se encuentran desarrolladores de otros ecosistemas y compañías de varios tamaños.
Echa un vistazo a esta encuesta del presente año acerca de Go (en ingles):
Go 2019 - The state of Developer Ecosystem in 2019 Infographic
Retornando a la respuesta. Por salud, no sería justo comparar ambos lenguajes por diferentes razones, incluso muchas de ellas razones técnicas.
Como sabes, con ayuda de un runtime (Nodejs), Javascript se adentra en entornos más complejos, de alta demanda y fiabilidad con respecto al rendimiento, consumo de recursos, soporte de concurrencia, almacenamiento, red, CPU, memoria, entre otros. Lo cual puede sonar relativamente bien si eres JS entusiasta, pero si notas, JavaScript pasa de ser un lenguaje de acceso a características de tu navegador, a acceder a “características de un ordenador/servidor” vía v8 (motor JS de Chrome). Eso significa que JavaScript “gana méritos” para intentar competir en el espacio de software para servidores y ordenadores con lenguajes muy competitivos y de alto rendimiento y eficiencia, uno de ellos es Go.
Bien, pero quizá al común de desarrolladores JS esto les resulta completamente transparente, es más suena muy bien usar JavaScript para los propósitos descritos antes. Por ejemplo, para acceder al sistema de archivos, escribir datos y enviarlos por la red, escribir datos en memoria, etc.
Pero lamento desilusionarte ya que esto no es tan genial como parece en la práctica. Vamos a ver. Enumeraré algunas de las razones del porque JavaScript no es una opción o porque deberías considerar otras para todo lo que estes pensando desarrollar en el futuro.
- JavaScript fue diseñado para ser usado como lenguaje de navegador, nunca como lenguaje de propósito general.
- JavaScript es un lenguaje interpretado, necesita un interpretador como v8, por ejemplo, para poder ejecutarse. Si bien no es una limitación (Python, Ruby, Lua, etc), hay una penalidad que pagas con respecto al rendimiento si usas JS para tareas backend.
- El rendimiento de JavaScript no es predecible, esto es debido a su naturaleza dinámica, v8 (Node y navegador), por ejemplo debe realizar innumerables optimizaciones y averiguar los tipos de datos de variables, funciones y objetos, esto en tiempo de ejecución. Es más, v8 puede hacer más optimizaciones sobre código ya optimizado. Todo esto reduce significativamente el rendimiento.
- El runtime JavaScript (Nodejs) demanda una cantidad significativa de recursos, RAM, CPU, por lo mencionado anteriormente. Por ejemplo, un simple servidor web en NodeJS consumirá mas memoria que uno en Go por ejemplo, lo cual hace cierto sentido debido a la naturaleza dinámica de JS.
- JavaScript no fue diseñado para soportar alta demanda (concurrencia). Nodejs no tiene soporte completo para tomar ventaja de sistemas multi-procesador. Incluso si piensas en algún modulo npm. Por ejemplo el módulo cluster (core) es una pobre forma de querer lograr esto además de ser engorroso y de nuevo, no predecible.
- JavaScript no escala bien en grandes bases de código. Una de las desventajas de usar JavaScript es cuando una aplicación tiende a extenderse en funcionalidades durante los años, sobretodo si ese código es implementado por múltiples desarrolladores. Necesitas de algún mecanismo que asegure la confiabilidad, rendimiento y fácil mantenimiento de toda esa base de código. Y ese es uno de los problemas al usar JavaScript para desarrollar proyectos de tamaño considerable. Typescript por ejemplo entra en escena, proveyendo un sistema de tipos que permite mejor mantenimiento, estructura y ayudará a “asegurar” de alguna forma el código fuente en tiempo de desarrollo, pero no es suficiente, Typescript al final del día transpila (se convierte) a JS.
- Popularidad no significa productividad, JavaScript en general es popular por qué es el API por defecto en cada navegador. Pero fuera de allí no. Si piensas en Nodejs, es sólo popular entre desarrolladores de la comunidad JS. En entornos de software para servidores y ordenadores hay una amplia gama de alternativas y que han estado liderando dichas áreas en diferentes compañías por décadas. En tres ellos ejemplo C/C++, Java, C#, Objective C, etc.
Conclusión:
Mi conclusión es normalmente siempre la misma. Un lenguaje no es única solución para todo, evalúa otras alternativas. Hay una basta cantidad de lenguajes y cada uno puede ayudarte a resolver una tarea en específico o varias dependiendo de tus requerimientos. Así que moléstate en investigar. Go por ejemplo es una excelente alternativa que puede hacer lo que haces con NodeJS y más, pero de manera eficiente con respecto al rendimiento y consumo de recursos.