Pular para o conteúdo
Historia Dev

Sistemas Criticos: Como Software de Aviao,

Voce acha que deploy em sexta e arriscado? No software de aviacao, um bug pode matar centenas de pessoas. Veja como software critico e desenvolvido — e o

Software que nao pode falhar

Sistemas Criticos: Como Software de Aviao,. Voce acha que deploy em sexta e arriscado? No software de aviacao, um bug pode matar centenas de pessoas. Veja como software critico e desenvolvido — e o que seu SaaS pode roubar desse processo.

O que torna um software 'critico'

Software critico e qualquer software cuja falha pode causar morte, lesao grave, dano ambiental significativo ou perda financeira catastrofica. Nao e uma definicao arbitraria — existem padroes internacionais que classificam software por nivel de criticidade.

A classificacao mais comum usa o conceito de Safety Integrity Level (SIL), que vai de 1 (menos critico) a 4 (mais critico). SIL 4 e reservado pra sistemas onde uma falha causa 'multiplas fatalidades' — think controle de reatores nucleares ou sistemas de frenagem de trens.

A diferenca entre software critico e o seu SaaS nao e a linguagem de programacao ou a stack. E o processo. Em software critico, cada linha de codigo precisa ter rastreabilidade ate um requisito de seguranca. Cada mudanca precisa de analise de impacto formal. Cada teste precisa provar que o software nao faz coisas que nao deveria fazer — nao so que faz o que deveria.

Parece burocracia? E. Mas e burocracia que salva vidas. O Boeing 737 MAX mostrou o que acontece quando voce relaxa esses processos num sistema critico — 346 pessoas morreram.

DO-178C: como avioes voam com software

O DO-178C e o padrao que rege o desenvolvimento de software para aviacao. Publicado pela RTCA, e reconhecido pela FAA (EUA) e EASA (Europa). Se voce quer colocar software dentro de um aviao, precisa seguir o DO-178C. Nao tem opcao B.

O padrao define 5 niveis de criticidade chamados Design Assurance Levels (DAL), de A (catastrofico) a E (sem impacto na seguranca). O nivel muda radicalmente a quantidade de trabalho exigida.

No DAL A, voce precisa de MC/DC (Modified Condition/Decision Coverage). Isso significa que cada condicao individual em cada decisao do codigo precisa ser testada de forma que mostre influencia independente no resultado. Nao basta testar 'if (a && b)' com true/true e false/false. Voce precisa testar cada variavel individualmente pra provar que ela afeta o resultado.

Pra ter ideia do custo: estima-se que software DAL A custa entre 50 e 100 dolares por linha de codigo. Um modulo com 10 mil linhas pode custar 1 milhao de dolares so de verificacao e certificacao. E por isso que reusar modulos certificados e tao atraente na aviacao — e tambem por que o reuso sem auditoria e tao perigoso.

ECSS: software que vai pro espaco

Na industria espacial europeia, o padrao e o ECSS (European Cooperation for Space Standardization), especificamente o ECSS-E-ST-40C pra engenharia de software. A ESA (Agencia Espacial Europeia) usa esse padrao em todos os seus projetos — incluindo, ironicamente, os que vieram depois do Ariane 5.

O ECSS e mais rigido que o DO-178C em alguns aspectos. Software espacial tem um problema extra: voce nao pode fazer hotfix depois do lancamento. Se o codigo tem um bug quando o satelite ou sonda ja ta no espaco, voce precisa contornar com o que tem. Nao da pra fazer 'git revert' em Marte.

Por causa disso, o ECSS exige que todo software espacial tenha modos de operacao degradados. Se o modulo A falha, o sistema chaveie pro modulo B. Se B tambem falha, o sistema entra em safe mode — um estado minimo que mantém a nave funcionando ate o controle de missao descobrir o que fazer.

  1. Requisitos e analise de seguranca
    Cada requisito de software e derivado de um requisito de sistema. Analise de risco (FMEA/FTA) identifica como cada componente pode falhar e qual o impacto. Nenhum codigo e escrito antes dessa etapa estar completa.
    completed
  2. Design com redundancia
    Modulos criticos sao duplicados ou triplicados. Votacao majoritaria decide qual resultado usar quando outputs divergem. Sensores criticos nunca dependem de uma unica fonte de dados (licao que o Boeing nao seguiu no 737 MAX).
    completed
  3. Implementacao restrita
    Subconjunto da linguagem — em C, nada de alocacao dinamica, recursao ou ponteiros pra funcao. Em Ada (linguagem comum em espacial), uso de SPARK pra verificacao formal de partes criticas.
    completed
  4. Verificacao exaustiva
    Testes unitarios, integracao, sistema, aceitacao. Cobertura MC/DC pra modulos criticos. Testes de stress, testes de falha (fault injection), testes de longa duracao. Cada teste precisa de rastreabilidade ate o requisito que valida.
    in-progress
  5. Validacao em ambiente representativo
    Software roda em hardware identico ao de voo. Testes Hardware-in-the-Loop simulam condicoes reais de missao. Anomalias sao investigadas ate a causa raiz — nao se aceita 'funcionou na segunda tentativa'.
    upcoming

Depois do Ariane 5, a ESA adicionou requisitos especificos sobre reuso de software. Todo modulo reutilizado precisa de uma analise de portabilidade formal que compara as condicoes operacionais do contexto original com o novo. Se os ranges de input mudaram, o modulo precisa ser re-verificado. Simples assim.

Verificacao formal: provando que o codigo esta correto

Verificacao formal e o ponto mais alto de garantia de software. Em vez de testar (que so mostra a presenca de bugs, nunca a ausencia), verificacao formal prova matematicamente que o codigo satisfaz sua especificacao pra todas as entradas possiveis.

Parece utopico? Nao e. A Amazon usa verificacao formal no AWS IAM pra provar que as politicas de acesso nao tem brechas. A Airbus usa SPARK/Ada pra verificar formalmente partes do software de voo do A380. A Microsoft usa TLA+ pra verificar protocolos distribuidos no Azure.

O custo de verificacao formal e alto — estamos falando de 10 a 50 vezes mais esforco que testes convencionais. Mas pra sistemas onde o custo de uma falha e inaceitavel, esse investimento se paga. Se o bug do Ariane 5 tivesse sido pego por verificacao formal (que provaria que o valor poderia exceder o range de int16), 370 milhoes de dolares teriam sido economizados.

Testes convencionais

+ Prós

  • • Facil de implementar e automatizar
  • • Rapido pra executar no CI
  • • Todo dev sabe escrever
  • • Bom custo-beneficio pra maioria dos projetos

− Contras

  • • So testa os cenarios que voce pensou
  • • Pode ter 100% de cobertura e ainda ter bugs
  • • Nao prova ausencia de erros
  • • Edge cases exoticos passam despercebidos

Verificacao formal

+ Prós

  • • Prova matematica de corretude
  • • Cobre todas as entradas possiveis, nao so as testadas
  • • Encontra bugs impossiveis de achar com testes
  • • Usado pela AWS, Airbus, Microsoft em sistemas criticos

− Contras

  • • 10-50x mais caro que testes convencionais
  • • Exige especificacao formal (que pode ter seus proprios erros)
  • • Poucos devs dominam as ferramentas
  • • Impraticavel pra sistemas inteiros — melhor pra modulos criticos

Na pratica, verificacao formal e usada em modulos criticos especificos — nao no sistema inteiro. Voce verifica formalmente o modulo de autenticacao, o calculo de dosagem de radiacao, o controlador de voo. O resto usa testes convencionais. Misturar abordagens e a estrategia mais pragmatica.

O que devs de SaaS podem aprender com isso

Voce nao precisa seguir DO-178C pra sua API de agendamento. Seria insano. Mas alguns principios de software critico fazem sentido ate no projeto mais simples — e custam quase nada pra implementar.

Praticas de software critico que cabem no seu SaaS

  • Identificar os modulos criticos do seu sistema (pagamentos, auth, dados sensiveis) e dar tratamento especial pra eles
  • Exigir testes de edge case obrigatorios pra modulos criticos (null, zero, MAX_INT, strings vazias)
  • Nunca depender de um unico servico externo sem fallback (licao do 737 MAX)
  • Auditar codigo reutilizado: comparar premissas do contexto original com o novo (licao do Ariane 5)
  • Ter um 'safe mode' — quando algo da errado, degradar gracefully em vez de crashar
  • Rastreabilidade: cada feature precisa ter issue, PR e testes vinculados
  • Deploy gradual: canary releases pra mudancas criticas (licao do CrowdStrike)
  • Pra modulos financeiros, considerar property-based testing (QuickCheck, fast-check) como alternativa leve a verificacao formal

Property-based testing merece destaque. E um meio-termo entre testes convencionais e verificacao formal. Em vez de voce definir os inputs do teste, a ferramenta gera centenas de inputs aleatorios e verifica se uma propriedade se mantém. Por exemplo: 'a funcao de calculo de preco nunca retorna valor negativo' ou 'serializar e deserializar retorna o mesmo objeto'. Ferramentas como fast-check (JS/TS), Hypothesis (Python) e QuickCheck (Haskell) fazem isso.

A mentalidade de software critico nao e sobre burocracia. E sobre pensar proporcionalmente ao risco. Seu formulario de contato pode ter bugs — e irritante, mas ninguem morre. Seu modulo de pagamento com um bug de overflow pode custar milhares de reais. Trate cada um com o nivel de cuidado proporcional ao estrago que pode causar.

Construa software que resiste

No CrazyStack voce aprende a pensar em resiliencia desde o primeiro commit. Testes robustos, deploys seguros, arquitetura que degrada gracefully. Tudo na pratica, com projetos reais que preparam voce pro mercado.

Acesse crazystack.com.br e leve seu desenvolvimento a serio.

Perguntas frequentes

O que torna um software 'critico'

Software critico e qualquer software cuja falha pode causar morte, lesao grave, dano ambiental significativo ou perda financeira catastrofica. Nao e uma definicao arbitraria — existem padroes internacionais que classificam software por nivel de criticidade. A classificacao mais comum usa o conceito de Safety Integrity Level (SIL), que vai de 1 (menos critico) a 4 (mais critico). SIL 4 e reservado pra sistemas onde uma falha causa 'multiplas fatalidades' — think controle de reatores nucleares ou sistemas de frenagem de trens. A diferenca entre software critico e o seu SaaS nao e a linguagem de programacao ou a stack. E o processo. Em software critico, cada linha de codigo precisa ter rastreabilidade ate um requisito de seguranca. Cada mudanca precisa de analise de impacto formal. Cada teste precisa provar que o software nao faz coisas que nao deveria fazer — nao so que faz o que deveria.

O que devs de SaaS podem aprender com isso

Voce nao precisa seguir DO-178C pra sua API de agendamento. Seria insano. Mas alguns principios de software critico fazem sentido ate no projeto mais simples — e custam quase nada pra implementar. Property-based testing merece destaque. E um meio-termo entre testes convencionais e verificacao formal. Em vez de voce definir os inputs do teste, a ferramenta gera centenas de inputs aleatorios e verifica se uma propriedade se mantém. Por exemplo: 'a funcao de calculo de preco nunca retorna valor negativo' ou 'serializar e deserializar retorna o mesmo objeto'. Ferramentas como fast-check (JS/TS), Hypothesis (Python) e QuickCheck (Haskell) fazem isso. A mentalidade de software critico nao e sobre burocracia. E sobre pensar proporcionalmente ao risco. Seu formulario de contato pode ter bugs — e irritante, mas ninguem morre. Seu modulo de pagamento com um bug de overflow pode custar milhares de reais. Trate cada um com o nivel de cuidado proporcional ao estrago que pode causar.