Explore como o software é construído

Concluído

O desenvolvimento de software moderno mudou fundamentalmente, desde a construção de tudo do zero até a montagem de aplicativos a partir de componentes existentes. Compreender essa abordagem baseada em componentes é essencial para implementar e gerenciar software de forma eficaz em ambientes de desenvolvimento contemporâneos.

O modelo de software baseado em componentes

Os aplicativos atuais são construídos combinando código original com componentes reutilizáveis. Em vez de escrever todas as funcionalidades, as equipes de desenvolvimento montam soluções a partir de:

  • Código de lógica de negócios original: Código personalizado que implementa requisitos de negócios específicos, fluxos de trabalho e recursos exclusivos que diferenciam seu aplicativo.
  • Bibliotecas e estruturas de código aberto: Componentes reutilizáveis criados e mantidos pela comunidade, fornecendo funcionalidades comuns como processamento de dados, autenticação, interfaces de usuário e protocolos de comunicação.
  • Componentes comerciais: Bibliotecas de terceiros oferecidas por fornecedores, geralmente fornecendo funcionalidade, suporte e garantias especializados.
  • Código de integração: Código de "cola" que conecta componentes, adapta interfaces e orquestra interações entre diferentes partes do sistema.

A pesquisa mostra consistentemente que as aplicações modernas consistem em aproximadamente 80% componentes existentes mantidos fora do projeto, com apenas 20% sendo código original escrito pela equipe de desenvolvimento. Essa composição reflete uma mudança fundamental na forma como o software é criado, da construção à montagem.

Porque é que o software é construído desta forma

A abordagem baseada em componentes oferece vantagens significativas:

Velocidade de desenvolvimento

A reutilização de componentes existentes acelera drasticamente o desenvolvimento:

  • Soluções comprovadas: Em vez de resolver problemas que outros já resolveram, as equipes incorporam componentes testados em batalha que funcionam de forma confiável.
  • Tempo de desenvolvimento reduzido: A criação de uma estrutura de aplicativo Web, driver de banco de dados ou sistema de autenticação do zero levaria meses ou anos. O uso de componentes existentes reduz isso para dias ou horas.
  • Foco no valor do negócio: Os desenvolvedores se concentram em uma lógica de negócios única, em vez de reinventar a infraestrutura comum.
  • Tempo de comercialização mais rápido: Os aplicativos chegam à produção mais cedo porque as equipes não estão construindo todas as camadas do zero.

Qualidade e fiabilidade

Componentes de código aberto bem mantidos geralmente excedem a qualidade do código personalizado:

  • Verificação comunitária: Projetos populares de código aberto têm milhares de usuários identificando e relatando problemas, levando a um código robusto e confiável.
  • Desenvolvimento especializado: Muitos projetos de código aberto são criados e mantidos por especialistas especializados em domínios de problemas específicos.
  • Melhoria contínua: Os projetos ativos recebem atualizações regulares, correções de bugs e melhorias de colaboradores em todo o mundo.
  • Testes de produção: Os componentes utilizados por milhares de aplicações foram testados em diversos ambientes e cenários.

Eficiência de custos

O uso de componentes de código aberto reduz os custos de desenvolvimento e manutenção:

  • Sem taxas de licenciamento: A maioria dos componentes de código aberto é de uso gratuito, evitando custos de licenciamento por estação ou por implantação.
  • Encargos de manutenção partilhados: Correções de bugs e melhorias são contribuídas pela comunidade, reduzindo os custos de manutenção da sua organização.
  • Necessidades reduzidas de pessoal: As equipes não precisam de especialistas para todas as camadas de tecnologia, pois podem incorporar a experiência existente por meio de componentes.
  • Menor custo total de propriedade: Embora os componentes comerciais tenham custos diretos, as alternativas de código aberto geralmente fornecem funcionalidade semelhante sem taxas de licenciamento.

Acesso à inovação

As comunidades de código aberto impulsionam a inovação tecnológica:

  • Características de ponta: Muitas novas tecnologias e abordagens surgem primeiro em projetos de código aberto.
  • Efeitos nos ecossistemas: Estruturas populares criam ecossistemas de componentes, ferramentas e conhecimento compatíveis.
  • Adoção flexível: As organizações podem experimentar novas tecnologias sem grandes compromissos financeiros.
  • Conhecimento da comunidade: Extensa documentação, tutoriais e suporte da comunidade facilitam a adoção.

Componentes de código aberto versus componentes de código fechado

Os componentes vêm em duas categorias fundamentais com base na disponibilidade do código-fonte:

Componentes de código aberto

O código de fonte aberta está disponível publicamente para qualquer pessoa inspecionar, usar, modificar e, muitas vezes, contribuir para:

  • Visibilidade do código-fonte: Você pode examinar a implementação real, entender como o componente funciona e verificar as práticas de segurança.
  • Envolvimento da comunidade: Muitas pessoas podem contribuir com melhorias, corrigir bugs e adicionar recursos.
  • Uso regido por licença: As licenças de código aberto especificam usos permitidos, desde o uso irrestrito até requisitos de que obras derivadas compartilhem a mesma licença.
  • Transparência: Pesquisadores de segurança, desenvolvedores e usuários podem auditar o código em busca de vulnerabilidades, backdoors ou problemas de qualidade.

Os componentes de código aberto populares incluem:

  • Linguagens de programação e tempos de execução: Python, Node.js, .NET Core, Go, Rust.
  • Frameworks Web: React, Angular, Vue.js, Express, Django, Spring Boot.
  • Bases de dados: PostgreSQL, MySQL, MongoDB, Redis, Elasticsearch.
  • Ferramentas de desenvolvimento: Código do Visual Studio, Git, Docker, Kubernetes.
  • Bibliotecas: Lodash, Moment.js, NumPy, Pandas, TensorFlow.

Componentes de código fechado

Os componentes de código fechado (proprietários) fornecem funcionalidade sem disponibilizar o código-fonte:

  • Distribuição binária: Os componentes são fornecidos como binários compilados ou bibliotecas empacotadas sem código-fonte.
  • Controle de fornecedor: A organização de criação controla atualizações, recursos e termos de licenciamento.
  • Apoio comercial: Muitos componentes de código fechado incluem suporte profissional, contratos de nível de serviço e manutenção garantida.
  • Transparência limitada: Os usuários não podem inspecionar os detalhes da implementação, dificultando as avaliações de segurança e qualidade.

Os exemplos incluem muitos drivers de banco de dados comerciais, SDKs proprietários, ferramentas específicas do fornecedor e bibliotecas especializadas específicas do setor.

Como os componentes são distribuídos

Os pacotes fornecem um mecanismo formalizado para distribuir e gerenciar componentes:

Estrutura do pacote

  • Código binário: Bibliotecas compiladas prontas para uso em aplicativos.
  • Metadados: Informações sobre o pacote, incluindo nome, versão, autor e descrição.
  • Dependências: Lista de outros pacotes necessários para o componente funcionar.
  • Informações sobre a licença: Termos legais que regem como o pacote pode ser usado.
  • Documentação: Instruções de uso, referências de API e exemplos.

Ecossistemas de pacotes

Diferentes linguagens de programação estabeleceram ecossistemas de pacotes:

  • npm (Gestor de Pacotes Node): É o maior registo de pacotes do mundo que inclui pacotes JavaScript e TypeScript, com mais de 2 milhões de pacotes.
  • PyPI (Índice de Pacotes Python): Pacotes Python, fornecendo bibliotecas para ciência de dados, desenvolvimento web, automação e muito mais.
  • NuGet: pacotes .NET para aplicativos C#, F# e Visual Basic.
  • Maven Central: Pacotes Java para desenvolvimento empresarial e Android.
  • RubyGems: Pacotes Ruby para aplicações web e automação.
  • Crates.io: Pacotes Rust para programação de sistemas.

Ferramentas de gerenciamento de pacotes

Os gerenciadores de pacotes automatizam o download, a instalação e a atualização de dependências:

  • Resolução de dependências: Determine e instale automaticamente as dependências necessárias.
  • Gerenciamento de versões: Rastreie quais versões de pacotes seu aplicativo usa.
  • Notificações de atualização: Informe os desenvolvedores quando versões mais recentes estiverem disponíveis.
  • Análise de vulnerabilidades: Alguns gerenciadores de pacotes integram a verificação de segurança para identificar vulnerabilidades conhecidas.

As implicações do desenvolvimento baseado em componentes

Embora a abordagem baseada em componentes proporcione enormes benefícios, também introduz desafios:

Complexidade do gerenciamento de dependência

  • Árvores de dependência: Seu aplicativo pode depender diretamente de 20 pacotes, mas esses pacotes dependem de outros, criando árvores de centenas ou milhares de dependências.
  • Conflitos de versão: Componentes diferentes podem exigir versões incompatíveis de dependências compartilhadas.
  • Cascatas de atualização: A atualização de um componente pode exigir a atualização de muitos outros.

Considerações de segurança

  • Vulnerabilidades herdadas: Vulnerabilidades de segurança em qualquer dependência afetam seu aplicativo.
  • Ataques à cadeia de abastecimento: Agentes mal-intencionados podem comprometer pacotes populares para atacar aplicativos que dependem deles.
  • Dependências não mantidas: Os componentes que não são mais mantidos não receberão atualizações de segurança.

Conformidade de licenças

  • Obrigações de licença: Cada licença de código aberto tem requisitos — alguns permitem uso comercial irrestrito, outros exigem o compartilhamento de seu código-fonte.
  • Proliferação de licenças: Um aplicativo pode incorporar centenas de pacotes com dezenas de licenças diferentes.
  • Encargos em matéria de conformidade: As organizações devem acompanhar as obrigações de licença e garantir a conformidade.

Dependências operacionais

  • Alojamento externo: Muitos aplicativos dependem de pacotes hospedados em registros públicos que podem sofrer interrupções.
  • Disponibilidade do registo: Se um registro público ficar indisponível, compilações e implantações poderão falhar.
  • Remoção de pacotes: Às vezes, os autores podem remover pacotes de registros públicos, quebrando aplicativos que dependem deles.

Compreender como o software moderno é construído com componentes fornece contexto essencial para as preocupações de segurança, legais e operacionais que as organizações devem abordar ao implementar software de código aberto. As restantes unidades deste módulo exploram estas preocupações e estratégias para as gerir de forma eficaz.