O Exercism.io ajuda os desenvolvedores a aprimorarem suas habilidades em uma linguagem de programação por meio de feedback e discussões. Ele consiste em uma comunidade e uma ferramenta na qual os desenvolvedores podem escrever e discutir código, para fortalecer suas habilidades na resolução de problemas.
O InfoQ.com entrevistou a criadora do exercism, Katrina Owen, e Richard Thomson que contribuiu com a trilha da linguagem C++ para o exercism.
InfoQ.com: Você poderia apresentar uma breve descrição do que é o exercism.io para nossos leitores?
Thomson: O Exercism é um lugar para praticar e melhorar suas habilidades em desenvolvimento de software. Existem duas forças que influenciam a criação de software: utilidade e arte. O aspecto da utilidade é óbvio: o software realiza a tarefa pretendida ou não a realiza. A realização do aspecto de utilidade do software é foco da maior parte dos esforços no ensino de programação. O software funciona? Ele é robusto? Como corrigir este erro?
O aspecto da arte é mais nebuloso. A arte no desenvolvimento de software é aprendida por meio da experiência e da exposição ao trabalho de outros. Ao trabalharmos pela primeira vez em uma base de código na qual ninguém respeitou o aspecto de arte em seu desenvolvimento, sentimos profundamente sua necessidade. O código é repleto de métodos longos, nomes mal escolhidos, responsabilidades misturadas, desorganização e duplicações.
Com o tempo, a indústria desenvolveu uma terminologia para se referir aos aspectos positivos da arte de desenvolver software através de princípios de design como SOLID, DRY, Law of Demeter, entre outros. Quando o código carece de cuidado em seu desenvolvimento, indicadores específicos foram codificados como diversos mau cheiros: código duplicado, métodos longos, classes longas, dentre outros.
O Exercism assume que você já sabe como resolver o aspecto utilidade da programação, mas está procurando melhorar sua arte. Melhorar sua arte significa interagir com outros programadores, ter discussões sobre algum código cujo problema já foi entendido e usar como base para avaliar uma solução específica para este problema.
Ower: O Exercism permite que as pessoas realizem simples exercícios de programação como um ponto de início para conversas sobre simplicidade, estilo e idiomas na linguagem utilizada. Enquanto as pessoas frequentemente vêm até o Exercism.io por causa dos exercícios, elas geralmente permanecem por causa das conversas.
InfoQ.com: Quais linguagens de programação são suportadas no exercism e que tipos de exercícios são oferecidos?
Ower: Neste momento o exercism conta com 19 linguagens ativas. Em ordem alfabética, são elas: Clojure, CoffeeScript, Common Lisp, C++, C#, Elixir, Erlang, F#, Go, Haskell, JavaScript, Lua, Objective-C, OCaml, Perl (5), Python, Ruby, Scala e Swift.
Também estamos resolvendo os detalhes finais para lançar as trilhas de PHP e Java.
Os exercícios em si representam problemas simples. O formato do exercício inclui um arquivo do tipo "LEIA-ME (README)" e um conjunto de testes para baixar e trabalhar localmente no seu ambiente e com suas ferramentas habituais. O conjunto de testes oferece às pessoas um bom ponto de parada e a parte mais interessante na resolução do problema é fazer iterações sobre as soluções, testando diversas abordagens e respondendo a críticas de outros programadores.
Thomson: Temos uma página de sinopse mostrando as linguagens atualmente disponíveis no exercism e os problemas disponíveis em cada uma das trilhas.
InfoQ.com: O Exercism busca ajudar os desenvolvedores a produzir um código melhor. Mas o que é melhor? Será que podemos realmente saber isso?
Ower: Na maioria das vezes, penso que "melhor" é apenas intuição.
A intuição tende a ser baseada na experiência. O seu "melhor" será muito diferente do meu "melhor", simplesmente porquê trabalhamos em bases de código muito diferentes, e resolvemos problemas de tipos muito diferentes. Coisas familiares para você podem ser muito estranhas para mim.
Podemos aplicar análise estática de código para basear nossa discussão em fatos, mas pra ser honesta, estas coisas não aparecem com frequência no exercism. As conversas tendem a ser mais sobre mau cheiros e legibilidade.
Mesmo sabendo que a definição de "melhor' é inteiramente subjetiva, estas conversas são muito úteis.
Thomson: Assim como a Katrina, acho que alguns aspectos do software são subjetivos. Normalmente isto gira em torno dos nomes que são escolhidos e claro, as discussões acirradas e sem fim sobre espaços em branco e formatação.
No entanto, acho que, com o passar do tempo, a indústria adotou alguns padrões objetivos sobre o que constitui um código "melhor". Métricas de código como a complexidade ciclomática podem fornecer uma resposta para questões simples como "quando uma função ou método é muito complexa?". Regras gerais como "nenhuma função deve ter mais de 5 parâmetros" podem nos mostrar quando uma versão do código é melhor do que outra.
Software é infinitamente maleável e o exercism guia as pessoas na direção de discutir formas alternativas para codificar a mesma funcionalidade, mas que são mais simples de serem entendidas por outras pessoas. Os aspectos mais profundos das discussões são os princípios que fundamentam as regras gerais e o uso de dados objetivos como métricas da complexidade. Estes aspectos são mais baseados na experiência do desenvolvedores, mas avanços recentes na ciência cognitiva fornecem uma base científica que suporta estes aspectos aprendidos por meio da experiência. O recente livro "Principle-Based Refactoring", de Steve Halladay, identifica os princípios que suportam os instintos do autor quando ele está ensinando estudantes a escrever código melhor.
InfoQ.com: Há alguns dias atrás, publicamos no InfoQ um artigo sobre as habilidades de programação necessárias para se tornar um artesão de software. Como o exercism pode contribuir com isto?
Thomson: Com o exercism, você recebe os testes e escreve a implementação para fazer os testes passarem. Isto pode lhe dar uma suave introdução a Test Driven Development, ao invés de ter de pensar nos testes e na implementação ao mesmo tempo. Baixar os testes é apenas o ponto de início para uma discussão da sua solução para o problema. Nesta discussão é que o real "Ah ha!" ocorre.
Aprendi novas maneiras de melhorar meu código Python e JavaScript apenas resolvendo o primeiro exercício em cada uma das linguagens. Minha solução funcionou, mas ela não era elegante e eu não estava me sentindo particularmente orgulhoso do grande volume de expressões regulares que usei para resolver o primeiro problema em JavaScript. Eu sabia que podia fazer melhor. Após submeter minha solução nestas linguagens, pude comparar a solução de outras pessoas e aprendi como fazer a mesma coisa de uma forma mais simples. Mesmo sem feedback específico de outros usuários, apenas buscando por soluções diferentes, aprendi como melhorar meu código e torná-lo mais natural nestas linguagens.
Ower: Acho que a ajuda mais poderosa que o exercism pode oferecer para melhorar suas habilidades é entregar uma maneira focada de olhar para o código de outras pessoas e articular ideias para melhorá-lo. Isto lhe força a ler e entender código que você não escreveu e também a pensar sistematicamente e criticamente. Você começa a reconhecer padrões e mau cheiros e desenvolve um senso muito prático do que é legível ou não.
Mais importante ainda, você precisa articular esta crítica de uma forma que faça sentido. Não é suficiente apenas dizer "Faça isso". Ter de apresentar um racional para seu instinto lhe faz examinar seus preconceitos bem de perto e, as vezes, você vai se surpreender com seus próprios instintos.
InfoQ.com: O hack.pledge() é um movimento mundial para que os programadores se agrupem e auxiliem uns aos outros. O que você pensa desta iniciativa?
Ower: Acho que iniciativas como o hack.pledge(), #pairwithme e CodeNewbies são fantásticas. Elas possuem um componente humano vital que as vezes se perde em muitos posts em blogs sobre como programar melhor.
Thomson: Acho que o exercism é uma ótima maneira de realizar o hack.pledge()!
InfoQ.com: Vamos assumir que estamos em Dezembro de 2015? Com o quê o exercism deve se parecer daqui a um ano e o que foi alcançado no último ano?
Ower: Em primeiro lugar, adoraria ver consistência na qualidade das discussões em todas as trilhas de linguagens. Neste momento, algumas trilhas são muito mais ativas do que outras e em algumas linguagens você vai receber constantemente feedbacks fenomenais (Haskell me veio a mente agora), enquanto em outras, existem muitas pessoas submetendo soluções e muito pouco feedback ou o feedback apresentado é de qualidade variável.
Em segundo lugar, espero melhorar a usabilidade do site, em particular nas questões relacionadas a busca e filtro de problemas e soluções existentes, em seguir pessoas e em ser notificada de atualizações em problemas específicos.
Thomson: Daqui a um ano espero ver mais trilhas de linguagens e mais problemas disponíveis em várias linguagens. Também espero encontrar mais problemas específicos de determinadas linguagens. Espero ver mais participação dos usuários no exercism e novos colaboradores do projeto, tornando-o melhor para todos.