Saltar al Contenido
Este artículo ha sido traducido del japonés usando IA
Leer en japonés
Este artículo es de Dominio Público (CC0). Siéntete libre de usarlo libremente. CC0 1.0 Universal

Desarrollo Impulsado por el Desarrollo y Pruebas Impulsadas por la Refactorización

Desarrollar consiste en crear repetidamente algo nuevo y útil.

Cuando escuchamos "desarrollo", a menudo nos viene a la mente el desarrollo de nuevos productos. Esto difiere de la fabricación de productos individuales; implica, por así decirlo, la creación de los planos o moldes del producto.

Por lo tanto, los diseños y moldes creados mediante el desarrollo de nuevos productos se utilizan repetidamente en las fábricas para producir en masa productos idénticos.

También existen usos de la palabra "desarrollo" como desarrollar capacidades individuales, o desarrollar una sociedad y una nación. Estos implican no solo un aumento en lo que se posee, sino más bien la capacidad de usar y beneficiarse repetidamente de las capacidades desarrolladas.

Si bien el poder económico de los individuos y las sociedades puede fluctuar con las condiciones económicas, las capacidades desarrolladas son generalmente permanentes.

Incluso si disminuyen, se considera un declive, no una fluctuación como la prosperidad económica.

Además, existe el desarrollo de tecnología y conocimiento. A diferencia de las capacidades de los individuos o sociedades específicas, estas tienen la característica de ser fácilmente compartibles.

Y entre los resultados de estos desarrollos (productos, capacidades, conocimiento y tecnologías), algunos pueden ser útiles para el desarrollo posterior.

Al desarrollar estos resultados útiles, el alcance del desarrollo se expande, y también mejoran la eficiencia y la calidad.

Desarrollo de Software Impulsado por la IA

En general, el desarrollo requería una cantidad considerable de tiempo y esfuerzo. Especialmente a medida que la sociedad avanza y diversas cosas se vuelven más sofisticadas, crear cosas nuevas se vuelve cada vez más difícil.

Sin embargo, con la llegada de la IA generativa, esta situación está cambiando. Actualmente, el desarrollo de software está experimentando una transformación dramática, beneficiándose de las altas capacidades de programación de la IA generativa.

Una visión futura donde los agentes autónomos basados en IA generativa se conviertan en el centro del desarrollo de software como ingenieros de software ya se está convirtiendo en una realidad.

Actualmente nos encontramos en un período de transición. Si bien no podemos confiar completamente el desarrollo a la IA generativa, utilizarla hábilmente puede impulsar poderosamente el desarrollo de software.

A esto se le denomina Desarrollo de Software Impulsado por la IA.

Desarrollo Impulsado por el Desarrollo

Cuando la IA generativa agiliza el desarrollo de software, no solo puede hacer más eficiente el desarrollo del software objetivo final, sino también el desarrollo de software que ayuda en el propio proceso de desarrollo.

Como se mencionó anteriormente, los resultados que facilitan el desarrollo amplían el alcance del mismo y contribuyen a aumentar la eficiencia y la calidad. Además, si se crean de forma eficaz, pueden reutilizarse en otros proyectos de desarrollo.

Por lo tanto, al desarrollar software útil durante el curso del desarrollo de software, la eficiencia general puede aumentar en última instancia, y estos activos pueden aprovecharse también para futuros desarrollos.

Tradicionalmente, desarrollar este tipo de software de apoyo al desarrollo era una práctica común en el campo, pero requería su propio tiempo y esfuerzo de desarrollo, lo que exigía una evaluación cuidadosa y una implementación dirigida.

Al utilizar la IA generativa, se puede crear rápidamente software sencillo para automatizar tareas pequeñas e improvisadas. Para tareas con procesos claros, la IA generativa puede generar programas precisos casi sin errores.

Esto hace que sea más fácil que nunca desarrollar software que ayude en el desarrollo durante el propio desarrollo de software.

Y tras una reflexión más profunda, emerge un estilo de desarrollo en el que se desarrollan continuamente herramientas útiles durante el proceso de desarrollo, transformando así el propio método de desarrollo.

A esto lo llamaremos Desarrollo Impulsado por el Desarrollo.

Para practicar el Desarrollo Impulsado por el Desarrollo, se requiere el hábito de observar objetivamente el propio desarrollo de software para considerar qué partes pueden delegarse al software y qué partes solo pueden ser realizadas por humanos, junto con la habilidad para desarrollar dicho software de apoyo al desarrollo.

Además, la IA generativa puede integrarse en estas herramientas de software. Al incrustarla dentro del software, a diferencia de un agente de IA generativa independiente, el alcance del procesamiento puede acotarse y se puede definir un camino claro hasta cierto punto.

Si bien los agentes de IA pueden lograr resultados similares mediante indicaciones, el software que integra la IA generativa puede aumentar la precisión más fácilmente combinando programas e indicaciones.

Si se puede practicar el Desarrollo Impulsado por el Desarrollo, el segundo proyecto experimentará mejoras tanto en calidad como en coste en comparación con el primero. Además, con cada proyecto posterior —el tercero, el cuarto, y así sucesivamente—, las mejoras seguirán acumulándose.

Esto es completamente diferente de simplemente desarrollar software utilizando IA generativa. Con el tiempo, surgirá una brecha significativa entre los equipos que simplemente dominan las herramientas de IA generativa y los equipos que practican el Desarrollo Impulsado por el Desarrollo.

Pruebas Impulsadas por la Refactorización

Existe un concepto llamado Desarrollo Orientado a Pruebas (TDD, por sus siglas en inglés), que implica diseñar primero las pruebas basándose en las especificaciones y luego desarrollar el software para que las supere.

Inicialmente, también pensé que, con la IA generativa facilitando el desarrollo de programas de prueba para la automatización, el Desarrollo Orientado a Pruebas podría ser practicable.

Sin embargo, a medida que comencé a practicar el Desarrollo Impulsado por el Desarrollo, llegué a la conclusión de que el enfoque de diseñar pruebas antes de la implementación no siempre era adecuado.

Especialmente para software como aplicaciones web, que implican aspectos subjetivos como la usabilidad y el diseño visual que uno puede experimentar al interactuar, me di cuenta de que ejecutar e interactuar realmente con el software tiene prioridad sobre las pruebas detalladas.

Esto se debe a que, si existen insatisfacciones significativas a nivel de UI/UX al interactuar, existe la posibilidad de que partes fundamentales como el marco de trabajo, la arquitectura básica, el modelo de datos o los casos de uso necesiten ser modificados.

En mi actual proyecto personal de desarrollo de software, también noté problemas con la flexibilidad funcional y el rendimiento, lo que me llevó a cambiar dos marcos de trabajo por otros diferentes.

También hubo una parte con una eficiencia deficiente en el uso de la memoria, lo que requirió una revisión completa del procesamiento.

Es en estas coyunturas de refactorización cuando las pruebas se convierten por primera vez en una consideración consciente.

Si esto ocurre durante las primeras etapas del desarrollo, o si las características y especificaciones van a cambiar significativamente de todos modos, las pruebas podrían no ser necesarias.

Sin embargo, si el desarrollo ya está avanzado y hay muchos elementos que verificar, es probable que se necesiten pruebas durante la refactorización para asegurar que no haya deficiencias funcionales u omisiones.

Por lo tanto, la idea de crear programas de prueba en el momento en que el desarrollo ha avanzado hasta cierto punto y la refactorización se hace necesaria no es una mala idea.

En este punto, la clave no es crear pruebas para todo el código, sino centrar las pruebas en las partes maduras que es poco probable que cambien mucho en el futuro, dejando las partes aún fluidas sin pruebas automatizadas.

A esto se le puede llamar Pruebas Impulsadas por la Refactorización.

Conclusión

La IA generativa está transformando drásticamente el desarrollo de software.

En artículos anteriores, escribí sobre la importancia de aspirar a convertirse en un Ingeniero Omnidireccional, capaz de ir más allá del rol tradicional de ingeniero full-stack para desarrollar sistemas omnidireccionales que combinen diversos dominios, infraestructuras y entornos de ejecución.

También escribí un artículo sugiriendo que estamos entrando en una era de Desarrollo Guiado por la Experiencia y el Comportamiento, que se centra en mejorar la experiencia del usuario a través del comportamiento del software, en lugar del enfoque tradicional de desarrollo de software de alinear las especificaciones con la implementación.

El Desarrollo Impulsado por el Desarrollo y las Pruebas Impulsadas por la Refactorización son precisamente los enfoques que nos guiarán hacia estos nuevos horizontes en el desarrollo de software.