Lições (re)aprendidas com o HackerRank

Você, desenvolvedor, conhece o HackerRank? Ele é portal com desafios de programação, usado principalmente como preparação para entrevistas de emprego que tenham uma etapa de whiteboard. Eu, pessoalmente, gosto muito de plataformas de aprendizado que envolvam gamificação; logo, assim que entrei e resolvi alguns problemas, me empolguei bastante em ir construindo algoritmos que atendessem os testes dos enunciados. Conforme os problemas foram avançando, eu me peguei em uma retomada de aprendizados que surgiram quando comecei a programar. E, honestamente? Foi ótimo revisitar essas lições. Através deste post, eu gostaria de facilitar um pouco a sua jornada e documentar as minhas lições (re)aprendidas com o HackerRank!

Uma garota balançando livros na cabeça com a frase "Always be learning"

Atente-se sempre aos tipos das variáveis e seus respectivos limites

Problema: Mini-Max Sum

Eu não sei vocês, mas, por mais que eu já tenha alguns anos de experiência, há coisas muito básicas que eu ainda preciso buscar como funcionam, quais suas sintaxes, etc. Uma delas é: a diferença de tamanho entre as variáveis long e int. Conforme ilustra a tabela abaixo, a diferença entre os dois é bem considerável:

Apesar disso, às vezes, eu ainda me perco um pouco nos limites entre as duas. E a lição que fica desse problema é: na dúvida do resultado de alguma operação? Ou do tamanho de algum dado? Opte pela variável com mais espaço (nesse caso, o long). Acredite, você terá menos dor de cabeça colocando umas conversões à mais do que lidando com estouros de tamanho “surpresinha”.

Nem sempre é o conceito mais complicado que vai resolver o seu problema

Problema: Staircase

A princípio, quando vi esse problema, pensei: isso é obviamente uma recursividade. E eu fiquei um tempão gastando neurônio tentando fazer a recursividade resolver o problema. Parecia tão óbvio! Depois de alguma frustração, fui buscar como solucionar aquele enunciado. De certo que alguém haveria de me explicar como construir a bendita recursividade. E aí eu descobri que não era bem assim. Fiquei até me sentindo uma desenvolvedora sênior depois de ver a simplicidade da resolução!

Um bonequinho andando e pisando em uma ferramenta somente, com a legenda "Junior React Developer"
Um homem fazendo uma super manobra com a ferramenta e depois pisando nela tal qual o boneco anterior, com a legenda "Senior React Developer"
Isso serve para qualquer tecnologia, viu?

A solução que encontrei foi implementada pela Ali Reubenstone e ela escreveu um artigo bem completinho no Medium sobre ela. Mas a questão aqui é a seguinte: nem sempre você precisa de algo muito além do básico para resolver um problema. Em certas ocasiões, ficamos tão “bitolados” pensando em como construir uma solução que nos esquecemos do básico, do simples… Às vezes, a solução mais fácil é sim a correta.

Tem uma passagem famosa do Bill Gates dizendo que, para tarefas difíceis, ele escolheria pessoas preguiçosas, pois elas sempre vão pensar no caminho mais fácil/rápido. Quem sabe a gente não devesse, de vez em quando, escutar o que ele tem a dizer? 😅

Verifique na documentação se a roda já está criada (porque provavelmente está)

Problema: Staircase

Quando eu encontrei a solução do problema da escada, ela estava escrita em Javascript e eu estava tentando resolvê-lo em C#. Enquanto eu lia o código, me deparei com a função .repeat() do Javascript, e eu não lembrava de nada parecido no C#. Ao mesmo tempo em que eu pensava que precisava criar uma função dessa na minha solução, também pensei que não era possível que não tivesse nada do gênero dentro de uma linguagem tão vasta.

Fui para a documentação e não é que a roda já estava criada mesmo? Inclusive era o próprio construtor de strings.

public String (char c, int count);

//Exemplo
String teste = new String('*', 3);
Console.WriteLine(teste);

//Resultado impresso:
//***

Declarando uma string da forma assim, ou seja, mandando como parâmetros um char e um inteiro, o resultado será o caracter enviado repetido tal qual o número de vezes que você definiu. Você pode consultar a documentação desse trecho de código aqui. E lembre-se: provavelmente os conceitos fundamentais de uma linguagem/tecnologia já estão criados. Você só precisa buscar e aplicar.

Copie sempre o valor do parâmetro para uma variável

Problema: Birthday Cake Candles

De antemão, essa daqui já é uma das regras escritas em pedra no Clean Code; porém sempre tem gente que não leu, que não se lembra ou que, como eu, precisa de um reforço: nunca altere diretamente o valor dos parâmetros recebidos em uma função. Ou seja, se a responsabilidade do seu método é processar um valor e retorná-lo, jamais o faça diretamente na variável que vem como parâmetro; antes de qualquer operação, copie o valor do parâmetro para uma variável e depois trabalhe em cima dele.

Você nunca sabe se vai precisa comparar ou fazer alguma outra operação com base no valor original do parâmetro, portanto é recomendado ter o valor original disponível para ser acessado à qualquer momento, beleza?

Uma mulher ruiva falando "Copy that"
Copie isso!

LINQ não resolve tudo

Problema: Mini-Max Sum

Essa daqui é especial para os meus programadores .NET/C# mundão afora. Se você, assim como eu, não pode ver uma oportunidade de usar LINQ que vai usar LINQ, essa carapuça vai te servir certinho. Pois saiba que essa componente não vai resolver todos os seus problemas.

Eu sou a pessoa que, às vezes, aperta o Ctrl + Espaço para pensar. Sabe quando você abre a geladeira e fica olhando lá para dentro, refletindo? Eu faço muito isso com o LINQ quando estou programando. Muitas vezes, ele já resolveu problemas complicados para mim de formas simples; a solução simplesmente veio na minha cabeça prontinha. Porém, infelizmente, algumas vezes eu achei que ia matar no peito usando LINQ e… fuén. Simplesmente não era possível. Esse problema foi uma dessas vezes, inclusive.

Não que o problema não tenha solução. Mas eventualmente, vamos precisar resolver com um for mesmo; simplão, aprendido nas primeiras aulas de algoritmos de qualquer curso de programação. E às vezes vamos precisar usar as classes “base” do C#, muitas vezes negligenciadas por nós, que estamos focados nas coisas mais familiares e explícitas. (Sim, todo esse drama para dizer que tentei fazer um .OrderBy() quando, na verdade, o que era para usar era Array.Sort()).

Um pictograma de uma pessoa irritada batendo com a cabeça em um teclado na frente de um computador.

Existem problemas que vão demandar mais tempo, pesquisa e paciência – e tá tudo bem

Problema: HackerRank City

Essa daqui é uma lição mais filosófica, mas acho que é uma das mais importantes. Não sei vocês, mas vem problema, vai problema e eu ainda não aprendi a lidar 100% com eles. Quando a ansiedade e a síndrome do impostor batem… só quem viveu (e vive!) sabe.

Andressa Urach, uma mulher loira, com a legenda "Ai Gabi, só quem viveu sabe"

O contexto dessa lição é: eu comecei resolvendo vários probleminhas fáceis no HackerRank e me senti um pouquinho mais confiante para tentar resolver um problema que ele classifica como de nível Médio. Bem, fui lá tentar… e acabou que não consegui resolver. E me senti mega-frustrada e mega-ansiosa pela solução ainda não estar completa quando desisti dela.

O ponto é: existem coisas que não vão sair de bate-pronto. Você vai precisar estudar mais, ter um pouco mais de paciência, talvez até mesmo de tempo – e está tudo bem! Você não deixa de ser um bom programador só porque não conseguiu resolver um enunciado de um problema, ou por ter demorado mais para resolver problemas mais difíceis.

Quando eu fico nervosa por conta desse tipo de situação, tento sempre lembrar que a busca por conhecimento é uma jornada – e que cada um tem a sua e o seu tempo para cumpri-la. Respeitá-la e respeitar-se e o melhor a se fazer e garanto que é o que vai te trazer melhores resultados. Ansiedade e correria nunca fizeram de ninguém uma pessoa melhor, e com você não vai ser diferente, combinado?


Repositório no GitHub

Durante essa minha jornada com o HackerRank, eu preferi criar um projetinho no Visual Studio para ir resolvendo alguns dos exercícios em vez de usar somente a interface do site. Caso você tenha interesse em dar uma olhada no que eu já construí para alguns dos enunciados que encontrei lá, você pode acessar o repositório desse projeto no meu GitHub. Fique à vontade para mandar um PR se você quiser me ajudar! 😉


📜 Posts relacionados

👩‍💻 Como não ficar ansiosa programando

📀 O que é o tipo dynamic?


💌 Recadinhos

Gostou do texto? Tem algo a adicionar? Alguma crítica construtiva? Feedbacks? Sugestões? Pedidos? Fique à vontade para me contatar via email (oli.pmatt@gmail.com), Twitter (@oliviamattiazzo), LinkedIn (/oliviamattiazzo) ou pela caixa de comentários aqui embaixo! Vai ser um prazer conversar contigo! ✨

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.