O Kata de código definitivo

Quando eu estava folheando o livro de Steve Yegge volumoso corpo de trabalho recentemente, fiquei impressionado com uma entrada de 2005 sobre praticando programação:

Ao contrário do que o senhor possa pensar, o simples fato de fazer seu trabalho todos os dias não se qualifica como prática real. Ir a reuniões não é praticar suas habilidades com pessoas, e responder a e-mails não é praticar a digitação. O senhor precisa reservar algum tempo de vez em quando e praticar com foco para melhorar em alguma coisa.

Conheço muitos engenheiros excelentes – essa é uma das melhores vantagens de trabalhar na Amazon – e se o senhor os observar com atenção, verá que eles praticam constantemente. Por melhores que sejam, eles ainda praticam. Eles têm todos os tipos de maneiras de fazer isso, e este ensaio abordará algumas delas.

Os grandes engenheiros que conheço são tão bons quanto são porque praticam o tempo todo. As pessoas que estão em ótima forma física só ficam assim se fizerem exercícios regularmente, e precisam continuar assim, ou ficarão fora de forma. O mesmo se aplica à programação e à engenharia.

Essa é uma distinção importante. Posso ir de carro para o trabalho todos os dias, mas estou longe de ser um motorista profissional. Da mesma forma, programar todos os dias pode não ser suficiente para torná-lo um programador profissional. Então, o que pode transformar alguém em um piloto ou programador profissional? O que o senhor faz para praticar?

A resposta está no artigo da Scientific American A mente do especialista:

A Ericsson argumenta que o que importa não é a experiência em si, mas o “estudo esforçado”, que implica enfrentar continuamente desafios que estão além da competência da pessoa. É por isso que é possível que entusiastas passem dezenas de milhares de horas jogando xadrez, golfe ou um instrumento musical sem nunca avançar além do nível amador e que um aluno devidamente treinado possa ultrapassá-los em um tempo relativamente curto. É interessante observar que o tempo gasto jogando xadrez, mesmo em torneios, parece contribuir menos do que esse estudo para o progresso do jogador; o principal valor de treinamento desses jogos é apontar os pontos fracos para estudo futuro.

Estudo com esforço significa lidar constantemente com problemas no limite de sua capacidade. Coisas em que o senhor pode ter uma grande probabilidade de fracassar. A menos que o senhor seja falhe em parte do tempo, o senhor provavelmente não está crescendo profissionalmente. O senhor precisa buscar esses desafios e ir além do seu limite de conforto.

Esses desafios às vezes podem ser encontrados no trabalho, mas não precisam ser assim. Separando o praticando do profissão é frequentemente referida como código kata.

Ilustração de Katas

O conceito de kata, uma série de movimentos de prática coreografados, é emprestado das artes marciais.

Se o senhor estiver procurando por alguns exemplos de kata de código – maneiras de praticar o estudo com esforço e aprimorar suas habilidades de programação -, o Artigo de Steve tem alguns pontos de partida excelentes. Ele os chama de exercícios de prática:

  1. Escreva seu currículo. Liste todas as suas habilidades relevantes e, em seguida, anote aquelas que ainda serão necessárias daqui a 100 anos. Dê a si mesmo uma nota de 1 a 10 em cada habilidade.
  2. Faça uma lista de programadores que o senhor admira. Tente incluir alguns com os quais trabalhe, já que os pegará emprestados para alguns exercícios. Faça uma ou duas anotações sobre coisas que eles parecem fazer bem – coisas em que o senhor gostaria de ser melhor.
  3. Acesse o site da Wikipedia entrada para ciência da computação, role para baixo até a seção “Prominent pioneers in computer science” (Pioneiros proeminentes da ciência da computação), escolha uma pessoa da lista e leia sobre ela. Siga os links que o senhor achar interessantes.
  4. Leia o código de outra pessoa por 20 minutos. Para esse exercício, alterne entre ler código excelente e código ruim; ambos são instrutivos. Se não tiver certeza da diferença, peça a um programador que você respeita que lhe mostre exemplos de cada um. Mostre o código que você leu para outra pessoa e veja o que ela acha dele.
  5. Faça uma lista de suas 10 ferramentas de programação favoritas: aquelas que você acha que usa mais, aquelas sem as quais quase não conseguiria viver. Passe uma hora lendo a documentação de uma das ferramentas de sua lista, escolhida aleatoriamente. Nessa hora, tente aprender algum recurso novo da ferramenta que o senhor não conhecia ou descubra uma nova maneira de usar a ferramenta.
  6. Escolha algo em que o senhor seja bom e que não tenha nada a ver com programação. Pense em como os profissionais ou grandes mestres dessa disciplina fazem suas práticas. O que o senhor pode aprender com eles que pode ser aplicado à programação?
  7. Reúna uma pilha de currículos e um grupo de avaliadores em uma sala por uma hora. Certifique-se de que cada currículo seja analisado por pelo menos três avaliadores, que escrevem suas iniciais e uma pontuação (1-3). Discuta os currículos que tiveram uma grande discrepância na pontuação.
  8. Ouça uma tela técnica do telefone. Depois, escreva seu feedback, dê seu voto e converse sobre a tela com o avaliador para ver se os dois chegaram às mesmas conclusões.
  9. Conduza uma entrevista técnica com um candidato que seja especialista em algum campo sobre o qual o senhor não tem muito conhecimento. Peça a ele que lhe explique tudo desde o início, sem pressupor nenhum conhecimento prévio dessa área. Esforce-se para acompanhar o que ele está dizendo e faça perguntas quando necessário.
  10. Convide o senhor mesmo para a entrevista técnica de outra pessoa. Ouça e aprenda. Tente resolver as perguntas da entrevista em sua cabeça enquanto o candidato trabalha nelas.
  11. Encontre um colega para trocar perguntas práticas. Façam perguntas de programação um ao outro, alternando as semanas. O senhor passa 10 ou 15 minutos trabalhando no problema e 10 ou 15 minutos discutindo-o (concluído ou não).
  12. Quando ouvir alguma pergunta de codificação de entrevista que não tenha sido resolvida por você mesmo, volte para a sua mesa e envie a pergunta para si mesmo como um lembrete. Resolva-a em algum momento da semana, usando sua linguagem de programação favorita.

O que eu gosto na lista do Steve é que ela é um tanto holística. Quando alguns desenvolvedores pensam em “prática”, não conseguem ir além dos quebra-cabeças de código. Mas, para mim, programar é mais sobre pessoas do que sobre códigoPortanto, há um limite para o quanto o senhor pode crescer resolvendo todos os problemas obscuros de programação em entrevistas de codificação do planeta.

Também gosto das recomendações gerais de Peter Norvig para o estudo com esforço, descritas em Ensine-se a programar em dez anos.

  1. Converse com outros programadores. Leia outros programas. Isso é mais importante do que qualquer livro ou curso de treinamento.
  2. Programa! O melhor tipo de aprendizado é aprender fazendo.
  3. Faça aulas de programação em nível universitário ou de pós-graduação.
  4. Procure e trabalhe em projetos com equipes de programadores. Descubra o que significa ser o melhor programador em um projeto. e o pior.
  5. Trabalhar em projetos após outros programadores. Aprenda a manter o código que o senhor não escreveu. Aprenda a escrever código para que outras pessoas possam mantê-lo com eficiência.
  6. Aprenda diferentes linguagens de programação. Escolha linguagens que tenham visões de mundo e modelos de programação alternativos, diferentes daqueles com os quais o senhor está acostumado.
  7. Entenda como o hardware afeta o que o senhor faz. Saiba quanto tempo o computador leva para executar uma instrução, buscar uma palavra na memória (com e sem falha de cache), transferir dados pela ethernet (ou pela Internet), ler palavras consecutivas do disco e buscar um novo local no disco.

O senhor também pode obter mais inspiração em Pragmatic Dave’s 21 Code Katasou talvez o senhor queira participar de um Coding Dojo em sua região.

Não tenho uma longa lista de conselhos para estudar com afinco, como fazem Steve, Peter e Dave. Sou impaciente demais para isso. Na verdade, há apenas dois movimentos em meu livro de kata de código:

  1. Escrever um blog. Comecei este blog no início de 2004 como uma forma de estudo esforçado. Desde esse humilde começo, ele se tornou a coisa mais importante que já fiz em minha vida profissional. Assim o senhor deveria escrever blogstambém. As pessoas que conseguem escrever e se comunicar com eficiência são, com muita frequência, as únicas que são ouvidas. São elas que estabelecem os termos do debate.
  2. Participe ativamente de um ou três projetos de código aberto notáveis. Toda essa conversa chique de blá blá blá é ótima, mas será que o senhor está um falador ou um executor? Isso é extremamente importante, porque o senhor será julgado por suas ações, não por suas palavras. Tente deixar um rastro de coisas públicas, concretas e úteis que o senhor possa apontar e dizer: Eu ajudei a construir isso.

Quando o senhor pode escrever um código brilhante e explicando esse código para o mundo – bem, eu acho que isso é o kata de código definitivo.