DevEx: la experiencia del desarrollador

Estos días estamos hablando con compañeros del trabajo sobre cómo agilizar varios desarrollos en paralelo que se están realizando y que tienen requerimientos temporales dictados por los roadmap de diferentes soluciones; pero sobre todo lo que estamos buscando es mejorar la experiencia de los desarrolladores de manera que puedan ser más productivos y a la vez disfruten haciendo lo que mejor saben hacer, programar para entregar valor a los clientes externos o internos.

El hecho es que, como es de suponer, no siempre ha sido así. Me puse nostálgico al recordar cuando las cosas eran “diferentes” así que hagamos un rápido viaje.

A lo largo del tiempo, la industria del desarrollo de software ha experimentado cambios drásticos, y junto con ellos, ha ido evolucionando también la experiencia del desarrollador y la carga cognitiva asociada a ella.

Desde los primeros días de la programación hasta la era actual de la transformación digital y la nube, los desarrolladores han tenido que aprender nuevas herramientas, lenguajes y metodologías, adaptándose (o reinventándose en algunos casos) para mantenerse al día con las demandas del mercado.

La prehistoria: La Era de los Mainframes y Lenguajes Bajo Nivel

Quizá algún lector joven no le suenen o no conozca los primeros días de la informática, donde los desarrolladores trabajaban mayoritariamente con mainframes, pantallas de fosforo verde (recuerdo alguna experiencia con un Vax que se usaba de calefacción en la universidad durante los fríos inviernos de Valladolid) y lenguajes de programación de bajo nivel, como el lenguaje ensamblador. Para aquellos que no conozcan ensamblador, es un lenguaje en el que se accede directamente a la memoria y a los registros de la CPU para operar con ellos mediante llamadas a interrupciones del sistema. ¿Suena bien verdad? Un ejemplo de programa “Hola mundo” podría ser algo así:

section .data
msg db ‘Hola, mundo!’, 0xa
section .text
global _start
_start:
; Escribir el mensaje en la consola
mov eax, 4 ; Syscall número 4: escribir
mov ebx, 1 ; Descriptor de archivo: salida estandar
mov ecx, msg ; Direccion del mensaje
mov edx, 12 ; Longitud del mensaje
int 0x80 ; Llamar a la interrupcion

; Salir del programa
mov eax, 1 ; Syscall numero 1: salir
xor ebx, ebx ; Codigo de salida: 0
int 0x80 ; Llamar a la interrupcion

El ensamblador es un lenguaje bastante críptico, pero en aquella época, la experiencia del desarrollador se centraba en la eficiencia y la optimización del código para aprovechar al máximo los recursos limitados de hardware, y eso también lo tiene, genera programas muy compactos y eficientes. Las pocas herramientas de depuración que había eran rudimentarias y como es de suponer, el ciclo de desarrollo era lento debido a la complejidad del lenguaje, búsquedas manuales de servicios de sistema en libros como el «Interrupt List» de Ralph Brown y la limitada de capacidad de computación y almacenamiento.

La Edad Antigua: La Era de los Lenguajes Alto Nivel

Con el aumento de la capacidad de computación, se podían realizar abstracciones mayores del código y compilaciones y enlazados más complejos, es cuando comienzan a surgir los lenguajes de programación como C, Fortran o Pascal, donde el uso de librerías ayudaba a no tener que realizar las mismas tareas de manera repetitiva y abstrayendo al programador de los detalles de su implementación. Con esto, se comienzan a realizar desarrollos mucho más complejos.

Es por esta época cuando surgen también los IDE (Integrated Development Environment, Entornos de desarrollo integrados) donde se podia programar, depurar y leer documentación desde la misma aplicación. Los primeros basados en línea de comando como el de Borland.

La Edad Media: La Era de las Aplicaciones de Escritorio

Con el auge del uso de entornos gráficos como System1, X Window System, o más adelante con Windows 3.1 y sobre todo Windows 95, los IDEs y los lenguajes de programación se modernizan y ofrecen mejoras en la experiencia. Dos claros ejemplos fueron Delphi (fuente de inspiración para mi primer libro) y VisualBasic con los que se podían hacer fácilmente aplicaciones de escritorio, dibujando las pantallas de la aplicación simplemente clicando y arrastrando los objetos deseados sobre una emulación de la pantalla final del programa y añadiendo código a cada objeto. Estos IDEs, además, disponían de todas las herramientas de depuración y test dentro de la misma aplicación, pudiendo acceder a ellos mediante un simple click y todo muy visual.

En aquella época los desarrollos se realizaban en cascada (waterfall), siguiendo un enfoque secuencial y lineal para el desarrollo de software, donde cada etapa se completaba antes de pasar a la siguiente. Esto requería una planificación exhaustiva y resultaba en proyectos largos, rígidos y desviados (y a veces en la basura).

Pero en este aspecto algo estaba cambiando. A mediados de los 90, apareciendo términos como el Extreme programming, abriendo paso a las metodologías ágiles.

La Edad Moderna: La Era de la Web y las Aplicaciones Empresariales

La popularización de Internet, hizo que el foco de desarrollo de aplicaciones pasara del escritorio a la web, y con ello la experiencia del desarrollador. En esta época se ve como las empresas no quieren perder el tren de Internet y se lanzan a hacer portales para sus clientes y empleados, trasladando a los desarrolladores hacia la generación de aplicaciones web y empresariales. Los lenguajes como Java y PHP se volvieron ampliamente utilizados, y surgieron nuevas metodologías de desarrollo centradas en la colaboración y la entrega continua.

Es cuando aparecen frameworks como Ruby on Rails, Django y ASP.NET permitiendo a los desarrolladores construir aplicaciones web de manera más rápida y eficiente, proporcionando estructuras y bibliotecas predefinidas, sin tener que escribir todo el código HTML de las páginas de manera manual.

Más exigencias y cambios por parte de las empresas hacen que el ritmo al que se espera la entrega de soluciones aumente, calando las metodologías ágiles como Scrum o Kanban, donde se enfatiza la colaboración, la adaptabilidad y la entrega continua. Esta manera de trabajar permite una mayor flexibilidad y una mejor respuesta a los cambios en los requisitos del proyecto en comparación con la rigidez de las técnicas de cascada (waterfall).

La Edad Contemporánea: La Era de la Nube y el Auge de DevOps

Con la capacidad y flexibilidad que ofrece la computación en la nube, la experiencia del desarrollador se centra en la creación de aplicaciones escalables y altamente disponibles. Los desarrolladores también asumen roles más amplios en el ciclo de vida de desarrollo, colaborando estrechamente con los equipos de operaciones (DevOps) y seguridad (DevSecOps).

Plataformas como Amazon Web Services (AWS), Google Cloud Platform (GCP) o Microsoft Azure proporcionaron servicios escalables de infraestructura como servicio (IaaS) y plataforma como servicio (PaaS), permitiendo a los equipos centrarse más en desarrollar sin preocuparse de gestionar la infraestructura o ciertos servicios como réplicas o balanceos de carga.

Es normal la práctica de CI/CD para automatizar la construcción, las pruebas y la implementación de aplicaciones de manera continua. Herramientas como Jenkins o GitLab entre muchas otras, facilitan estas tareas de integración y entrega automáticas.

La Edad Futura: La era del No code, la inteligencia artificial y las plataformas.

En los equipos de desarrollo DevOps, sobre todo para aplicaciones cloud, la carga cognitiva de las personas es cada vez mayor. Cada vez son más las tecnologías y herramientas que los desarrolladores deben conocer con tal de poder realizar su trabajo correctamente. Conocer como configurar y utilizar cada pieza de software que compone un desarrollo moderno, no es trivial y esto hace que los desarrolladores necesiten parte del tiempo que estarían desarrollando en realizar otras tareas o aprender a utilizar algo nuevo. Si lo miramos desde la perspectiva de lo que implica para un programador junior, pueden ser varios meses los que transcurran hasta que sea totalmente operativo tras aprender a utilizar todas las utilidades y técnicas empleadas en el desarrollo. Si esto lo unimos a la falta de personal disponible y al aumento de la demanda, tenemos la tormenta perfecta.

Es entonces donde podemos hablar de tecnologías como el low code / no code , donde se ofrece un nivel de abstracción aun mayor que permite crear aplicaciones sin necesidad de escribir código o realmente poco código.

Por otro lado, ya estamos viendo como la inteligencia artificial está irrumpiendo en el mundo de la programación con ejemplos como GitHub Copilot, Synk Code o el ultra conocido ChatGPT, y no solo para crear código, sino para explicarlo (muy útil en sistemas legacy o mal documentados), detectar fallos de seguridad o mejorar el rendimiento.

Dentro de todos los tipos de plataformas que pueden existir en el mundo IT, son de especial relevancia para los programadores las plataformas como Azure, AWS o GCP, ya nombradas anteriormente. Estas plataformas permiten al desarrollador centrarse en aspectos mucho más de desarrollo y aligerar o incluso olvidarse de temas como las infraestructuras, respaldos o balanceos entre otras cosas.

Cuando entramos en el mundo empresarial, muchas veces estas plataformas son demasiado genéricas y a los desarrolladores solo les interesa cierta parte de ellas y los servicios ya desarrollados dentro de la propia compañía, es donde entran en juego las plataformas internas de desarrollo o IDP (Internal Development Platform). La finalidad de estas plataformas es reducir la carga cognitiva de los desarrolladores mejorando su experiencia a través de servirles información, tecnologías, plantillas y herramientas, mediante un acceso sencillo y facilitando el autoservicio. Este es un tema extenso e interesante que del que merece la pena hablar más en profundidad otro día.

Pero el futuro es el futuro, y no sabemos que herramientas y metodologías se impondrán, aunque si es cierto que algunas ya comienzan a despuntar.