A ferramenta da sua stack que silenciosamente chegou ao fim da vida
Fim de vida é uma data que alguém publicou, você só não estava inscrito nela. Um watch sobre o ciclo de vida da sua stack revela o pôr do sol enquanto você ainda tem espaço pra se mexer.
Apollo Space Research
Apollo Space
A queda começou com um build verde. Os testes passaram, o deploy saiu, o tráfego fluiu. Três dias depois, uma biblioteca de pagamentos parou de aceitar um handshake TLS que um provider upstream havia silenciosamente aposentado, e a página de checkout começou a retornar erros que ninguém tinha tocado em meses. O post-mortem achou a causa em quatro minutos: a biblioteca tinha sido declarada fim de vida onze meses antes, com uma data de pôr do sol publicada, um guia de migração, e um banner na homepage do projeto. Ninguém no time jamais tinha visto nada disso.
Essa é a parte que vale parar pra pensar. A falha não foi uma surpresa. Foi um anúncio em que ninguém estava inscrito.
Fim de vida é uma data que alguém publicou. Você só não estava inscrito nela. Este post é sobre por que essa lacuna existe em toda stack, por que as correções de sempre não a fecham, e como é quando algo fica de olho no ciclo de vida das suas ferramentas do jeito que um bom engenheiro de ops faria, se um bom engenheiro de ops nunca dormisse e nunca ficasse entediado.
A versão ingênua: você vai perceber quando importar
Pergunte à maioria dos times como eles acompanham o fim de vida das coisas das quais dependem, e a resposta honesta é: eles não acompanham. Eles percebem.
O modelo é reativo por design. Uma biblioteca entra porque resolveu um problema numa terça-feira. Um fornecedor de SaaS ganha um contrato porque alguém precisou da feature naquele trimestre. Uma versão de runtime é fixada porque era a mais recente na época. Aí as três recuam pro plano de fundo, e o plano de fundo é onde elas deveriam morar. Você não pensa na sua fundação. É esse o ponto inteiro de uma fundação.
O problema é que a fundação tem uma data de validade que você nunca anotou. O mantenedor da biblioteca segue em frente. O fornecedor é adquirido e encerra a linha de produto. A versão de runtime sai do suporte de segurança. O cloud provider posta um aviso de deprecação pra uma API que o seu código chama quarenta vezes por segundo. Cada uma dessas coisas é anunciada, num changelog, numa status page, num feed RSS de release notes, numa nota de uma linha numa versão menor. E cada anúncio pousa num lugar que nenhum humano do seu time lê, num dia em que ninguém estava olhando.
Então “você vai perceber quando importar” acaba significando “você vai perceber quando quebrar.” Esses não são o mesmo momento. Quando importa do jeito que você consegue sentir, a janela em que se mexer era barato já fechou.
O custo aqui não é a migração. Migrações são trabalho normal. O custo é quando você é forçado a fazê-la: sob um incidente, com a página fora do ar, sem tempo de testar, escolhendo o patch mais rápido em vez do certo. Um pôr do sol que você viu chegando é um sprint. Um pôr do sol que te surpreende é uma queda com uma migração aparafusada na frente.
Por que as correções óbvias não seguram
A objeção razoável é: isso é um problema resolvido. Faça uma auditoria. Fixe um dependency scanner. Coloque no checklist trimestral. Eis por que cada uma dessas vaza.
A auditoria é um snapshot, e ciclos de vida são um alvo em movimento. Você audita em janeiro, está tudo suportado, fecha o ticket. Em março um mantenedor posta um aviso de pôr do sol pra uma coisa que estava ok em janeiro. A auditoria não deixou passar. A auditoria simplesmente já tinha acabado quando a notícia chegou. Uma checagem pontual contra um risco contínuo está sempre um anúncio atrás.
O dependency scanner pega uma coisa diferente. Scanners são feitos pra vulnerabilidades conhecidas, uma CVE cai, a ferramenta sinaliza a versão afetada. Isso é real e vale ter. Mas fim de vida não é uma vulnerabilidade. É uma mudança de status. Uma biblioteca pode estar perfeitamente segura hoje e fim de vida hoje; o scanner não vê CVE nenhuma e não diz nada, até o exato momento em que a vulnerabilidade não corrigida que vai chegar não tem onde pousar porque o projeto está morto. O scanner fica de olho no bug. Ninguém fica de olho no pôr do sol.
O checklist trimestral falha pelo motivo mais humano de todos. Ele depende de uma pessoa lembrar de olhar, no lugar certo, em dezenas de fornecedores e centenas de dependências, enquanto faz o trabalho de verdade dela. No primeiro trimestre é minucioso. No quarto é um carimbo automático, porque checar o status de ciclo de vida de cada linha de um lockfile à mão é exatamente o tipo de trabalho em que humanos são piores, alto volume, baixo risco-até-deixar-de-ser, e invisível quando bem feito. Você só descobre que o checklist apodreceu no dia em que a coisa que ele devia pegar cai.
O gargalo nunca desaparece. Ele só se move, de “isso foi anunciado?” (sempre é) pra “alguém está escutando?” (quase nunca).
A forma da correção: inscreva-se no ciclo de vida, não na quebra
Aqui está o reframe em que a coisa toda gira. O anúncio existe. O guia de migração existe. A data existe. A única peça faltando é uma inscrição permanente que conecte a coisa que está sendo aposentada ao lugar onde você depende dela e te avise enquanto a data ainda está no futuro.
Fim de vida é uma data que alguém publicou. Você só não estava inscrito nela. Então construa a inscrição.
Isso se decompõe em três tarefas, e nenhuma delas é glamorosa, que é exatamente por que nenhum humano as faz de forma confiável.
Saiba do que você de fato depende. Não as dependências que você lembra, as que você tem. O lockfile, a versão de runtime, a lista de fornecedores com contrato, as cloud APIs que o seu código chama, os serviços de terceiros por trás das suas integrações. Essa é a parte que a maioria do tracking de ciclo de vida pula, porque é tediosa de montar e ela deriva no momento em que alguém adiciona um pacote. Tem de ser lida da fonte de verdade, continuamente, não transcrita pra uma planilha uma vez.
Fique de olho onde os pores do sol são anunciados. Changelogs, release notes, status pages de fornecedores, feeds de deprecação, a versão onde “deprecated” aparece pela primeira vez numa docstring. Essas fontes são públicas e legíveis por máquina e quase inteiramente não lidas. Um watch as lê num cronograma, não porque a leitura é difícil, mas porque fazê-la todo dia em cada fonte é precisamente o trabalho que a atenção não consegue sustentar.
Case as duas e ranqueie por tempo-até-morder. Um aviso de pôr do sol pra uma biblioteca que você não usa é ruído. Um aviso de pôr do sol pro runtime que três serviços compartilham, com uma data dentro da sua próxima janela de planejamento, é a coisa mais importante da sua semana. O valor não é a lista de anúncios. É o join, este aviso, contra esta dependência, pousa assim de perto, então mexa agora e não depois.
Faça essas três coisas continuamente e a surpresa some. Não porque nada é aposentado, coisas são aposentadas o tempo todo, mas porque o pôr do sol chega até você como uma data no calendário em vez de um stack trace em produção.
Por que um watch, e não um scanner mais inteligente
A tentação é transformar isso em mais um scan, rode toda noite, faça o diff do output, alerte nas mudanças. Isso é mais perto, mas ainda erra a coisa que torna a falha cara.
Um scan te diz o estado de hoje. Um watch entende a trajetória. A diferença importa porque fim de vida raramente é um único evento, é uma curva de descida. Uma versão vai de “atual” pra “manutenção” pra “só segurança” pra “fim de vida” pra “ativamente perigosa”, cada passo publicado com meses de distância. Um scan que só dispara no estado final te entrega a emergência. Um watch que vinha lendo a trajetória te avisa na fase de manutenção, quando você tem trimestres, não na fase perigosa, quando você tem horas.
E um watch consegue raciocinar sobre o que o pôr do sol significa pra você especificamente, o que um alerta genérico não consegue. “A biblioteca X é fim de vida” é um fato. “A biblioteca X é fim de vida, você depende dela no caminho de checkout, o guia de migração do mantenedor aponta pra biblioteca Y, e três dos seus serviços precisariam da mesma mudança” é um briefing, do tipo que um engenheiro cuidadoso escreve depois de uma hora cavando, exceto que ele está te esperando antes de você saber que precisava cavar.
Essa é a jogada em torno da qual a Apollo é construída: não uma query mais rápida contra a sua stack, mas um agent permanente que lê as fontes de ciclo de vida, segura um mapa vivo do que você depende, e fala primeiro quando uma data está se aproximando. O cérebro lembra o que você está rodando. O watch lê o mundo em busca de mudanças nele. O agent compõe o join em algo sobre o qual você pode agir, e o registra como trabalho, com o guia de migração já linkado, antes do pôr do sol virar um incidente.
Não é que a máquina sabe algo que você não conseguiria achar. É que ela achou antes de você precisar, enquanto o anúncio ainda estava fresco e a data ainda estava longe.
O que “a tempo” de fato vale
Coloque um número nisso do único jeito honesto, como uma forma, não como uma afirmação. Suponha que um runtime do qual você depende poste o fim de vida dele dezoito meses no futuro, do jeito que plataformas maduras normalmente fazem. Pego no anúncio, a migração é um épico planejado: agendado, testado, espalhado por um sprint tranquilo, entregue com confiança. Pego no prazo, é a mesma migração feita num fim de semana sob um precipício de deprecação. Pego depois, quando a primeira vulnerabilidade não corrigida pousa na versão morta, é a migração mais um incidente mais uma auditoria mais a conversa com um cliente sobre por que a coisa estava fora do ar.
Mesma migração, três preços. O trabalho não mudou. Só o aviso mudou.
Essa é a lei geral por baixo deste tópico inteiro. A parte cara de um pôr do sol nunca foi o se mexer. Foi não saber a tempo de se mexer com calma. Cada real que a surpresa custa é um real que a inscrição teria economizado, não fazendo a migração por você, mas te entregando ela enquanto ainda era uma escolha em vez de uma crise.
E isso compõe ao longo de uma stack. Uma biblioteca é um item de checklist. Cem dependências, uma dúzia de fornecedores, três runtimes, e uma fleet de cloud APIs, cada um com o próprio relógio de ciclo de vida tiquetaqueando no próprio cronograma, é uma superfície que nenhuma pessoa consegue segurar na cabeça. O watch não cansa na dependência número quarenta. Ele lê todas elas com a mesma atenção, todo dia, e só fala quando uma delas está prestes a importar.
A virada: pare de ser o calendário que ninguém atualiza
Tire os changelogs e os lockfiles e aqui está o que de fato está acontecendo.
Na maioria das empresas, a pessoa que acompanha fim de vida é ninguém, e no time raro onde é alguém, esse alguém está carregando um calendário na cabeça que tem de manter atualizado manualmente contra um mundo que muda sem avisar. É o engenheiro que meio que lembra que a biblioteca de auth “pode estar sendo deprecada,” o ops lead que pretendia checar a janela de suporte do runtime no trimestre passado, o fundador que descobre que um fornecedor encerrou o plano dele pelo e-mail de cancelamento. Parece diligência. Na verdade é uma ansiedade permanente sem sistema nenhum por trás.
Esse trabalho nunca foi um bom uso de uma pessoa. Lembrar de uma data que mora no changelog de outra pessoa não é julgamento, e julgamento é a única coisa em que as suas pessoas são insubstituíveis. O ponto de inscrever o sistema no ciclo de vida não é substituir o engenheiro que teria pego. É libertar o engenheiro que estava pegando, por estresse, por sorte, às 2 da manhã, pra gastar aquela atenção no design da migração em vez de na descoberta dela.
O pôr do sol está vindo pra alguma coisa na sua stack agora mesmo. Já foi anunciado. A única pergunta em aberto é se você o lê numa terça com meses de sobra, ou num sábado com a página fora do ar.
É isso que estamos construindo na Apollo Space, não um alerta mais alto depois da quebra, mas um watch que lê o ciclo de vida da sua stack enquanto ele ainda está silencioso e te entrega o pôr do sol como uma data em torno da qual você pode planejar. Fim de vida é uma data que alguém publicou. A boa notícia é que você não precisa ser quem lembra de ir procurar por ela.
A Apollo cuida da operação repetitiva da sua empresa pro seu time não precisar.
Entre na lista de espera: acesso antecipado, preço de usuário fundador e um lugar na primeira fila enquanto a gente constrói.
Entrar na lista de esperaA morte lenta da voz de um marketeiro
Você publica uma peça real por semana e silenciosamente a traduz em dez, e cada tradução é uma pequena chance de soar um pouco menos como você mesmo. Construímos o OS porque nada no mercado estava guardando isso.
Pensamento de ProdutoNo dia em que alguém pede demissão, sua empresa esquece como ela funciona
Onboarding não está quebrado porque o treinamento é ruim. Está quebrado porque sua empresa não consegue lembrar, e cansamos de ver a resposta sair pela porta.
Pensamento de ProdutoA primeira coisa que um novo contratado deveria fazer é ler a empresa
Um ótimo onboarding não te entrega docs, ele já sabe quem você é quando você faz login.