Uma 'entrevista' muito boa (para emprego) e algumas dúvidas, focar em qual 'conhecimento'?

E aí galera, tudo de boa?

Obs.: O texto inicial é um resumo meu pra dar mais contexto pro final, mas não é essencial, pode pular para a parte das perguntas e ir pro ponto principal do tópico. ` Primeiro quero dar um resumo meu, comecei a estudar programção em 2006 e fiquei até 2009 nisso, na época 'WebMaster' com a stack padrão do programador POG, HTML,CSS,JS e PHP,MySQL. Era tudo muito bagunçado, não fiz curso algum, era tudo via 'fórum'. Me afastei em 2009 e retomei em 2016 pagando Alura e estudando. Mudou muito minha visão do código, tinha algo estruturado e uma sequencia pra estudo. Meu código evoluiu muito, mas eu ainda não tava focado em ser 'desenvolvedor'.

Então, depois desse resumo vem o 'foco', retomei os estudos em Outubro/2022 e comecei a trabalhar como freela, com Wordpress, enquanto estudava JS. Paguei Alura e comecei a estudar praticamente 100% do tempo.

A partir de Abril/Maio 2023 comecei a procurar/pegar freela de 'programação' em si, deixei de lado o Wordpress pra focar mais em desenvolvimento direto, e foi ok, mas bem nessa época apareceu uma vaga, e que vaga 'legal'.

O processo começava com código e não com RH, o que já tornava o processo interessante, deveria clonar o repo e fazer o que se pedia... Foi um experiência legal, fiz esse código em 2 dias e me consumiu principalmente a parte do 'React/Front' (não é obrigatório React, mas era o que eu sabia na época), lembro claramente eu não conseguindo dormir as 3h da manhã porque eu não conseguia fazer um componente re-renderizar porque meus states eram uma bagunça cheio de 'prop-drilling'... Mas entreguei, como era um código 'ruim' obviamente não passei dessa etapa, mas tudo bem, o que eu mais buscava era um feedback, eu queria saber em que ponto eu estava na escala de 'Dev', recebi um feedback bem 'simples', falou alguns pontos, se me lembro bem uns 3 pontos, como usar uma variavel de checagem de 'status' com valores 1 2 3, sendo que poderia ser um boolean true e false bem mais eficaz, eu entendi na época e achei ótimo.

Ok, agora chega a etapa mais 'importante' desse texto, essa vaga surgiu de novo esses dias, 7 meses depois da primeira vez.. nesse momento em questão eu só desisti de procurar vagas, enviei CV para umas 300 vagas e já sabem né, feedbacks automatizados que seria melhor nem receber. Até hoje eu fiz 4 entrevistas, todas sempre superficiais, então eu decidi de parar de perder tempo com isso e focar 100% nos freelas, que estão acontecendo de certa forma 'ok'..... então essa vaga surgiu de novo e essa eu queria tentar, o teste era o mesmo, usa sempre o mesmo repo, pensei 'Vou fazer numa conta nova pra não conseguirem ligar a meu teste anterior', meu plano era ter um feedback, até mais importante que ser contratado em si..., mas independente dessa ideia eu fiz na mesma conta mesmo no final pensei 'tanto faz'.`

Então vem aqui a parte das 'dúvidas', fiz o código, dessa vez em 3h/4h e usando Context, tudo ok, senti a evolução e realmente tive, porque fui chamado pra entrevista, a segunda etapa. Então vamos para a Entrevista. As perguntas foram essas, depois dessa entrevista eu não pesquisei nada, então o que tá aqui é basicamente o que eu sei, mas com a cabeça mais fria e depois de algum tempo pra pensar sobre(4 dias) 1- Abra o código e na linha X me diga se você consegue identificar a Mutation (Eu pensei se eu deveria por o código aqui ou não, pelo fato de ser um teste "privado" mas é algo simples, então tanto faz)

const peopleByCompanyMap = new Map();
peopleFetch.forEach(person => {
    if (person.checkInDate && !person.checkOutDate) {
        const count = peopleByCompanyMap.get(person.companyName) || 0;
        peopleByCompanyMap.set(person.companyName, count + 1);
        }
 });
 /**
 * After create the map I convert it to an array to set the state and work with
 * a map to show in the component
 */
 const peopleByCompanyArray = Array.from(peopleByCompanyMap).map(([companyName, count]) => ({companyName, count }));
 setPeopleByCompany(peopleByCompanyArray);

 // Here is like the first step, i just count how many people do not have a checkInDate
 setPeopleNotCheckedIn(peopleFetch.filter(person => !person.checkInDate).length);

Aí vem o que eu pensei: Bem, mutation é a alteração de um dado no "banco de dados", então, mas eu não estou alterando, fiz apenas uma consulta ... -Ele me interrompe pra falar 'Mutation não é apenas com banco de dados' Então pensei, claro, a mutation é a alteração de uma informação, mas assim, não identifiquei essa mutation, seria no caso do set do map? Porque eu altero o count+1, seria isso?

Bem, no final essa foi minha resposta, sem realmente ter certeza do que eu tinha falado, foi realmente um 'chute' e até agora não entendi com clareza e já puxando o final da entrevista ele citou usar reduce, ok, o reduce iria criar um outro item, então a ideia é não alterar o valor diretamente mas sempre criar um novo, ok? Mas porque isso é uma boa prática, no caso eu não iria criar vários pontos de memória desnecessários com isso? Eu sinto que eu estou deixando algo escapar no inicio da ideia de 'mutation' e esteja tendo uma ideia completamente errada no final, então minha dúvida sobre esse ponto 1 é: O que é mutation? Onde está essa mutation nesse bloco de código? Qual seria a melhor alternativa pra trabalhar isso e porque? Eu não consegui essas respostas claramente por conta própria.

Bora pra próxima.

2- Me fale o que você sabe sobre 'Programação Funcional'. Essa aqui é mais simples, não tem análise de código nem nada, mas eu simplesmente 'não lembrava de conceito algum', não do nome, mas eu sabia que eu tinha ideia. Então na conversa ele foi jogando algumas coisas no ar e eu lembrei do ponto A função deve receber parametros e retornar sempre o mesmo resultado, sem mexer com itens de fora, do escopo. Foi essa resposta que eu dei, de forma resumida, sem falar nome de conceito nem nada, na hora o que me veio a cabeça foi comparar com 'idempotência', que por sinal esqueci completamente de como falava, acabei falando assim "é aquela palavra que tá muito ligada a HTTP requests, com get, post, put, etc", isso foi eu falando pra ver se ajudava a lembrar, mas travei e não lembrei.

No final da entrevista ele também falou "Acho que a palavra que você queria lembrar era função pura" eu confirmei, mas na verdade não era, a palavra era idempotente, mas o conceito que eu tava explicando era função pura.

(A, tanto a parte do mutation e essa segunda pergunta foram em ingles, então tinha mais um grau de dificuldade, mas nada de especial, só um ponto pra comentar mesmo)

3- Me fale como o Node executa Aqui já tava em portugues, então não tinha trava alguma na linguagem, só de conhecimento mesmo, então a linha de pensamento foi

Como assim, executa? Usando v8? Transpilando, codificando... Ele fala sobre async, threads etc A certo, então é meio que pra falar sobre 'EventLoop', ok, Node executa linha a linha, async, await, then, callback. Nessa parte acabei desviando da 'resposta direta' porque fui contar umas coisas que faço como freela, como um projeto atual, construindo uma API utilizando 'automação/webscrapping', no caso o Puppeteer faz as ações e retorna algo... ok, mas aí eu preciso que o código possa receber vários requests e executar tudo, então tenho a função que 'busca usuário' que é async e quando eu chamo eu chamo sem o 'await', seguindo essa ideia eu jogo no 'evento loop' do async e o código sync continua executando..., de qualquer forma o lance foi que esses dias atualizei algo e quebrou esse sistema, mas consertei logo depois e fiquei encudado com isso, "Como realmente funciona o 'async'", então eu percebi que realmente não sei 'a resposta', mas eu entendo parte do conceito, que por sinal onde entendi isso de forma mais eficiente foi nesse video aqui https://www.youtube.com/watch?v=cCOL7MC4Pl0 que peguei justamente de uma lista que o 'entrevistador' postou a um bom tempo no Twitter(X).

Tiveram outras perguntas mas essas são as mais interessantes, então pra tentar finalizar o pequeno texto com as dúvidas resumidas.

O que é mutation? Onde está essa mutation nesse bloco de código? Qual seria a melhor alternativa pra trabalhar isso e porque? 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? Recursividade faz parte de falar sobre programação funcional? Etc... O quão é importante conhecer o 'Event Loop' e conseguir explicar?

No caso todas essas tem diferença de 'saber' e 'explicar', eu sempre fui a favor de que, quando você saber explicar é porque você realmente entende sobre o assunto, correto? Mas saber apenas não seria suficiente pra 'ser considerado um dev'?

Mas assim, pra finalizar, não passei nessa etapa e ele falou: "Você precisa ter certeza nos conceitos, daqui um tempo você pode tentar de novo".

Então, eu concordo 100% com isso, 0 problemas, mas depois de 4 dias eu não consigo parar de pensar nisso e até mesmo estou escrevendo o texto por isso, e o que me incomoda mais é 'não saber responder as perguntas' e não 'não ter passado de fase', pra mim todos esses conceitos são importantes de conhecer, principalmente o 'Event Loop'.

Bom, talvez tenha ficado confuso, mas a ideia é falar de: Processo legal, o único que fiz em 6 meses que me deu feedback REAL. Fiquei em dúvida nesses pontos, então pelo julgamento do entrevistador eu não sou um 'Jr' ainda (eu sei que eu não sou pra empresa dele, mas esse lance de Jr, Pleno e Sr é 'quase' aleatório), mas, será que eu posso me colocar como um 'Dev JS' mesmo não sabendo explicar esses conceitos?

E a última é: Se eu não sou Jr pra ele, o que o Pleno precisa saber pra ser Pleno? E o Sr? Eu pergunto isso com intuito de me guiar para próximas etapas de estudo, atualmente trabalho como freela e 'parei' de estudar, porque eu não sei pra onde olhar, na verdade eu tenho focado muito em DevOps, mas eu queria ser um cara 'pro' em JS antes de pular pra outra coisa...

Obrigado pra quem leu até aqui e pra quem responder também :).

E na última linha vou mandar o link pra quem quiser tentar essa vaga também. Aparentemente ainda estão abertas, então deve dar tempo de tentar ainda.

https://github.com/quavedev/join

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. `