Reuso de Software: origens, evolução e estratégias para otimização no desenvolvimento e superando desafios para garantir sucesso.
Tempo de Leitura: 8 minutos
Se você convive na civilização humana há pelo menos uns anos, certamente já precisou contratar alguém que fosse especialista em algo ou comprar um produto pronto ao invés de fazer você mesmo. Pense neste exemplo empresarial: se você tiver uma padaria, é provável que o seu foco não seja produzir ovos, leite, farinhas e açúcar que serão usados na fabricação dos seus produtos. O foco de uma padaria é preparar alimentos que usam esses ingredientes como base, ou seja, bolos, pães, bolachas, biscoitos, tortas, salgados…
Seria viável para uma panificadora produzir cada um dos ingredientes e investir tempo em seu cultivo? Com certeza não, pois o mercado já dispõe de produtores especializados que oferecem essas soluções de pronta entrega e, geralmente, a custo bem mais baixo. O objetivo deste exemplo simples é mostrar o quanto o reuso é comum na produção de muitos produtos e serviços, portanto isso não é diferente na indústria de software.
A produção de sistemas de informação pode ser caro e lento a depender de sua complexidade. Por isso, pensar em estratégias que contornam o custo e a lentidão pode oferecer grandes vantagens competitivas. Atualmente, observa-se um aumento na exigência dos usuários, sejam eles empresas ou pessoas, por softwares mais sofisticados, eficientes e completos. Por um lado, isso motiva o mercado a buscar técnicas adequadas e evoluir. Em contrapartida, players que não se esforçam no mesmo sentido, perdem espaço neste ambiente competitivo.
Além disso, os sistemas de informação estão amplamente difundidos nos processos humanos, desde o controle de robôs em operações espaciais ao envio de mensagens por uma pessoa comum conversando com um amigo. Percebe-se uma quantidade enorme de softwares disponíveis e aplicações muito específicas para determinadas atividades.
É nesse cenário que o Reuso de Software se torna mais relevante a cada dia. Também chamado de Reutilização, o termo ficou mais conhecido na indústria de software entre as décadas de 1960 e 1970. Apesar do reuso de fórmulas, ideias e soluções já ser conhecido nas esferas da física, matemática e engenharias, a notoriedade dele na indústria de software é relativamente nova. Inicialmente, ele surgiu com um conceito mais simples: reaproveitar trechos de código e funções já existentes. À medida que a maturidade dos sistemas aumentou, os profissionais da área observaram uma oportunidade de ir mais alto, abordando o reuso de componentes, padrões e frameworks.
Neste texto, você entenderá detalhadamente o que é o Reuso de Software, como ele pode ser aplicado ao nível de código e de ecossistemas, além de suas vantagens e desvantagens. Ao final, trouxemos algumas dicas para facilitar a eficácia da reutilização.
O que é Reutilização de Software?
Falando do conceito, a Reutilização de Software tem várias definições, mas comumente consideramos que ela é o uso de qualquer informação, item de software ou até softwares já existentes que um desenvolvedor possa aproveitar na criação de um sistema. Ou seja, é o processo de criar sistemas a partir de softwares que já existem em vez de desenvolver totalmente do zero. Ao longo dos anos, a reutilização passou de “usar linhas de código de um programa em outro” para “Ecossistemas de Software”. A título de curiosidade, temos uma breve linha do tempo de como essa evolução ocorreu:
- 1960 - Reuso ao nível de código: trechos de um software eram aproveitados em outros sistemas.
- 1970 - Reutilização de subrotinas e bibliotecas de funções comuns: aproveitamento de coleções de recursos.
- 1980 - Herança e polimorfismo: novas técnicas de desenvolvimento (Orientação a Objetos) permitiram herdar e compor características e métodos de objetos, além de desenvolver interfaces, polimorfismos e ligação dinâmica (late binding).
- 1990 - Padrões de software, Frameworks e Componentes: aqui a reutilização começou a ficar mais robusta. Os padrões de software se referem à estruturação de classes e suas relações, e não meramente às linhas de código. Já o reuso dos frameworks diz respeito a reusar análises, projetos, implementações e teste de domínios de aplicação. Enquanto os componentes são códigos executáveis que podem ser configurados e adaptados a um software.
- 2004 - Função de negócio: passou a ocorrer o reuso de unidades autônomas de execução (bibliotecas, componentes de software que podem ser plugados e serviços web, por exemplo).
- 2009 - Ecossistemas de Software: essa fase conta com a integração de múltiplos e distintos participantes interconectados e interdependentes formando um ambiente ou conjunto operante.
Por falar em ecossistemas de software, eles estão diretamente ligados ao reuso de software, uma vez que os integrantes cooperam mutuamente e é possível produzir mais software com menos esforço. Um ecossistema de software é caracterizado por conter os seguintes elementos: atores internos e externos à organização; produto de software principal; plataforma de apoio ao software; e os ativos de ecossistemas.
Esses elementos são tratados de maneira integrada, considerando suas interações. Inclusive, existem integrações em escala mundial que permitem transações financeiras, monitoramento e segurança, compartilhamento de informações e muitos outros serviços de Tecnologia da Informação. O Google é um exemplo de ecossistema de software de alta complexidade. Ele possui navegador web, drive, e-mail, mapa, sistema operacional mobile (Android), loja de aplicativos e vários outros integrantes. Tudo isso foi construído aplicando a reutilização de software.
No começo deste texto, demos um exemplo fora do desenvolvimento de sistemas para familiarizar o termos “reuso”, agora vamos pensar num exemplo específico do campo:
Supomos que você vá desenvolver um sistema para uma grande distribuidora e transportadora. Uma empresa deste tipo tem rotinas comuns como faturamento de notas, folha de pagamento, financeiro, etc. Mas também possui rotinas mais específicas, como controle e mapeamento de estoque, rota de entrega e regras de negócio (valores para venda de varejo e atacado, por exemplo).
Como podemos notar, há uma quantidade muito grande de funcionalidades interessantes para esse perfil de usuário. Por isso, uma estratégia eficiente é focar nas demandas específicas dele e utilizar soluções previamente desenvolvidas para atender àquelas necessidades mais gerais. Uma demonstração disso é utilizar um componente ou uma API para realizar a emissão de documentos fiscais, pois essa função é fundamental para a maioria das empresas e há muitos parceiros especialistas nesse tipo de solução.
Essa é uma boa amostra de reutilização de software porque, no Brasil, há vários documentos e obrigatoriedades fiscais que devem ser atendidas, porém, o trabalho para acompanhar as atualizações de normas e desenvolver as integrações com webservices públicos toma muito tempo (além de ser caro). Sendo assim, ao invés dispensar esforços lendo editais, entendendo as regras burocráticas e integrando com cada webservice, você pode se tornar parceiro de uma empresa que fornece uma integração muito mais simples e rápida, terceirizando o esforço.
Com o tempo e o dinheiro economizado, é possível direcionar as equipes para evoluir os diferenciais da sua própria solução. Além da emissão de documentos fiscais, é comum a reutilização de sistemas para emissão de boletos, recebimento e realização de pagamentos online, integração com marketplaces, mapas e geocodificação, entre muitos outros.
Talvez, com esse exemplo envolvendo vários tipos de serviços integrados, a reutilização pareça distante ou complicada demais. Porém, é justamente o contrário. Há uma quantidade enorme de bibliotecas e frameworks contendo funções, métodos e códigos pré-desenvolvidos que facilitam a evolução dos projetos.
Inclusive, alguns desses códigos podem estar pré-escritos nas próprios editores de código-fonte - como o Visual Studio Code que tem IntelliSense e já sugere o preenchimento automático. Outros softwares úteis podem ser importados como bibliotecas - isso é muito comum na linguagem JavaScript - que fazem, por exemplo, efeitos de imagem, operações matemáticas mais complexas, manipulação de arquivos, etc. Existem ainda funções da própria linguagem, como para arredondar um número com casas decimais, sortear um número aleatório, converter tipos de variáveis… Viu? A reutilização está em todo lugar!
Vantagens da Reutilização de Software
Já se comentou alguns dos benefícios de reusar software, porém segue uma descrição mais pontual das principais vantagens dessa técnica:
Aumento da confiabilidade:
Há uma confiança muito maior em aproveitar uma solução que tenha sido criada por fontes consolidadas e/ou seja, amplamente utilizada por outros profissionais.
Redução de riscos do processo
Associado à confiabilidade, também temos uma maior previsibilidade, ou seja, reduzem-se as incertezas de funcionamento e custo de desenvolvimento.
Uso eficaz de especialistas
Especialistas em aplicações podem encapsular seus conhecimentos e desenvolver softwares sofisticados, disponibilizando de prontidão soluções mais eficientes do que repetir o mesmo trabalho cada vez que determinada necessidade surgisse.
Conformidade de padrões
Quanto mais frequente for a aplicação de um formato e o reuso de software, maior será a padronização dos códigos. Sendo assim, as aplicações apresentarão formatos semelhantes que auxiliam na compreensão e organização dos códigos. Padrões como os de interface facilitam o aprendizado e a compreensão de funcionamento.
Desenvolvimento rápido
Essa é uma das maiores vantagens da reutilização porque é possível implementar em poucos minutos códigos que levariam horas para serem desenvolvidos do zero. Até em cenários mais complexos, como integrações em ecossistemas, o tempo de entrega é reduzido drasticamente se comparado ao tempo que seria gasto para reescrever a lógica e cada código dos elementos.
Desvantagens da Reutilização de Software
Seguindo o ditado popular, “nem tudo são flores”. E sim, leitor(a), é possível enfrentar algumas dificuldades com a reutilização de software. Listamos algumas delas abaixo porque, quanto mais você souber delas, melhor poderá se prevenir de seus impactos:
Aumento dos custos de produção
Se o código-fonte dos softwares reutilizáveis estiver, por algum motivo, indisponível, isso pode aumentar os custos de manutenção. Isso porque há possibilidade de eles se tornarem incompatíveis à medida que o sistema sofre alterações. Se o sistema evoluir e os artefatos reutilizáveis não acompanharem, haverá custos em realizar essa manutenção.
Síndrome do “não inventado aqui” (Not Invented Here - NHI)
Essa síndrome é uma propensão das equipes de desenvolvimento a rejeitar ideias novas que venham de fora da organização ou até de equipes diferentes. Essa resistência é causada pela desconfiança a respeito de utilizar o que foi desenvolvido por outras pessoas. Alguns profissionais de software podem preferir reescrever o código, monopolizando seu controle e aumentando a sensação de segurança.
Se o NHI não for contido, ele pode barrar drasticamente a evolução do software (e da própria organização) por rejeitar iniciativas externas de progresso e isolar o desenvolvimento.
Criação, manutenção e uso de uma biblioteca
Esse processo pode ser caro e exigir muito empenho caso não haja uma cultura de melhoria contínua. É necessário criar essa cultura e utilizar metodologias de desenvolvimento que permitam fazer isso o mais ágil e barato possível. O Clean Code pode dar diretrizes cruciais para estruturar a criação, manutenção e até refatoração de código.
Esforço de busca, compreensão e adaptação dos artigos reutilizáveis
É necessário pesquisar (às vezes, arduamente) para descobrir componentes que atendam às expectativas e, mais do que isso, entender em detalhes como eles funcionam. Somente assim, é possível reaproveitar esses artefatos e realizar a devida adequação deles no projeto.
Por isso, para ter uma reutilização de software de sucesso, você deve se atentar a esses três pontos:
- Existência de um repositório de componentes ou de uma biblioteca: quanto mais confiante os engenheiros de software e desenvolvedores estiverem de que existe sim uma solução pré-desenvolvida, menor será o risco da busca ser em vão. Naturalmente, se não existir um repositório ou biblioteca, a reutilização se torna impraticável.
- Garantia de que o componente se comportará conforme as especificações: nem sempre é possível ter total previsibilidade dos softwares, mas optar por fornecedores, parceiros e fontes confiáveis reduz o risco de surpresas negativas. Em cenários mais corporativos, a escolha de players parceiros impacta diretamente no produto final que está sendo desenvolvido.
- Existência de documentação: as documentações técnicas são, geralmente, os guias de compressão e uso para qualquer sistema. Sem elas, o reuso pode se tornar uma tarefa às cegas. Sendo assim, quanto melhor o software for documentado, melhor a chance de sucesso na sua reutilização.
Desde seu surgimento, o reuso é um tema emergente na indústria de TI e ainda há muitos outros subtemas tão extensos que precisam ser abordados individualmente. Todavia, esperamos que esse conteúdo tenha contribuído com a sua bagagem de conhecimentos. Mas ainda não acabou! Vamos deixar mais duas sugestões sobre o reuso de software:
- A Tecnospeed disponibiliza muitas soluções que economizam seu tempo e permitem gerar mais software com menos esforço. Você pode conferir as integrações disponíveis neste link.
- Na Casa do Desenvolvedor, temos um espaço com nossos parceiros especialistas que também podem te apoiar com componentes e APIs, infraestrutura, equipamentos, gestão, cursos, educação e outros serviços que fazem a diferença no mercado de TI.
Gostou deste conteúdo? Então participe desse ecossistema que é a comunidade Casa do Desenvolvedor!