Tag Archive: Learning

Windowsill is a point and click game that is available as part of the current humble bundle.

Windowsill - now where can I find that pesky cube?

I really enjoyed playing windowsill. Your goal seems to be to guide a small toy train of some sort through a set of ten or so puzzle style levels. In each puzzle you enter on the left, and need to find a small pink cube somewhere in the world that acts as a key for the door on the right. The game has been put together really well, and is very enjoyable – but it reminded me of something I’ve seen students do sometimes.

Throughout the game each level feels pretty random. I experiment, I mess around and eventually I get the result I want – but I haven’t learnt anything expect how to complete that level. Contrast that with a game like Cogs – as I was playing through cogs I felt like I was improving, learning patterns and developing skills – albeit skills that were only really useful within the game, but I feel like if I had been given the last level of Cogs at the beginning I wouldn’t be equipped for it.

Sometimes students start to program in the same way. They are given a task to complete, and may want to implement some functionality as part of that task. They experiment until they get that functionality and then they stop. The problem is that what they think they wanted isn’t actually what they wanted. They wanted to learn how to program generally. What they have achieved is the ability to program a specific problem. This is where the students who are more reflective, and start asking awkward questions like “was that the best way to implement that” start to separate themselves.

If you buy the humble bundle and play through windowsill, then at the end think to yourself whether if there were another level you would feel any more equipped to complete it than when you started. Then (if you’re a student) think about the last lecture, or a lab, or a piece of coursework you completed. Are you any more equipped now to complete the next lecture, lab or coursework that you attempt than you were before?

If not, why not?

Good students will often seek feedback – or validation that what they are doing is right. This is especially true when they are just starting to learn programming (in fact, it’s probably true of everybody on some level, but that is a whole different post).

As a result, often students will ask whether they are doing something the right way, or the best way, and in programming that’s a very difficult question to answer and depends on the problem that you are trying to solve.

The answer is usually "it depends"

as the problems that we give students are usually, to some extent, artificial and contrived in some cases the answer could be “it doesn’t matter”, or the same as that answer to the question “does it work?”, but that doesn’t really help the student, especially given that the question raises an interesting point. In my opinion a far better answer is “it depends – specifically on what the meaning of ‘best’ is”.

Often programming comes down to compromises. There are a number of qualities that we would like to be associated with our code, fast, efficient, reliable, readable, maintainable, finished on time and so on. Quite often though these concepts are in conflict. One example is that you could cache some results, which might make your program faster, but would use more memory. Making code faster often goes hand in hand with making it more readable.

To combat this whenever I start a significant project I always try to define what the meaning of best is. I pick some aspects that I care about, and discard things I don’t care about. This keeps the concept of what I’m trying to achieve in focus and should stop me getting distracted.

Another thing that I think is worth noting is that in my list of qualities, although I’m really interested in clever ways to make code fast the size and scope of the projects I’m usually involved in means that speed is never an issue. Usually the issues are reliable, readable and maintainable, which begs the question what have I still not learnt to comment my own code?

I learnt a new word today. It’s probably a sign that I’m getting old and am no longer “down with the kids”, although that’s probably more evident by the fact that I even use the phrase “down with the kids”. Anyway, I learnt the word “Grok”. Apparently groking (or is it grokking?) is commonplace among 733t programmers.

Anyway, according to UrbanDictionary.com Grok can mean the following things:

  • To understand – as in “It took me a long time to grok Perl, but now I can read it without going blind!”
  • To understand intuitively, or through empathy
  • To become one with
  • Also ‘love’, ‘hate’, and much more. To grok means to understand and empathize with something or someone to the extent that the object or person becomes part of ones’ sense self. (Enders’ Game, anyone?)
So big deal, I learnt a new word. People learn new words all the time. I learnt the word “snodchortle” only last week, why is Grok so important? Well, because last week I was also reading about something called the Dreyfus model of Skill Acquisition.

Dreyfus Model of Skill Acquisition

If you Grok something, you understand it intuitively. 733t programmers grok stuff all the time and that means that they find it difficult to explain how they arrived at any conclusion, or why they did something in a particular way to other, less able people. Intuition doesn’t come with reasoning.

In a lot of the topics I work on I would probably place myself somewhere between Advanced Beginner and Competent. The things I do more of I would probably place myself a little higher, but this also puts me in a difficult place professionally, because as I strive to climb the Dreyfus model to become more of an expert, I also need to remember to remain grounded in order to retain any ability I may have to explain what may become intuitive, and therefore unexplainable.

Where do you place yourself, or your peers on the Dreyfus model?