Desafios e Campeonatos de Programação

 

Programador ABAP

 

Você sabia que além do campeonato de ABAP inaugurado pelo ABAP101 um tempo atrás existem muitos campeonatos de programação mundo afora? Os organizadores vão desde universidades passando pelas gigantes Google e Microsoft até empresas especializadas. Além das competições, existem vários sites com desafios de programação – geralmente usados como preparação para os campeonatos ou como critério de seleção de candidatos.

Este post além de citar as vantagens de participar em tais competiçōes, cita alguns campeonatos de programação bem como sites com desafios para preparação.

Para muitos programar não é apenas uma ocupação mas sim um hobby ou até um vício. Aposto que muitos que estão lendo este post já ficaram ansiosos no trabalho enquanto programavam por quererem ir para casa programar algo mais interessante/divertido.

Muitas faculdades participam de campeonatos de programação como forma de promover seus cursos e seus estudantes, ao passo que estes ganham visibilidade e experiência na área. A grande maioria dos campeonatos envolvem a solução de uma quantidade de desafios no menor tempo possível (na grande maioria das vezes os desafios tem um estilo acadêmico e voltado para matemática). O nível de complexidade dos exercícios pode variar absurdamente assim como o critério de avaliação para cada uma das soluçōes.

Existem campeonatos nos quais a participação é individual e outros que você codifica em grupo (todos no mesmo computador). Um fato interessante é que programar em grupo pode muitas vezes não ser mais produtivo que programar sozinho, por isso é importantíssimo ter uma equipe bem preparada e entrosada. Vale lembrar que o algumas metodologias ágeis, como no caso da eXtreme Programming, a codificação é feita em pares. A grande maioria dos campeonatos é realizado com equipes de aproximadamente quatro pessoas. Campeonatos cuja participação é individual tendem a ter o propósito de recrutamento. A(s) linguagem de programação permitidas variam de campeonato para campeonato, todavia C, C++ e/ou Java são aceitos quase na totalidade dos casos.

O que particularmente acho mais interessante nos desafios propostos é o critério de avaliação utilizado. Geralmente é necessário submeter seu código fonte para uma ferramenta que avaliará a sua solução. Essas ferramentas basicamente executam o programa criado para uma série de entradas (muitas vezes desconhecidas) e comparam com saídas desejadas. Além de comparar se as respostas fornecidas são corretas, as ferramentas de avaliação sempre analisam sua solução em termos de desempenho e consumo de memória. Caso durante a execução dos testes seu programa demore mais que um tempo limite ou utilize mais memória que o estabelecido, sua solução simplesmente é classificada como errada e você só é informado o porquê desta classificação, ou seja, o tempo limite para cada teste e o limite de memória muitas vezes não é fornecido.

Dado a complexidade dos desafios, existem muitos sites que funcionam como repositórios de desafios de programação. Você encontra uma série de desafios, escolhe os quais deseja resolver e submete sua solução fazendo uploads dos arquivos criados. Em poucos instantes você recebe a resposta se sua solução foi bem sucedida ou não. Estes sites também possuem rankings como forma de avaliar quem está mais viciado bem preparado para os desafios.

Garanto que participar de campeonatos é muito desafiador, divertido e recompensador, arrependo-me de não ter aproveitado esta experiência durante a universidade. O conhecimento de lógica de programação e complexidade de algoritmos evolui drasticamente, além de ser uma excelente forma de aprender uma nova linguagem (utilizada por muitos diga-se de passagem). Não obstante, você é submetido a trabalhar sob pressão por conta do tempo limite para solução dos desafios. Enfim, recomendo e muito. Caso você não esteja na faculdade ou simplesmente não tem interesse em participar de competiçōes, considere se cadastrar em algum(ns) dos repositórios de desafios. Eles são gratuitos e o trabalho não machuca nenhum pouco. :-). Confira abaixo os principais campeonatos e repositórios de desafios.

Campeonatos de Programação

  • Facebook Hacker Cup: Por ser realizado pela maior rede social do mundo, este campeonato tem tudo para estar entre os mais conhecidos mundialmente. A competição ocorre anualmente e amanhã (21 de Janeiro) começa sua segunda. edição.
  • Matarona de Programação: Realizada pelo IME/USP, esta é uma das principais competiçōes entre universidades. Este campeonato pode ser comparado como um “pré-olímpico” pois os vencedores vão para torneios mundiais de alto renome.
  • ACM-ICPM: A maior “olimpíadas” de programação entre universidades. Simplesmente o campeonato mais antigo e prestigiado de todos os tempos.
  • TopCoder Open: realizado pela comunidade TopCoder (veja mais detalhes abaixo), um campeonato completo de programação que não se limita a avaliar o melhor algoritmo.
  • InterviewStreet CodeSprint: A start-up InterviewStreet ajuda outras start-ups e algumas modestas empresas como Apple, Facebook, Microsoft, Skype, Dropbox e Grupon a recrutar desenvolvedores e engenheiros de software. Ela promove um campeonato de programação chamado CodeSprint de tempos em tempos no qual você tem um final de semana inteiro para resolver uma série de desafios. Além da parceria com empresas que querem contratar, o interessante deste campeonato é a existência de desafios baseados em problemas reais de empresas e não apenas desafios acadêmicos sem muita utilização prática.
  • Dementia – Survive the Coding Madness: Muito popular na Índia, China e outros países asiáticos, este campeonato é apoiado pela comunidade CodeChef e pela IBM e disponível apenas para estudantes.
  • CodeChef Cook-Of: competição mensal aberta a todos também realizada pela comunidade CodeChef.
  • AI Challenge: esta é uma competição focada em Inteligência Artificial apoiada pelo Google.
  • Russian Code Cup: Os russos são excelentes desenvolvedores. Se você consegue entender o site deste campeonato, por favor nos dê mais detalhes sobre o mesmo.

Repositórios de desafios de programação

  • UVa (UVa Online Judge): utilizei este repositório durante minhas aulas de “Desafios de Programação” na universidade. Há uma infinidade de problemas nos mais diversos níveis de dificuldade. Você pode ver quantas vezes cada problema foi resolvido, quantas tentativas em média são necessárias para chegar na solução correta e quantas pessoas resolveram cada desafio. Além disso você encontra muita informação de livros sobre o assunto.
  • ACM-ICPC Live Archive: Muito parecido com o UVa, possui uma grande quantidade de problemas coletados desde 1988.
  • TopCoder: é covardia chamar este site de um simples repositório de desafios. O TopCoder é uma comunidade enorme com a nata de programadores de todo mundo e você é capaz de praticar muito mais do que programação incluindo arquitetura, design, testes, UI etc.
  • CodeChef: uma grande comunidade assim como o TopCoder, muito famosa no oriente. Possui seus próprios campeonatos e é pouco conhecida por brasileiros. No momento, menos de 15 brasileiros cadastrados que resolveram no mínimo um desafio. Eles tem até uma badge com o programador do mês.
  • CoderChart: Com parceirias como o Google, este repositório lhe dá visibilidade para conseguir um emprego. Eles também tem prêmios especiais para participantes para que se destacam em uma dada linguagem.
  • SPOJ (Sphere Online Judge) e SPOJ Brasil: este repositório é bem conhecido e também tem uma grande variedade de desafios. A comodidade vantagem é sua versão em português, indiscutivelmente muito mais limitada. A desvantagem deste repositório fica por conta da cor pastel do background. Com toda certeza não há desafios envolvendo ergonomia nele.
  • InterviewStreet Challenges: O InterviewStreet (mencionados nos campeonatos) também possui um pequeno repositório de desafios. Há apenas alguns mas de boa complexidade. Aconselho caso deseje participar do campeonato da empresa.
  • Timus Online Judge: O maior repositório de problemas da Rússia, mas que o ranking está repleto de chineses.
  • PKU Online Judge: Repositório da Universidade de Pequim, também está repleto de chineses.

Finalmente, se você ainda não foi convencido da utilidade destes desafios e competiçōes, leia o post “Onde Estará Seu Currículo“, que discute sobre a tendência cada vez mais forte de desenvolvedores serem avaliados pelas linhas de código que já produziram do que pelas linhas de cursos e empresas que já passaram nos seus currículos. Garanto: isso vai chegar ao mundo ABAP mais cedo ou mais tarde (ou bem mais tarde mesmo) mas para mim e para outros entrevistadores que lêem este post, a tendência já chegou.

Caso você conheça mais algum campeonato ou repositório por favor inclua ele nos comentários. Conte para nós se você já participou de algum campeonato e como foi a experiência. Caso utilize algum repositório de desafios, diga o que aprendeu com eles.

* Obrigado ao Prof. Luciano Digiampietri, Caio Santiago,@abhi9u, @shrivastavasitz, @mastersobg, @dmlicht e @codechef por me ajudarem a formar esta excelente lista de campeonatos e repositórios.

 

Fábio Pagoti

Formado em Sistemas de Informação pela Universidade de São Paulo. Comecei no mundo da programação com Java mas logo caí no mundo ABAP. Estagiei na Nestlé por 2 anos e foi lá onde conheci o Furlan. Depois de efetivado fui morar no Canadá por 1 ano onde pude aprender a área de testes em desenvolvimento de software. Hoje sou consultor e instrutor ABAP, amante de projetos Open Source, Wordpress, Data Mining e da esfera SAP. Siga-me no twitter: @fabiopagoti