December 11, 2016

What Exercism Is and Isn't

‚ÄčThere was an interesting conversation recently about what sort of exercises make sense for Exercism to include.
I'd like to be able to give people a nice resource where they can learn introductory image analysis with Python and scikit-image, but in general it would be nice to be able to support any third party library or skillset. I feel that just adding some exercises into the general Python problem set would be problematic since having external libraries is its own can of worms, and you'd also get a huge explosion of exercises once everyone adds their favorite library.
Jim Rybarski, exercism/exercism.io#3113
This sparked a very lively discussion with lots of excellent points about what the purpose of Exercism is, the value and danger of relying on 3rd party libraries, and whether or not the introduction of this type of Exercise would change the platform so much that it would be unrecognizable. It's a great discussion, and you should go read it.

The question of what should be included or excluded on Exercism has come up before. Brian Hicks wondered whether or not we should have a track for JSON in exercism/discussions#84, after observing that people do some funny things with it. I've received email on a couple of occasions, asking whether or not we could add HTML and/or CSS tracks. 

Understanding what Exercism is really about has been one of the most difficult things about the project. When I started it back in June of 2013 I didn't really have a very clear idea. When someone suggested something I would get some sort of gut feeling about whether I thought it fit or not, but I was unable to express clearly why it seemed right or wrong.

That makes it really difficult to explain, and it also makes it harder to discuss. And it makes it harder to close issues even when the suggestion seems wrong, because I can't give a coherent explanation, which means that if I close it, it seems like I'm just closing it on a whim, or because I'm The Boss or something. That is not a great way to run a project. It leaves people frustrated, dissatisfied, and feeling like they've not been heard.

Over the past few months I've started to gain an understanding about what Exercism aims to be.

Exercism is based on the idea that you can develop a high degree of fluency even at a low level of proficiency. In other words, you can be extremely fluent in the basic syntax, idioms, conventions, and standard library of a programming language, without being able to solve real-world problems in that language.

This is useful, because it frees up cognitive resources. Once you have the fluency at the basic level, it is much easier to improve your proficiency, and then ratchet up your fluency.

Fluency is described by the Language Hunters project as:
What you can say when you’re woken up in the middle of the night with a flashlight in your face.
The Language Hunters describe four levels of proficiency where you have the ability to express and understand:
  1. Very simple, concrete ideas. E.g. “Good music”. “Drink”.
  2. Simple, complete sentences. E.g. “How do I get to the party?”
  3. More complex, descriptive language, e.g. telling a story about what happened at the party.
  4. Complex political, social, economic topics, e.g. “Should parties be illegal?”
Exercism targets a high level of fluency at a level of proficiency this more or less equivalent to level 2 here. 

Having used Exercism you should feel like you can express yourself without the syntax or standard library getting in your way. Your code should look and feel like that of a native. But that's it. This doesn't touch the real world at all.

You'll still need to go figure out how to write code that solves real-world problems. You'll need to learn how to navigate large, real-world codebases, and integrate with real-world technologies.

And that's OK. Because the world is full of tutorials and blog posts and example code and codebases that will let you learn those things. If you're fluent in the basics, it will be so much easier to make use of those other resources.

And maybe you'll discover that there are some resources that are missing—such as how to learn introductory image analysis with Python and scikit-image, as suggested in the "teaching libraries on Exercism" discussion.

That's an excellent opportunity to dig into the topic and create the missing guide or design the missing exercises. They might stand alone as a great resource, or they might grow into something bigger, something that you can't imagine right now, as you scratch the little itch.