O que é mutation?

Uma mutation no contexto de software funcional é simplemente um assignment, ou qualquer coisa que altera o valor de um objeto depois que ele foi criado.

Onde está essa mutation nesse bloco de código?

.set()

Neste trecho de código, os assignment acontecem apenas no momento da criação da variável por isso não são mutações neste caso.

As funções setPeopleByCompany(), setPeopleNotCheckedIn(), provavelmente vão fazer mutações, mas isso não fica claro neste trecho código.

Qual seria a melhor alternativa pra trabalhar isso?

A abordagem de utilizar variáveis constantes e atribuir os valores no momento da criação, como feito no código é uma excelente prática em muitos cenários, especialmente em programação funcional ou em contextos onde a imutabilidade é valorizada.

E por quê?

Código que evita mutações é geralmente mais fácil de entender, raciocinar e depurar. Como o estado de um objeto ou variável não está constantemente mudando, fica mais claro entender o que um trecho de código fará. Código imutável tem um fluxo de controle mais claro e previsível.

Dados imutáveis são naturalmente seguras para uso em threads, pois não existem problemas com múltiplas threads tentando modificar os mesmos dados simultaneamente. Já que ninguém pode modifical o dado. Isso facilita a escrita de código concorrente e paralelo de forma segura.

O que é imortante entender no conceito de programação funcional? Comparando com SOLID para POO é importante entender sobre Função Pura, mas o que mais?

A imutabilidade é um dos princípios de programação funcional que todo progrmador deve conhecer. Além disso é imporante saber sobre Composição de Funções, Currying, Tipagem Forte, e talvez, apenas talvez Monads.

Recursividade faz parte de falar sobre programação funcional?

Sim, e não. A recursividade é uma parte fundamental de qualquer paradigma de programação. Embora a recursão não seja exclusiva da programação funcional, ela desempenha um papel particularmente importante na programação funcional. Isso ocorre por que em vez de usar loops tradicionais, frequentemente se usa recursão para realizar iterações ou repetições. Além disso a recursividade se alinha bem com estruturas de dados imutáveis, que são o mais básico da FP.

Linguagens puramente funcionais como Haskell, sequer têm estruturas de Loop nativamente.

E falando nelas, embora o JS e muitas outras linguagens modernas possam (e devem) ser usadas de forma funcional, para realmente compreender este paradigma é altamente aconselhavel estudar e praticar programação com linguagens puramente funcionais, embora Haskell seja talvez a melhor do ponto de vista puramente academico, eu pessoalmente recomendaria conhcer Clojure ou Elm.

Além disso recomendo fortemente esse pequeno livro maravilhoso:

https://github.com/MostlyAdequate/mostly-adequate-guide

O quão é importante conhecer o 'Event Loop' e conseguir explicar?

Conhecer e compreender o 'Event Loop' é extremamente importante para programadores, especialmente aqueles que trabalham com JavaScript ou outras linguagens que operam em um modelo de programação assíncrona. Saber como as funções assíncronas são tratadas, como os callbacks são enfileirados e processados, e como a concorrência é gerenciada é crucial para escrever código eficiente e evitar erros comuns. Um programador de verdade precisa saber exatamente, quando cada linha de código vai ser executada. E entender o Event Loop, é fundamental para isso.

Problemas como bloqueio do thread principal, gerenciamento ineficiente de tarefas assíncronas e outros problemas de performance estão frequentemente ligados a um entendimento insuficiente do Event Loop. Um conhecimento sólido nessa área é fundamental para evitar esses problemas.

A verdade é que muitos desenvolvedores JavaScript não têm esse conhecimento. Por isso recorrem a async/await e promises, sem entender os fundamentos por trás dessas abstrações. Eles acreditam que callbacks são inferiores ou obsoletos comparados a promises e async/await. No entanto, callbacks são quase sempre a escolha certa.

Entender o Event Loop é fundamental para entender quando usar cada um desses padrões.

Se eu não sou Jr pra ele, o que o Pleno precisa saber pra ser Pleno? E o Sr?

A transição de Junior para Pleno e de Pleno para Sênior em uma carreira de desenvolvimento de software não é uma questão de conhecimento técnico acumulado, mas principalmente de experiência prática e a capacidade de aplicar esse conhecimento de maneira eficaz. Autonomia, liderança técnica, habilidades interpessoais e compreensão dos objetivos de negócios são alguns exemplos do que não é esperado de Jr. Conhecimento técnico, não está nessa lista.


Acho que respondi tudo, certo? Quaisquer outras dúvidas não hesite em perguntar,

Um abraço e bons estudos!

Massa demais, principalmente a parte da Mutation, era básicamente onde estava o maior 'gap'. Eu tinha essa ideia do motivo de ser uma 'vantagem' trabalhar dessa forma, mas essa parte

Dados imutáveis são naturalmente seguras para uso em threads, pois não existem problemas com múltiplas threads tentando modificar os mesmos dados simultaneamente. Já que ninguém pode modifical o dado. Isso facilita a escrita de código concorrente e paralelo de forma segura.

conseguiu me fazer compreender bem a importância. E faz todo sentido, é o famoso caso, depois que entende parece óbvio :).

Sobre a questão da programação funcional, ótimo, e você pegou num ponto que eu justamente me perguntava, "Um loop e recursividade não são a mesma coisa?", mas isso é só um detalhe, curti a ideia de 'experimentar' as linguagens citadas, farei isso.

Você me confirmou o que já pensava do 'Event Loop', acredito que no final esse seja o conhecimento mais importante de ter, independente de querer definir o que é mais importante que o que, tudo é, mas de modo geral acho que a parte de entender como o código vai 'rodar' é algo direcionado a eficiência do mesmo, estou correto nessa análise? Não só eficiência como evitar bugs com race conditions. Na verdade acabei de ler e vi que você cita isso mesmo

Problemas como bloqueio do thread principal, gerenciamento ineficiente de tarefas assíncronas e outros problemas de performance estão frequentemente ligados a um entendimento insuficiente do Event Loop. Um conhecimento sólido nessa área é fundamental para evitar esses problemas.

Sobre o async await isso foi o que me 'quebrou' na verdade, a um bom tempo eu venho usando isso constantemente, de uma forma que a minha cabeça começou a julgar uma Fn async como sendo de 'thread principal', blocante/bloqueante, e eu tava considerando começar a trabalhar com callbacks (na verdade eu só preciso pensar mesmo, o fluxo de async await faz parecer que estamos trabalhando um código sync, mas já aprendi, justamente depois dessa pergunta)

Sobre a ultima, sobre Jr, Pleno, Sr, na verdade essa foi uma pergunta mal feita da minha parte, na verdade a ideia era tentar definir o que eu deveria estudar, o que eu devo focar pra me tornar um bom profissional, no final eu até considero essa pergunta 'idiota', porque níveis de senioridade são muito vagos, acredito que ao invés de perguntar 'Se eu não sou Jr etc...', eu deveria perguntar algo como: "O que devo aprender quando sai do CRUD?" Lógico, a resposta pode ser tudo, e por isso que tentei passar a ideia de "O que é conteúdo pra Jr?" "E o de pleno" "E o de Sr", essa era a ideia, pra eu não querer ver algo complexo demais sem ter estudado a base antes.

Mas voltando, muito foda, muito obrigado pelas respostas, conseguiu destravar os neurônios.

No final, analisando a pergunta, ficou parecendo até que eu fiquei com raiva do 'entrevistador' porque ele não me considerou nem um Jr... muito mal feita essa minha colocação.