¿Cuál es la diferencia entre la sobre ingeniería y el diseño excesivo de un software?

El diseño excesivo de un software ocurre cuando un equipo de producto intenta incorporar características sin tener en cuenta cómo, cuándo y si se utilizará. Los equipos a menudo pasan semanas y meses desarrollando una característica que rara vez se usa, si es que se usa. A medida que el software madura, tales características se encuentran en el software y se crean más características a su alrededor o dependiendo de él, creando lo que a veces se llama Lava Flow. Nada cambia realmente, pero por fuera, da la sensación de que algo se está desarrollando. Se puede rectificar fácilmente registrando y utilizando métricas de uso, y eliminando periódicamente las funciones que ya no son útiles para los usuarios finales. Un muy buen ejemplo sería la función ’empujar’ en Facebook.

La sobre ingeniería, por otro lado, ocurre cuando se escribe una sola característica para manejar casos extremos y casos extremos, independientemente de la probabilidad de que ocurra. Puede conducir a un desplazamiento de alcance y un código difícil de manejar que es difícil de refactorizar. Esto a menudo se contrarresta con el principio de programación Xtreme YAGNI (no lo necesitará). Es decir, a menos que tal caso sea lo suficientemente frecuente como para considerarlo, el código es mejor al no considerarlo. Sin embargo, debe hacerse junto con el monitoreo continuo de la frecuencia de los casos límite, seguido de una refactorización para resolverlo. No refactorizar puede conducir a un trabajo masivo a largo plazo. Un ejemplo muy común es usar una base de datos NoSQL bajo el supuesto de que se necesitará manejar a millones de usuarios, cuando en realidad, el número de usuarios es de cientos o miles y una base de datos SQL sería suficiente.

El diseño excesivo es agregar características que no necesita ahora en previsión de que pueda necesitarlas. La sobreingeniería está agregando capacidad o redundancia que no se necesita ahora.