Desenvolvimento é a criação iterativa de algo novo e útil.
Quando pensamos em desenvolvimento, o desenvolvimento de novos produtos muitas vezes vem à mente. Isso difere da manufatura, que produz produtos individuais; em vez disso, envolve a criação de especificações de design ou moldes para produtos.
Assim, os projetos ou moldes criados através do desenvolvimento de novos produtos são usados repetidamente em fábricas para fabricar numerosos produtos idênticos.
Existem também usos como o desenvolvimento de habilidades individuais ou o desenvolvimento da sociedade e das nações. Estes implicam não meramente um aumento no que se possui, mas a capacidade de usar repetidamente e beneficiar das capacidades desenvolvidas.
Embora o poder económico de indivíduos e sociedades possa flutuar devido às condições económicas, as capacidades desenvolvidas são fundamentalmente permanentes.
Mesmo que diminuam, é considerado declínio em vez das flutuações de altos e baixos da prosperidade económica.
Além destes, há também 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 partilháveis.
E entre os produtos, capacidades, conhecimento e tecnologias que são os resultados desses desenvolvimentos, alguns podem contribuir para o desenvolvimento subsequente.
Ao desenvolver tais resultados úteis, o âmbito do desenvolvimento alarga-se, e a eficiência e a qualidade melhoram.
Desenvolvimento de Software Orientado por IA
Geralmente, o desenvolvimento tem exigido tempo e esforço significativos. Especialmente à medida que a sociedade avança e várias coisas se tornam mais sofisticadas, criar coisas novas torna-se ainda 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 mudanças dramáticas graças às altas capacidades de programação da IA generativa.
Neste cenário, uma visão futura onde agentes autónomos baseados em IA generativa se tornam centrais no desenvolvimento de software como engenheiros de software já está a tornar-se uma realidade.
Estamos atualmente numa fase de transição. Embora não possamos confiar totalmente o desenvolvimento à IA generativa, utilizar habilmente a IA generativa pode impulsionar poderosamente o desenvolvimento de software.
Isto é referido como desenvolvimento de software orientado por IA.
Desenvolvimento Desenvolvimental
Quando a IA generativa torna o desenvolvimento de software mais eficiente, ela pode otimizar não apenas o desenvolvimento do software alvo final, mas também o desenvolvimento de software que auxilia no próprio desenvolvimento.
Conforme mencionado anteriormente, os resultados que facilitam o desenvolvimento ampliam seu escopo e ajudam a melhorar a eficiência e a qualidade. Além disso, se criados de forma eficaz, podem ser reutilizados em outros projetos de desenvolvimento.
Portanto, ao desenvolver software que auxilia no desenvolvimento durante o processo de desenvolvimento de software, a eficiência geral pode ser aumentada, e esses ativos podem ser aproveitados para desenvolvimentos futuros.
Convencionalmente, desenvolver tal software auxiliar era uma prática comum, mas exigia seu próprio tempo e esforço de desenvolvimento, necessitando de consideração cuidadosa e execução focada.
Ao utilizar a IA generativa, pode-se criar rapidamente software simples para automatizar pequenas tarefas que surgem na mente. Se a tarefa envolver processamento claro, a IA generativa pode gerar o programa com precisão, quase sem erros.
Consequentemente, desenvolver software para auxiliar no desenvolvimento durante o processo de desenvolvimento de software tornou-se mais fácil do que antes.
E, ao pensar profundamente sobre isso, surge um estilo de desenvolvimento onde ferramentas úteis para o desenvolvimento são continuamente criadas durante o processo, transformando assim a própria metodologia de desenvolvimento.
A isso chamaremos "desenvolvimento desenvolvimental".
Para praticar o desenvolvimento desenvolvimental, é necessário o hábito de observar objetivamente o próprio desenvolvimento de software, considerando quais partes podem ser tratadas por software e quais partes apenas por humanos, juntamente com a habilidade de desenvolver tal software auxiliar.
Além disso, a IA generativa pode ser incorporada a essas ferramentas de software. Ao incorporá-la dentro do software, ao contrário dos agentes de IA generativa, o escopo de processamento pode ser reduzido até certo ponto, e os caminhos podem ser definidos.
Enquanto os agentes de IA podem alcançar resultados semelhantes através de prompts, o software com IA generativa incorporada pode aumentar a precisão mais facilmente combinando programas e prompts.
Se tal desenvolvimento desenvolvimental puder ser praticado, o segundo projeto mostrará 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 usar a IA generativa para desenvolver software. Uma lacuna significativa surgirá ao longo do tempo entre as equipas que simplesmente dominam as ferramentas de IA generativa e as equipas que praticam o desenvolvimento desenvolvimental.
Testes Orientados a Refatoração
Existe um conceito chamado Desenvolvimento Orientado a Testes (TDD), onde os testes são projetados primeiro com base nas especificações, e então o software é desenvolvido para passar nesses testes.
Inicialmente, também pensei que, ao aproveitar a IA generativa, seria fácil desenvolver programas de teste para automação, tornando o TDD viável.
No entanto, à medida que comecei a praticar o desenvolvimento desenvolvimental, passei a acreditar que pensar nos testes antes de implementá-los nem sempre é a abordagem mais adequada.
Especialmente para software como aplicações web que envolvem aspetos subjetivos, como usabilidade e design visual, com os quais se interage diretamente, percebi que executar e interagir com o software na prática tem precedência sobre testes detalhados.
Isso ocorre porque, se houver uma insatisfação significativa no nível da UI/UX após a interação, há a possibilidade de querer mudar partes fundamentais como o framework, a arquitetura básica, o modelo de dados ou os casos de uso.
No meu projeto pessoal atual de desenvolvimento de software, notei problemas com a flexibilidade e o desempenho dos recursos e acabei trocando dois frameworks por outros diferentes.
Também tive que rever completamente o processamento em algumas áreas devido ao uso ineficiente de memória.
É nesses momentos de refatoração que o teste se torna uma consideração consciente pela primeira vez.
Se isso estiver numa fase inicial de desenvolvimento, ou se as funções e especificações forem mudar significativamente de qualquer forma, os testes podem ser desnecessários.
No entanto, se o desenvolvimento já estiver bastante avançado e houver muitos itens para verificar, os testes serão necessários para confirmar que a refatoração não introduziu defeitos funcionais ou omissões.
Portanto, a abordagem de criar programas de teste quando o desenvolvimento progrediu até certo ponto e a refatoração se torna necessária não é uma má ideia.
Neste ponto, a chave não é criar testes para todo o código, mas focar-se em testar partes maduras que são improváveis de mudar muito no futuro, enquanto as partes fluídas são deixadas sem testes automáticos.
Isso pode ser chamado de Testes Orientados a Refatoração.
Conclusão
A IA generativa está a transformar dramaticamente o desenvolvimento de software.
Num artigo anterior, escrevi sobre a importância de almejar ser um "Engenheiro Omni-direcional", capaz de desenvolver sistemas que combinam vários domínios, infraestruturas e ambientes de execução, indo além do tradicional engenheiro full-stack.
Também escrevi um artigo sugerindo que estamos a entrar numa era de "Desenvolvimento Centrado na Experiência e Comportamento", onde o foco não está em alinhar as especificações com a implementação, mas em melhorar a experiência do utilizador através do comportamento do software.
O desenvolvimento desenvolvimental e os testes orientados a refatoração são precisamente o que conduz a estes novos horizontes no desenvolvimento de software.