/ java

Java o NodeJS

En los últimos años, NodeJS ha ganado mucha tracción en la industria, sin embargo, unos años después, todos se han movido lentamente a TypeScript. Aquí haremos una comparativa con una contraparte corporativa: Java

Antes de comenzar, cabe aclarar que no vamos a enfocarnos a benchmarks sobre performance, si no a la complejidad que significa hacer un proyecto en cada tecnología y su facilidad en productividad, esto partiendo desde los comentarios típicos anti Java, como por ejemplo:

  • Demasiado verbose
  • Odio las VM - absurdamente, es un comentario que escucho a menudo

O comentarios menos infantiles como:

  • Es más fácil desarrollar en <cualquier lenguaje de scripting> tecnología
  • En Java las soluciones correctas son las sobre-complicadas

Dicho esto, es válido decir que es tentador tener una tecnología que te permite prototipar tan rápido para generar soluciones, posiblmenete sea lo más ideal para una startup ó para un proyecto personal, utilizar una tecnología que te de la facilidad de simplemente entregar cosas sin tener que ir mucho a pensar cosas como: Cómo puedo hacer el unit test para este componente con un miembro estático? o tal vez el simple hecho de escribir menos al quitar los tipos

NodeJS

Usualmente NodeJS se utiliza para desarrollar endpoints, aunque es posible tener un template engine, lo más común es sólo servir un REST API desde aquí

Básicamente, para iniciar un proyecto basta con algo similar al siguiente script, claro que puede variar entre preferencias, pero vaya, la idea es ver que tan rápido podemos levantar un proyecto por ahora

# crear la carpeta del proyecto
mkdir node-project
cd node-project

# inicializar el proyecto
npm init -y

# manejo de peticiones
npm install --save express

Ahora, creamos un archivo index.js

const express = require('express')

const app = express()

// mapping para /hello
app.get('/hello', (req, res) => {
  res.send("yay")
})

const PORT = 3031
app.listen(PORT, _ => {
  console.log(`escuchando en http://localhost:${PORT}`)
})

Ahora, editamos el archivo de package.json, en la sección de scripts, vamos a agregar el entry start de la siguiente forma:

"start": "node index.js"

Finalmente, lo ejecutamos npm start y probamos la ruta:

node-route

Como podemos observar, es muy sencillo en realidad generar el proyecto, crear un handler para rutas y comenzar a probar, sin embargo, la industria lentamente se ha ido moviendo a TypeScript, y la razón principal es para hacer el type check, por ejemplo, el proyecto deno, creado por el mismo aportador inicial de NodeJS, después de admitir que cometió muchos errores en varios componentes core de NodeJS (puedes ver la plática en youtube desde aquí), por lo cual está implementando deno, donde nos presenta una nueva plataforma, más segura, con TypeScript

Pero volviendo a la pregunta.. Qué nos proporciona TypeScript en combinación con NodeJS?

  • Es type safe - así que hay muchos problemas que podemos encontrar previos a un despliegue, por ejemplo tratar una promesa como si fuera un dato numérico
  • Es transpilado a un JavaScript óptimo
  • Dado que JavaScript no maneja interfaces, polimorfismo no está presente (al menos no de forma transparente). Aunque esto puede ser evadido pensando en módulos en lugar de clases, lo cual, dependiendo de tu estilo, puede ser algo bueno o malo

En fin, varias de las cosas que estamos mencionados están presentes en otros lenguajes que son más fuertes en POO, como Java, por ejemplo. Sin embargo, Java no es bien visto en el mundo de los desarrolladores hipsters hacker papu pro que gustan de tener una taza reciclable con su nombre escrito en ellas

hipster-dev

Java

Si bien Java se utiliza en ambientes más enterprise, hay una razón para ello, y eso puede ser justificado en dos palabras extensibilidad, escalabilidad. Y esto no quiere decir que las demás tecnologías no sean buenas, simplemente no son tan fuertes en OOP como lo es Java, y en el mundo empresarial, esto no puede ser sólo un feature, si no un strength. Por otro lado, si no quieres lidear con este peso extra, aún puedes desarrollar pensándo en módulos, ya que es un feature de Java también, teniendo aún la posibilidad de hacer un desarrollo más robusto cuando sea necesario y seguro durante los periodos de desarrollo rápido

Es por esto mismo que en lugares donde se utilizaba NodeJS con vanilla JavaScript, cuando llegan a tener problemas en donde type safe habría salvado el día desde el momento en que se realizó el desarrollo, han comenzado moverse a TypeScript, para seguir teniendo facilidades que el ecosistema de JavaScript les presenta en una tecnología más segura como lo es TypeScript, pero, podemos acercarnos a este punto con Java? O tiene que ser sobrecomplicado?

Si alguna vez has buscado lo que muchos empleos para Java WEB solicitan, verás que siempre piden spring (distintos módulos de este, pero en el centro, es spring), y terminas con dos opciones grandes

  • spring boot - dependiendo de tu experiencia previa con spring puedes llamarlo un boilerplate, arquetipo ó simplemente magia

magic-meme

  • spring con maven / gradle - primero, la decisión sobre si usar maven o gradle y porqué?, y después a instalar spring core, mvc, entender porque si ambos son de spring son cosas distintas, fingir que sabes lo que haces, etc.

En resumen, no es muy starter friendly como lo vimos en nuestro ejemplo con NodeJS, PERO, spring no es la única forma de hacer las cosas, y definitivamente podemos hacer un desarrollo similar, comencemos!

# crear el proyecto
mkdir java-project
cd java-project

# inicializar el projecto
mvn archetype:generate -DgroupId=com.nopaldev -DartifactId=spark -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ahora, en el archivo pom.xml, vamos a agregar la siguiente dependencia (similar a npm install --save express)

<!-- dependency for spark -->
<dependency>
    <groupId>com.sparkjava</groupId>
    <artifactId>spark-core</artifactId>
    <version>2.5</version>
</dependency> 

Y también, dado que utilizaremos Java 11, hay que hacer unos ajustes para indicarle a maven como realizar la compilación

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.0</version>
      <configuration>
        <release>11</release>
      </configuration>
    </plugin>
  </plugins>
</build>

Ahora, si verificamos en el directorio src, encontraremos los paquetes, y dentro de ellos, existe una clase llamada App.java, lo abriremos y vamos a agregar nuestro manejador de rutas

package com.nopaldev;

import static spark.Spark.*;


public class App {

  public static void main(final String[] arguments) {
    get("/hello", (req, res) -> {
      return "yay";
    });
  }
}

Java 11

La razón por la cual en este ejemplo se mencionó el uso de Java 11, es porque aquí tenemos varias ventajas, algunas nuevas, otras que se heredan de Java 8, en general:

  • Lambda functions - permite escribir de forma similar a los arrow functions de JS
  • var keyword - Permite declaración de variables sin indicar el tipo localmente en un méotdo

Estos dos features nos darán la flexibilidad de un lenguaje scripting y la robustes necesaria para escalar al futuro con el type check, y esto creo yo que es un gran punto medio, si miras alrededor en la industria:

  • Python ya es capaz de indicar tipos para los parámetros y retornos de un método
  • JavaScript está lentamente integrando más componentes para dar un soporte a OOP más maduro
  • Muchos desarrolladores de JavaScript para backend / frontend se han mudado lentamente a TypeScript o algún linter que permita hacer ese type check

Algunas áreas de mejora para Java en estos ámbitos podrían ser:

  • Serialización / deserealización a JSON no son transparentes como JavaScript
  • En Java, la gran mayoría de la comunidad de desarrollo está acostumbrado a utilizar inyección de dependencias, así que hay que configurar aún esto, aunque con librerías como guice de Google, podemos configurarlo de una forma relativamente sencilla

conclusión

Si bien Java no es el lenguaje más popular cuando se trata de facilidad para los nuevos desarrolladores y cuenta con un ecosistema tan variado que puede ser abrumador para cualquiera, ha ido mejorando con los años, y realmente en este punto, Java se ha adaptado a las necesidades tanto de los negocios como los desarrolladores para proponer soluciones robustas con facilidad de prototipado y escalamiento

Hoy en día alguien puede decir Me gusta Java y no ser acribillado en un Starbuckss