Você se considera um desenvolvedor? Você deveria resolver os problemas do Project Euler

Jonathan Arantes
CHCJr
Published in
5 min readDec 17, 2018

Esta é uma tradução do story de Bennett Garner.

Eu farei uma afirmação ousada. Todo desenvolvedor (ou aspirante à desenvolvedor) deveria resolver os primeiros 50 problemas do Project Euler.

Os benefícios de trabalhar nos problemas do Project Euler são grandes demais para se ignorar:

  • Eles vão expor o que você entende das operações básicas da linguagem que está usando e podem ser resolvidos em qualquer linguagem de programação;
  • Você vai aprender a escrever um código sólido e padrão. Sem a necessidade de bibliotecas, então você não vai ter muletas para depender;
  • Você terá que pensar em como irá armazenar e acessar dados na memória;
  • Você ira precisar otimizar a velocidade de processamento e pensar muito sobre seus algoritmos.

Neste artigo rápido (leitura de 5 minutos), vou argumentar por que você deve resolver os problemas do Project Euler em todas as linguagens de programação que você quer aprender.

Comece com o fundamental

Vince Lombardi with Bart Starr — Public Domain

Vince Lombardi, o lendário treinador de futebol americano, sempre iniciava a pré-temporada de treinamento com um discurso (agora famoso):

“Senhores, “ ele diria para uma sala de jogadores profissionais de futebol, “isto é futebol.” Ele iria em frente e explicaria os passos fundamentais para se jogar e vencer o jogo — correndo, passando, atacando e chutando.

O foco implacável de Lombardi nos fundamentos fez dele o treinador mais vitorioso na história do futebol, com mais campeonatos (5) do que qualquer outro técnico na história.

Os mesmos princípios se aplicam ao desenvolvimento de software.

Qualquer desafio de programação irá testar sua habilidade de usar variáveis, declarações condicionais, laços, e outras características comuns de linguagens de programação.

Project Euler, no entanto, é especialmente rigoroso em testar seu compreensão e comando dos fundamentos. Você terá que combinar os fundamentos em diferentes permutações em ordem de resolver os problemas.

E os fundamentos são tudo o que você precisa. Se você está escrevendo web apps, jogos, ou outras soluções de software, é provável que você tenha se acostumado a usar determinadas bibliotecas para realizar tarefas específicas e previsíveis.

Project Euler remove essas bibliotecas e testa puramente sua capacidade de raciocinar sobre problemas lógicos simples e escrever códigos simples que resolvam esses problemas.

Treinamento para algo que é difícil de ensinar: Intuição de otimização

Tem uma razão para que todo curso de graduação em Ciência da Computação inclui cursos de Algoritmos e Estruturas de Dados, e por que tantas companhias testam pensamento algorítmico em seus processos seletivos.

Em essência, escrever um bom código significa aplicar a melhor solução para o problema lógico em questão.

O desafio é saber quando gastar tempo otimizando e quando ir com a solução simples.

Ás vezes, a solução direta é a melhor solução.

A solução que é a mais legível para outros humanos e intuitivamente faz sentido com frequência é a melhor.

Os primeiros problemas do Project Euler irão te ensinar esta lição. Eles envolvem cálculos simples com upper bounds (relativamente) pequenos. Computadores são rápidos, e não há necessidade de criar trabalho para você mesmo super otimizando as primeiras soluções.

Outras vezes, você precisará otimizar para ver ganhos reais de performance

O que uma aula de Algoritmos na universidade não ensina é sobre como é esperar um algoritmo lento para calcular a resposta de um problema.

Um grande desenvolvedor tem a intuição sobre eficiência. Com o tempo, desenvolvedores experientes criam um sexto sentido para implementações sub-ótimas de soluções para problemas. Você irá desenvolver essa intuição com a experiência, e os problemas posteriores do Project Euler são grandes professores sobre como é a intuição de eficiência.

Se um algoritmo for usado com frequência ou com grandes entradas, o tempo gasto em otimização vale a pena pela economia de tempo no final da linha. Em outros casos, no entanto, não vale a pena o tempo extra para otimizar uma solução que será usada apenas em pequena escala.

Julgar que o trade-off de otimização é a intuição que os desenvolvedores experientes têm, e é uma habilidade que o Project Euler pode começar a ensinar.

Você vai se tornar mais fluente e confiante na linguagem de sua escolha

Resolver até mesmo alguns problemas do Project Euler fará maravilhas em sua confiança e fluência em um determinado idioma. Também é uma ótima maneira de aprender um novo idioma ou atualizar um idioma que você conhecia.

Por exemplo, eu tenho programado exclusivamente em Python nos últimos meses, e faz um tempo que eu escrevi qualquer coisa em C — uma linguagem que conhecia antes de Python.

Eu comecei a implementar os primeiros problemas do Project euler em C para renovar minhas habilidades. Isto fez maravilhas para trazer de volta minhas habilidades e me lembrar da sintaxe. Da mesma forma, usei o Project Euler para aprender os fundamentos do Java, já que a sintaxe do Java é semelhante, mas diferente, de maneiras principais de C.

Uma grande chance de praticar documentação e testes

Se você quer adicionar algo impressionante ao seu portfolio, comece um repositório do GitHub onde você armazenará suas soluções para os problemas do Project Euler.

Então, quando você completar a solução, cheque os nomes de funções e variáveis para ter certeza de que são intuitivas, e remova qualquer código desnecessário.

Depois, adicione comentários sobre por que você tomou das decisões que fez no seu código. Aprender a escrever bons comentários é uma habilidade. Uma boa regra prática: qualquer bom desenvolvedor pode descobrir o que seu código faz, então seus comentários devem explicar por que você fez dessa maneira.

/* TESTS */

static char * test_2() {
mu_assert("error 2 !>> 0", sum_of_multiples(2) == 0);
return 0;
}

static char * test_10() {
mu_assert("error 10 !>> 23", sum_of_multiples(10) == 23);
return 0;
}

static char * test_16() {
mu_assert("error 16 !>> 60", sum_of_multiples(16) == 60);
return 0;
}

static char * test_19() {
mu_assert("error 19 !>> 79", sum_of_multiples(19) == 78);
return 0;
}

static char * test_31() {
mu_assert("error 31 !>> 225", sum_of_multiples(31) == 225);
return 0;
}

Outra ótima oportunidade com Project Euler é aprender unit testing. Adicionar um framework mínimo de testes para seus projetos e escrever testes antes de escrever a solução. Esta é uma ótima forma de se começar com Desenvolvimento Orientado à Testes.

Project Euler, ftw!

Se você solucionar os primeiros 50–100 problemas do Project euler você vai:

  • Tem um comando sólido sobre os fundamentos de programação;
  • Ser confiante e fluente na sintaxe da linguagem de sua escolha;
  • Aprender sobre otimização de algoritmos, e — mais importante — intuição de otimização;
  • Ganhar experiência usando código limpo com boa documentação;
  • Ter uma oportunidade de praticar desenvolvimento orientado a testes;
  • Ter algo impressionante para mostrar em seu GitHub e portfolio.

Eu não sei de nenhum outro conjunto de problemas que seja adequado para ensinar e demonstrar seu domínio dos fundamentos de programação. O Project Euler é obrigatório para qualquer desenvolvedor ou desenvolvedor aspirante.

--

--