Sobreingeniería (overengineering) en el desarrollo de Software
Aunque Sobreingeniería no está reconocida por la RAE, la podríamos definir como el diseño de un producto para ser más robusto o complicado de lo necesario para el uso que se le pretende dar (WIKIPEDIA).
Durante 25 años desarrollando software he visto a menudo que algunos informáticos adaptan el problema a la solución más de moda, existiendo posiblemente soluciones más sencillas. Pero la tecnología es en un sector lleno de palabras de moda, por lo general anglicismos, siglas o abreviaturas (Over promises, Win Win, UX, IA, etc..) no solo por el origen americano de muchos conceptos, sino también por el Marketing y el postureo, que se han implantado ampliamente en la industria en general. Si además tenemos en cuenta que el ciclo de vida de la tecnología es muy corto, lo más probable es que la mejor forma de rentabilizar un proyecto a largo plazo es hacerlo con los últimos Frameworks, Lenguajes y técnicas del mercado. Si puedes elegir ¿Comprarías una aplicación Cobol o Python? ¿Excel o PowerBI? el informático debe actualizar sus conocimientos y habilidades (Skills) constantemente dando la mejor solución en la tecnología más reciente.
¿Realmente hay sobreingeniería en informática? La informática es una ciencia muy joven y lo mismo pasa con la ingeniería informática, en el desarrollo de software participan además profesionales que no son ingenieros (FP, físicos, matemáticos, autodidactas etc..) los ingenieros o profesionales con alta experiencia (Seniority) son escasos, es más muchas veces se califican senior por el tiempo que llevan trabando y no por su calidad o eficiencia. Ante este panorama me cuesta creer que la sobreingeniería sea un problema extendido en el desarrollo de software.
¿Qué hace entonces que el software sea a veces muy complejo o no cumpla las expectativas de los usuarios? Han hecho falta no solo proyectos con buenos resultados, sino todo lo contrario, muchos proyectos con muy malos resultados para que la ingeniería establezca metodologías probadas (Proceso Unificado de Desarrollo de Software, desarrollo Ágil), técnicas como patrones de arquitectura o patrones de diseño (TDD, Clean Arquitecture) y lo más importante principios y buenas prácticas (KISS, DRY, YAGNI, SOLID, Clean code), que nos aseguran la creación de software confiable y de calidad.
En conclusión, podemos afirmar por tanto que la falta de ingeniería provoca alta complejidad y fracaso en los productos de software, se debe tener en cuenta que todas las fases son importantes y deben aplicar ingeniería:
· Toma de requisitos
· Análisis
· Diseño
· Implementación
· Despliegue
· Pruebas
· Operaciones y mantenimiento
Si eres responsable, cuando elijas tu equipo de desarrollo, además del precio hora ten en cuenta su conocimiento y experiencia en metodologías, técnicas, patrones y buenas prácticas.
Si eres desarrollador además de mejorar continuamente, no olvides los principios del desarrollo y en su orden correcto.
1º Que realice la funcionalidad requerida.
2º Que lo haga lo más rápido posible.
3º Que sea entendible y mantenible.