Assim como as dívidas financeiras, as falhas no desenvolvimento de um software geram custos extras, que precisam ser bem administrados
Graziela Tonin*
Dívida técnica é uma metáfora criada pelo consultor americano Ward Cunningham para se referir a artefatos imaturos inseridos no software. Essa dívida acarreta juros que irão resultar em custos extras para a evolução e a manutenção do software, comumente por meio da reescrita de código. A tendência é que, quanto mais tempo levar para pagar essa dívida, maior o custo.
As dívidas técnicas podem ser usadas de forma estratégica para um benefício de curto prazo, como aumentar a velocidade de entrega de um produto. Mas, segundo Cunningham, deveriam ser pagas com a maior brevidade possível devido aos juros incorridos ao longo do tempo e que podem comprometer o software no longo prazo.
Numa analogia com a área financeira, quando se opta por usar o cartão de crédito e se paga a fatura em dia, não há cobrança de juros. Porém, se a fatura não for paga na data de vencimento, a dívida vai crescer substancialmente devido aos altos juros.
Inserir dívida técnica no software é comum. O grande problema é quando essas dívidas não são geridas. Algumas dívidas não precisam ser pagas ao longo do tempo. Por exemplo, se foram inseridas em uma parte do código que foi descontinuada ou que praticamente não tem uso. Mas só será possível tomar essa decisão se houver gestão e monitoramento das dívidas técnicas.
A gestão da dívida técnica inclui uma série de atividades. Entre elas estão:
O termo “técnicas inteligentes” engloba um conjunto de técnicas usadas para explorar dados para descoberta de conhecimento, raciocínio, aprendizado, planejamento, percepção ou suporte à tomada de decisão (inclui, mas não está limitado a técnicas AI-based).
As técnicas inteligentes simulam o comportamento humano, incluindo a capacidade de aprender, realizar tarefas e emular a experiência e a decisão humana. Em geral, as técnicas inteligentes podem ser usadas para:
Aprendizado de máquina, sistemas especialistas, algoritmos genéticos e sistemas fuzzy são exemplos típicos dessas técnicas, uma vez que envolvem algum aprendizado humano, tomada de decisão e ação. (Além disso, é importante mencionar que não existe um consenso na literatura sobre uma nomenclatura mais ampla que englobe várias técnicas consideradas como “inteligentes’”. Neste artigo, consideramos a definição seguida no trabalho de Perkusich et. al[1]).
Por meio de uma revisão sistemática da literatura, identificamos 2.446 estudos entre os anos de 2013 e 2019 resultantes de uma string de busca relativa ao uso de técnicas inteligentes para a gestão de dívida técnica. Após removermos as duplicidades e aplicarmos os critérios de inclusão e exclusão, analisamos completamente 111 artigos relativos ao tema.
Nessa análise foi possível observar que os estudos consideram oito atividades para a gestão de dívida técnica, sendo três adicionais às cinco supracitadas (prevenção, documentação e medição). E, para cada atividade, uma variedade grande de diferentes técnicas está sendo aplicada. Além disso, muitos estudos já utilizam alguns indicadores para identificar variados tipos de dívida técnica.
A maioria das pesquisas de aplicação de técnicas inteligentes para dar suporte à gestão de dívida técnica está relacionada a artefatos de código, havendo lacunas na aplicação em outros tipos de dívida técnica e partes da gestão. O nível de automação das soluções propostas ainda é baixo, bem como a validação. Assim, a grande maioria ainda não é automatizada, o que dificulta a realização de testes. E, quanto mais automatizada a solução usando uma técnica inteligente, maior a tendência de autonomia para a tomada de decisão.
Existem quatro categorias de técnicas inteligentes que foram aplicadas em 70% dos estudos analisados: aprendizagem de máquina, raciocínio sobre incerteza, processamento de linguagem natural e modelos matemáticos. A aprendizagem de máquina é a técnica mais utilizada nos estudos (aproximadamente 47%), e a maioria dos estudos aplica apenas uma técnica inteligente para suporte à gestão de dívida técnica.
Em relação às atividades de gestão de dívida técnica, as que receberam maior suporte na aplicação das técnicas inteligentes foram: identificação, monitoramento e mensuração de dívida técnica. Aproximadamente 65% dos estudos suportam apenas uma atividade de gestão e 32% suportam duas atividades de gestão. Pouca ênfase foi dada nos estudos para atividades de gestão cruciais, como prevenção e comunicação.
Em relação aos tipos de dívida técnica, os mais considerados foram as dívidas de design, arquitetura e defeito (70,5% dos estudos abordam esses tipos). Por outro lado, dívidas técnicas de design e código foram exploradas considerando todas as atividades de gestão de dívida técnica. O nível de automação dessas soluções ainda é muito baixo e as que têm um nível mais elevado de automação implementam mais de uma técnica inteligente. Além disso, 28% das contribuições desenvolveram uma técnica ou procedure, 27% um modelo analítico e 16% desenvolveram apenas uma ferramenta ou notação. Somente 18% dos estudos foram validados na indústria. O artefato mais utilizado para as análises foi o código-fonte.
Observou-se no estudo que a área ainda tem muitas lacunas e é bem desafiador conseguir automatizar as atividades de gestão de dívida técnica. Até mesmo uma taxonomia e entendimento comum ainda é um desafio. Por isso, acredita-se que muitas oportunidades ainda estão em aberto para automatizar e auxiliar no processo de gestão de dívida técnica, utilizando técnicas inteligentes. Um próximo passo sugerido no estudo é testar as soluções criadas em casos reais da indústria e definir uma agenda colaborativa em comum para a evolução dessas soluções.
O acesso detalhado a cada estudo poderá ser feito na versão completa do artigo intitulado “Managing Technical Debt Using Intelligent Techniques – A Systematic Literature Review”, que em breve será publicado na revista IEEE Transactions on Software Engineering, uma das principais revistas mundiais da área de Engenharia de Software (Qualis A1).
Esta versão é oriunda de uma revisão sistemática desenvolvida em parceria com pesquisadores da Universidade Federal de Campina Grande, do Instituto Federal da Paraíba, da Universidade Estadual da Pensilvânia e da Universidade Politécnica de Madri.
* Graziela Tonin é doutora em Ciência da Computação pela Universidade de São Paulo, na área de Engenharia de Software, Dívida Técnica e Metodologias Ágeis. Ela leciona a disciplina Projeto Ágil e Programação Eficaz no curso de Ciência da Computação do Insper.
[1] M. Perkusich, L. C. e Silva, A. Costa, F. Ramos, R. Saraiva, A. Freire, E. Dilorenzo, E. Dantas, D. Santos, K. Gorgônio et al., “Intelligent software engineering in the context of agile software development: A systematic literature review,” Information and Software Technology, vol. 119, p. 106241, 2020.