El desarrollo es la creación iterativa de algo nuevo y útil.
Cuando pensamos en desarrollo, a menudo nos viene a la mente el desarrollo de nuevos productos. Esto difiere de la fabricación, que produce productos individuales; en cambio, implica crear las especificaciones de diseño o los moldes para los productos.
Así, los planos o moldes creados a través del desarrollo de nuevos productos se utilizan repetidamente en las fábricas para fabricar numerosos productos idénticos.
También hay usos como el desarrollo de habilidades individuales o el desarrollo de la sociedad y las naciones. Estos implican no solo un aumento de lo que se posee, sino 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 debido a las condiciones económicas, las capacidades desarrolladas son fundamentalmente permanentes.
Incluso si disminuyen, se considera un declive más que las fluctuaciones al alza y a la baja de la prosperidad económica.
Más allá de estos, también existe el desarrollo de la tecnología y el conocimiento. A diferencia de las capacidades de los individuos o sociedades específicas, estos tienen la característica de ser fácilmente compartibles.
Y entre los productos, capacidades, conocimientos y tecnologías que son los resultados de estos desarrollos, algunos pueden contribuir al desarrollo posterior.
Al desarrollar tales resultados útiles, el alcance del desarrollo se amplía y la eficiencia y la calidad mejoran.
Desarrollo de software impulsado por IA
En general, el desarrollo ha requerido una cantidad significativa de tiempo y esfuerzo. Especialmente a medida que la sociedad avanza y diversas cosas se vuelven más sofisticadas, crear cosas nuevas se vuelve aún 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 cambios drásticos gracias a las altas capacidades de programación de la IA generativa.
En este panorama, una visión de futuro en la que los agentes autónomos basados en IA generativa se conviertan en el centro del desarrollo de software como ingenieros de software ya se está haciendo realidad.
Actualmente nos encontramos en una fase de transición. Si bien no podemos confiar plenamente el desarrollo a la IA generativa, utilizarla hábilmente puede impulsar poderosamente el desarrollo de software.
Esto se conoce como desarrollo de software impulsado por IA.
Desarrollo Evolutivo
Cuando la IA generativa hace que el desarrollo de software sea más eficiente, puede agilizar no solo 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 su alcance y ayudan a mejorar la eficiencia y la calidad. Además, si se crean de manera efectiva, pueden reutilizarse en otros proyectos de desarrollo.
Por lo tanto, al desarrollar software que ayuda en el desarrollo durante el proceso de creación de software, se puede aumentar la eficiencia general, y estos activos se pueden aprovechar para futuros desarrollos.
Convencionalmente, desarrollar este tipo de software auxiliar era una práctica común, pero requería su propio tiempo y esfuerzo de desarrollo, lo que exigía una cuidadosa consideración y una ejecución enfocada.
Al utilizar la IA generativa, se puede crear rápidamente un software sencillo para automatizar tareas menores que surjan. Si la tarea implica un procesamiento claro, la IA generativa puede generar el programa con precisión y casi sin errores.
En consecuencia, desarrollar software para ayudar en el desarrollo durante el proceso de creación de software se ha vuelto más fácil que antes.
Y, al reflexionar profundamente sobre esto, surge un estilo de desarrollo en el que se crean continuamente herramientas útiles para el desarrollo durante el proceso, transformando así la metodología de desarrollo en sí misma.
A esto lo llamaremos "desarrollo evolutivo".
Para practicar el desarrollo evolutivo, se necesita el hábito de observar objetivamente el propio desarrollo de software, considerando qué partes pueden ser manejadas por software y qué partes solo por humanos, junto con la habilidad para desarrollar dicho software auxiliar.
Además, la IA generativa puede incorporarse a estas herramientas de software. Al incrustarla dentro del software, a diferencia de los agentes de IA generativa, el alcance del procesamiento puede reducirse hasta cierto punto y se pueden definir rutas.
Si bien los agentes de IA pueden lograr resultados similares a través de prompts, el software con IA generativa incrustada puede aumentar la precisión más fácilmente combinando tanto programas como prompts.
Si se puede practicar este desarrollo evolutivo, el segundo proyecto mostrará mejoras tanto en calidad como en costo 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 usar la IA generativa para desarrollar software. 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 evolutivo.
Pruebas Impulsadas por Refactorización
Existe un concepto llamado Desarrollo Orientado a Pruebas (TDD), donde los tests se diseñan primero basándose en las especificaciones, y luego se desarrolla el software para que los pase.
Inicialmente, también pensé que al aprovechar la IA generativa, sería fácil desarrollar programas de prueba para la automatización, haciendo factible el TDD.
Sin embargo, a medida que empecé a practicar el desarrollo evolutivo, llegué a creer que pensar en las pruebas antes de implementarlas no siempre es el enfoque más adecuado.
Especialmente para software como las aplicaciones web que involucran aspectos subjetivos como la usabilidad y el diseño visual, con los que uno interactúa directamente, me di cuenta de que ejecutar e interactuar realmente con el software tiene prioridad sobre las pruebas detalladas.
Esto se debe a que si hay una insatisfacción significativa a nivel de UI/UX después de interactuar con el software, existe la posibilidad de querer cambiar partes fundamentales como el framework, la arquitectura básica, el modelo de datos o los casos de uso.
En mi proyecto personal actual de desarrollo de software, noté problemas con la flexibilidad de las características y el rendimiento, y terminé cambiando dos frameworks por otros diferentes.
También tuve que revisar completamente el procesamiento en algunas áreas debido a un uso ineficiente de la memoria.
Es en estos momentos de refactorización cuando las pruebas se convierten por primera vez en una consideración consciente.
Si esto se encuentra en una etapa temprana de desarrollo, o si las funciones y especificaciones van a cambiar significativamente de todos modos, las pruebas podrían ser innecesarias.
Sin embargo, si el desarrollo ya está bastante avanzado y hay muchos elementos que verificar, las pruebas serán necesarias para confirmar que la refactorización no ha introducido defectos funcionales u omisiones.
Por lo tanto, el enfoque de crear programas de prueba cuando el desarrollo ha progresado hasta cierto punto y la refactorización se vuelve necesaria no es una mala idea.
En este punto, la clave no es crear pruebas para todo el código, sino centrarse en probar las partes maduras que es poco probable que cambien mucho en el futuro, dejando las partes fluidas sin pruebas automatizadas.
Esto se puede llamar Pruebas Impulsadas por Refactorización.
Conclusión
La IA generativa está transformando drásticamente el desarrollo de software.
En un artículo anterior, escribí sobre la importancia de aspirar a ser un "Ingeniero Omnidireccional", capaz de desarrollar sistemas que combinen diversos dominios, infraestructuras y entornos de ejecución, yendo más allá del ingeniero full-stack tradicional.
También escribí un artículo sugiriendo que estamos entrando en una era de "Desarrollo Centrado en la Experiencia y el Comportamiento", donde el enfoque no está en alinear las especificaciones con la implementación, sino en mejorar la experiencia del usuario a través del comportamiento del software.
El desarrollo evolutivo y las pruebas impulsadas por refactorización son precisamente lo que nos lleva a estos nuevos horizontes en el desarrollo de software.