Techniques
Adopt
-
1. 1% canary
For many years, we've used the canary release approach to encourage early feedback on new software versions, while reducing risk through incremental rollout to selected users. The 1% canary is a useful technique where we roll out new features to a very small segment (say 1%) of users carefully chosen across various user categories. This enables teams to capture fast user feedback, observe the impact of new releases on performance and stability and respond as necessary. This technique becomes especially crucial when teams are rolling out software updates to mobile applications or a fleet of devices like edge computing devices or software-defined vehicles. With proper observability and early feedback, it gives the opportunity to contain the blast radius in the event of unexpected scenarios in production. While canary releases can be useful to get faster user feedback, we believe starting with a small percentage of users is mandatory to reduce and contain the risk of large-scale feature rollouts.
-
2. Component testing
Automated testing remains a cornerstone of effective software development. For front-end tests we can argue whether the distribution of different test types should be the classic test pyramid or whether it should be a trophy shape. In either case, though, teams should focus on component testing because test suites should be stable and run quickly. Instead, what we're seeing is that teams forgo mastering component testing in favor of end-to-end browser-based testing as well as very narrowly defined unit tests. Unit tests have a tendency to force components to expose what should be purely internal functionality, while browser-based tests are slow, more flaky and harder to debug. Our recommendation is to have a significant amount of component tests and use a library like jsdom to run the component tests in memory. Browser tools like Playwright of course still have a place in end-to-end tests, but they shouldn't be used for component testing.
-
3. Continuous deployment
We believe organizations should adopt continuous deployment practices whenever possible. Continuous deployment is the practice of automatically deploying every change that passes automated tests to production. This practice is a key enabler of fast feedback loops and allows organizations to deliver value to customers more quickly and efficiently. Continuous delivery differs from continuous deployment in that it only requires that code can be deployed at any time; it doesn't require that every change actually is deployed to production. We've hesitated to move continuous deployment into the Adopt ring in the past, as it’s a practice that requires a high level of maturity in other areas of software delivery and is therefore not appropriate for all teams. However, Thoughtworker Valentina Servile’s recent book Continuous Deployment provides a comprehensive guide to implementing the practice in an organization. It offers a roadmap for organizations to follow in order to achieve the level of maturity required to adopt continuous deployment practices.
-
4. Retrieval-augmented generation (RAG)
Retrieval-augmented generation (RAG) is the preferred pattern for our teams to improve the quality of responses generated by a large language model (LLM). We’ve successfully used it in many projects, including the Jugalbandi AI platform. With RAG, information about relevant and trustworthy documents is stored in a database. For a given prompt, the database is queried, relevant documents are retrieved and the prompt augmented with the content of the documents, thus providing richer context to the LLM. This results in higher quality output and greatly reduced hallucinations. The context window — which determines the maximum size of the LLM input — has grown significantly with newer models, but selecting the most relevant documents is still a crucial step. Our experience indicates that a carefully constructed smaller context can yield better results than a broad and large context. Using a large context is also slower and more expensive. We used to rely solely on embeddings stored in a vector database to identify additional context. Now, we're seeing reranking and hybrid search: search tools such as Elasticsearch Relevance Engine as well as approaches like GraphRAG that utilize knowledge graphs created with the help of an LLM. A graph-based approach has worked particularly well in our work on understanding legacy codebases with GenAI.
Trial
-
5. Domain storytelling
Domain-driven design (DDD) has become a foundational approach to the way we develop software. We use it to model events, to guide software designs, to establish context boundaries around microservices and to elaborate nuanced business requirements. DDD establishes a ubiquitous language that both nontechnical stakeholders and software developers can use to communicate effectively about the business. Once established, domain models evolve, but many teams find it hard to get started with DDD. There’s no one-size-fits-all approach to building an initial domain model. One promising technique we've encountered recently is domain storytelling. Domain storytelling is a facilitation technique where business experts are prompted to describe activities in the business. As the experts are guided through their narration, a facilitator uses a pictographic language to capture the relationships and actions between entities and actors. The process of making these stories visible helps to clarify and develop a shared understanding among participants. Since there is no single best approach to developing a domain model, domain storytelling offers a noteworthy alternative or, for a more comprehensive approach to DDD, companion to Event Storming, another technique we often use to get started with DDD.
-
6. Fine-tuning embedding models
When building LLM applications based on retrieval-augmented generation (RAG), the quality of embeddings directly impacts both retrieval of the relevant documents and response quality. Fine-tuning embedding models can enhance the accuracy and relevance of embeddings for specific tasks or domains. Our teams fine-tuned embeddings when developing domain-specific LLM applications for which precise information extraction was crucial. However, consider the trade-offs of this approach before you rush to fine-tune your embedding model.
-
7. Function calling with LLMs
Function calling with LLMs refers to the ability to integrate LLMs with external functions, APIs or tools by determining and invoking the appropriate function based on a given query and associated documentation. This extends the utility of LLMs beyond text generation, allowing them to perform specific tasks such as information retrieval, code execution and API interaction. By triggering external functions or APIs, LLMs can perform actions that were previously outside their standalone capabilities. This technique enables LLMs to act on their outputs, effectively bridging the gap between thought and action — similar to how humans use tools to accomplish various tasks. By introducing function calling, LLMs add determinism and factuality to the generation process, striking a balance between creativity and logic. This method allows LLMs to connect to internal systems and databases or even perform internet searches via connected browsers. Models like OpenAI's GPT series support function calling and fine-tuned models like Gorilla are specifically designed to enhance the accuracy and consistency of generating executable API calls from natural language instructions. As a technique, function calling fits within retrieval-augmented generation (RAG) and agent architectures. It should be viewed as an abstract pattern of use, emphasizing its potential as a foundational tool in diverse implementations rather than a specific solution.
-
8. LLM as a judge
Many systems we build have two key characteristics: being able to provide an answer based on questions about a large data set, and being next to impossible to follow how it arrived at that answer. Despite this opacity we still want to assess and improve the quality of the responses. With the LLM as a judge pattern we use an LLM to evaluate the responses of another system, which in turn might be based on an LLM. We've seen this pattern used to evaluate the relevance of search results in a product catalog and to assess whether an LLM-based chatbot was guiding its users in a sensible direction. Naturally, the evaluator system must be set up and calibrated carefully. It can drive significant efficiency gains, which, in turn, translates to lower costs. This is an ongoing area of research, with the current state summarized in this article.
-
9. Passkeys
Shepherded by the FIDO alliance and backed by Apple, Google and Microsoft, passkeys are nearing mainstream usability. Setting up a new login with passkeys generates a key pair: the website receives the public key and the user keeps the private key. Handling login uses asymmetric cryptography. The user proves they're in possession of the private key, which is stored on the user’s device and never sent to the website. Access to passkeys is protected using biometrics or a PIN. Passkeys can be stored and synced within the big tech ecosystems, using Apple's iCloud Keychain, Google Password Manager or Windows Hello. For multiplatform users, the Client to Authenticator Protocol (CTAP) makes it possible for passkeys to be kept on a different device other than the one that creates the key or needs it for login. The most common objection to using passkeys claims that they are a challenge for less tech-savvy users, which is, we believe, self-defeating. These are often the same users who have poor password discipline and would therefore benefit the most from alternative methods. In practice, systems that use passkeys can fall back to more traditional authentication methods if required.
-
10. Small language models
Large language models (LLMs) have proven useful in many areas of applications, but the fact that they are large can be a source of problems: responding to a prompt requires a lot of compute resources, making queries slow and expensive; the models are proprietary and so large that they must be hosted in a cloud by a third party, which can be problematic for sensitive data; and training a model is prohibitively expensive in most cases. The last issue can be addressed with the RAG pattern, which side-steps the need to train and fine-tune foundational models, but cost and privacy concerns often remain. In response, we’re now seeing growing interest in small language models (SLMs). In comparison to their more popular siblings, they have fewer weights and less precision, usually between 3.5 billion and 10 billion parameters. Recent research suggests that, in the right context, when set up correctly, SLMs can perform as well as or even outperform LLMs. And their size makes it possible to run them on edge devices. We've previously mentioned Google's Gemini Nano, but the landscape is evolving quickly, with Microsoft introducing its Phi-3 series, for example.
-
11. Synthetic data for testing and training models
Synthetic data set creation involves generating artificial data that can mimic real-world scenarios without relying on sensitive or limited-access data sources. While synthetic data for structured data sets has been explored extensively (e.g., for performance testing or privacy-safe environments), we're seeing renewed use of synthetic data for unstructured data. Enterprises often struggle with a lack of labeled domain-specific data, especially for use in training or fine-tuning LLMs. Tools like Bonito and Microsoft's AgentInstruct can generate synthetic instruction-tuning data from raw sources such as text documents and code files. This helps accelerate model training while reducing costs and dependency on manual data curation. Another important use case is generating synthetic data to address imbalanced or sparse data, which is common in tasks like fraud detection or customer segmentation. Techniques such as SMOTE help balance data sets by artificially creating minority class instances. Similarly, in industries like finance, generative adversarial networks (GANs) are used to simulate rare transactions, allowing models to be robust in detecting edge cases and improving overall performance.
-
12. Using GenAI to understand legacy codebases
Generative AI (GenAI) and large language models (LLMs) can help developers write and understand code. Help with understanding code is especially useful in the case of legacy codebases with poor, out-of-date or misleading documentation. Since we last wrote about this, techniques and products for using GenAI to understand legacy codebases have further evolved, and we've successfully used some of them in practice, notably to assist reverse engineering efforts for mainframe modernization. A particularly promising technique we've used is a retrieval-augmented generation (RAG) approach where the information retrieval is done on a knowledge graph of the codebase. The knowledge graph can preserve structural information about the codebase beyond what an LLM could derive from the textual code alone. This is particularly helpful in legacy codebases that are less self-descriptive and cohesive. An additional opportunity to improve code understanding is that the graph can be further enriched with existing and AI-generated documentation, external dependencies, business domain knowledge or whatever else is available that can make the AI's job easier.
Assess
-
13. Assistentes de equipe baseados em IA
As ferramentas de assistência à codificação baseadas em IA são geralmente discutidas no contexto de apoiar e aprimorar o trabalho individual. No entanto, a entrega de software é e continuará sendo um trabalho em equipe. Por isso, você deve procurar maneiras de criar assistentes de equipe baseados em IA que ajudem a criar a equipe 10x, o oposto de pessoas engenheiras 10x isoladas e habilitadas por IA. Felizmente, desenvolvimentos recentes no mercado de ferramentas estão nos aproximando de tornar isso uma realidade. Unblocked é uma plataforma que reúne todas as fontes de conhecimento de uma equipe e as integra de forma inteligente às ferramentas dos membros da equipe. E o Rovo da Atlassian traz a IA para a plataforma de colaboração em equipe mais utilizada, oferecendo às equipes novos tipos de pesquisa e acesso à sua documentação, além de desbloquear novas formas de automação e suporte a práticas de software com agentes Rovo. Enquanto esperamos que o mercado evolua ainda mais nesse espaço, temos explorado o potencial da IA para amplificação de conhecimento e suporte a práticas de equipe por conta própria: disponibilizamos como código aberto, o Haiven, nosso assistente à equipe baseado em IA e começamos a reunir aprendizados com assistência de IA para tarefas não relacionadas à codificação, como a análise de requisitos.
-
14. Prompt dinâmico de poucos disparos
Prompt dinâmico de poucos disparos aprimora o conceito de few-shot prompting ao incluir dinamicamente exemplos específicos no prompt para guiar as respostas do modelo. Ajustar o número e a relevância desses exemplos otimiza o comprimento e a pertinência do contexto, melhorando assim a eficiência e o desempenho do modelo. Bibliotecas como scikit-llm implementam essa técnica utilizando a busca pelos casos mais similares para encontrar os exemplos mais relevantes alinhados com a consulta da usuária. Essa técnica permite uma melhor utilização da janela de contexto limitada do modelo e reduz o consumo de tokens. O gerador de código aberto do SQL, vanna, utiliza o dynamic few-shot prompting para aprimorar a precisão das respostas.
-
15. GraphQL para produtos de dados
GraphQL para produtos de dados é a técnica de usar GraphQL como uma porta de saída para produtos de dados buscando o consumo do produto pela cliente. Nós citamos GraphQL como um protocolo de API e como ele permite com que desenvolvedoras criem uma camada de API unificada que abstrai a complexidade dos dados subjacentes, concedendo uma interface mais coesa e gerenciável para clientes. GraphQL para produtos de dados torna fácil para consumidoras descobrirem o formato dos dados e suas relações com o esquema do GraphQL, além de fazer uso de ferramentas que são conhecidas por esse público. Os nossos times estão explorando essa técnica em usos específicos como o de conversas sobre dados para analisar e descobrir insights de big data com a ajuda de grandes modelos de linguagem, onde as consultas GraphQL são construídas por LLMs com base no prompt da usuária e o esquema do GraphQL é usado nos prompts LLM para referência.
-
16. Agentes autônomos impulsionados por LLM
Agentes autônomos com tecnologia LLM estão evoluindo além de agentes únicos e sistemas multi-agentes estáticos com o surgimento de frameworks como o Autogen e o CrewAI. Essa técnica permite que desenvolvedoras dividam uma atividade complexa em várias tarefas menores realizadas por agentes, onde cada agente é designado a uma função específica. Desenvolvedoras podem utilizar ferramentas pré-configuradas para realizar a tarefa, e os agentes conversam entre si e orquestram o fluxo. A técnica ainda está em estágio inicial de desenvolvimento. Em nossos experimentos até agora, nossos times têm encontrado problemas como agentes entrando em loops contínuos e comportamento descontrolado. Bibliotecas como LangGraph oferecem um maior controle das interações do agente com a habilidade de definir o fluxo como um gráfico. Se você utiliza esta técnica, nós sugerimos implementar mecanismos de segurança contra falhas, incluindo timeouts e supervisão humana.
-
17. Observabilidade 2.0
Observabilidade 2.0 representa uma mudança de ferramentas de monitoramento tradicionais e díspares para uma abordagem unificada que promove dados de eventos estruturados e de alta cardinalidade em um único armazenamento de dados. Este modelo captura eventos ricos em sua forma bruta, com metadados detalhados, para oferecer uma única fonte de verdade para uma análise abrangente. Ao armazenar eventos em sua forma bruta, ele simplifica a correlação e oferece suporte a análises em tempo real e forense, além de permitir insights mais profundos em sistemas complexos e distribuídos. A abordagem permite monitoramento de alta resolução e capacidades de investigação dinâmica. Observabilidade 2.0 prioriza a captura de dados de alta cardinalidade e alta dimensionalidade, permitindo um exame detalhado sem gargalos de desempenho. O armazenamento de dados unificado reduz a complexidade, oferecendo uma visão coerente do comportamento do sistema e alinhando as práticas de observabilidade mais de perto com o ciclo de vida do desenvolvimento de software.
-
18. Inferência de LLM em dispositivos
Modelos de linguagem de grande porte (LLMs) agora podem ser executados em navegadores da internet e em dispositivos móveis como smartphones e laptops, permitindo a construção de aplicações de IA em dispositivos. Isso proporciona uma manipulação segura de dados sensíveis, eliminando a necessidade de transferi-los para a nuvem, a baixa latência para tarefas computacionais e processamento em tempo real de imagens e vídeo nos dispositivos, e a redução de custos pela execução computacional local e funcionamento das aplicações mesmo quando a conectividade à internet é instável ou indisponível. Esse é um campo de pesquisa ativo e em crescimento. No passado, nós destacamos MLX, uma ferramenta de código aberto para aprendizado de máquina eficiente em processadores Apple. Outras ferramentas emergentes incluem Transformers.js e Chatty. Transformers.js possibilita a execução de Transformers em navegadores usando ONNX Runtime, dando suporte a modelos convertidos de PyTorch, TensorFlow e JAX. Chatty, por sua vez, roda LLMs de forma nativa e privada nos navegadores através da WebGPU, enriquecendo a experiência de IA com uma gama completa de funcionalidades.
-
19. Saída estruturada de LLMs
Saída estruturada de LLMs se refere a prática de restringir a resposta de um modelo de linguagem a um esquema definido. Isso pode ser alcançado tanto através de um modelo generalizado, para que ele responda em um formato específico, quanto ajustando um modelo para que ele nativamente produza um JSON, por exemplo. A OpenAI agora suporta saídas estruturadas, permitindo que as desenvolvedoras forneçam um esquema JSON, pydantic ou um objeto Zod para restringir as respostas do modelo. Essa capacidade é especialmente valiosa para permitir chamadas de função, integração com APIs e realizando integrações externas, onde a precisão e conformidade com o formato são críticas. A saída estruturada não apenas aprimora a maneira como as LLMs podem interagir com o código, mas também suporta casos de uso mais amplos, como a geração de marcação para renderizar gráficos. Além disso, a saída estruturada demonstrou reduzir a probabilidade de erros nas respostas do modelo.
Hold
-
20. Complacência com código gerado por IA
Assistentes de codificação de IA como GitHub Copilot e Tabnine tornaram-se muito populares. De acordo com a pesquisa de desenvolvedoras da StackOverflow em 2024, 72% de todas as pessoas entrevistadas são favoráveis ou muito favoráveis às ferramentas de IA para desenvolvimento. Embora também vejamos seus benefícios, estamos cautelosas sobre o impacto de médio a longo prazo que isso terá na qualidade do código e alertamos as desenvolvedoras sobre a complacência com o código gerado por IA. É muito tentador sermos menos vigilantes ao revisar sugestões de IA após algumas experiências positivas com um assistente. Estudos como este da GitClear mostram uma tendência de bases de código crescendo mais rapidamente, o que suspeitamos coincidir com pull requests maiores. E este estudo do GitHub nos faz questionar se o aumento mencionado de 15% na taxa de merge de pull requests é realmente uma coisa boa ou se as pessoas estão mesclando pull requests maiores mais rapidamente porque confiam demais nos resultados da IA. Ainda estamos usando o conselho que compartilhamos há mais de um ano de como iniciar o uso, que é ter cuidado com o viés de automação, a falácia do custo irrecuperável, o viés de ancoragem e a fadiga de revisão. Também recomendamos que as programadoras desenvolvam uma boa estrutura mental sobre onde e quando não usar e confiar na IA.
-
21. Ambientes de testes de integração em toda empresa
A criação de ambientes de testes de integração em toda empresa é uma prática comum e ineficiente que deixa tudo mais lento. Esses ambientes invariavelmente se tornam um recurso precioso, difícil de replicar e um gargalo no desenvolvimento. Eles também dão uma falsa sensação de segurança devido a inevitável discrepância nos dados e na sobrecarga de configuração entre os ambientes. Ironicamente, uma objeção comum às alternativas — como ambientes efêmeros ou múltiplos ambientes de testes locais — é o custo. No entanto, isso não leva em conta o custo de atraso causado pela utilização de ambientes de testes de integração em toda companhia, como times de desenvolvimento esperando por outros times terminarem ou por novas versões de sistemas dependentes serem implementados. Em vez disso, as equipes devem utilizar ambientes efêmeros e, preferencialmente, uma suíte de testes mantida pela equipe de desenvolvimento, que pode ser criada e descartada de forma barata, usando stubs falsos para seus sistemas em vez de réplicas reais. Para outras técnicas que suportam esta alternativa veja sobre testes de contrato, desacoplamento da implantação do lançamento, foco no tempo médio de recuperação e testes em produção.
-
22. Proibições de LLM
Em vez de instituir proibições gerais de LLM no local de trabalho, as organizações devem se concentrar em fornecer acesso a um conjunto aprovado de ferramentas de IA. Uma proibição apenas leva as funcionárias a encontrarem soluções alternativas não aprovadas e potencialmente inseguras, criando riscos desnecessários. Assim como nos primeiros dias da computação pessoal, as pessoas usarão quaisquer ferramentas que considerem eficazes para realizar seu trabalho, independentemente das barreiras existentes. Ao não fornecer uma alternativa segura e endossada, as empresas correm o risco de que as funcionárias usem LLMs não aprovados, o que traz riscos de propriedade intelectual, vazamento de dados e responsabilidade legal. Em vez disso, oferecer LLMs ou ferramentas de IA seguras e aprovadas pela empresa garante tanto a segurança quanto a produtividade. Uma abordagem bem governada permite que as organizações gerenciem preocupações com privacidade de dados, segurança, conformidade e custos, ao mesmo tempo em que empoderam as funcionárias com as capacidades que LLMs oferecem. No melhor cenário, o acesso bem gerenciado às ferramentas de IA pode acelerar o aprendizado organizacional sobre as melhores maneiras de usar a IA no local de trabalho.
-
23. Substituição da programação em pares por IA
Quando as pessoas falam sobre assistentes de programação, o tópico programação em pares inevitavelmente aparece. Nossa profissão tem uma relação de amor e ódio com isso: algumas pessoas acreditam veemente, outras não suportam. Assistentes de programação agora imploram pela pergunta: pode um ser humano parear com uma IA, ao invés de outro ser humano, e obter os mesmos resultados para o time? GitHub Copilot chama a si mesmo deseu programador em par de IA. Enquanto acreditamos que um assistente de programação pode trazer alguns dos benefícios da programação em pares, nós aconselhamos totalmente contra substituir programação em pares por IA. Visualizar assistentes de código para o pareamento ignora um dos benefícios chave da programação em pares: fazer o time, não apenas os indivíduos que contribuem, melhor. Assistentes de código podem oferecer benefícios para se desbloquear, aprender sobre uma nova tecnologia, integrar ou tornar o trabalho tático mais rápido para que possamos focar em design estratégico. Mas eles não ajudam com nenhum dos benefícios de colaboração de time, como manter em baixo nível o trabalho em progresso, reduzir handoffs e reaprendizados, tornando a integração contínua possível ou melhorando a propriedade coletiva de código.
Unable to find something you expected to see?
Each edition of the Radar features blips reflecting what we came across during the previous six months. We might have covered what you are looking for on a previous Radar already. We sometimes cull things just because there are too many to talk about. A blip might also be missing because the Radar reflects our experience, it is not based on a comprehensive market analysis.
