Pular para o conteúdo
Engenharia de Software

Falhas de Software na NASA: 5 Licoes que Todo

A NASA tem os melhores engenheiros do mundo e mesmo assim perde sondas por bugs de software. Se acontece com eles, imagina no seu deploy de sexta. Aqui

A NASA tem acesso aos melhores engenheiros do planeta, orcamento de bilhoes e processos de qualidade que fariam qualquer big tech chorar. E mesmo assim, ja perdeu sondas, satelites e missoes inteiras por causa de bugs de software.

Isso nao e sinal de incompetencia — e sinal de como software espacial e absurdamente dificil. Se bugs passam pelos processos mais rigorosos do mundo, o que isso te diz sobre o seu deploy de sexta a noite sem review?

Nesse artigo vou contar 5 falhas reais de software na NASA (4 desastres e 1 caso de sucesso) e extrair a licao pratica que voce pode aplicar no seu dia a dia. Nao precisa estar lancando foguetes pra se beneficiar dessas historias.

#1 Mars Climate Orbiter — US$ 125 milhoes por uma conversao de unidade (1999)

Em setembro de 1999, a sonda Mars Climate Orbiter da NASA chegou em Marte apos 9 meses de viagem. O plano era entrar em orbita a 226 km de altitude. A sonda entrou a 57 km — baixo demais. Desintegrou na atmosfera marciana.

O motivo e quase comico de tao simples: o modulo de navegacao da Lockheed Martin enviava dados de impulso em libras-forca por segundo. O software de navegacao do JPL (Jet Propulsion Laboratory da NASA) esperava newtons por segundo. Ninguem validou a interface.

O mais absurdo: a equipe de navegacao notou anomalias na trajetoria durante os 9 meses de viagem. Os dados nao batiam. Mas ninguem escalou o alerta com urgencia suficiente. Tinham dados que mostravam o erro e escolheram confiar no software.

Licao #1: Teste de integracao entre modulos de times diferentes

Falhas de Software na NASA: 5 Licoes que Todo. A NASA tem os melhores engenheiros do mundo e mesmo assim perde sondas por bugs de software. Se acontece com eles, imagina no seu deploy de sexta. Aqui estao 5 falhas reais e as licoes que voce pode aplicar hoje.

#2 Mars Pathfinder — Priority Inversion que quase matou a missao (1997)

O Mars Pathfinder pousou em Marte com sucesso em julho de 1997. Comecou a enviar dados. E ai, de forma aparentemente aleatoria, comecou a resetar. Varias vezes por dia, o sistema reiniciava sozinho e perdia dados coletados.

O problema era priority inversion. O sistema operacional VxWorks rodava tarefas com prioridades diferentes. Uma tarefa de baixa prioridade segurava um mutex que uma tarefa de alta prioridade precisava. Uma tarefa de media prioridade, que nao precisava do mutex, tinha prioridade suficiente pra preemptar a tarefa de baixa prioridade — impedindo que ela liberasse o mutex. A tarefa de alta prioridade ficava travada esperando. O watchdog detectava o travamento e resetava o sistema.

A solucao foi ativar priority inheritance no mutex — um flag do VxWorks que ja existia no codigo mas estava desabilitado. Os engenheiros do JPL enviaram o patch de 6 bytes pra Marte e a missao continuou normalmente.

Licao #2: Entenda a concorrencia do seu sistema

Priority inversion e um problema classico de sistemas operacionais de tempo real. O codigo individual de cada tarefa estava correto. O bug estava na interacao entre elas.

No seu projeto: quando voce tem threads, workers ou processos concorrentes, pense em como eles interagem. Locks, mutexes e semaforos introduzem dependencias implicitas que nao aparecem lendo o codigo de cada funcao isoladamente.

E o melhor: o fix ja estava disponivel. Bastava habilitar um flag que ja existia. A licao e tambem sobre conhecer as ferramentas que voce ja tem.

#3 Spirit Rover — Flash memory cheia no dia 18 (2004)

O Spirit Rover pousou em Marte em janeiro de 2004 e comecou a operar perfeitamente. No dia 18 de operacao, parou de responder. Entrou em modo de reboot continuo — ligava, crashava, reiniciava, crashava, num loop infinito.

A causa: a memoria flash do rover estava cheia. O sistema de arquivos tinha acumulado arquivos de log que nunca eram apagados. Quando o software de inicializacao tentava montar o filesystem, encontrava correcao de erros em cascata e crashava antes de completar o boot.

A equipe do JPL levou 3 semanas pra diagnosticar e enviar um fix. A solucao foi botar o rover em modo de RAM (sem montar o flash), deletar os arquivos antigos e reiniciar normalmente. O Spirit operou por mais 6 anos apos essa correcao.

Licao #3: Limite seus logs e monitore disco

Logs sem rotacao derrubam sistemas. Nao importa se e um rover em Marte ou um servidor EC2. Disco cheio e uma das causas mais comuns de outage e uma das mais faceis de prevenir.

No seu projeto: configure log rotation, defina limite de retencao, monitore uso de disco com alertas em 70% e 90%. E teste o que acontece quando o disco enche. Saber que o sistema falha de forma controlada e tao importante quanto evitar a falha.

#4 Genesis — Sensor invertido, US$ 264 milhoes no deserto (2004)

A missao Genesis coletou particulas de vento solar durante 3 anos e trouxe a capsula de volta pra Terra em setembro de 2004. O paraquedas deveria abrir. Nao abriu. A capsula atingiu o deserto de Utah a 310 km/h e se espatifou.

O motivo: os sensores de aceleracao que detectavam a reentrada na atmosfera estavam instalados de cabeca pra baixo. O sinal que deveria ativar o paraquedas indicava a direcao oposta. O software leu o sensor corretamente — o sensor e que estava errado.

O mais revelador: o erro no design dos sensores foi identificado na revisao do projeto da missao Stardust (semelhante) em 2001, 3 anos antes do crash da Genesis. Mas ninguem cruzou a informacao. A correcao da Stardust nao foi propagada pra Genesis.

Licao #4: Testar o sistema completo, nao so o software

O software da Genesis funcionava perfeitamente. O bug era de hardware (sensor invertido). Mas um teste de integracao end-to-end — simulando a reentrada completa com o hardware real — teria detectado o problema.

No seu projeto: testes unitarios provam que cada peca funciona isolada. Testes de integracao provam que as pecas funcionam juntas. Testes end-to-end provam que o sistema inteiro funciona. Voce precisa dos tres.

E quando corrigir um bug num projeto, verifique se outros projetos semelhantes tem o mesmo problema. A NASA aprendeu isso da pior forma possivel.

#5 James Webb Space Telescope — O caso que deu certo (2021-2022)

Depois de 4 desastres, vou contar um caso de sucesso — porque entender o que deu certo e tao importante quanto entender o que deu errado.

O James Webb Space Telescope (JWST) e o projeto mais complexo da historia da NASA. Custou US$ 10 bilhoes e levou 25 anos de desenvolvimento. O deploy envolvia 344 pontos de falha unicos — se qualquer um deles falhasse, a missao estava perdida. Nao tinha como mandar astronauta consertar porque o telescopio fica a 1,5 milhao de km da Terra.

Em dezembro de 2021, o Webb foi lancado. Nos 30 dias seguintes, todos os 344 pontos de falha executaram perfeitamente. O espelho principal se desdobrou. O sunshield se estendeu. Os instrumentos ligaram. Tudo funcionou de primeira.

Como? Testes. Uma quantidade absurda de testes. O deploy inteiro foi simulado mais de mil vezes em terra. Cada sequencia, cada motor, cada mecanismo foi testado individualmente e em integracao. O software de controle foi verificado formalmente em componentes criticos. Nao confiaram na sorte — provaram matematicamente que ia funcionar.

Licao #5: O que a NASA faz que voce deveria copiar

Simulacao exaustiva: teste seu sistema em condicoes que imitam producao, nao so em ambiente de dev

Revisao independente: ninguem revisa o proprio codigo. Revisores nao participaram do desenvolvimento

Verificacao formal de componentes criticos: prove que funciona, nao so teste e torce

Checklist operacional: cada operacao tem um checklist. Nao confie na memoria humana

Margens de seguranca: o Webb foi projetado com margens tao generosas que vai operar por 20 anos em vez dos 5 planejados. Margem e o oposto de otimizacao prematura

O que a NASA faz que voce deveria copiar

Voce nao precisa do orcamento da NASA pra usar as praticas da NASA. Aqui vai o que faz sentido pra qualquer time de desenvolvimento:

  1. Rastreabilidade: cada funcionalidade deve ter um requisito documentado. Cada teste deve mapear pra um requisito. Nao escreva codigo que ninguem pediu
  2. Revisao formal de premissas: quando reutilizar codigo, documente as premissas do contexto original e valide se elas se aplicam ao novo contexto
  3. Testes de integracao entre times: quando dois sistemas trocam dados, teste o contrato. Nao confie em docs — confie em testes automatizados
  4. Post-mortem sem culpa: quando algo da errado, investigue a causa raiz sem culpar individuos. O objetivo e consertar o processo, nao punir a pessoa
  5. Checklist operacional: deploy, rollback, incidente — tudo tem checklist. Memoria humana falha sob pressao
  6. Margem de seguranca: nao otimize ate o limite. Use int64 onde int32 'bastaria'. Use timeout generoso onde 'provavelmente nao precisa'. A margem e o que te salva quando a premissa esta errada

A NASA nao e perfeita — os 4 desastres nesse artigo provam isso. Mas a forma como eles aprendem com os erros e aplicam as licoes e o que os torna a referencia mundial em software critico.

Perguntas frequentes

A NASA usa metodologia agile?

Depende do projeto. Missoes criticas como o JWST usam processos mais proximos de waterfall com gates formais de revisao. Projetos de pesquisa e ferramentas internas usam metodologias mais ageis. O JPL tem experimentado com praticas ageis adaptadas desde os anos 2010, mas sempre com as salvaguardas de verificacao e validacao que software espacial exige.

Quanto custa testar software da NASA comparado com software normal?

Em software critico espacial, testes e verificacao podem consumir 50-70% do orcamento total do projeto. Em software comercial, testes tipicamente consomem 15-25%. A diferenca e que em software espacial voce nao pode fazer hotfix — ou funciona de primeira ou a missao acaba.

O Mars Helicopter Ingenuity rodava Linux de verdade?

Sim. O Ingenuity foi a primeira aeronave a voar em outro planeta e rodava Linux em um processador Qualcomm Snapdragon 801. O software de voo foi escrito em C++ com framework JPL F Prime. Foi uma aposta ousada — usar hardware e software comerciais em vez de componentes espaciais certificados — e funcionou.

Perguntas frequentes

A NASA ja perdeu missao por causa de bug de software?

Sim, varias vezes. O caso mais famoso e o Mars Climate Orbiter (1999), perdido por causa de uma conversao de unidades errada entre libras-forca e newtons. O prejuizo foi de US$ 125 milhoes. Outros casos incluem a Genesis (2004) e o Mars Polar Lander (1999).

O James Webb Space Telescope teve problemas de software?

Na verdade, o James Webb e um caso de sucesso de software espacial. Apesar de 14 anos de atraso e US$ 10 bilhoes de custo, o deploy dos 344 pontos de falha funcionou perfeitamente. O software foi testado mais de mil vezes em simulacao antes do lancamento.

Que linguagem de programacao a NASA usa?

A NASA usa diversas linguagens dependendo do projeto. Missoes criticas historicamente usam C, Ada e Assembly. Sistemas de solo geralmente usam Python, Java e C++. O Mars Helicopter Ingenuity rodou Linux com codigo C++. A linguagem mais associada a software critico espacial e Ada.

Como a NASA testa software?

A NASA segue o padrao NPR 7150.2 para software critico. Isso inclui: revisao formal de codigo com multiplos revisores independentes, testes exaustivos em ambientes que simulam condicoes espaciais, verificacao formal de componentes criticos, e testes de integracao end-to-end em hardware real. O processo e significativamente mais rigoroso que a industria convencional.

O que a NASA faz que voce deveria copiar

Voce nao precisa do orcamento da NASA pra usar as praticas da NASA. Aqui vai o que faz sentido pra qualquer time de desenvolvimento: A NASA nao e perfeita — os 4 desastres nesse artigo provam isso. Mas a forma como eles aprendem com os erros e aplicam as licoes e o que os torna a referencia mundial em software critico.