Back-End

5 set, 2012

Sobre codar e jogar xadrez

Publicidade

Introdução

Isso acontece com todos os programadores. Após alguns trabalhos preliminares, você está no ponto em que pode ver a solução com a sua percepção, e tudo o que resta para ser feito é escrever o código. Aí você divide em etapas, o que você acha que vai te trazer sucesso, e inicia a codificação. Rapidamente, você percebe que não é tão simples, e alguns dias depois tem uma versão em execução, porém você não está feliz com ela. É frágil, grande e roda terrivelmente. Tem a elegância de uma girafa bêbada, e você se sente decepcionado. Muitos programadores dizem para si mesmos nesse momento: “Quão difícil pode ser? ‘.

E o que é pior: os seus gestores, que não podem codificar para salvar sua vida, vão fazer a mesma pergunta.

Deixe-me partilhar um insight que me conforta em momentos assim. Vou tentar responder exatamente a essa pergunta.

Vejamos algo mais simples

Eu vou trapacear um pouco, como uma tentativa de estabelecer exatamente o quão difícil é a programação para mim. Por isso vou me contentar com algo mais simples. Vamos encontrar algo que seja realmente mais fácil do que a programação em si. Bem, o xadrez me parece ser um bom candidato.

O xadrez é um jogo limitado. Seu universo inteiro é composto por apenas 64 quadrados e existem dois exércitos de no máximo 16 peças, cada uma seguindo algumas regras simples. Os jogadores se revezam, cada um move uma peça (excepcionalmente 2) e tenta dar um xeque-mate em seu oponente. A posição de partida possui apenas 20 movimentos possíveis, e uma posição complexa possui cerca de 50 movimentos possíveis (eu já vi posições compostas com mais de 200 movimentos), dos quais talvez 10 pareçam realmente jogáveis. Um jogo pode durar 200 movimentos, mas um jogo típico dificilmente chega a 50 lances. No final, você só pode ter uma quantidade finita de posições possíveis.

A programação, por outro lado, é muito menos limitada. Você pode combinar algoritmos, estruturas de dados, linguagens de programação e paradigmas em um número quase infinito de combinações. À medida que você escreve código, a única coisa que te segura é que você precisa produzir algo que seja aceitável para a sintaxe da linguagem de programação que esteja usando. Fora isso, você está livre. Uma linguagem de programação como Java tem uma sintaxe simples (em comparação com C++, pelo menos), mas ainda é muito rica em possibilidades. Você pode pegar a sintaxe para construir pequenas classes, e pode então pegá-las e combiná-las como Lego, para construir blocos de construção mais complexos eternamente. Ainda melhor, o seu playground (o hardware no qual você trabalha) torna-se mais e mais poderoso para que você possa experimentar coisas que eram impossíveis há apenas alguns anos atrás. Comparado ao xadrez, na programação você pode combinar as peças e construir novas, ampliar as possibilidades, e assim por diante. Pensando nisso, é seguro dizer que a programação é pelo menos tão complexa como o xadrez.

Se alguém ainda tiver dúvidas, posso dizer que vamos construir programas que jogam xadrez que são capazes de derrotar qualquer ser humano. A que distância estamos dos programas de programação? Ok, o xadrez é realmente algo mais simples. A programação é pelo menos tão difícil quanto o xadrez. Pode ser muito mais difícil, mas é muito difícil provar, por isso vou me contentar com “pelo menos tão difícil”.

Sobre o xadrez

Vamos falar um pouco mais sobre o Xadrez. Ele é realmente um jogo muito antigo. Supostamente, o primeiro profissional foi Abu-Bakr Muhammad ben Yahya al-Suli (854-946). Ele era o melhor jogador do seu tempo, e autor de um livro que descreve uma forma sistemática de jogar Shatranj. No mundo árabe, ainda se pode ouvir ocasionalmente o comentário: “Ele jogou como Yahya al-Suli”. Mas ele jogou um dos jogos que eram antecessores do xadrez.

O xadrez moderno existe há mais de meio milênio, e as pessoas ficam bastante surpresas ao saber que algumas das manobras padrão existem esse tempo todo.

Por exemplo, todo jogador de xadrez conhece a posição “Lucena”, mostrada abaixo:

Ela é atribuída a Luis Ramirez de Lucena, que escreveu um livro sobre xadrez publicado em 1497 (você leu corretamente: 1497!).

Existem vários livros de xadrez por aí no mercado. Se você fizer uma pesquisa no Google com esse tema vai notar que existem a mais de 200 mil resultados. Apenas uma minoria desses livros tem como público-alvo pessoas novatas no assunto. É engraçado notar que um jogo tão limitado é rico o suficiente para um monte de novos livros serem publicados a cada ano.

Sobre os jogadores de xadrez

Uma das coisas interessantes sobre o xadrez é que cada jogador possui um nível de habilidade (chamado de Elo). Isso permite que você veja exatamente o quão bom um jogador é, e permite, também, que você calcule as probabilidades de um jogador ganhar de outro. Fide mantém registros das avaliações e possui um banco de dados online onde você pode navegar. Por exemplo, vamos pegar dois dos melhores jogadores do mundo e compará-los. O líder Magnus Carlsen possui atualmente um índice de 2835. Se ele jogar contra o jogador número um dos EUA, Hikaru Nakamura, que atualmente tem um rating pontuação de 2759, ele marcará cerca de 0,60, ou terá a pontuação de cerca de 6 pontos em uma partida de jogo de 10.

import math
def expected(r_a,r_b):
    d = r_b - r_a
    e = d / 400.0
    n = 1 + math.pow(10,e)
    return 1.0/n

print expected(2835, 2759)

A avaliação de uma pessoa no xadrez evolui no tempo. Se um pontua melhor do que a classificação do outro prevê, sua classificação vai subir, e vice-versa. Melhorar sua habilidade de xadrez é igual a melhorar seu índice Elo. Por exemplo, a evolução Anish Giri pode ser encontrada aqui. Na verdade, o elo é tão predominante que as pessoas o usam para se referir a um adversário: é ainda mais importante do que o nome. Se um jogador de xadrez quer mostrar o seu jogo para um colega, ele vai dizer algo como: “Eu derrotei ontem um 1900. Deixa eu te mostrar como foi”.

Está a fim de jogar?

Como se vê, o xadrez é muito difícil fícil para a maioria das pessoas dominar. Um mestre (ver Mestre Internacional) possui uma avaliação acima de 2400. É um nível que apenas algumas pessoas já alcançaram (cerca de 1% ou 2% dos entusiastas do xadrez em todo o mundo).

Pessoalmente, posso dizer que é muito difícil: eu comecei a jogar com 17 anos, investi horas incontáveis, li (pelo menos comprei) mais de cem livros, e só atingir o nível 2000. Há algumas limitações no meu jogo que eu não consigo eliminar, então devo limitar a minha ambição. Conversando com as pessoas sobre o porquê disso, elas disseram que o principal motivo é que eu comecei tarde demais. Enfim, se eu me esforçar um pouco mais, talvez possa chegar a 2100. Talvez.

Então você acha que pode codificar?

Ok, vamos voltar à programação. Nós afirmamos antes que ela é, pelo menos, tão difícil quanto o xadrez, e depois aprendemos que xadrez é realmente muito difícil. Assim, a programação é realmente muito difícil. Uma maneira de melhorar é programando, analisar onde você errou, e iterar na esperança de que você melhore enquanto faz isso.

Assim como o xadrez, ler um livro sobre o assunto não fará de você um programador melhor. Se tiver sorte e ler um bom livro sobre o tema (seja ele de xadrez ou de programação), você terá algumas ideias sobre o que está fazendo de errado. Mas essas ideias em si não vão melhorar você magicamente. Então, você precisa fazer um árduo esforço. Algumas das coisas que eu aprendi que irão ajudá-lo a fazer esse esforço são:

  • Enfrente um novo tipo de problema (um mecanismo de xadrez, um mecanismo de renderização, um depósito de chave valor distribuído, um compilador, …)
  • Aprenda uma nova linguagem de programação
  • Aprenda um novo paradigma de programação (FP, OO, Declarative)
  • Aprenda uma nova plataforma (GPU, FPGA, …)
  • Aprenda com um programador melhor

Programadores mestres, alguém por aí?

Seja qual for a atividade, alguns seres humanos serão melhores do que outros. Tal como acontece com o xadrez, na programação, haverá algumas pessoas que já atingiram o “nível de mestre”. Mas eu sou um cético. Até hoje não vi nenhuma. Além disso, enquanto não temos nada ainda parecido com uma classificação Elo para programadores, posso afirmar que eles não foram observados. Na verdade, a classificação Elo para programadores pode funcionar como fator discriminador para os autores também, exatamente como ele faz com livros de xadrez (livros de xadrez escritos por um não-mestre são raros, e ser um mestre também não é uma garantia de que você vai escrever um bom livro… Mas isso é uma discussão completamente diferente).

Eu me irrito com os livros publicados de pessoas que são incompetentes me dizendo como codificar ou organizar o processo de desenvolvimento de software. Já foram os dias em que eu costumava valorizar uma coisa simplesmente porque ela foi escrita em um livro. Na verdade, quanto mais alguém me diz como fazê-lo, mais desconfiado fico. Esse é um resultado direto da minha interação com os mestres de xadrez. Às vezes eu peço o conselho para um em um problema que enfrentei, e na maioria das vezes eles respondem com palavras nebulosas como “eu acho que você provavelmente deve tentar organizar suas peças mais ou menos assim …”. A mesma posição, quando mostrada a um jogador menos bem classificado muitas vezes leva à uma explicação como esta: “você precisa primeiro pegar aqui e ali, e empurrar o peão”. Como é possível que a mesma posição não seja clara para um mestre, embora seja evidente para um patzer? Eu penso que se trata do respeito pela complexidade do jogo. Se você vê mais, você teme mais.

Palavras finais

Basicamente, acho que vale a pena lembrar duas coisas deste artigo. Primeiro, a programação é realmente muito difícil. Em segundo lugar, seria vantajoso se houvesse uma classificação Elo para programadores. Ele, pelo menos, evitaria que alguns autores reunissem coragem suficiente para publicar um livro sobre programação. Isso certamente permitiria melhores decisões de contratação e, talvez, pudesse ajudá-lo a ganhar o dinheiro que você merece por seus esforços. Ou você está sendo pago em excesso?

Divirta-se!

Post Scriptum

Algumas pessoas comentaram que algo parecido com a classificação Elo para programadores não poderia ser criado porque a programação não é uma competição cabeça contra cabeça. Como se vê, isso não é necessário. Sites como chesstempo.com mostram que você também pode competir contra quebra-cabeças. O que acontece lá é que um concorrente recebe um quebra-cabeça. Caso resolva, ele receberá pontos, e o quebra-cabeça perderá pontos de classificação. Se o usuário falhar, o quebra-cabeça coletará pontos do usuário. Dessa forma, não só os usuários se classificam, mas também os quebra-cabeças, o que permite que o site sempre apresente aos usuários quebra-cabeças que se encaixam mais ou menos em seu nível. O mesmo conceito pode ser utilizado para qualquer tipo de teste/exame. A coisa boa é que as pessoas têm uma ferramenta para calcular o seu nível e podem trabalhar para melhorá-lo. Exatamente o tipo de feedback que uma pessoa precisa.

***

Texto original disponível em http://blog.incubaid.com/2012/02/24/how-hard-can-it-be-on-coding-chess-and-elo/