O que você precisa saber sobre a existência precede a essência.
Muita gente ouve essa frase e acha que é um pensamento bonito sobre liberdade. Não é. É uma afirmação técnica sobre como funções, objetos e sistemas se comportam em runtime. O conceito original de Sartre foi puxado pra fora da filosofia e aplicado a várias áreas, mas o cerne é sempre o mesmo: o que algo é só faz sentido depois que ele existe de fato. Vou explicar do jeito que eu uso no dia a dia, sem teoria geral primeiro.
Por que a existência precede a essência importa na prática.
No desenvolvimento de software, isso aparece todo dia quando você cria algo que só recebe sua forma real durante a execução. Não na compilação, não no design, não na documentação. Na execução. Aí entra o conceito de forma pura. Eu já perdi tempo demais com um problema específico que vou descrever agora. Estava construindo um sistema de plugins para uma aplicação Ruby on Rails. A ideia era carregar extensões sob demanda, sem pré-carregamento. Cada plugin seria instanciado apenas quando um evento específico acontecesse no fluxo da aplicação. Até aqui, tudo tranquilo.
O problema veio quando dois plugins precisavam compartilhar o mesmo objeto de configuração, mas esse objeto só poderia ser criado depois que o primeiro plugin fosse carregado e validasse seus próprios dados. Se eu tentasse criar a configuração antes, o sistema entrava em loop infinito de dependências circulares. A essência do objeto configuração só existia após o plugin A ter sido carregado. Tentar forçar a criação antecipada causava falhas silenciosas que apareciam só em produção, nunca em ambiente de teste. Levei três dias pra entender o padrão por trás disso. A workaround que funcionou foi simples: em vez de pré-criar a configuração, eu usei um lazy loader que só instanciava o objeto quando realmente era necessário, passando por ele como uma promessa ou classe singleton com inicialização preguiçosa. O dado central do problema é que a configuração precisa existir primeiro pra que sua estrutura possa ser definida corretamente depois.
Isso é exatamente o que significa a existência precede a essência em termos concretos. Você não consegue definir a forma do objeto antes dele estar vivo no sistema.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Como aplicar esse raciocínio no seu trabalho diário.
A regra básica é: identifique quais entidades do seu projeto dependem de estados ou valores que só aparecem em runtime. Essas são as candidatas naturais a objetos cuja essência é determinada pela existência. Um erro comum que eu vejo acontecer com frequência é tentar injetar dependências em classes que ainda não foram carregadas. Isso gera erros de referência nula que parecem aleatórios, mas na verdade são previsíveis. Se você tem um módulo B que depende de um valor calculado pelo módulo A, e o módulo A só é inicializado durante uma interação do usuário, criar o módulo B no início da aplicação vai falhar.
Outro detalhe que começa a doer em escala: quando você trabalha com frameworks reativos ou sistemas event-driven, a existência de cada entidade é governada pelo ciclo de eventos, não pelo ciclo de inicialização. Isso significa que a ordem de importação nos seus arquivos não reflete a ordem real de criação dos objetos. Eu tenho visto muita gente tentar resolver isso com imports condicionais ou com padrões de DI container mal configurados. A solução mais limpa costuma ser separar a definição da instância e tratar a criação como um evento separado do carregamento do módulo. Se você estiver usando TypeScript, por exemplo, tipos como unknown ou any podem ser usados como ponte enquanto a existência do dado ainda não foi confirmada, mas isso é remendo. O jeito certo é estruturar seu código para que a validação da existência seja parte do fluxo normal, não um tratamento de exceção.
Existem casos em que esse padrão não funciona bem. Sistemas legados com código espaguete, aplicações monolíticas sem separação clara de camadas, ou projetos onde a equipe não tem maturidade suficiente pra lidar com inicialização tardia. Nesses cenários, forçar a injeção de dependências ou criar wrappers desnecessários só aumenta a complexidade sem resolver o problema raiz. Às vezes o melhor caminho é refatorar a arquitetura ou aceitar que algumas partes do sistema precisam ser simplificadas.
Dica rápida pra quem tá começando.
Antes de definir a estrutura de qualquer objeto ou classe, pergunte: isso já existe no momento em que eu preciso dele? Se a resposta for não, você está lidando com um caso de existência precedente à essência. Trate isso separadamente.