Executando verificação de segurança...
4

"Teste técnico" para vaga de dev sênior

Boa tarde gurizada,
Recentemente eu fiz um teste técnico para uma vaga de dev Node.js Sênior. Depois de precisar cadastrar todos os dados do meu currículo, fazer um teste de perfil, responder algumas questões técnicas sobre Node, precisei resolver um teste prático para "provar minhas habilidades". Nesse teste, eu tinha aproximadamente 10 min para resolver o que estava sendo solicitado. Segue o teste:

******

O problema consiste em quebrar uma string "str" em "x" linhas e reorganizar essas linhas no padrão "Vai e Vem". Se a quebra não for exata, os caracteres remanescentes devem ser intercalados entre o início e o fim da string resultante. Nas linhas pares, o conteúdo deve ser invertido.

Aqui está a descrição em texto do problema:

Dado uma String "str" e um número inteiro positivo "x", onde o tamanho de "str" é sempre maior que "x", o objetivo é determinar a String resultante após a quebra da "str" em "x" linhas e a reconstrução no padrão "Vai e Vem". Se a quebra não for exata (quando o número de caracteres em "str" não é um múltiplo de "x"), os caracteres remanescentes devem ser intercalados entre o início e o fim da String resultante. Nas linhas pares, o conteúdo deve ser invertido.

Exemplos:

Exemplo 1: "str" = "SEMSOBRAS", "x" = 3
1 "SEM"
2 "SOB" --> Resultado: "SEMBOSRAS"
3 "RAS"

Exemplo 2: "str" = "HELLOWISECODE", "x" = 3
1 "HELL"
2 "OWIS" --> Resultado: "EHELLSIWOECOD"
3 "ECOD"
4 "E" (sobra) (1º caractere no início da string)

Exemplo 3: "str" = "STRINGCOMSOBRAFOUR", "x" = 5
1 "STR"
2 "ING"
3 "COM" --> Resultado: "ROSTRGNICOMBOSRAFU"
4 "SOB"
5 "RAF"
6 "OUR" (sobra) (1º caractere no início, 2º no final, 3º no início, etc.)

Observação: O valor "x" não representa o número de caracteres, mas sim o número mínimo de quebras (ou linhas) a serem feitas, e a ordem das linhas segue o padrão "Vai e Vem".

******

Queria saber a opinião de vocês sobre isso, pois eu fiquei muito chateado em saber que estão contratando devs sênior com base em resultados de testes desse tipo. Não que não seja um algorítmo bom para praticar habilidades, mas teste prático único? sério isso?

Ao meu ver, para contratar um sênior a abordagem deve ser totalemnte diferente. É muito difícil entender todas habilidades de um sênior com base em um único teste prático. Acredito que o ideal é conversar e questionar sobre assuntos como arquiteturas, padrões de código, problema reais de uma aplicação. Pode se até passar um teste para o candidato, mas com ênfase nesses assuntos.

Carregando publicação patrocinada...
2

Gostei do teste,rs e acho que faz sentido.. tanto que parei para resolver, levei uns minutos a mais que 20 minutos, acho importante porque testa logica, porque framework e linguagem qualquer um aprende e se adapta, agora para testar experiencia em pensamento logico, sao estes testes de faculdade que eu entendo que funciona e é justo para medir experiencia sem levar em consideração tecnologia expecifica..

const str = "HELLOWISECODE"
const x = 3

const tamanho = str.length
const linhas = x
const cols = Math.trunc(tamanho / linhas)

const res = []
for (let i = 0; i < linhas; i++) {
    const ini = i * cols
    let tx = str.slice(ini, ini + cols)
    if ((i + 1) % 2 === 0) tx = tx.split("").reverse().join("")
    res.push(tx)
}
let inicio = []
let fim = []
if (tamanho % linhas) {
    const sobra = str.slice(linhas * cols, str.length)
    for (let i = 0; i < sobra.length; i++) {
        if ((i) % 2 === 0) {
            inicio.push(sobra[i])
        } else [
            fim.push(sobra[i])
        ]
    }
}
result = inicio.reverse().join("") + res.join("") + fim.join("")
console.log(result)
1

Boa tarde, Mano!
Tudo bem?

Realmente é muito brochante isso, você tem uma base forte e quando chega na entrevista te tacam um teste que pegaram em alguma base de dados de alguma faculdade, e dizem: Resolve esse teste ai e quando terminar a gente passa pro proximo passo da entrevista. Kkkkk

Por um lado da até pra entender o porque os recrutadores fazem isso, são muitos candidados e eles realmente precisam filtrar isso de alguma maneira, mas realmente do nosso lado isso é muito brochante.

Fica mais brochante ainda quando você percebe que muitas empresas utilizam os mesmos testes nas entrevistas, daí fica aquele jogo de quem decora mais. Alguem que decorou esse teste e respondeu certo tomou o lugar de alguem melhor que ele na entrevista por ter decorado isso de alguma outra entrevista. Mas fazer o que né, como eu disse, eles precisam filtrar de alguma forma...

1

Normalmente as empresas grandes costumam usar leetcode, tive isso em uma entrevista que fiz para a Motorola.

Eu sou contra leetcode em qualquer nível de teste, ainda mais para nível sênior. Mas, em um ambiente em que essas empresas gigantes tem inúmeras cartas para escolher, usar o leetcode para dar uma filtrada é uma boa opção.

Não se fruste pelo problema dos outros, se eles não sabem selecionar a culpa não é sua. Paciência. O mundo é grande, com certeza tem algum espaço melhor pra tu por aí.
Pra quem é sênior sempre tem vaga, difícil tá para os iniciantes...

1

Olá!

Entendo perfeitamente sua frustração e concordo que é complexo avaliar completamente as habilidades de um desenvolvedor sênior através de um único teste prático. No entanto, você já parou para pensar se este teste era apenas uma etapa de triagem inicial?

Seu propósito poderia ser simplesmente garantir que o candidato realmente tem habilidades sólidas de programação. É surpreendente o número de desenvolvedores sênior no mercado que têm dificuldades em resolver problemas usando código!!!

Claro, há o risco de perder excelentes profissionais nesse processo e ainda assim aprovar alguns medianos, mas a realidade é que esse método de triagem funciona.

Recomendo que você assista ao vídeo "Most Tech Interview Prep is GARBAGE. (From a Principal Engineer at Amazon)". Apesar de ser em um contexto diferente (na verdade, quase o oposto do que estamos discutindo aqui), ele pode oferecer uma perspectiva esclarecedora sobre o tema.

1

Então, eu concordo com o que a maioria das pessoas comentou aqui, que provavelmente esse era um primeiro teste prático pra dar uma filtrada (se a pessoa não consegue resolver um probleminha de manipulação de strings ela definitivamente não é senior). E eu também concordo que é meio broxante receber um teste desses, mas temos que aceitar que é parte do processo. O que me deixou indignado for o tempo, por mais simples que o problema possa ser, 10 minutos é muito pouco pra: Analizar o problema, pensar numa primeira solução, avaliar possiveis edge cases, escrever testes e tentar melhorar a solução.
O tempo, pra mim, é a falha desse teste técnico, pq provavelmente é algo automatizado, se passou nos testes da plataforma ali qualifica automaticamente pra proxima etapa, sem ninguém avaliar teu processo ou código.

1

É um teste simples, porém relevante, ele vai avaliar seu raciocionio lógico, organização do código, nomes das variáveis, quais abordagens vai utilizar, legibilidade de código e até mesmo como você encara o problema, sendo um teste automático acho que ele não é muito relevante mas se for um teste numa entrevista com alguém de verdade serve de ótimo filtro, resolvendo ou não o problema dentro do tempo proposto disertar sobre o problema e como você chegou ou tentou chegar a solução seria uma baita filtro pra entender se de fato o candidato atende o nível de senioridade que a vaga exige, segue a solução que eu faria para o problema

/**
 * @function formatStringToGoesAndComesFormat
 * @param {string} word
 * @param {number} numberOfRows
 */
function formatStringToGoesAndComesFormat(word, numberOfRows) {
  const wordLength = word.length;
  const numberOfCols = Math.trunc(wordLength / numberOfRows);
  const remainingLettersQuantity = wordLength % numberOfRows;
  const partOfTheWordWithoutTheRemainingLetters = word
    .split('')
    .slice(0, wordLength - remainingLettersQuantity);

  const remainingLettersOfTheWord = word
    .split('')
    .splice(remainingLettersQuantity * -1, remainingLettersQuantity);

  const formattedLettersArray = new Array(numberOfRows)
    .fill(0)
    .flatMap((_, index) => {
      const initialIndex = index * numberOfCols;
      const finalIndex = index * numberOfCols + numberOfCols;
      const lettersArray = partOfTheWordWithoutTheRemainingLetters.slice(
        initialIndex,
        finalIndex
      );
      return index % 2 === 0 ? lettersArray : lettersArray.reverse();
    });

  remainingLettersOfTheWord.forEach((letter, index) => {
    if (index % 2 === 0) {
      formattedLettersArray.unshift(letter);
      return;
    }

    formattedLettersArray.push(letter);
  });

  return formattedLettersArray.join('');
}

console.table({
  value: formatStringToGoesAndComesFormat('SEMSOBRAS', 3),
  expected: 'SEMBOSRAS',
  result: formatStringToGoesAndComesFormat('SEMSOBRAS', 3) === 'SEMBOSRAS',
});
console.table({
  value: formatStringToGoesAndComesFormat('HELLOWISECODE', 3),
  expected: 'EHELLSIWOECOD',
  result:
    formatStringToGoesAndComesFormat('HELLOWISECODE', 3) === 'EHELLSIWOECOD',
});
console.table({
  value: formatStringToGoesAndComesFormat('STRINGCOMSOBRAFOUR', 5),
  expected: 'ROSTRGNICOMBOSRAFU',
  result:
    formatStringToGoesAndComesFormat('STRINGCOMSOBRAFOUR', 5) ===
    'ROSTRGNICOMBOSRAFU',
});
1

Teste é teste, isso não vai te validar como senior, mas se filtra, isso sim! Filtra mesmo.

O teste é facil, e pra eu ganhar tempo, procuraria algo já pronto fazendo uma busca, ou até o ChatGPT ou BARD.

Já que mostrar que é senior, não é só pensar, e sim resolver da melhor maneira e rápido.

Agora, se o teste fosse em uma chamada de vídeo, ia ficar complicado! O nervosismo aumenta, e o desempenho diminui.