Apresentação

Bom dia! Meu nome é Leonardo Gomes, sou orientando do Paulo.

Hoje vou apresentar um artigo que o Paulo e Fabio me forneceram e que se chama “The Future of AI-Driven Software Engineering”, esse artigo foi escrito na universidade de Auckland, na Nova Zelandia.

Contexto

Antes de eu começar a falar realmente do futuro da engenharia de software dirigida por inteligencia artificial, eu gostaria de fazer um contexto super rápido de como ela vem se tornando parte essencial da nosso dia enquanto engenheiros e engenheiras de software.

Na decada de 40, os programadores ainda faziam seus códigos em binário, o que além de muito dificil, impossibilitava o avanço no desenvolvimento de sistemas mais complexas pela alta complexidade de resolver problemas simples. Então facilmente foi percebido que era necessario aumentar a compressão desses códigos para aumentar a gama de problemas que poderiam ser solucionados na área da computação.

Então na decada seguinte surgiu o Assembly, onde abstraia essas informações de 0101 e sintetizam em diretrizes e variaveis, possibilitando o aumento na produtividade, aumento na eficiencia de resolução de problemas e aumentando a gama de problemas, mais complexas, que poderia ser resolvidos.

Ainda mais para frente, com outros problemas surgindo, sistemas fazendo cada vez mais coisas, novas linguagens surgindo como C, C#… chegandos nas linguagens que vemos hoje com um alto nivel de abstração, que muitas das vezes é possível até ler, em linguagem humana, o que está escrito. Muito diferente do que vemos no assembly, ainda mais diferente do 01.

Mas não só foram as linguagens de programação que aumentou a nossa produtividade e nos ajudou a resolver problemas ainda mais complexos. No anos 2000, existem também protocolos que foram desenvolvidos ao decorrer dos anos que ajudaram e muito no compartilhamento de dados que vem hoje, aumentando ainda mais a facilidade de resolver novos problemas e também as bibliotecas, essas que sintetizam um código que pode ser uzado em diferentes contextos e é compartilhado para todos com o intuito de minimizar a necessidade de reescrever e repensar naquele problema.

Mas além das facilidades que foram surgindo, obviamente com a complexidade aumentando nos sistemas que estamos desenvolvendo, os bugs e problemas aumentavam também. Assim, houve a necessidade que também se compartilhasse entre a comunidade de desenvolvedores as formas de resolver um bug e problema, que talvez outros já tivessem passado. Então ai temos como exemplo o Stack Overflow, o Github e as comunidades que se formam.

E foi nesse contexto em que as LLMs e outras IAs surgiram, como facilitadoras para gerar código rapidamente, responder perguntas sobre bugs e além disso poder estruturar aquele código no contexto especifico que a programador queira.

Então aqui por exemplo eu peço para fazer um código de 0 a 10, mas no meu caso eu não quero com for, eu quero com while, então eu consigo pedir para a o chat me fornecer uma solução ainda mais especifica para o meu contexto… Isso possibilita o engenheiro de software avançar e focar em problemas ainda mais complexos do que ficar pensando como escrever um código de 0 a 10 por exemplo.

Mas assim como a engenharia de software não é apenas escrever código; temos documentação, teste, reisão de código, resolver bugs… A inteligencia artificial também se aproprio desses contextos. Então, vamos ver essa colaboração entre engenheiros e engenheiras de software está caminhando e como a IA está adentrando as outras áreas da engenharia de software.

Mais um pouquinho de IA

Por exemplo, além do Github Copilot a gente tem o Code Whisperer, também uma assistente de desenvolvimento, mas especializada no desenvolvimento de AWS Cloud. Além disso a gente te outras tecnologias que não são features como o Code Whisperer e o Copilot, mas são IDE que já tem IA integrada para dar suporte ao desenvolvimento, por exemplo o Windsurf by Codeium e o Cursor, que possui ferramentas para auxiliar na criação de testes e detectar bugs

Além dessas IA que são focadas no desenvolvimento, a gente tem também as IA’s que são focadas em outra parte da engenharia de software, como o GitPodcast, que basicamente faz um resumo em audio do seu repositório e explica do estilo de um podcast, para o que ele serve, quais tecnologias aquele repositório está usando. Além desse tem o GitDiagram, que faz um diagrama das relações entre algoritmos, funções e arquivos que existe dentro do seu repositório, o legal tbm é que esse diagrama é interativo, então facilitando e muito a vida da pessoa que está documentando ou um first touch para a pessoa que quer entender melhor a estrutura do repositório. Por fim temos essas duas IA, UitHub e LLMText que fazer a extração de todo o código em um formato que desejar e adiciona descrição para o bloco do código.

E obviamente a gente tem usado várias outras IA’s para documentar, para criar issues… histórias de usuário… várias outras coisas, então com esses exemplos fica claro que as LLMs tem ganhado uma grande participação na engenharia de software. E é a partir disso que vamos olhar agora para o futuro e ver que cada vez mais estamos caminhando para a evolução do desenvolvimento de software onde haverá um sistema autonomo multi-agente, onde as IA’s irão tomar decisões independentes do desenvolvimento de software e é nesse sentido que o autor propõe então um framework onde detalha a forma para onde estamos caminhando no desenvolvimento empoderado por IA e também os desafios que isso pode trazer.

AI-Driven Software Engineering

Então primeiramente, esse framework é visão geral de como eles visualização essa colaboração entre a engenharia de software e a IA, então aqui eles separam em 5/4 onde seria, engenharia de requisitos, desenho de software, desenvolvimento, teste e manutenção.

Requirements

Então vamos começar falando deles separadamente, a engenharia de requisitos é um dos momentos cruciais para o sucesso do projeto, aqui a gente traduz as necessidades e desejos dos stakeholders para o requisitos do desenvolvimento e exatamente esse entendimento das necessidades do stakeholder que pode ser desafiador, porque muitas das vezes eles não sabem o que eles exatamente querem ou precisam e na evolução do produto a expectativas podem ficar ainda mais complexas. Então o ponto aqui é gerar esses requisitos funcional ou não funcionais em especificações tecnicas pode ser bastante dificil.

E nesse sentido a IA, especificamente as LLM’s, pode fornecer suport para essas área, utilizando a ferramenta para analisar, organizar e resumir grande quantidade de dados, podem ser feito um estudo de mercado interessante e participar de uma fase preliminar da elicitação. E o autor traduziu esse suporte em 3 principais chaves, a elicitação, a validação e o refinamento.

Na parte de elicitação a IA poderia forcer uma forma mais engajada de coletar informações em entrevistas ou gerar questões mais claras para o tipo requisitos que deseja ser coletado ou quem sabe fornecer um exemplo em tempo de uma situação ou até mesmo um mock para exemplificar e confirmar as necessidades que a pessoa está descrevendo.. ainda na elicitação ela pode ser capaz de classificar as respostas em requisitos funcionais e não funcionais. E nesse sentido os engenheiros de software precisam validar o que a IA forneceu, mas além disso poder até então interpretar comunicação não verbal que possa tá escapando, como um gesto ou uma expressão facil que possa indicar algum coisa tanto no trabalho da IA, quanto na própria tarefa de elicitação de requisitos.

Já na validação a IA pode detectar informações inconsistentes, contradições nos requisitos ou alguma ambiguidade por exemplo, mas além disso ela pode a partir desses requisitos identificar inconsistência nos artefatos do software como na documentação, no código, informar sobre questões eticas nos requisitos e até prever os riscos em mudança de requisitos e como isso pode impactar direto o sistema.

No refinamento, é possivel que a IA possa detectar os principais pontos coletados, quem sabe até aplicar um MOSCOW com todas as informações sobre as necessidade e prioridades.

E tudo parece uma maravilha, mas isso não é capaz se a IA não entender as necessidades do usuário efetivamente, podem gerar mais trabalho para o engenheiro de software do que realmente facilitando.

Software Design

Indo para a segunda fase, a parte do desenho do software, é importante para transformar os requisitos em algo mais palpável para o software, podendo desenhar a arquitetura, banco de dados, enfim… esse trabalho acaba sendo bastante minucioso, com uma aplicação um pouco complexa, criando diagramas e graficos que podem ter alguns erros que de primeiro podem não surtir efeito na aplicação, mas a longo prazo sim.

A IA ela pode estar nesse processo, fazendo as primeiras versões dos diagramas, poder fazer diferentes artefatos para diferentes stakeholders, assim pode ser comparado as necessidades de um usuário para outro, pode comparar o que tem no código e se houver alguma mudança a IA perceber e mudar automaticamente o código ou a documentação, pode validar algo que muitas das vezes pode não ser implementável e por fim fornecer uma explicação do que ela tem criado, por exemplo a ferramenta do deep seek que mostra como ele chegou naquele pensamento.

Software Development and Testing

No desenvolvimento a gente já tem a participação bastante das IA’s como já mostrado para dar o suporte no desenvolvimento recomendando código