It’s not often (never) that I feel moved to review a computer game. It’s not so much that I don’t play them, because I do – quite a bit sometimes, but because they are generally “good” and an awful lot of people already review games.
Enter TIS-100; it’s a modest little thing, and it’s interface is both nostalgia-inducing retro and modern convenience. It looks like you should be using an ancient IBM model M keyboard, but actually allows mouse clicks and control-c/v commands just like modern software would. With very little fanfare you’re dropped into a broken operating system, where the corrupted segments of the kernel have to be fixed up by you.
The first part of the charm here is that there is no hand-holding. None. You’re provided with a short manual detailing the valid processor op-codes, a little brief on how the node based architecture works – and then you’re out in the wild. Each node has a short code limit of around 15 lines, and each node also allows access to two registers. And that’s it. You’re set a task, and provided with some tests to run with the expected output detailed on the left hand side of the display. This is coding stripped down to it’s barest nuts and bolts.
Part of the novelty is that the TIS stands for Tesselated-Intelligence-System – processing is divided out into separate nodes, each with their own codebase. Calls to access the values of other nodes block the callee, making simple swaps a more considered operation and deadlocks ever present. Once you’ve got the swing though, you quickly find that you can use nodes for parallel processing, or as quick scratch-RAM for a main processing node. Each task that you are set to repair a segment is also non-trivial, in that it’s a real operation you could expect to find in an embedded environment (signal peak detection, pattern matching – even an interrupt handler), and that there’s a genuine sense of accomplishment when the output column of the test matches the required values – and it’s extremely instructional.
I spend most of my working life dealing with a fourth generation language, and I’m abstracted away from the hardware by a considerable degree – but I’ve often yearned to get some assembly coding done (even maybe start a hobby operating system), and all of my attempts to “get in” to assembly have been thwarted. Either I wasn’t experienced enough, the documentation was patchy, or the build environment wasn’t sane; I’ve had several cracks at learning – but nothing in my twenty-plus years of developing has been as useful or informative as a (slightly drunken) hour with this little beast.
One of the joys is that coming from some much (.NET, SQL server) down to this level forces you to do far more with far less. I tend to float up objects and variables with wild abandon, expensive database queries and non-optimal execution trees don’t consume a lot of my thinking time because modern machines are so fast and have so much RAM. I do sometimes go back over old code to correct my more egregious assumptions or requests (when they pile up into seconds), but here we’re given two registers two work with – and one of the register operations is destructive. Suddenly we’re up into The Art of Computer Programming territory, using a notional system to achieve realistic results – and with such little room to manoeuvre that optimisation is almost impossible to avoid.
This really has helped me enormously in terms of my feeling of “completeness” as a developer, and has refueled my desire to work through the Art of Computer Programming and GEB (Godel, Escher Bach – an eternal golden braid to the unfamiliar) – it’s the same feeling you get when a beautiful algorithm unfolds in your head, and when it gets down to it, it’s one of the reasons I’m in this business. I love to code, and I love good code – but we don’t often get paid to write good code; just stuff that works. If you feel the same then get this game, because it will put you back in touch with that feeling.
If you’ve never coded before, you may need a little more time bootstrapping yourself – but I reckon that you’d be far better off spending a day puzzling over this than almost any “fundamentals” programming course. This will get you in at the sharp end, and the techniques you learn will give you a better understanding of what various library functions do, their overhead – and insight into how much has gone into providing all that padding for you to keep you safe from the sharp edges of the hardware.
Please – go buy. It’s only a fiver, and I want to encourage the developer to keep adding more segments and more challenges; they’ve managed to re-awaken my hidden low-level developer, and I want more!