Um percurso do Exercism com todas as funcionalidades tem dois tipos de exercícios: Exercícios de Conceito e Exercícios de Prática. São fundamentalmente diferentes e complementam-se bem.
Os Exercícios de Conceito de um percurso são exercícios concebidos para ensinar conceitos individuais que formam a base de uma linguagem de programação específica. Estes conceitos formam um plano de estudos.
Esta documentação contém indicações e dicas sobre como conceber com sucesso um plano de estudos para o teu percurso.
O objetivo final de um plano de estudos é levar os estudantes a sentirem-se à vontade a ler e a escrever código idiomático na linguagem em questão.
Cada Exercício de Conceito individual é extremamente focado. É um passo pequeno e muito direcionado que faz o estudante avançar no sentido de compreender algo sobre a linguagem. Assenta apenas em conceitos que foram introduzidos anteriormente.
Ao resolver o exercício, o estudante começa o processo de se familiarizar com o conceito. A compreensão surge sobretudo pela prática, muito menos pelas explicações. O conteúdo explicativo existe para introduzir o estudante nas ideias de que precisa para resolver o exercício (daí a escolha do nome do ficheiro: «introduction.md»).
Queremos permitir que os estudantes comecem a escrever código imediatamente, sem terem de perceber tudo à partida. Para o conseguir, passamos por cima de detalhes e deixamos muitas coisas por explicar. Simplificamos e fornecemos esqueletos de código sempre que possível. Isto reduz a carga cognitiva do arranque e dá tempo e espaço para que o conhecimento se assimile. Ao adotar esta abordagem, não estamos a dizer que o estudante não precisa de saber estas coisas; estamos a dizer que não precisa de as saber ainda.
Muitas vezes, os primeiros exercícios têm de conter código não idiomático. Isto acontece porque, no início, a maior parte da linguagem ainda é desconhecida para o estudante e a maior parte dos conceitos ainda não foi introduzida. Ao permitir código não idiomático nos primeiros exercícios, os estudantes conseguem dar muitos passos pequenos em terreno familiar, em vez de poucos passos grandes em terreno desconhecido. O resultado é que conseguem chegar à fase do código idiomático mais depressa e com menos atrito.
Os exercícios estão organizados como uma árvore, com um exercício introdutório no topo como ponto de partida. Os exercícios seguintes ensinam conceitos que dependem de ter compreendido conceitos ensinados antes.
Pode valer a pena ver como outros percursos de outras linguagens construíram os seus exercícios de conceito. Podes encontrar exemplos de Exercícios de Conceito de percursos de outras linguagens aqui.
Dito isto, se decidires usar outros exercícios como ponto de partida para os teus, tem cuidado para garantir que o exercício resultante é sobre o conceito tal como ele existe na tua linguagem. Por vezes, os conceitos diferem subtilmente, outras vezes radicalmente. Há também conceitos que simplesmente não existem noutras linguagens.
O plano de estudos, e portanto a árvore de conceitos, deve representar os conceitos que existem nesta linguagem específica.
Não incluas conceitos só porque outros percursos o fazem.
Nalguns casos, pode ser tentador incluir um conceito porque as pessoas têm muitas vezes de o contornar usando conceitos que existem. Em vez de fazer isso, introduz o conceito que a linguagem usa de facto e considera acrescentar um exercício que explique como usá-lo nesse tipo de situação.
Por exemplo, em Go não existem enums. Em vez disso, a árvore de conceitos de Go introduz constantes e ensina a usá-las no tipo de situação em que usarias enums noutras linguagens.
Não hesites em pedir ajuda. É melhor perguntar logo no início, ou enquanto trabalhas num exercício, do que discutir durante a revisão de código.
No GitHub, podes mencionar a equipa @exercism/learning-mode. No fórum do Exercism, abre um issue na categoria Exercism Support.
A nossa experiência ensinou-nos que a forma mais pragmática de desenvolver um plano de estudos é fazer crescer a árvore de conceitos de forma orgânica, começando pelos conceitos mais simples. Não temos de conceber tudo à partida e, na verdade, é geralmente útil não pensar demasiado à frente.
Começamos pelo mínimo indispensável de conceitos, ou seja, aqueles que são mais fundamentais para escrever qualquer coisa na linguagem. Também tentamos começar pelos conceitos que são mais familiares ao programador comum. Familiar é bom. Familiar não é confuso.
Lembra-te de que, embora o objetivo final seja escrever código idiomático, os passos intermédios até lá nem sempre são idiomáticos. Usar o que é familiar, mesmo que não seja um grande exemplo de código nessa linguagem, ajuda o estudante a chegar mais depressa ao objetivo de escrever código mais típico da linguagem.
Em vez de tentares mapear toda a árvore de conceitos à partida, começa apenas pelo primeiro exercício. O objetivo do primeiro exercício é permitir que o estudante comece a aprender com o mínimo de atrito possível. Está a dar o primeiro passo no sentido de se familiarizar com o aspeto do código nesta linguagem. Pode escrever um pequeno trecho de código ou, talvez, fazer apenas um par de adições a um esqueleto para completar o exercício. Os estudantes já resolveram o "Hello, World!" para poderem aceder a este exercício. Mas no "Hello, World!" só estão a mudar o texto. Toda a sintaxe da linguagem pode ainda ser desconhecida. Tenta otimizar para uma vitória rápida e para que os estudantes fiquem suficientemente familiarizados com o essencial da sintaxe para poderem avançar com confiança.
Lê mais sobre desenvolver o primeiro exercício.
O primeiro exercício deve desbloquear alguns exercícios que introduzem conceitos fundamentais. Serão coisas como primitivos ou tipos básicos e operações simples sobre esses tipos.
Lê mais sobre desenvolver os exercícios seguintes.
É aqui que a coisa começa muitas vezes a ficar interessante. Há tanta coisa que poderias introduzir neste ponto. Como decides que conceitos abordar a seguir?
Não importa assim tanto. Desde que comeces por algum ponto que pareça razoável, vai correr bem.
Lê mais sobre o que entendemos por "razoável" no contexto de expandir a árvore de conceitos.
Um bom Exercício de Conceito é extremamente focado e, idealmente, ensina apenas um conceito. Haverá normalmente apenas uma abordagem esperada para o resolver. Isto contrasta com os Exercícios de Prática, que são abertos e propícios à exploração.
Um bom Exercício de Conceito é, normalmente, um mau Exercício de Prática, e vice-versa. Uma vez que os objetivos dos Exercícios de Prática e dos Exercícios de Conceito são completamente diferentes, não pegamos em Exercícios de Prática para os converter em Exercícios de Conceito. Escrevemos todos os Exercícios de Conceito a partir do zero ou baseamo-los em histórias criadas explicitamente com o propósito de ensinar conceitos simples.
Às vezes, vais sentir que estás num impasse. O conceito A exige compreender o conceito B, e o B exige compreender o A.
Nesse caso, simplifica. Passa por cima de alguma complexidade num deles para que consigas familiarizar os estudantes com o outro. Não há qualquer problema em dizer que algo será introduzido com mais profundidade mais tarde e que, por agora, o estudante só precisa de compreender este pequeno detalhe.
Os conceitos são compreendidos mais profundamente por etapas e ao longo do tempo.
Um exercício de conceito tem sempre uma história.
Se estiveres a fazer um fork de um exercício de outro percurso, o exercício já terá uma história. Nesse caso, está tudo pronto.
Para ver se há histórias existentes que possas usar ou exercícios de que possas fazer fork, consulta a lista de histórias.
Se tens um conceito mas não tens uma história, a nossa recomendação é escreveres um exemplo de código pequeno e simples que use o conceito que estás a introduzir. Depois, deduz uma história a partir do código. Mantém a história estupidamente simples. Não tem de ser boa ficção. Não precisa de um enredo forte nem de desenvolvimento de personagens. Pode ter apenas um par de linhas.
Troca ideias para histórias com a equipa do Exercism. Temos muita experiência a inventar histórias adequadas.
Depois de teres uma história, é provável que precises de ajustar um pouco o código para que encaixe na história.
Trabalhar num plano de estudos envolve duas atividades distintas mas interligadas:
Temos verificado que é divertido e enriquecedor envolver a comunidade mais vasta na implementação de exercícios. No entanto, a conceção do plano de estudos em si é mais fácil de abordar com uma pequena equipa de colaboradores que estejam todos empenhados em compreender o plano de estudos completo, com todas as suas subtilezas.
Dito isto, recomendamos que a equipa de conceção do plano de estudos implemente primeiro os primeiros cinco ou seis conceitos, antes de abrir a porta às contribuições da comunidade. Isto ajuda a garantir que as pessoas da equipa principal de conceção do plano de estudos compreendem elas próprias o processo antes de terem de rever pull requests de pessoas da comunidade mais vasta.
Também é mais fácil criar issues para estes conceitos de ordem superior e é geralmente mais divertido para os membros da comunidade trabalhar neles, uma vez que há menos restrições com que se preocupar.
Ainda não descobrimos qual é a melhor forma de criar issues para criar exercícios de conceito.
Nalguns percursos, tentámos criar exercícios separados para o conceito em si e para o exercício. Noutros, tentámos criar issues com uma lista de verificação para ir seguindo. No geral, achamos que isto ainda é demasiado intimidante e gostaríamos de encontrar uma forma melhor.
Fala connosco sobre o processo quando começares a criar issues e faremos o possível para ajudar a perceber como avançar.
Vamos atualizar a documentação à medida que aprendermos melhores formas de abordar isto.