Descubra como garantir a confiabilidade, disponibilidade e segurança dos sistemas de software para evitar falhas e proteger dados.
Tempo de Leitura: 8 minutos
Direta ou indiretamente, os sistemas de software fazem parte de todos os aspectos de nossas vidas. Empresas de todos os tamanhos usam sistemas, sejam em smartphones, tablets, computadores robustos ou outros tipos de equipamentos. Como prova disso, nos dias de hoje, dificilmente encontramos estabelecimentos sem máquinas de cartão que também geram QR code para pagamento via PIX. Isso demonstra a crescente tendência de virtualização das operações humanas, comerciais, econômicas e comunicativas.
Dado que os sistemas de software se incorporam cada vez mais às empresas e à nossa vida pessoal, os desafios enfrentados pela engenharia de software para garantir que esses sistemas operem de maneira confiável crescem no mesmo ritmo.
Neste artigo, entenderemos o que é dependabilidade e segurança de software. Também introduziremos as propriedades que sustentam esses dois fatores, que são: confiabilidade, disponibilidade, segurança (safety), segurança da informação (security) e resiliência. Desta forma, será possível aprender como desenvolver sistemas cada vez mais confiáveis e seguros.
Conteúdo
MostrarOcultarImportância da Confiabilidade e Segurança
Ter um software confiável significa que ele estará disponível e com o desempenho esperado sempre que necessário. Sua segurança implica na proteção dos equipamentos e dados manipulados pelo sistema, sendo assim, ele precisa protegê-los de ameaças e estar equipado com recursos que permitam uma rápida restauração em casos de falha ou ciberataques. Uma falha de segurança em um sistema de e-commerce pode causar perdas de receitas e de clientes para a empresa usuária dele, por exemplo.
Em um outro caso, um erro em um software embarcado para controle de automóvel pode gerar até mesmo um acidente de trânsito. Imagine, então, o prejuízo de vazamento de dados de instituições financeiras. Esses foram apenas alguns exemplos das consequências catastróficas que a insegurança de sistemas pode causar. Considerando a importância dos sistemas para governos, empresas e indivíduos, eles precisam ser capacitados para estar disponíveis e operando corretamente, sem efeitos colaterais indesejáveis como a exposição não autorizada de informações.
Dependabilidade de Software
Em 1995, Jean-Claude Laprie propôs o termo “dependabilidade” para contemplar os atributos de sistema relacionados à disponibilidade, confiabilidade, segurança (safety), segurança da informação (security) e resiliência. Essas quatro propriedades estão intimamente ligadas e, por esse motivo, o termo dependabilidade foi apresentado para engloba-las.
Por Que a Dependabilidade é Importante
- Falhas de sistemas podem afetar um grande número de pessoas.
As falhas que impactam a disponibilidade do sistema tendem a prejudicar todos os usuários. Ter softwares indisponíveis podem impossibilitar a atuação com negócios normais. Imagine uma empresa de transporte e abate de aves com carga viva parada aguardando a disponibilidade do software retornar. Em algumas horas, toda a carga pode ser perdida e os colaboradores terão perdido tempo, esforço e resultados por conta da falha.
- Os usuários rejeitam softwares não confiáveis, não seguros ou desprotegidos.
Por mais útil que um sistema possa ser, os usuários não o utilizarão caso sintam algum tipo de perigo nele. Além disso, os clientes podem rejeitar até outros produtos que a empresa desenvolveu, desconfiando de uma possível experiência negativa com eles. Ou seja, uma aplicação não confiável compromete a imagem da empresa e de suas soluções.
- Falhas de sistema podem gerar custos enormes
Sistemas que controlam reatores de usinas nucleares ou ainda sistemas de navegação de aeronaves são exemplos de aplicações que gerarão custos exorbitantes em caso de falhas. Esse prejuízo pode ultrapassar o próprio custo do sistema de controle. Isso ocorre devido à quantidade de valores movimentados nas operações intrínsecas desses negócios - como os equipamentos, mão de obra e matéria prima caríssimos que não podem ser desperdiçados. Em alguns casos, o prejuízo pode se estender de maneira generalizada - como a falta de energia elétrica para todas as pessoas e empresas de uma região.
- Sistemas não confiáveis podem causar perda de informação.
Coletar e manter dados é caro porque, normalmente, eles valem mais do que o sistema computacional onde são processados. O custo para reparar dados perdidos ou corrompidos costuma ser altíssimo. Além disso, o vazamento de dados por ação criminosa causará danos, por vezes, irreparáveis.
Tipos de falhas
Os softwares sempre fazem parte de sistemas mais amplos. Levando em consideração que o software roda em um ambiente operacional que inclui o hardware onde ele é executado, os usuários humanos que o controlam e os processos de negócio onde o sistema é utilizado, há três tipos de falhas:
- Falha de hardware: o equipamento utilizado para rodar o software está sujeito à falha. Ela pode ocorrer por conta do próprio projeto de software, por exemplo, se ele exigir uma capacidade de processamento muito superior ao que o hardware permite. Mas também é possível que o hardware apresente falhas devido a componentes desgastados ou com mau funcionamento de fábrica, temperatura ou umidade inadequados no ambiente, desgaste ou ainda o fim de sua vida útil.
- Falha de software: o software do sistema pode falhar por erros na sua especificação, projeto ou implementação.
- Falha operacional: os usuários humanos podem não operar o sistema conforme os criadores especificaram, causando erros. É interessante notar que, à medida que o hardware e o software tornam-se mais confiáveis, essas falhas operacionais concentram a causa das falhas de sistema.
Esses tipos de falhas frequentemente se inter-relacionam na prática. Uma falha de hardware pode estressar o usuário que tende a se enganar e provocar falhas de software. É um efeito em cadeia. Para contornar esse cenário, os projetistas de sistemas devem adotar a perspectiva holística dos sistemas sociotécnicos, ao invés de se concentrar num único aspecto do sistema. Se projetarmos separadamente software, hardware e processos operacionais, a visão do sistema fica fragmentada e abre espaço para erros em outras partes do sistema.
Propriedades da dependabilidade
Segundo Ian Sommerville, a dependabilidade de um sistema reflete o quanto ele merece a nossa confiança - trustworthiness é um termo usado nesse sentido também. Sendo assim, a dependabilidade transparece o quanto o usuário confia que o sistema vai funcionar conforme o previsto e não vai falhar durante o uso normal. Entretanto, não é significativo representar ela numericamente, pois faz mais sentido usarmos termos relativos como “não confiável”, “confiável”, “muito confiável” e “ultra confiável” para refletir o grau de confiança de um sistema.
Existem cinco dimensões ou propriedades principais da dependabilidade brevemente explicados:
- Disponibilidade: é a probabilidade de um sistema estar funcionando e que seja capaz de prestar serviços úteis a qualquer momento.
- Confiabilidade: é o julgamento da probabilidade de um sistema vir a prestar serviços corretamente, conforme esperado pelo usuário, ao longo de um determinado período de tempo.
- Segurança (safety): é o julgamento da probabilidade de um sistema causa dano às pessoas ou ao seu ambiente
- Segurança da informação (security): é o julgamento da probabilidade de um sistema conseguir resistir a intrusões acidentais ou deliberadas.
- Resiliência: é o julgamento de quão bem um sistema pode manter a continuidade de seus serviços críticos na presença de eventos danosos - como ciberataques ou falhas de equipamentos.
Essas propriedades são tão complexas ao ponto de serem decompostas em partes menores para maior detalhamento e compreensão. Ademais, nem todas elas são críticas a todos os sistemas, sendo possível priorizar umas em detrimento de outras a depender do contexto onde o software atuará.
Fatores que Influenciam a Dependabilidade
A dependabilidade sofre influência de três fatores principais: reparabilidade, manutenibilidade e tolerância ao erro. Todos os sistemas terão falhas em algum momento, por isso, o primeiro termo se refere justamente à capacidade de reparação dessas falhas. Sendo assim, a reparabilidade é a competência de restaurar danos no menor tempo possível. Naturalmente, essa habilidade se torna maior para organizações que possuem acesso ao código-fonte e competência para modificá-lo. Em softwares de baixa reparabilidade, há um risco maior de afetar a dependabilidade porque isso implica sobretudo nas propriedades de disponibilidade e resiliência.
Já a manutenibilidade é a capacidade do software de adaptar novos requisitos de maneira econômica e com baixa probabilidade de introduzir novos erros no processo. Ao passo que novas demandas são propostas, é necessário se atentar à integridade e valor do software para não prejudicá-las na tentativa de implementar alterações. Se a manutenção do software é dificultosa, o que ocorre em softwares legados como exemplo, todas as propriedades da dependabilidade podem ser prejudicadas. Assim, a experiência do cliente e a eficiência do software ficam engessadas.
Por fim, a tolerância ao erro consiste na flexibilidade do sistema em lidar com erros de entrada do usuário. Esse fator mede o quanto o sistema está preparado para contornar falhas por parte do usuário a fim de que, quando ela ocorra, o próprio sistema identifique e proponha correção (seja ela automática ou solicitando que o usuário insira novamente os dados).
Requisitos para desenvolver softwares confiáveis
Já percebemos que as cinco propriedades da dependabilidade - confiabilidade, disponibilidade, segurança (safety), segurança da informação (security) e resiliência - estão muito interligadas. Elas se comunicam e se implicam mutuamente. O mesmo pode ocorrer com as ameaças à dependabilidade: elas são interdisciplinares. É possível que um sistema deixe de ser confiável por uma invasão de um hacker que corrompeu seus dados e derrubou seu acesso, isso prejudicou sobretudo a disponibilidade e security por exemplo. Um outro caso para exemplificar isso é a invasão por vírus que causa perda de confiabilidade e safety porque não poderemos esperar que o sistema opere normalmente e sem falhas após a infecção.
Para desenvolver um software confiável, ou seja, com dependabilidade, é crucial:
- Evitar ao máximo a introdução de erros acidentais no sistema durante a especificação e desenvolvimento do software. É comum que a execução desafie o que foi planejado inicialmente, por isso é importante redobrar esforços na validação desde o escopo do projeto, até a conclusão de cada entrega. Se mais de um profissional puder revisar o projeto, teremos mais cobertura e prevenção de erros na especificação e implementação.
- Projetar processos de verificação e validação eficazes no diagnóstico de erros residuais que afetam a dependabilidade do sistema. Exemplos de estratégias para isso: revisão por pares (onde um desenvolvedor revisa o código do outro), testes automatizados, teste de regressão e monitoramento em produção.
- Arquitetar o sistema para ser tolerante a defeitos com o objetivo de mantê-lo funcionando caso haja pequenas falhas. Isso evita que o sistema pare completamente por defeitos ou falhas de pouca implicação.
- Projetar previamente mecanismos de defesa contra possíveis ataques externos que comprometam a disponibilidade ou segurança da informação do sistema.
- Configurar adequadamente o sistema e o seu software de apoio segundo o ambiente operacional
- Capacitar o sistema para reconhecer e resistir a ciberataques.
- Projetar o sistema visando recuperação rápida de falhas e ciberataques a fim de evitar perda de dados críticos
Desafios na Implementação da Dependabilidade
É frequente que a dependabilidade e o desempenho de software concorram pela preferência. Isso porque os sistemas confiáveis precisam recorrer a códigos redundantes que monitoram a si próprios e detectam estados de erro para reparar defeitos antes que as falhas ocorram. Em alguns casos, é preferível deixar as checagens fora do sistema, pois elas o tornam mais lento. Contudo, o risco inerente é de o sistema falhar porque os defeitos não foram detectados.
Quanto mais confiável, mais caro é o sistema dado que aumentar a dependabilidade exige investimento em projetar, implementar e validar o software com mais ponderações. Para sistemas ultraconfiáveis, em particular, os custos de dependabilidade são altíssimos. As validações e verificações desse tipo de software precisam provar para os reguladores externos que ele é sim seguro. Os sistemas de aeronaves, por exemplo, precisam comprovar que são confiáveis perante reguladores como a Agência Nacional de Aviação Civil. Esses reguladores exigirão comprovação de que a probabilidade de falha é extremamente baixa porque, caso ela ocorra, as consequências podem ser drásticas.
Ainda assim, é possível obter melhorias significativas na confiabilidade de um sistema usando uma engenharia de software melhor. As boas práticas de desenvolvimento já visam fornecer softwares melhor estruturados e seguros. Se elas estão implementadas, o próximo passo é partir para melhorias de dependabilidade mais robustas à medida que o cliente e o ambiente exigem.
Há também um problema relacionado ao teste de software para demonstrar dependabilidade. Quanto mais confiável um software é, menos falhas ele apresenta. Por consequência, é preciso fazer mais testes para experimentar e detectar quantos erros ainda restam. Os testes são processos caros e isso também pode aumentar consideravelmente os custos dos sistemas de alta dependabilidade.
Conclusão
Neste artigo, você descobriu o que é a dependabilidade e quais são as propriedades que a compõem. Também abordamos os três principais tipos de falhas e os motivos pelos quais devemos nos esforçar para produzir softwares confiáveis. Finalmente, chegamos aos sete principais requisitos para desenvolver sistemas confiáveis. Essa tarefa não é fácil, mas o seu resultado é gratificante: sistemas confiáveis são valiosos. Esperamos que esse estudo seja útil no fortalecimento do seu software no mercado!