There is a project called Language Hunters that provides a framework for learning human languages. The goal of the project is to help keep dying languages alive. They make a very interesting distinction between fluency in a language and proficiency in a language.
Fluency is what you can say without thinking about how to say it. Or perhaps, what you can say when you're woken up in the middle of the night with a flashlight in your face.
You can be fluent at a low level of proficiency. This was a bit of an epiphany to me.
The language hunters operate with four levels of proficiency in a language. They call it Travels with Charlie (video).
The first level is where you can use simple phrases–single concrete ideas. "Burger". "Soda". "Good food".
The second level is where you can communicate in full, simple sentences. "Where is the library?" "Walk straight ahead until you get to the tree. Then turn left."
At the third level, you can tell simple stories. "Last night I went to see a movie. It was about two friends who hacked into computers to transfer money from rich people to poor people. Then one guy went out for pizza and the other guy got caught."
At the forth level you can discuss complex ideas, including social, political, and economic topics.
These levels don't map exactly to proficiency in a programming language, but the idea is useful. I gave a presentation at GopherCon this year, where I explore this topic in relation to the existing resources that teach the Go programming language.
One of the reasons I've spent so much time thinking about this is that for the past three years I've been working on a project, Exercism, that I think of as working towards fluency in a programming language at level 2 proficiency.
The project has lots and lots of small exercises. The exercises are tiny, self-contained, and they're typically on a quite trivial topic. For example: count the occurrences of each word in a given sentence. Or figure out of two queens in a given configuration on an otherwise empty chess board could attack one another.
The project is popular with professional programmers who need to ramp up quickly in a new language for work, and it's also popular with people who are in the early phases of learning how to program.
The goal is to give people enough little exercises that they could solve this type of problem if someone woke them up in the middle of the night with a flashlight in their face.
It doesn't teach large overarching design principles, or complex algorithms, or how to do large-scale projects, but it does take away a level of friction in learning the language so that when you start tackling bigger, more meaty topics, the student has more cognitive resources available. You're not fighting against basics like "how to write a loop", or "how to access the value for a given key in a dict/map/hash".
Each exercise consists of a README and an automated test suite, which does a couple of things:
- It teaches students how to use the test driven development workflow.
- It gives the student a clear indication of when they've solved the problem (clear definition of "done").
The project also encourages people to submit the solution and get feedback, and the feedback tends to center on idioms in the language, greater simplicity and readability, and better use of the core libraries for your language.
The project supports 33 languages at this time. Some languages have a lot of exercises (F# has 100), others have fewer (Java has 39).
For teachers, Exercism isn't necessarily ideal, because it has its own janky command-line client, website, community, etc. It would be far better if the interface were simply git and GitHub.
Since the exercises themselves are all using the MIT license, I've started repackaging the exercises as stand-alone repositories that you can import via GitHub Classroom.
There are two formats. In one I'm sticking all the exercises in a single repository:
In the other format each individual exercise is it's own repository:
The exercises themselves have been solved by thousands of people on Exercism, but the idea of using them as assignments in the classroom is still new and unproven. I would love to work out the kinks to make them more generally useful to teachers and students.
If you are teaching basic programming, and you're using GitHub Classroom, and you think these exercises would make good assignments for your students then I would love to hear from you. My email address is email@example.com.
If you're teaching a different language than the ones I listed, let me know. As long as we have that language on Exercism it should be a very simple manner to create the repositories that can be used with GitHub Classroom.