A estratégia adotada para recrutamentos por meio da GeekHunter é simples. Resolver um testes de recrutamento em 60 Minutos e em qualquer uma das linguagens disponíveis.
- Java;
- C;
- C++;
- C#;
- PHP;
- Python 3;
- Ruby;
- Javascript;
- Objective-C;
- Kotlin;
- Swift 3;
- Elixir;
- GO Lang;
- Groovy;
- Scala.
Fácil, não é? talvez não tanto
O que é Hackathon e por que todo desenvolvedor deve participar de um
Para muitos novos programadores – e também aqueles que estão regressando ao mercado de programação – passar por testes de recrutamento pode ser uma experiência desanimadora.
Vamos então tornar os testes de recrutamento algo mais agradável.
Como obter ajuda?
Ao chegar na etapa de codar temos algumas recomendações que merecem destaque:
→ A Central de Ajuda da GeekHunter, com alguns tópicos | FAQ (Dúvidas Frequentes)
→ Indicações para práticar antes de realizar o testes de recrutamento:
- HackerRank;
- CodeWars;
- Codility;
- CodeSignal.
Let’s crack the geekhunter challenge. Shall We?
Antes de começar:
→ Estar familiarizado com a linguagem pode e vai te ajudar na hora de resolver problemas ←
Seja para testes de recrutamento ou na vida (dia a dia) de um programador
Imagine quão dificil seria para um mecânico se ele não soubesse quais ferramentas ele tem disponíveis em sua oficina.
Treine sintaxe e leia a documentação da linguagem escolhida, pode sempre ser útil para o seu futuro.
→ Comece devagar e vá evoluindo o seu nível em etapas. ←
Não adianta nada acessar as plataformas de prática e querer logo resolver os problemas mais complexos.
Mantendo a analogia do mecânico: Nenhum engenheiro de avião começou mexendo nos motores das aeronaves. Primeiro resolva o problema com sua bicicleta para depois ir aos motores complexos dos jatos.
Para esse post vamos usar a plataforma CodeWars para praticar. Entra e cria tua conta ou vincula com o teu GitHub.
Independente da sua escolha, dominar a sintaxe é essencial para se dar bem programando em certa linguagem.
Escolha bem suas armas antes de ir para guerra.
Nesses exemplos utilizaremos o famosinho JavaScript.
Confira também: 10 frameworks e bibliotecas JavaScript mais importantes do mercado
Mãos à obra!
Para construir esse post usei como manual de instruções o canal Coding Garden With CJ – YouTube.
Basicamente em cada live, esse carinha resolve alguns dos ‘katas‘, que são os desafios do CodeWars.
No link acima do canal está a playlist completa ‘resolvendo katas’, só clicar e conferir.
O conteúdo é todo em inglês, mas vale a pena dar uma conferida pois tem uma didática boa e bem humorada durante a resolução dos problemas.
Code Katas
A metodologia adotada pelo CJ na resolução dos katas é adequada e fácil de aprender.
Separei em 4 partes a solução para os problemas do CodeWars.
- Ler Bem e com Calma a Descrição do Problema;
- Resolver o Problema. (use um quadro branco, caderno, comentários no código, etc);
- Aplicar a Primeira Solução;
- Trabalhar em Refatoramentos.
1. Leitura:
Ler a descrição do problema lhe poupará tempo na hora de escrever o código e lhe poupará tempo na hora de resolver o problema.
2. Resolver primeiro, aplicar depois:
Resolver o problema antes de codificar lhe dará mais tempo caso algo dê errado na hora de rodar os testes.
Você terá menos motivos para acreditar que está errando algo na lógica do seu programa.
Usar um quadro branco ou uma folha de papel pode te dar insights para àquele determinado problema. Desenhe, rascunhe e pense em uma solução simples e funcional.
3. Aplicar a Primeira solução:
Aplique uma solução rápida, não precisa ser bonito, precisa funcionar.
4. Trabalhe (pense) em refatoramentos:
Chegou a hora de refatorar, pensar maneiras de consumir menos espaço na memória, escrever a solução em menos linhas de código talvez?
Trocar os nomes das variáveis? Agora que a primeira solução já foi aplicada sobrará certamente um tempo para pensar em melhorias no algoritmo.
Vamos aplicar esses passos a um simples exemplo:
Exemplo 1
Problema: VowelCount
Descrição: “Return the number (count) of vowels in the given string.
We will consider a, e, i, o, u
as vowels for this Kata (but not y
).
The input string will only consist of lower case letters and/or spaces.”
Passo 1 – Ler a descrição e descobrir o que precisa ser feito
function getCount(str) {
var vowelsCount = 0;
// Recebemos a string como parâmetro e devemos retornar
// a quantidade de vogais que ela possui
// simples
return vowelsCount;
}
Passo 2 – Resolver o problema:
Ok! Sabemos o que temos que fazer, agora basta saber como fazer.
A primeira idéia para resolver seria iterar ao longo da string, ou seja, passar por cada letra e verificar se a letra atual é uma vogal. Se for uma vogal então aumentar o valor do contador (vowelsCount).
function getCount(str) {
var vowelsCount = 0;
// iterar pela string. ou seja,
// passar por cada elemento(letra) e realizar uma ação
/* se a letra for uma vogal: a, e, i, o, u */
// então, aumentar o valor do contador de vogais, vowelsCount
return vowelsCount;
}
Problema resolvido, vamos agora aplicar uma estrutura de loop para iterar através da string e então verificar se a letra atual é uma vogal.
Passo 3 – Aplicando a solução:
Isso deve funcionar:
function getCount(str) {
var vowelsCount = 0;
// iterar pela string. ou seja,
// passar por cada elemento(letra) e realizar uma ação
for (let i = 0; i < str.length; i++) {
// salva a posição da string numa variável letra.
const letra = str[i];
/* se a letra for uma vogal: a, e, i, o, u */
// aumentar o valor do contador de vogais
if (letra == 'a' || letra == 'e' || letra == 'i'
|| letra == 'o' || letra == 'u') {
vowelsCount++;
}
}
return vowelsCount;
}
Um loop que passa pela string, armazena a letra em uma variável e verifica se a letra é igual a uma das vogais.
Simples e funciona!
Mas sim, sabemos que isso tá feio e precisamos do quarto passo.
Passo 4.1 – Refatoração:
Uma das ideias para diminuir o número de estruturas condicionais (ifs) usando o JS é criar um objeto.
Um objeto que tenha como propriedades as vogais.
function getCount(str) {
var vowelsCount = 0;
// objeto com as vogais
const vogais = {
a: true,
e: true,
i: true,
o: true,
u: true,
};
for (let i = 0; i < str.length; i++) {
const letra = str[i];
// dessa forma, verificamos se existe a propriedade letra
//dentro do objeto vogais.
if (vogais[letra]) {
vowelsCount++;
}
}
return vowelsCount;
}
Isso também deve funcionar! E bem mais fácil de ler esse novo código.
Passo 4.2 – Refatoração ? De novo?
As vezes a necessidade de refatorar código não é tão essencial mas, para este exemplo, vamos tentar deixar mais divertido implementando um Reduce.
O Reduce é um método javascript que executa uma função para cada elemento do array.
Vamos então escrever um reduce que retorne o contador de vogais.
Utilizaremos o .split(‘ ‘) para tornar a string em um array. Para que possamos usar o reduce.
Passando por parâmetro do split uma string vazia, como meio de separação.
function getCount(str) {
const vogais = {
a: true,
e: true,
i: true,
o: true,
u: true,
};
return str.split('').reduce((contadorVogais, letra) => {
if (vogais[letra]) {
contadorVogais++;
}
return contadorVogais;
}, 0)
};
Basicamente essa função Reduce diz que se a letra atual for uma vogal então incremente o nosso contador em 1.
Nesse caso devo admitir que a complexidade do reduce não foi tão justificável, porém ai está mais uma refatoração.
Aprender é uma constante evolução, você não deve esperar para plantar, mas sim ter paciência para colher.
Por vezes, um simples exercício como esse pode te dar dicas para resolver problemas mais complexos no futuro.
De novo, dominar a linguagem e seus métodos ‘built-in‘ pode ser uma mão na roda na hora de resolver determinadas situações.