Trabalhe remotamente e ganhe em dólar com Programação – pt 4
Ao se candidatar a uma vaga de desenvolvimento de software, as chances são altas de que você será solicitado a fazer pelo menos um code challenge. Inicialmente, o code challenge parecerá algo assustador para alguém que não se preparou. É por isso que investir algum tempo de preparo prévio é importante aqui.
O preparo vai além de somente programar, ele envolve uma série de aspectos que irei abordar a seguir, entre eles:
- Entender o comando da questão;
- Gestão de tempo;
- Estruturar uma solução;
- Testar o algoritmo desenvolvido;
- Saber explicar a abordagem utilizada.
Mas antes coloco aqui uma imagem mostrando a estrutura geral do ambiente utilizado para o code challenge:
Fig 1. Exemplo do ambiente de um code chellenge
Na [Fig. 1] podemos observar que o ambiente do code challenge é composto pelos seguintes elementos:
- Comando da questão: esta área é a mais importante, uma vez que sem o pleno entendimento do problema será inviável resolver o algoritmo apropriadamente.
- Escolha da linguagem de programação: em geral as plataformas de code challenge oferecem uma grande variedade de linguagens de programação, sendo as principais Java, Javascript, PHP, C, C++ e várias outras. Importante: caso você opte por alterar a linguagem de programação no meio do teste, todo o trabalho desenvolvido anteriormente será perdido, então escolham a linguagem antes de começar a programar e evitem alterá-la!
- Editor de código: aqui será o local onde você passará a maior parte do tempo do code challenge, em geral os editores são modernos contando com contadores de linhas e colunas e alguns até trazem a função de auto-completar da linguagem de programação, mas não contem com esta opção.
- Botões para submissão do código desenvolvido: ao finalizar o algoritmo ou até mesmo durante o desenvolvimento do mesmo, você sempre poderá checar se o seu código está compilando corretamente e se está passando nos testes.
Após essa visão geral do ambiente do code challenge, vamos aos pontos cruciais na preparação para o teste.
Entenda o comando da questão!
Antes de pular etapas e ir no modo go-horse para a codificação, separe alguns minutos para compreender qual é o objetivo da questão.
Fig 2. Seções do comando da questão
Observando a [Fig. 2] você perceberá que o enunciado da questão é dividido em seções além do parágrafo introdutório, entre elas:
- Input/output format: após entender o contexto geral do problema, você precisará saber como será a entrada e saída dos dados. Nesta seção você receberá com precisão quais são esses formatos, no caso da [Fig. 2] o problema informa que a entrada de dados será composta por 4 linhas, na qual a primeira será um número inteiro representando a idade, a segunda será uma cadeia de caracteres minúsculos representando o nome do aluno, a terceira também será uma cadeia de caracteres minúsculos representando o sobrenome do aluno, e por fim a última linha será um número inteiro representando a média de suas notas. Além disso, o problema traz uma nota informando que as cadeias de caracteres não excederão mais de 50 caracteres.
- Sample input/output: aqui o enunciado da questão te dará um exemplo concreto tanto da entrada como da saída de dados, a saber:
Entrada
15 = idade
john = nome
carmack = sobrenome
10 = média das notas
Saída
15
carmack, john
10
15,john,carmack,10
Entender a problemática da questão, como receber, processar e devolver os dados é crucial aqui. Sem esse entendimento você não conseguirá progredir no problema. Pessoalmente, eu invisto os primeiros 5 minutos do code challenge para entender o problema.
Gestão de tempo
- Primeiros 5 minutos: foco total em entender a questão;
- Próximos 5 minutos: organizar mentalmente a solução com papel e caneta;
- Próximos 35 minutos: codificar o algoritmo, a primeira versão dele da forma mais simples possível e ir aprimorando se houver tempo. Uma dica importante aqui é sempre rodar o programa para ver se o mesmo está compilando corretamente e já pegar typos logo de cara;
- Últimos 15 minutos: verificar se o algoritmo passa em todos os casos de teste disponibilizados. É muito comum após o término da codificação, o algoritmo passar em alguns casos de teste e em outros não, tente utilizar esse tempo final para fazer os últimos ajustes.
Nota: aqui estou pressupondo que no modelo do code challenge que você se deparou não tenha um item pedindo para você explicar a sua abordagem, assim como a complexidade assintótica do seu algoritmo. Esteja ciente que isso pode aparecer no seu teste!
Estruturar uma solução
Após entender o enunciado do problema, agora é hora de colocar a mão na massa!
Um método bastante eficiente para resolução de problemas, é o método de Pólya. Ele é baseado em algumas etapas:
- Entenda o problema (feito!)
- Elabore um plano
- Execute o plano
- Olhe para trás
Na prática, a elaboração do plano pode ser um rascunho da solução em pseudocódigo.
Pseudocódigo é uma descrição em linguagem simples das etapas de um algoritmo. Em outras palavras, seu pseudocódigo é seu plano passo a passo de como resolver o problema.
Escreva as etapas que você precisa seguir para resolver o problema. Para um problema mais complicado, você terá mais etapas. Segue um exemplo de como você pode escrever:
// Create a sum variable.
Add the first input to the second input using the addition operator.
// Store value of both inputs into sum variable.
// Return as output the sum variable.
Agora que você tem um plano passo a passo para resolver o problema, está na hora de realmente codificar. Infelizmente nesta parte eu não posso te ajudar muito, você precisará estar afiado na linguagem de programação escolhida para evitar perder tempo tentando lembra a sintax dos comandos. Por isso recomendo bastante treino antes de partir para o code challenge!
Utilize as plataformas Hackerrank e Leetcode para praticar com antecedência.
Testar o algoritmo desenvolvido
Agora que chegamos na reta final do code challenge está na hora de colocar o trabalho desenvolvido a prova! A última etapa é testar o algoritmo desenvolvido e ver se ele passou nos testes. A [Fig. 3] mostra exemplos de como os resultados dos testes são demonstrados:
Fig 3. Exemplos de algoritmos que falaharam e que passaram nos testes
Caso após a execução dos testes um ou mais deles falharem igual a [Fig. 3A], você precisará checar o teste específico que falhou clicando na aba correspondente a ele. Infelizmente alguns dos testes são escondidos e possuem um cadeado, então não será possível visualizar o input completo dos dados. Daí vem a importância de planejar o seu algoritmo antes de codificá-lo e pensar em possíveis casos de erro.
Se todos os testes forem bem sucedidos igual a [Fig. 3B], parabéns! Você está pronto para submeter a sua solução. Caso não haja uma questão extra pedindo para explicar a abordagem utilizada no seu algoritmo, utilize o tempo restante caso tenha para dar uma polida no seu código.
Explicar a abordagem utilizada
Em algumas ocasiões mais raras, me deparei com questões extras pedindo para explicar a abordagem utilizada no algoritmo assim como sua complexidade assintótica. Caso você não entenda bem este conceito, sugiro fortemente que o estude antes de partir para o code challenge. Deixo aqui um ponto de partida: link sobre complexidade assintótica.
Para ir além
Caso você realmente queira aprender em profundidade os conceitos de algoritmos, estrutura de dados e complexidade de algoritmos, deixo aqui algumas recomendações de livros:
Estruturas de Dados e Seus Algoritmos | Cracking the Coding Interview: 189 Programming Questions and Solutions | Algoritmos: Teoria e Prática |
No próximo post irei detalhar mais um pouco sobre a etapa do mini-projeto (take home) que pode aparecer em alguns processos seletivos.
Vejo vocês na próxima!
Igor Augusto Brandão
#igorabrandaoHello, world! My name is Igor and I am a system analyst professional with degrees in Systems Analysis, Business Administration, Information Technology, a specialization of IT applied to the Legal Area, an MSc in Bioinformatics, and +10 years of experience working with systems development.