Cualquier proyecto software acaba siendo complejo de desarrollar. Muchas veces más de lo que esperábamos. Pero esta complejidad la podemos dividir en dos grandes tipos como ya propuso el gran Fred Brooks en su aún más conocido artículo No Silver Bullet:

Complejidad esencial

La complejidad inherente al problema que estamos intentar solucionar. Por ejemplo, crear un vehículo autónomo es un problema complejo, lo mires como lo mires. No se puede simplificar.

Este concepto nació como una métrica concreta para evaluar los caminos de ejecución de un programa. Para los que queráis conocer mejor como se calcula y su relación con otra métrica conocida, la complejidad ciclomática, podéis leer el artículo de T. J. McCabe donde presentó originalmente estas métricas. Pero más allá de su definición normal, se utiliza este concepto para hablar de lo difícil que es el dominio para el que vamos a desarrollar un nuevo software.

Complejidad accidental

La complejidad accidental es la complejidad adicional que introducimos nosotros mismos (y nuestras herramientas) durante el proceso de desarrollo. Siguiendo con el ejemplo del vehículo autónomo, el problema de detectar un objeto en la cámara es un problema esencialmente complejo. Pero que haya que convertir los datos de la imagen a un cierto formato que es el único que entiende la librería que queremos usar para la detección es una complejidad accidental. No tiene que ver con el problema en sí sino en como lo estamos intentando solucionar.

Obviamente, el objetivo es introducir el mínimo de complejidad accidental al solucionar la complejidad esencial del proyecto. No siempre es fácil. A veces no es fácil ni diferenciar claramente los dos tipos de complejidad, algo puede parecernos esencial hasta que nos damos cuenta de que había una solución sencilla que no veíamos por culpa de nuestras decisiones tecnológicas (o metodológicas).

La creciente complejidad del software

La complejidad esencial del software no para de crecer. La complejidad accidental también. Cada vez somos mejores desarrollando software pero esto mismo hace que cada vez nos embarquemos en proyectos más complicados. Un ejemplo claro es la explosión de la IA que ha disparado la complejidad esencial de proyectos que tienen que integrar componentes inteligentes. Y para tratar esa complejidad se ha empezado a usar editores inteligentes que incremental la complejidad accidental del proyecto.

Hablamos hace poco de la complejidad que se escondía detrás de la creación de un chatbot que probablemente a más de uno la parece algo fácil. Pero que en realidad implica combinar componentes en 5+2 lenguajes de programación diferentes (para integrar el bot en tu web, para definir su lógica interna, para procesar la parte de NLP,…). Seguro que podríamos reducir la complejidad accidental de nuestra plataforma de bots (por ejemplo reduciendo el número de lenguajes diferentes que se utilizan) ¡pero os aseguro que crear un buen bot es un problema esencialmente complejo!