Le développement est la création itérative de quelque chose de nouveau et d'utile.
Lorsque nous pensons au développement, le développement de nouveaux produits vient souvent à l'esprit. Cela diffère de la fabrication, qui produit des articles individuels ; il s'agit plutôt de créer les spécifications de conception ou les moules pour les produits.
Ainsi, les plans ou les moules créés grâce au développement de nouveaux produits sont utilisés à plusieurs reprises dans les usines pour fabriquer de nombreux produits identiques.
Il existe également des usages tels que le développement des capacités individuelles ou le développement de la société et des nations. Ceux-ci impliquent non seulement une augmentation de ce que l'on possède, mais aussi la capacité d'utiliser et de bénéficier à plusieurs reprises des capacités développées.
Bien que le pouvoir économique des individus et des sociétés puisse fluctuer en fonction des conditions économiques, les capacités développées sont fondamentalement permanentes.
Même si elles diminuent, cela est considéré comme un déclin plutôt que comme les fluctuations ascendantes et descendantes de la prospérité économique.
Au-delà de cela, il y a aussi le développement de la technologie et des connaissances. Contrairement aux capacités des individus ou de sociétés spécifiques, celles-ci ont la caractéristique d'être facilement partageables.
Et parmi les produits, les capacités, les connaissances et les technologies qui sont les résultats de ces développements, certains peuvent contribuer au développement ultérieur.
En développant de tels résultats utiles, le champ du développement s'élargit, et l'efficacité et la qualité s'améliorent.
Développement logiciel axé sur l'IA
Généralement, le développement a nécessité un temps et des efforts considérables. D'autant plus que la société progresse et que divers éléments deviennent plus sophistiqués, la création de nouvelles choses devient encore plus difficile.
Cependant, avec l'avènement de l'IA générative, cette situation est en train de changer. Actuellement, le développement logiciel connaît des transformations spectaculaires grâce aux capacités de programmation élevées de l'IA générative.
Dans ce paysage, une vision future où des agents autonomes basés sur l'IA générative deviendront centraux dans le développement logiciel en tant qu'ingénieurs logiciels est déjà en train de devenir une réalité.
Nous sommes actuellement dans une phase de transition. Bien que nous ne puissions pas confier entièrement le développement à l'IA générative, l'utilisation habile de celle-ci peut puissamment faire avancer le développement logiciel.
Ceci est appelé développement logiciel axé sur l'IA.
Développement itératif
Lorsque l'IA générative rend le développement logiciel plus efficace, elle peut simplifier non seulement le développement du logiciel cible final, mais aussi le développement de logiciels qui facilitent le développement lui-même.
Comme mentionné précédemment, les productions qui facilitent le développement élargissent sa portée et contribuent à améliorer l'efficacité et la qualité. De plus, si elles sont créées efficacement, elles peuvent être réutilisées dans d'autres projets de développement.
Par conséquent, en développant des logiciels qui facilitent le développement pendant le processus de développement logiciel, l'efficacité globale peut être augmentée, et ces actifs peuvent être exploités pour de futurs développements.
Traditionnellement, le développement de tels logiciels auxiliaires était une pratique courante, mais cela nécessitait son propre temps et effort de développement, exigeant une considération attentive et une exécution ciblée.
En utilisant l'IA générative, on peut rapidement créer des logiciels simples pour automatiser les tâches mineures qui viennent à l'esprit. Si la tâche implique un traitement clair, l'IA générative peut générer le programme avec précision et presque sans erreurs.
Par conséquent, développer des logiciels pour aider au développement pendant le processus de développement logiciel est devenu plus facile qu'auparavant.
Et, en y réfléchissant profondément, un style de développement émerge où des outils utiles pour le développement sont continuellement créés pendant le processus, transformant ainsi la méthodologie de développement elle-même.
Nous appellerons cela le "développement itératif".
Pour pratiquer le développement itératif, il faut prendre l'habitude d'observer objectivement son propre développement logiciel, en considérant quelles parties peuvent être gérées par un logiciel et quelles parties uniquement par des humains, ainsi que la compétence pour développer de tels logiciels auxiliaires.
De plus, l'IA générative peut être incorporée dans ces outils logiciels. En l'intégrant dans le logiciel, contrairement aux agents d'IA générative, la portée du traitement peut être quelque peu limitée, et des chemins peuvent être définis.
Bien que les agents d'IA puissent obtenir des résultats similaires via des prompts, un logiciel avec une IA générative intégrée peut plus facilement augmenter la précision en combinant à la fois des programmes et des prompts.
Si un tel développement itératif peut être pratiqué, le deuxième projet montrera des améliorations tant en qualité qu'en coût par rapport au premier. De plus, avec chaque projet subséquent — le troisième, le quatrième, et ainsi de suite — les améliorations continueront à s'accumuler.
Ceci est entièrement différent de la simple utilisation de l'IA générative pour développer des logiciels. Un écart significatif émergera avec le temps entre les équipes qui maîtrisent simplement les outils d'IA générative et les équipes qui pratiquent le développement itératif.
Tests axés sur le refactoring
Il existe un concept appelé Développement Piloté par les Tests (TDD), où les tests sont conçus d'abord sur la base des spécifications, puis le logiciel est développé pour réussir ces tests.
Initialement, je pensais aussi qu'en exploitant l'IA générative, il serait facile de développer des programmes de test pour l'automatisation, rendant le TDD faisable.
Cependant, en commençant à pratiquer le développement itératif, j'en suis venu à croire que penser aux tests avant de les implémenter n'est pas toujours l'approche la plus appropriée.
En particulier pour des logiciels comme les applications web qui impliquent des aspects subjectifs tels que l'ergonomie et le design visuel, avec lesquels on interagit directement, j'ai réalisé que l'exécution et l'interaction réelles avec le logiciel priment sur des tests détaillés.
Cela s'explique par le fait qu'en cas d'insatisfaction significative au niveau de l'UI/UX après interaction, il est possible de vouloir modifier des parties fondamentales comme le framework, l'architecture de base, le modèle de données ou les cas d'utilisation.
Dans mon projet actuel de développement logiciel personnel, j'ai remarqué des problèmes de flexibilité des fonctionnalités et de performance, et j'ai fini par remplacer deux frameworks par d'autres.
J'ai également dû revoir complètement le traitement dans certaines zones en raison d'une utilisation inefficace de la mémoire.
C'est à ces moments de refactoring que la considération des tests devient une préoccupation consciente.
Si cela se situe à un stade précoce du développement, ou si les fonctions et les spécifications sont de toute façon amenées à changer significativement, les tests pourraient être inutiles.
Cependant, si le développement est déjà bien avancé et qu'il y a de nombreux éléments à vérifier, des tests seront nécessaires pour confirmer que le refactoring n'a pas introduit de défauts fonctionnels ou d'omissions.
Par conséquent, l'approche consistant à créer des programmes de test lorsque le développement a progressé jusqu'à un certain point et qu'un refactoring devient nécessaire n'est pas une mauvaise idée.
À ce stade, l'essentiel n'est pas de créer des tests pour tout le code, mais de se concentrer sur les parties matures qui sont peu susceptibles de beaucoup changer à l'avenir, tout en laissant les parties fluides sans tests automatisés.
Cela peut être appelé les Tests axés sur le Refactoring.
Conclusion
L'IA générative transforme radicalement le développement logiciel.
Dans un article précédent, j'ai souligné l'importance de viser à devenir un "ingénieur omnidirectionnel", capable de développer des systèmes combinant divers domaines, infrastructures et environnements d'exécution, allant au-delà de l'ingénieur full-stack traditionnel.
J'ai également rédigé un article suggérant que nous entrons dans une ère de "développement axé sur l'expérience et le comportement", où l'accent n'est pas mis sur l'alignement des spécifications avec l'implémentation, mais sur l'amélioration de l'expérience utilisateur à travers le comportement du logiciel.
Le développement itératif et les tests basés sur le refactoring sont précisément ce qui mène à ces nouveaux horizons dans le développement logiciel.