Desenvolvimento consiste em criar repetidamente algo novo e útil.
Quando ouvimos a palavra "desenvolvimento", o desenvolvimento de novos produtos vem frequentemente à mente. Isto difere da fabricação de produtos individuais; implica criar os modelos ou moldes do produto, por assim dizer.
Portanto, os designs e moldes criados através do desenvolvimento de novos produtos são repetidamente utilizados em fábricas para produzir em massa produtos idênticos.
Existem também utilizações da palavra "desenvolvimento", como o desenvolvimento de capacidades individuais, ou o desenvolvimento da sociedade e de uma nação. Estas implicam não apenas um aumento do que é possuído, mas sim a capacidade de utilizar e beneficiar repetidamente das capacidades desenvolvidas.
Embora o poder económico de indivíduos e sociedades possa flutuar com as condições económicas, as capacidades desenvolvidas são geralmente permanentes.
Mesmo que diminuam, é visto como um declínio, não como uma flutuação como a prosperidade económica.
Além disso, existe o desenvolvimento de tecnologia e conhecimento. Ao contrário das capacidades de indivíduos ou sociedades específicas, estes têm a característica de serem facilmente partilhados.
E entre os resultados desses desenvolvimentos — produtos, capacidades, conhecimento e tecnologias — alguns podem ser úteis para desenvolvimentos subsequentes.
Ao desenvolver tais resultados úteis, o âmbito do desenvolvimento expande-se, e a eficiência e a qualidade também melhoram.
Desenvolvimento de Software Orientado por IA
Geralmente, o desenvolvimento exigia tempo e esforço consideráveis. Especialmente à medida que a sociedade avança e várias coisas se tornam mais sofisticadas, criar coisas novas torna-se cada vez mais difícil.
No entanto, com o advento da IA generativa, esta situação está a mudar. Atualmente, o desenvolvimento de software está a passar por uma transformação dramática, beneficiando das elevadas capacidades de programação da IA generativa.
Uma visão futura em que agentes autónomos baseados em IA generativa se tornam centrais para o desenvolvimento de software como engenheiros de software já se está a tornar uma realidade.
Estamos atualmente num período de transição. Embora não possamos confiar totalmente o desenvolvimento à IA generativa, a utilização hábil da IA generativa pode impulsionar poderosamente o desenvolvimento de software.
Isto é referido como Desenvolvimento de Software Orientado por IA.
Desenvolvimento Orientado a Desenvolvimento
Quando a IA generativa otimiza o desenvolvimento de software, pode não só tornar o desenvolvimento do software final mais eficiente, mas também o desenvolvimento de software que auxilia o próprio desenvolvimento.
Como mencionado anteriormente, os resultados que auxiliam o desenvolvimento expandem o âmbito do desenvolvimento e contribuem para o aumento da eficiência e da qualidade. Além disso, se criados eficazmente, podem ser reutilizados em outros projetos de desenvolvimento.
Portanto, ao desenvolver software útil durante o curso do desenvolvimento de software, a eficiência geral pode ser, em última análise, aumentada, e esses ativos podem ser aproveitados para futuros desenvolvimentos também.
Tradicionalmente, desenvolver tal software de apoio ao desenvolvimento era uma prática comum no campo, mas exigia o seu próprio tempo e esforço de desenvolvimento, necessitando de uma avaliação cuidadosa e de uma implementação direcionada.
Ao utilizar a IA generativa, software simples para automatizar pequenas tarefas improvisadas pode ser criado rapidamente. Para tarefas com processos claros, a IA generativa pode gerar programas precisos com quase nenhuns erros.
Isto torna mais fácil do que nunca desenvolver software que auxilia o desenvolvimento durante o desenvolvimento de software.
E, após uma reflexão mais profunda, surge um estilo de desenvolvimento onde ferramentas úteis são continuamente desenvolvidas durante o processo de desenvolvimento, transformando assim o próprio método de desenvolvimento.
Chamaremos a isto Desenvolvimento Orientado a Desenvolvimento.
Para praticar o Desenvolvimento Orientado a Desenvolvimento, é necessário o hábito de observar objetivamente o próprio desenvolvimento de software para considerar quais as partes que podem ser delegadas ao software e quais as partes que só os humanos podem fazer, juntamente com a habilidade de desenvolver tal software de apoio ao desenvolvimento.
Além disso, a IA generativa pode ser integrada nessas ferramentas de software. Ao incorporá-la no software, ao contrário de um agente de IA generativa autónomo, o âmbito de processamento pode ser reduzido e um caminho claro definido até certo ponto.
Embora os agentes de IA possam alcançar resultados semelhantes através de prompts, o software que integra a IA generativa pode aumentar mais facilmente a precisão combinando programas e prompts.
Se o Desenvolvimento Orientado a Desenvolvimento puder ser praticado, o segundo projeto verá melhorias tanto na qualidade quanto no custo em comparação com o primeiro. Além disso, a cada projeto subsequente — o terceiro, quarto e assim por diante — as melhorias continuarão a acumular-se.
Isto é inteiramente diferente de simplesmente desenvolver software usando IA generativa. Uma lacuna significativa surgirá ao longo do tempo entre equipas que simplesmente dominam ferramentas de IA generativa e equipas que praticam o Desenvolvimento Orientado a Desenvolvimento.
Testes Orientados a Refatorização
Existe um conceito chamado Desenvolvimento Orientado por Testes (TDD), que envolve primeiro desenhar testes com base nas especificações e depois desenvolver o software para que passe nesses testes.
Inicialmente, também pensei que com a IA generativa a facilitar o desenvolvimento de programas de teste para testes automatizados, o Desenvolvimento Orientado por Testes poderia ser praticável.
No entanto, à medida que comecei a praticar o Desenvolvimento Orientado a Desenvolvimento, passei a acreditar que a abordagem de desenhar testes antes da implementação nem sempre era adequada.
Especialmente para software como aplicações web, que envolvem aspetos subjetivos como a usabilidade e o design visual, que se podem experimentar ao interagir, percebi que a execução e a interação com o software têm precedência sobre os testes detalhados.
Isto porque, se houver insatisfações significativas ao nível da UI/UX após a interação, existe a possibilidade de que partes fundamentais, como o framework, a arquitetura básica, o modelo de dados ou os casos de uso, possam precisar de ser alteradas.
No meu atual projeto pessoal de desenvolvimento de software, também notei problemas com a flexibilidade funcional e o desempenho, o que me levou a trocar dois frameworks por outros diferentes.
Havia também uma parte com baixa eficiência de uso de memória, que exigiu uma revisão completa do processamento.
É nestes momentos de refatorização que os testes se tornam uma consideração consciente pela primeira vez.
Se isso ocorrer durante as fases iniciais do desenvolvimento, ou se as funcionalidades e especificações forem mudar significativamente de qualquer forma, os testes podem não ser necessários.
Contudo, se o desenvolvimento já estiver bem avançado e houver muitos itens a verificar, os testes provavelmente serão necessários durante a refatorização para garantir que não existem deficiências ou omissões funcionais.
Portanto, a ideia de criar programas de teste no momento em que o desenvolvimento progrediu até certo ponto e a refatorização se torna necessária não é má.
Neste ponto, a chave não é criar testes para todo o código, mas sim focar os testes em partes maduras que são improváveis de mudar muito no futuro, deixando as partes ainda fluídas sem testes automatizados.
Isto pode ser chamado de Testes Orientados a Refatorização.
Conclusão
A IA generativa está a transformar dramaticamente o desenvolvimento de software.
Em artigos anteriores, escrevi sobre a importância de visar tornar-se um Engenheiro Omnidirecional, que pode ir além do papel tradicional de engenheiro full-stack para desenvolver sistemas omnidirecionais que combinam vários domínios, infraestruturas e ambientes de execução.
Também escrevi um artigo sugerindo que estamos a entrar numa era de Desenvolvimento Orientado por Experiência e Comportamento, que se foca em melhorar a experiência do utilizador através do comportamento do software, em vez da abordagem tradicional de desenvolvimento de software de alinhar especificações com a implementação.
O Desenvolvimento Orientado a Desenvolvimento e os Testes Orientados a Refatorização são precisamente as abordagens que nos levarão a estes novos horizontes no desenvolvimento de software.