terça-feira, 20 de outubro de 2009

Cadê os clássicos da "literatura de códigos"?

Muito bem, concordo que alunos de computação e cursos afins precisam aprender a ler código. Muito mais do que acostumá-los com a sintaxe, queremos ensiná-los a compreender o que estão lendo, a tirar da leitura mais do que se vê superficialmente.

Por exemplo, o que diz essa função?

void saveAgendaAsCSV(List agenda) {
  String csv = new StringBuilder(MAX_CSV_SIZE);
  for (user in agenda) {
    csv.append(user.name);
    csv.append(",");
    csv.append(user.phone);
    csv.append(",");
    csv.append(user.email);
    csv.append("\n");
  }
  return csv;
}


O novato diz que ela itera sobre os membros de uma lista de usuários e retorna um string com todos os dados dos usuários, um por linha. O programador experiente diz que ela converte uma lista de usuários ao formato CSV, para ser exportada. O grande programador sabe que essa função implementa a liberdade de dados que a aplicação permite. O novato sabe como a função trabalha. O experiente sabe o que a função faz. O grande sabe por que ela existe.

Todo código conta uma estória. O programador precisa saber ler além das simples linhas de código e entender a estória. Que estória esse trecho de código conta?

if (userId != 0) {
  associarUsuarioAoGrupo(userId, groupId);
} else {
  throw new RuntimeException("User id should not be zero.");
}


Desiste? A estória é a seguinte: um dia, houve um bug que levou horas para encontrar. O culpado era um id de usuário no banco de dados que valia zero, quando isso deveria ser impossível. Ao invés de descobrir como o problema aconteceu e corrigir o erro real, garantindo que isso nunca mais aconteça, o programador preferiu acreditar que o erro acontecerá de novo e está se defendendo para a próxima vez.

O que queremos estudar é a compreensão de textos, algo muito mais complexo do que sintaxe. Na escola estudamos o livro O Velho e o Mar, que pode ser apenas um conto de pescador, mas aprendemos que é uma alegoria que permite inúmeras interpretações sobre a condição humana. Assim precisa ser com a leitura de código - precisamos ensinar ao aluno a enxergar no código não só a estrutura de comandos, mas o projeto e arquitetura do sistema, assim como seus requisitos.

Só que implementar isso é bem mais difícil do que parece. Não acho que é suficiente uns alunos lerem o código dos outros. Como disse a Guta, eles precisam ler bons códigos. Mas de onde vamos tirar esses bons códigos?

Talvez eles venham da comunidade de código aberto, mas a verdade é que ainda não temos a resposta para essa pergunta. A comunidade acadêmica precisa coletar uma amostra significativa de bons sistemas para serem estudados - o equivalente a uma biblioteca de clássicos da literatura. Esses sistemas podem ser estudados por várias gerações de alunos e servirem como bons exemplos.

Vai dar um trabalhão, mas quanto mais esperarmos pra começar, mais vai demorar. Mãos à obra, então!

6 comentários:

  1. Sobre a função saveAgendaAsCSV, o compilador acusa erro de compilação :)

    ResponderExcluir
  2. Ha! Essa foi boa. Além de "o novato" e "o experiente" eu devia também ter perguntado "o que o compilador diz a respeito dessa função?" :-)
    Tem um erro realmente, tirando é claro as variáveis e classes não declaradas que presume-se estão declaradas externamente. Veja se você consegue achar...

    ResponderExcluir
  3. A função é declarada retornando void e você retorna uma String em seu final. Era deste erro que estava me referindo :-)

    ResponderExcluir
  4. É isso aí, falha nossa! E me desculpe, por "você" eu estava me referindo a "você, leitor" e não a "você, Alan" - afinal de contas foi você quem descobriu que tinha erro em primeiro lugar.

    ResponderExcluir
  5. Ahh, odeio if-elses.. pq nao:

    Preconditions.checkArgument(userId > 0);
    Preconditions.checkArgument(groupId > 0);
    associarUsuario(userId, groupId);

    ResponderExcluir
  6. Essa linha também dá erro de compilação:

    String csv = new StringBuilder(MAX_CSV_SIZE);

    ResponderExcluir