Fluxograma com várias formas e símbolos, incluindo um balão de diálogo azul, um ponto de interrogação e uma marca de seleção
Visão geral

A IA pode revolucionar o desenvolvimento de aplicações ao gerar, otimizar e traduzir código em todo o ciclo de vida do desenvolvimento de software. A adoção da IA generativa pode levar à criação de software consistente, à utilização ideal da criatividade dos desenvolvedores e habilidades aprimoradas dos desenvolvedores. Por exemplo:

  • Para desenvolvedores de Python e Java, a IA generativa pode aumentar seus recursos ao automatizar tarefas de baixo valor, como geração de código e busca de bugs. Ela também pode aprimorar a otimização de código, impor padrões de programação e auxiliar na seleção de APIs e bibliotecas, levando a aplicações mais eficientes e robustas.
  • Em linguagens tradicionais como o COBOL, a IA generativa pode dar nova vida a sistemas legados. Ao refatorar e otimizar o código COBOL existente, a IA generativa pode melhorar o desempenho e a capacidade de manutenção desses sistemas. Também pode ajudar na conversão do código COBOL para linguagens mais modernas, como Java, proporcionando uma ferramenta valiosa nos esforços de modernização do sistema.
  • Para Site Reliability Engineers (SREs) que trabalham com o Ansible, a IA generativa pode automatizar a criação de playbooks, otimizar scripts existentes ou até mesmo identificar possíveis erros. Essa automação pode reduzir significativamente o tempo gasto em tarefas rotineiras, permitindo que os SREs se concentrem em desafios mais complexos.
Por que usar a IA generativa no desenvolvimento de aplicações?

A aplicação da IA generativa ao desenvolvimento de aplicações tem grandes benefícios potenciais:

  • Consistência: ao aplicar a IA generativa para revisar e refatorar o código, os desenvolvedores podem manter padrões de programação consistentes, tornando o software mais fácil de avaliar e manter.
  • Otimização da criatividade: a IA generativa pode automatizar tarefas de baixo valor, liberando os desenvolvedores para se concentrarem em tarefas mais complexas, levando a ciclos de desenvolvimento mais curtos e mudanças mais frequentes.
  • Amplificação de habilidades: a IA generativa pode atuar como mentora para desenvolvedores juniores, permitindo que eles atuem em nível sênior ou até mesmo especialista.

A aplicação da IA generativa para avaliar, refatorar e aplicar padrões de programação empresariais aos resultados em software resulta em software mais consistente; por exemplo, abordagens comuns para resolver problemas recorrentes, estrutura de código comum, código autodocumentado, etc. independentemente de qual desenvolvedor escreveu o código. Isso, por sua vez, torna a aplicação resultante mais fácil de solucionar problemas e manter, pois há menos necessidade de os mantenedores entenderem primeiro a estrutura e as idiossincrasias de diferentes seções do código.

Assim como ocorre em outros domínios, a IA generativa tem o potencial de liberar os desenvolvedores de aplicações de tarefas de baixo valor, como escrever código simples/rotineiro ou identificar a origem de um bug problemático. Com mais tempo para se concentrar em tarefas de maior valor, os desenvolvedores podem implementar ciclos de desenvolvimento mais curtos, mais funcionalidades por versão de software e mudanças menores e mais frequentes.

Por fim, a aplicação da IA generativa ao desenvolvimento de aplicações pode ampliar as habilidades dos desenvolvedores, permitindo que desenvolvedores juniores atuem em nível sênior ou até mesmo especialista. Os desenvolvedores seniores podem incorporar o treinamento de modelos em seus ciclos de lançamento, incorporando as principais práticas à medida que o código é aprimorado. A IA generativa pode atuar como mentora especialista para a equipe júnior, liberando os desenvolvedores seniores para se concentrarem em outras tarefas e melhorando o nível de habilidade da equipe geral de desenvolvimento.

Casos de uso do desenvolvimento de aplicações

A IA generativa pode ser aplicada ao desenvolvimento de aplicações em diversos casos de uso amplos. Muitos modelos gerais, como o Llama 2, são treinados com código de aplicação escrito em várias linguagens de programação contemporâneas, e também há modelos ajustados para geração de código disponíveis.

Os casos de uso que vemos se beneficiando da IA generativa incluem:

  • Geração de código: a IA generativa pode gerar novo código a partir de prompts em linguagem natural.
  • Otimização e refatoração de código: a IA pode ser usada para otimizar e reestruturar o código, tornando-o mais eficiente e eliminando a duplicação.
  • Imposição de normas de programação: a IA pode impor normas e convenções de programação, que também podem ajudar a cumprir as normas regulatórias.
  • Conversão de código: a IA pode converter código de uma linguagem para outra.
  • Compreensão de código/documentação/busca de bugs: a IA pode interpretar código e gerar explicações de sua funcionalidade e também identificar erros.
  • Seleção de APIs e bibliotecas: a IA pode ajudar os desenvolvedores a escolher as APIs e as bibliotecas de software certas para suas aplicações.

Cada um desses casos de uso é descrito abaixo.

O recurso nativo de geração de texto dos grandes modelos de linguagem (LLMs) pode ser usado para gerar novos códigos a partir de prompts em linguagem natural. Por exemplo, um desenvolvedor pode enviar o prompt "Escreva uma SQL query para recuperar o nome e sobrenome de um cliente da tabela de clientes" e receber uma SQL query em troca.

O uso de LLMs para geração de código pode aumentar significativamente as habilidades de desenvolvimento de aplicações de desenvolvedores juniores ou até mesmo não desenvolvedores, mas pode rapidamente chegar a um ponto de retornos decrescentes à medida que as produções necessárias se tornam mais complexas ou conforme o nível de detalhamento exigido nos prompts se aproxima do código que será gerado.

 

A otimização e refatoração de código, o processo de melhorar o código para que tenha melhor desempenho e seja mais bem estruturado, podem ser consideradas como uma combinação de dois recursos dos LLMs: geração de texto e sumarização de texto. Usando um LLM geral ou ajustado, um desenvolvedor pode solicitar a otimização ou reestruturação de um trecho de código para torná-lo mais eficiente e/ou eliminar código duplicado.

Os LLMs funcionam bem para otimizar e refatorar partes menores de código que se encaixam na janela de contexto dos modelos, mas exigem soluções maiores que mantenham metadados sobre toda a aplicação de software para alcançar resultados aceitáveis em partes maiores de código e/ou sistemas de software completos.

Semelhante à otimização de código, os LLMs podem ser usados para aplicar e impor normas de programação empresarial em relação a tópicos como nomenclatura de funções e variáveis, estrutura de código e convenções de programação empresarial. Normalmente aplicados no nível do repositório como parte do processo de avaliações e confirmação de código, os LLMs ajustados nas normas de programação da empresa podem traduzir o código enviado para cumprir as normas da empresa. Essas normas também podem incluir o fortalecimento das convenções que ajudam a empresa a cumprir as normas regulatórias.

Como as linguagens de programação são como qualquer outra linguagem, a capacidade de tradução de texto nativa dos LLMs pode traduzir software escrito em uma linguagem de programação para outra, como por exemplo, converter C# em Java.

Assim como a otimização de código, os LLMs sozinhos funcionam bem para converter pequenos trechos de código que se encaixam na janela de contexto do modelo, mas são necessárias soluções maiores que mantenham metadados e outras informações contextuais importantes para converter trechos maiores de código ou sistemas de software completos.

Por meio de recursos de conversão de código, a IA generativa também pode facilitar a tradução de código entre diferentes linguagens de programação, como a tradução de código COBOL para Java. Isso pode ser particularmente útil em ambientes multilíngues ou durante migrações de sistema, economizando aos desenvolvedores o tempo e o esforço de reescrever manualmente o código.

A compreensão de código é análoga à geração de código. Em vez de converter prompts em linguagem natural em código, a explicação do código toma um pedaço de código como entrada e gera uma explicação em linguagem natural sobre a funcionalidade do código. Por exemplo, um prompt como "Explique a função dessa parte do código python" seguido de uma seção de python pode gerar um resumo linha por linha e geral da finalidade do código.

Esse recurso também pode ser usado para detectar erros no código, também conhecidos como busca de bugs, levando o modelo a "identificar por que esse trecho de código está falhando".

A seleção de APIs e bibliotecas é a aplicação da geração aumentada de recuperação (RAG) ao gerenciamento empresarial de APIs e bibliotecas de software. Um desenvolvedor que procura uma API para usar com uma aplicação pode compor um prompt da RAG que consulta um banco de dados corporativo de nomes de APIs, descrições, endpoints etc., para responder a perguntas como: "Temos uma API que faz xyz?" Se as descrições de APIs e da biblioteca de código forem mantidas com alta qualidade e palavras-chave, essa aplicação pode ser ajustada para fornecer respostas consistentes que aceleram o desenvolvimento de aplicações, bem como a integração do desenvolvedor.

Decisões e considerações sobre arquitetura

Os arquitetos devem tomar uma série de decisões significativas de arquitetura ao projetar soluções de desenvolvimento de aplicações usando LLMs.

O modelo oferece indenização/proteção de direitos autorais, e como você pode identificar se o código gerado está sobrecarregado por termos de licença? Mesmo os modelos treinados em licenças permissivas podem ser sobrecarregados por cláusulas de licenciamento, como a concessão de crédito ao detentor dos direitos autorais original.

Os arquitetos que criam soluções destinadas a impor e aplicar normas de programação empresarial devem considerar o esforço necessário para ajuste um LLM para "entender" as normas empresariais; e tomar uma decisão informada sobre se outros métodos, como ferramentas de linting, são mais bem equipados para alcançar recursos semelhantes.

A assistência de código de estilo de preenchimento automático deve responder rapidamente para não interferir no treinamento do pensamento de um desenvolvedor. Os arquitetos devem considerar o posicionamento e a conectividade dos modelos de assistência ao desenvolvedor para garantir que os suportes ao desenvolvedor sejam benéficos, não intrusivos.

Grandes modelos de linguagem não têm garantia de produzir código funcionalmente correto, especialmente se o código gerado ou revisado precisar se encaixar em um sistema de software maior. Embora não haja uma solução direta para esse problema (e esteja se tornando menos uma à medida que os LLMs evoluem), os arquitetos precisam estar cientes de que o código gerado pelo LLM precisa ser submetido à mesma garantia de qualidade e controles de segurança que o código produzido por desenvolvedores humanos.

Geralmente, os LLMs disponíveis são treinados em um pequeno número de linguagens de programação contemporâneas, como Python, Javascript, C# e outras. Os arquitetos de soluções que precisam oferecer compatibilidade com linguagens mais antigas ou de nicho podem acabar tendo poucas opções de modelos disponíveis ou podem ser obrigados a ajustar agressivamente um modelo geral para atender a suas necessidades específicas.

Próximas etapas

Fale com nossos especialistas sobre como implementar um padrão de implementação de nuvem híbrida.

Colaboradores

Pete Nuwayser, Chris Kirby, Mihai Criveti

Data de atualização: 30 de novembro de 2023