El mundo de la tecnología se mueve muy rápido. Cada par de años surge un nuevo lenguaje o un nuevo framework que transforma el modo en el que se crea el software. Frameworks como jQuery, Backbone.js o AngularJS han modificado por completo el modo en que trabajamos y Javascript y NoSQL han revolucionado el modo en que algunas compañías almacenan y estructuran sus datos.
Pero no sólo surgen nuevas tecnologías, sino que algunas ya existentes evolucionan o mejoran. Java 8 incorpora muchas funciones que han estado disponibles durante muchos años en otros lenguajes (lambdas, implementaciones por defecto, opcionales) y Microsoft ha anunciado que .NET va a ser de código abierto.
El mejor lenguaje de programación
La mayor parte de las personas que quieren aprender a programar me preguntan “¿cuál es el mejor lenguaje de programación?”. Yo les respondo: “Depende”, e intento explicar por qué es difícil contestar a esa pregunta. Cada lenguaje de programación (al igual que otras muchas cosas) tiene sus aspectos positivos y negativos.
Esa pregunta es como intentar saber cuál es la mejor comida del mundo: no hay una respuesta absoluta; depende de muchos factores.
Es bien sabido que en el mundo bancario las tecnologías son elegidas de una manera un tanto conservadora. Seguridad, estabilidad y soporte a largo plazo son los factores más determinantes, y este criterio se aplica también a los lenguajes de programación. Si se hace una búsqueda simple en Google se puede ver que la mayor parte de las páginas web coinciden en señalar que los más utilizados en banca son: Java, C# (u otro. NET) y C++.
Los grandes: Java, C#, C++
Java, como es de esperar, se utiliza para muchas cosas. Pero una de las mayores áreas es en servicios online. Muchas de las API internas y de las aplicaciones online de los bancos utilizan Tomcat. Además, todavía hay aplicaciones de escritorio y algunos applets en Java por ahí. Aunque pueda resultar sorprendente, algunos bancos aún utilizan applets Java en sus webs para clientes.
Uno de los puntos positivos de Java es su compatibilidad y portabilidad. Si desarrollas una solución para funcionar en una versión específica de Java, estás garantizado que funcionará en las versiones siguientes del lenguaje sin problemas. En otras palabras, Java es una multiplataforma y no introduce cambios rupturistas en las nuevas versiones. Esto es lo que le hace un lenguaje atractivo para la banca.
El C# es también uno de los lenguajes favoritos en banca, junto al Java y C++. Es un detalle interesante, ya que los otros dos llevan más tiempo circulando. Uno de los motivos por el que el C# ha sido adoptado rápidamente es por su estrecha integración con Windows. Muchas de las aplicaciones internas se desarrollan en C# porque es muy fácil integrarlas con otros productos de Microsoft, como Active Directory y Office. Y hay algo que Microsoft sabe hacer muy bien: crear herramientas y entornos que incrementan la productividad de los desarrolladores.
Si estás trabajando en un banco, y te piden que desarrolles una aplicación Windows con SSO y Active Directory que conecte con varios servicios web internos para mostrar algunos datos, hacerlo en C# sería una opción inteligente.
C++ siempre se ha asociado con tiempo real, productividad y eficacia. Hay cientos de debates acerca de si C++ es más rápido que el código no nativo (Java o .NET). Dado que este es un tema muy subjetivo (como discutir cuál es el mejor aceite para el motor de un auto), simplemente diré que aún siendo más lento o rápido que C++, los lenguajes no nativos son lo suficientemente rápidos como para ser usados por muchas de las aplicaciones a tiempo real que hay en el mercado (por ejemplo, Twitter tiene buena parte de su código en Scala, que funciona en JVM).
En mi opinión, hay muchos factores más importantes hoy en día a tomar en cuenta cuando se compara C++ con los otros dos lenguajes, como rapidez en el desarrollo, disponibilidad de ingenieros, coste de mantenimiento/depuración de fallos, capacidad de interoperabilidad, etc.
Dinámicos y agiles
Python es un lenguaje extremadamente flexible. Se puede utilizar para crear scripts de mantenimiento, algoritmos para el análisis de datos y servicios web. Pero también tiene puntos en contra, como su runtime lento. Sin embargo, dado que interactúa muy bien con C++, en muchos casos también se utiliza para crear frontends o capas de abstracción reutilizando parte del código de base de C++.
Javascript es un lenguaje que fue concebido para hacer scripts simples en páginas web, y se ha convertido en el componente más importante de las actuales tecnologías online. Con la introducción de Node.js, Javascript fue promovido también a lenguaje del lado de servidor. Recientemente, con Node-Webkit, también se utiliza como lenguaje de aplicaciones de escritorio.
La principal ventaja de los lenguajes dinámicos es el concepto de agilidad que hay en torno a ellos. Su comunidad de desarrolladores defiende una cultura que construye rápido y lanza con rapidez. Hay gestores de paquetes y frameworks que permiten a los desarrolladores crear cualquier tipo de solución realmente rápido.
Como ejemplo, con Node.js es posible arrancar el backend de una API REST en cuestión de minutos. Esto es muy positivo para crear proyectos pequeños y autocontenidos, ya que permite a los desarrolladores centrarse en la funcionalidad y no en la implementación.
¿Qué pasa con la arquitectura?
La arquitectura de un proyecto también influye en el lenguaje que se usa. Si se elige una arquitectura monolítica, entonces apartarse de ella puede ser complicado. El resultado de usar stacks monolíticos son bases de código enormes, desarrolladas habitualmente en un único lenguaje de programación. La mayor parte de las veces no es una arquitectura flexible, y se desarrolla como un todo único (por supuesto, hay excepciones).
Por el contrario, si la arquitectura se basa en (o migra a) microservicios, entonces la diversidad de tecnologías se multiplica. Muchos desarrolladores diferentes, con distintos perfiles y experiencia, pueden combinar sus esfuerzos utilizando la mejor herramienta para la tarea que corresponda a cada servicio en concreto. Este es un escenario ideal si se tiene el tiempo y los recursos suficientes para implementarlo. Normalmente esta arquitectura lleva más tiempo, y es más compleja, pero es más barato ampliarla y mantenerla a largo plazo.
Por ejemplo, múltiples servicios backend desarrollados en Java y .NET pueden exponer una serie de endpoints de API a uno o más frontends desarrollados en HTML5/JS o Python.
Entonces ¿cuál es el mejor lenguaje? 🙂
Hemos realizado un repaso a grandes rasgos de los lenguajes de programación más utilizados en la banca. Aunque la adopción de tecnologías en este sector suele ser lenta, eventualmente terminan poniéndose al día.
Recuerdo que hace unos años un amigo mío que trabajaba en un banco me dijo que proponer JQuery o AngularJS durante la planificación de un proyecto no tenía sentido. El banco tenía un stack en Javascript que habían desarrollado y mantenido a lo largo de los años. Su política en aquel momento era evitar cualquier librería de terceras partes. Esta tendencia ha cambiado últimamente, y ahora ya pueden utilizar esas tecnologías (principalmente para aplicaciones internas).
Los lenguajes clásicos de tipo estático, potentes, estarán en los primeros puestos de los más usados durante mucho tiempo. Hay numerosos programadores sénior en el mercado, las librerías, compiladores y runtimes son muy maduros y tienen el soporte de grandes compañías (Oracle o Microsoft). Además, hay ya una gran infraestructura creada ya en esos lenguajes.
Lo que creo que sucederá es que veremos más lenguajes dinámicos entrando en juego. La plataforma Athena de JP Morgan está creada en Python, C++ y Java. Casos como este serán más habituales en el futuro, e incluso habrá un momento en el que el conocimiento de frameworks de código abierto será un requisito para acceder a puestos de trabajo.
Finalmente, creo que las próximas generaciones de ingenieros de software estarán acostumbradas a un entorno mucho más diverso, con acceso fácil a la comunidad de código abierto. Los bancos deberían de adoptar esta filosofía e incorporar estas tecnologías al menos internamente. Esto les permitirá atraer gran talento y mantener un ambiente desafiante y motivador entre los ingenieros de software.