Hi everyone!
Over the last few months, the possibility has come up that CodeWorld's (&) operator was a mistake, at least in the educational dialect. This school year, a group at LSU has been trying a trial with 1000 students learning from CodeWorld without it, and it's been successful. This would, of course, be a HUGE breaking change, so I want to share thoughts, and get feedback on the approach.
The Problem
In short:
1. Students struggle with the notion of new binary operators. It's a big impediment to understanding, and it's clear that despite our best efforts, students learn (&) as a special-case of syntax, not as just another binary operator.
2. The specific choice of operator is an even bigger hurdle. It looks like a generic piece of English grammar, and many students never quite understand that it represents a specific function on pictures, rather than the generic notion of "and also..."
3. The alternative, the pictures function, is too generically named.
I am aware that removing the (&) operator means teaching list syntax earlier. LSU's experience is that this concern is far outweighed by the advantages of the new approach. By confronting types, including the list type, earlier and meeting the problem head-on, students and teachers also understand error messages better, and have a specific function name to categorize their understanding of this key function.
The Proposal
The proposal is to do two things at the same time: rename the existing "pictures" function to "layered", and also deprecate and remove (&). All code that is currently written with pictures or & (and yes, that means basically everything ever written in CodeWorld!) would need to be migrated to use layered, instead.
The Process
This would be an extremely slow change. It would proceed in these steps:
1. Add the new layered function. Wait a couple months to play around with it and surface any concerns.
2. Begin modifying the Guide and official sample code to migrate to use the layered function. Work with anyone hosting CodeWorld activities elsewhere to update, as well.
3. Once this is complete, wait at least one year, during which both approaches work equally well.
4. Add deprecation warnings to pictures and (&). This will cause warnings in code pointing to the replacement, as well as special syntax highlighting to raise awareness that they are deprecated.
5. Wait two to three more years for current practice to change and the long tail of users to have the time to update.
6. Finally, remove pictures and (&).
Haskell Mode, Too?
Probably. I think I'm somewhat persuaded by not wanting codeworld-api and codeworld-base to diverge. Haskell mode also already has another binary operator (<>) that works, since `Picture` is a monoid.
I'm interested in thoughts from users of Haskell mode about the right outcome here, though.