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.
DAL A — Catastrofico
Falha causa queda do aviao. Exige verificacao formal, MC/DC coverage, revisao independente de cada artefato. Custo: ate 100x mais que software normal.
DAL B — Perigoso
Falha causa condicao perigosa com reducao de margem de seguranca. Exige Decision Coverage e revisoes formais. Custo: 50x mais que software normal.
DAL C — Maior
Falha causa desconforto ou aumento de carga de trabalho do piloto. Statement Coverage e testes sistematicos. Custo: 20x mais que software normal.
DAL D — Menor
Falha causa inconveniencia pro piloto. Testes basicos e documentacao minima. Custo: 5x mais que software normal.
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.
- Requisitos e analise de segurancaCada 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
- Design com redundanciaModulos 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
- Implementacao restritaSubconjunto 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
- Verificacao exaustivaTestes 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
- Validacao em ambiente representativoSoftware 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.