Complejidad en el software
Complejidad es cualquier cosa relacionada con la estructura de un sistema software que lo hace dificil de entender y modificar.
La complejidad es mas evidente para los lectores que para los escritores.
For every complex problem there is an answer that is clear, simple, and wrong. H.L. Mencken, journalist, writer (1980-1956)
Sintomas de un sistema complejo
- Amplificación de cambios: Un cambio aparentemente simple requiere modificaciones de código en muchos sitios diferentes.
- Alta carga cognitiva: El desarrollador necesita conocer mucha información para desarrollar una tarea, lo que supone pasar altas cantidades de tiempo aprendiendo sobre el código antes de poder realizar modificaciones.
- Lo que no sabemos que no sabemos: No es obvio que partes del código deben ser modificadas para completar una tarea, así como la información que debe conocer el desarrollador para completarla. No está claro qué hay que hacer, y si la solución propuesta funcionará o no.
Causas de la complejidad
- Dependencias: Las dependencias son una parte fundamental del software y no pueden ser completamente eliminadas. Sin embargo, uno de los objetivos del diseño de sofware debe ser minimizar el número de dependencias, y hacer estas lo más simple y obvias posible.
- Opacidad: Cuando la información importante no es obvia.
Entender sistemas complejos
Causalidad vs Complejidad
El cerebro humano está preparado para asumir que cualquier evento tiene una causa identificable. Esto es llamado causalidad y funciona muy bien para predecir y planificar. Sin embargo, a menudo las cosas son más complejas de lo que parecen. La ciencia de la complejidad nos enseña que aplicar el pensamiento lineal a problemas complejos lleva a dolorosos errores. Aunque el reduccionismo ha sido muy beneficioso para la ciencia ahora se acepta que el reduccionismo puede ser llevado demasiado lejos. Para entender muchos problemas complejos se necesita una visión más holística lo cual es el objetivo de la ciencia de la complejidad social. Esta ofrece una vista holística en todo aquello que pasa con grupos de personas.
Only three water molecules are enough to produce complex behavior, as indicated by the famous three-body problem
The human mind has an overdeveloped sense of cause and effect which primes us to see purpose and design everywhere. We attribute cause and effect to all things around us even when there is no reason to.
Nuestras mentes favorecen el pensamiento lineal, es decir predictibilidad en causa y efecto, sobre el pensamiento no lineal, es decir cosas que son más complejas que eso. causation fallacy: our linear thinking minds see the world as a place full of easily explainable events with simple causes and simple effects. Gerald Weinberg.
como en el desarrollo ágil la teoría de los sistemas complejos favorece un enfoque multidisciplinar a la resolución de problemas. pensar de forma compleja es el antídoto a la especialización en la ciencia. así reconoce patrones en sistemas a lo largo de todas las disciplinas científicas y promociona la resolución de problemas utilizando conceptos de diferentes campos.
pensamiento complejo: Para manejar la complejidad social, hay que entender como el sistema crece, no como está construido. Un manager no puede construir y dirigir un equipo auto-organizado, si no que debe hacerlo crecer y alimentarlo. Las organizaciones productivas no se gestionan con modelos y planes. En cambio deben emerger del poder de la auto-organización y la evolución.
Referencia: The Philosophy of Software Design