Principio YAGNI: evita la sobreingeniería

9min

En este post vamos a abordar uno de los principios fundamentales de diseño de software. Se trata de YAGNI. Veremos en qué consiste, por qué debemos evitarlo y los consejos para no caer en la sobreingeniería cuando desarrollamos aplicaciones o páginas web.

Índice

¿Qué es el principio YAGNI?

YAGNI es el acrónimo de You Aren’t Gonna Need It (en español querría decir «No lo vas a necesitar»). Puedes tomar esta frase como un consejo a la hora de desarrollar software. ¿Parece fácil no? sin embargo es uno de los problemas más habituales de los proyectos.

Este filosofía, que es uno los principios básicos del Desarrollo Ágil es muy fácil de entender en el fondo. Simplemente nos indica que debemos ser muy concienzudos a la hora de desarrollar funcionalidades, para incluir solo aquellas que realmente son estrictamente necesarias, atendiendo siempre a los requisitos del software y los objetivos de cada etapa del proyecto. La antítesis de YAGNI consiste en desarrollar funcionalidades o piezas de software que realmente no nos han solicitado, simplemente por el hecho de pensar que algún día pueden ser útiles. En este caso estaremos incurriendo en uno de los defectos más habituales en los que caemos los desarrolladores.

Beneficios de aplicar YAGNI en el desarrollo

Aplicar YAGNI de manera estricta en los proyectos de desarrollo de software aportará numerosos beneficios en nuestro trabajo del día a día, los proyectos de software y en el equipo de desarrollo. Los vamos a resumir.

Ahorro de tiempo y recursos

La primera ventaja de aplicar YAGNI consiste en ahorrar tiempo y recursos, ya que si no nos han pedido realizar una funcionalidad no necesitamos gastar tiempo en ella. Por tanto, YAGNI nos ayuda a aprovechar el tiempo y los recursos, en las características que realmente importan.

Simplificación del código

Si agregamos funcionalidades que nos han pedido es muy probable que el código de las aplicaciones acabe siendo más complejo, o al menos tenga mayores dimensiones de las necesarias. En cambio, al aplicar YAGNI mantendremos el código más simple y objetivo.

Mejora de la mantenibilidad del proyecto

A mayor cantidad de código, más trabajo de mantenimiento. Es por ello que YAGNI puede resultar también en una ventaja a lo largo, ya que tendremos que mantener menos funcionalidades, centrándonos en lo que realmente nos han pedido.

Reducción de errores y bugs

A mayor cantidad de código, más probabilidad de introducir errores y bugs. Por tanto, mantenernos fieles a los requisitos esenciales del software permitirá ocupar menos tiempo también en la depuración de las aplicaciones.

¿Cómo implementar el principio YAGNI en tus proyectos?

Con un poco de sentido común cualquier desarrollador puede aplicar YAGNI en los proyectos y evitar la sobreingeniería. No obstante, siempre será útil seguir una serie de consejos prácticos para evitar YAGNI y para fomentar el desarrollo ágil en general.

1. Evalúa los requisitos del proyecto

Antes de ponernos a programar como si no hubiera mañana, debemos evaluar los requisitos del proyecto y realizar el conveniente análisis de las funcionalidades que incluye el proyecto. Esta primera etapa nos permitirá centrarnos y saber qué es exactamente lo que tenemos que hacer y las posibles dificultades que podemos encontrar.

2. Prioriza funcionalidades esenciales

Dentro de todas las funcionalidades que hayamos encontrado en la etapa de requisitos las costumbres del desarrollo ágil nos indican que lo conveniente es centrarse primero en aquellas que son capaces de aportar más valor al cliente o al proyecto. Otras corrientes nos llevarían a comenzar por las funcionalidades que presentan una mayor dificultad y, por tanto, pueden condicionar más el desarrollo de los pasos siguientes. En todo caso lo importante es priorizar y decidir qué funcionalidades acometer primero.

3. Adopta un enfoque incremental

La metodología del software nos indica que el desarrollo debe ser siempre interactivo e incremental. Esto quiere decir que vamos agregando funcionalidades a lo largo de iteraciones, siempre incrementando el número de características desarrolladas. Al centrarnos en una cosa de cada vez evitaremos caer en YAGNI. 

4. Mantén la simplicidad del código

El código claro es una de las principales cualidades que deben tener los proyectos de software. Evita introducir mayor complejidad de la necesaria en el desarrollo del software, lo que incluye también desarrollar más cosas de las que realmente se han solicitado.

5. Colaboración y comunicación con el equipo

Debe existir siempre una comunicación abierta con el resto del equipo de desarrollo, en un ambiente colaborativo. Todos los miembros del equipo deben entender el principio YAGNI y aplicarlo en su trabajo del día a día.

6. Realiza revisiones y una refactorización continua

Durante el desarrollo del proyecto es importante establecer dinámicas en las que se realicen revisiones del código de los proyectos y se analice la marcha del desarrollo de las funcionalidades. Otro paso fundamental para el desarrollo ágil es la refactorización continua, de modo que mantengamos siempre la calidad del software lo más elevada posible.

7. Utiliza herramientas de gestión de proyectos

Resultará de mucha ayuda apoyarse en herramientas de gestión de proyectos, que permitan planificar las tareas en las que el equipo está trabajando. De esta manera es más fácil asignar recursos y centrar el foco en las funcionalidades esenciales y necesarias.

Retos y obstáculos al aplicar YAGNI

Ahora que ya conocemos los beneficios de la aplicación del principio YAGNI y tenemos una idea sobre cómo seguirlo, vamos a ver algunos de los desafíos que nos podemos encontrar en los proyectos y consejos para resolverlos.

Resistencia del equipo a cambios de enfoque

Es natural que ciertos componentes del equipo de desarrollo tiendan a desarrollar funcionalidades porque piensan que pueden ser útiles o necesarias en un breve espacio de tiempo. Este es uno de los puntos que hacen especialmente recomendables las revisiones continuas de la marcha de los proyectos y la participación y colaboración del equipo. Si eres el gestor del proyecto es ideal fomentar la cultura del desarrollo ágil y asegurarse que todos los componentes del equipo compartan la misma filosofía.

Dificultades en la identificación de funcionalidades esenciales

A veces puede ser complicado detectar las funcionalidades que son verdaderamente esenciales. En estos casos es importante mantener el contacto cercano con el cliente y hacer esfuerzos activos en la toma de requisitos y análisis del software.

Gestión de la complejidad en proyectos a largo plazo

En proyectos más complejos, donde vamos a trabajar durante un plazo largo de tiempo, puede ser más complicado mantener el foco en las funcionalidades esenciales y evitar la sobreingeniería, ya que es posible que tengamos en mente funcionalidades que en el futuro se van a tener que desarrollar.

Nuevamente, debemos insistir en el enfoque del desarrollo iterativo e incremental, agregando funcionalidades esenciales en cada paso, centrándonos en aquellas que puedan aportar mayor valor al proyecto, evitando adelantarnos en el tiempo y querer abarcar demasiado en una sola etapa.

Balance entre simplicidad y escalabilidad

En ocasiones, cuando sabemos que ciertas partes del software van a requerir una extensión puede ser conveniente realizar un diseño capaz de hacer viable esa futura ampliación. Sin embargo, aquí podemos estar contradiciendo el principio YAGNI, puesto que quizás todavía no tengamos la necesidad real de aplicar un diseño más complejo del estrictamente necesario.

En estos casos hay que evaluar las decisiones de diseño con especial cuidado, tratando siempre de ajustar el balance entre simplicidad y escalabilidad.

Superación de la tendencia a la sobreingeniería

Con la ayuda del equipo, las revisiones periódicas y la participación activa de todos los desarrolladores en las decisiones de diseño debemos poder superar la tendencia natural a la sobreingeniería. Es conveniente evitar nuestra propia necesidad de perfeccionismo. Para ello es importante tener en mente siempre los beneficios de evitar caer en YAGNI.

Herramientas y técnicas para evitar la sobreingeniería

Para acabar vamos a ver algunas herramientas y técnicas que nos permitirán evitar la sobreingeniería en el desarrollo de proyectos de software, manteniendo el enfoque en las funcionalidades esenciales en cada etapa del proyecto.

Aplicación de métodos Ágiles en el desarrollo

Los métodos ágiles del desarrollo del software son ideales a la hora de apoyar el principio YAGNI, ya que se centran en la entrega incremental y continua de valor, estableciendo sprints cortos, en los que debe quedar muy claro el objetivo de cada periodo del proyecto.

Uso de principios de diseño Lean

Otro enfoque popular que debemos fomentar en el equipo de desarrollo son los principios de diseño de la metodología Lean Development. Éstos se enfocan en la eliminación de desperdicios y la creación de valor de manera continua. La aplicación de los principios de Lean nos ayudará a evitar la sobreingeniería, ya que ambas prácticas son completamente opuestas.

Implementación de revisiones de código colaborativas

Siempre que podamos debemos establecer revisiones de código colaborativas, en las que unos desarrolladores validen el trabajo de otros. De esta manera podemos asegurarnos de no caer en el YAGNI y detectar cuando ciertos componentes del equipo de desarrollo tienen tendencia a desarrollar características innecesarias.

Priorización de funcionalidades a través de MVP (Productos Mínimos Viables)

Otro de los enfoques que promueve el desarrollo ágil es la creación de MVP (Productos Mínimos Viables)Esta técnica es muy eficaz para evitar caer en el YAGNI, ya que hacer un producto mínimo viable es incompatible con la sobreingeniería.

Incorporación de feedback continuo del usuario

En todas las etapas del desarrollo de software es ideal mantener un feedback continuo con los usuarios o las empresas a las cuales va destinado el software que estamos creando. Es por ello que el enfoque de entrega continua, iterativa e incremental resulta especialmente útil para la marcha de los proyectos y evitar la sobreingeniería.

Fernán García de Zúñiga

Productos relacionados: