Não é tão simples responder isso. Obviamente que existem algumas coisas, mas a prática mostra que pode ser muito pouco.
Aí vem a definição do que é um programador. Algumas pessoas dizem, o que acho equivocado, que se você sabe fazer um Hello World você é programador. Aí obrigatório é só saber reproduzir algumas letras em um editor e conseguir entregar para alguém, eventualmente subir com alguma ferramenta (FTP por exemplo) para um servidor disponível. Pela definição de alguns isso já é um programador backend e é obrigatório.
Partindo daí vem gradações de obrigatório. Seria obrigatório para conseguir ser um pouco melhor, conseguir fazer coisas realmente úteis. E entramos no programático para o que eu chamo de ser programador de verdade, aquela pessoa profissional da área com P maiúsculo, que realmente entende de tudo o que precisa na área.
Para cada pessoa que você perguntar falará coisas diferentes entre o Hello World e o desenvolvedor de software profissional completo.
Eu gosto muito de dizer que o profissional começa bem quando ele tem algum domínio da matemática, comunicação e expressão e ciências. Isso é obrigatório em grande parte das profissões que exigem qualificação. As pessoas esquecem disso. Muita gente quer pular para a programação sem ter isso em ordem. Não funciona. Todo o resto ficará picotado. Eu coloco isso como obrigatório em primeiro lugar. Eu sei que muita gente está pensando "não é disso que a pergunta quer saber", mas justamente porque é frequente as pessoas não se preocuparem com isso que é importante falar. Não tem casa sólida sem o alicerce, mesmo que você não veja ele e parece que não é importante.
Programação é matemática, como vai se dar bem com isso sem ela? Como vai interpretar instruções da documentação e de outras epssoas se não sabe interpretar texto ou fazer as perguntas adequadamente para chegar a informação que precisa? Como vai pesquisar e separar o joio do trigo sem método científico para obter o que falta para realizar a tarefa da forma correta?
Daí começo a falar em computação e engenharia de software. Se não entender a base disso não fará bons softwares. Não precisa dominar tudo, mas a base precisa estar clara. Também pode parecer que não é tão obrigatório assim, mas quando a pessoa aprende por intuição sem o fundamento das coisas que vai trabalhar, frequentemente ela aprende meio certo e meio errado, ela não pode nem contestar o que está aprendendo, e ela aprende o erro. Se aprende o erro, treina ele, e treinando, vai se solidificando e é ele que fará para sempre.
Teve um caso que respondi uma postagem aqui de uma pessoa que teve a melhor das intenções de postar algo ensinando outras pessoas. Está tudo errado. Ela aprendeu algo de forma errada e quando eu contestei (tentei ser sutil) ele insistiu no erro, começou dar referência falsa para justificar o erro como se fosse certo. Ele contestou o meu conhecimento, eu mostrei minhas credenciais, ele ficou bravo me ofendeu, não assumiu a responsabilidade e apagou a postagem, o que chamamos isso de xadrez de pombo. Isso é um exemplo do que acontece quando a pessoa aprende errado.
E é muito fácil aprender errado hoje em dia com a internet. Esta maravilhosa ferramenta é a casa do capeta. Tem muita coisa errada disponível, tem que tomar muito cuidado.
As redes sociais deram voz a uma legião de imbecis -- Umberto Eco
Estou só ecoando. Sei que algumas pessoas não gostam de ver algo assim, mas talvez seja sintoma. Me desculpe, não quero ofender ninguém, mas é preciso ser dito para que a pessoa saiba sair de um ciclo vicioso. Os demais entendem isso e sabem que é importante. Não tome isso como algo destrutivo, eu quero a sua evolução. De qualquer forma eu acho que você tem direito à escolha, até de ser algo ruim para a sociedade e para você mesmo (estou obviamente falando hipoteticamente, quase todo mundo que está lendo isso faz escolhas adequadas).
Obviamente que a pessoa precisa saber codificar, e em uma linguagem que permita usar no backend (virtualmente todas). Pode usar JavaScript com Node, ou TypeScript (tecnicamente pode ser JS) com Deno, pode ser PHP, Python, Java, C#, Go e muitas outras, até C pode, embora pouco recomendado para a maioria dos casos. Tem que aprender um passo de cada vez. tem que dominar todas as estruturas de controle, variáveis, tipagem, e boa parte da biblioteca básica, e o principal da biblioteca que se comunica com o servidor HTTP (eu considerando que trabalhará com backend web, porque o termo costuma ser usado assim, embora exista backend de outras coisas, o que é um dos erros que as pessoas costumam aprender).
Eu sei que eu sou chato, mas pra mim é obrigatório a pessoa conseguir se comunicar corretamente com outros profissionais. Eu sei que boa parte das pessoas não acham isso e por essa razão está tudo ficando deteriorado e as cada dia tem mais vagas não preenchidas. Tem que saber os termos corretos. Tem Que saber em detalhes o'que é uma variável (ela é um padrão de projeto, você sabia?), não pode ser superficial, porque senão vai usar errado e não vai perceber.
Muitas pessoas, muitas mesmo, não sabem o que é a linguagem, o que é o runtime, o que é o compilador, o que é o IDE, etc.. Isso é mais que obrigatório, mas as pessoas conseguem entregar algum resultado sem saber, então alguns dirão que não é obrigatório. Você só vai usar bem quando parar para pensar sobre tudo isso. Porque é o IDE e não a IDE. Eu sei que parece bobo, mas de novo, é aprender tudo com mais buracos do que "queijo suíço".
Ter um entendimento básico de infra para subir os projetos, conseguir configurar os serviços no teste e em produção parece obrigatório também. Dominar não é obrigatório, mas é importante.
Entender de segurança, não no nível do profissional especializado, mas ter um forte entendimento, até para saber quando procurar ajudar é obrigatório. Hoje boa parte dos servidores estão vulneráveis, muitos até são zumbis trabalhando para crackers e as pessoas nem sabem.
Docker não é uma infra obrigatória, pelo contrário. A maioria das pessoas na área nunca usaram ou nunca usarão. Mas ele pode ser bem útil. Para algumas vagas é obrigatório.
E aí é onde mora o problema. Obrigatório mesmo depende da vaga. Cada uma pode colocar o que quer. De que adianta você estudar (o que inclui prática) algo se uma vaga quer outra coisa e não liga para o que estudou?
Quando falamos de infra pode não ser tão obrigatório em um primeiro momento, mas precisa entender como a internet funciona, como é um servidor HTTP, DNS, etc., um navegador, o protocolo, a base de HTML e coisas dos tipo (não é saber usar um HTML, mas tem que entender o papel dele, afinal você vai entregar muito, feito por outra pessoa).
Se aprender um pouco de infra é quase certo que terá que saber o básico de Linux, ou então toda parte de servidor do Windows.
Não é tão obrigatório para um júnior, mas tem caso que entender de arquitetura pode ser importante. Em geral essas decisões não cairão na sua mão, a não ser que você seja solo. Aí precisa saber pelo menos que deve fazer o mais simples possível, que funcione bem e tenha algum futuro. Se está fazendo solo é para ser muito simples. A não ser que tenha um justificativa bem plausível, sem muita especulação, deve evitar qualquer opção que gere complexidade, seja porque não tem experiência para fazer uso adequado, seja pela desnecessidade. Quem é júnior tende a fazer algo mais complexo do que deveria, em alguns casos para inchar currículo. Tá cheio de gente que diz que já trabalhou com microsserviços em projeto solo. Se você ainda não entende bem da área, não está rolando de rir.
Claro que solo você será full stack (não gosto muito do termo, mas whatever), então pode ser semisolo.
Um banco de dados como o MariaDB provavelmente é fundamental. Mas tem que aprender modelar mais que usar a ferramenta. Pra mim, entender de álgebra relacional é mais obrigatório que saber o básico de SQL, mas a maioria vai dizer que só o SQL está bom. Pode querer saber do PostgreSQL, SQLite, e outros. Alguns preferirão o MongoDB. Eu acho que é um erro para boa parte dos projetos que as pessoas usam (parece mais fácil, mas cobra um preço em qualquer projeto não trivial que ele não seja o mais adequado, mas enfim...).
Muitas vezes a pessoa quer aprender o avançado sem dominar a base, isso não dá certo. Não vai de OOP antes de dominar toda parte imperativa da programação que é o que você fará em mais de 90% do tempo que está codificando (boa parte das pessoas passam mais tempo fazendo outras coisas que codificar), deixem design patterns famosos para depois quando entender como usá-los bem, mas tenha em mente que eles existem. A lógica importa muito mais. A organização do código vem logo depois. Não deve demorar tanto para começar a ver isso, especialmente se começar a fazer coisas maiores, mais sérias.
Algumas pessoas colocarão que deve aprender MVC, um framework, mas isso não é obrigatório, pelo contrário. Isso pode ajudar a entregar algo mais rápido, mas queima o aprendizado. Não use a calculadora antes de aprender a fazer conta de cabeça.
Não é exatamente obrigatório, mas logo precisará lidar com controle de versão. É quase certo que seja Git, mas SVN tem lá suas vantagens para certos cenários.
E aí vai somando outros conhecimentos.
Quam tem a base muito boa, pode ser aceito para trabalhar com tecnologia que não domina. POde se dar bem com algo que não seja Node.
Faz sentido para você?
Espero ter ajudado, gastei um tempo para isso, espero que entenda os puxões de orelha :)
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).