Anniversary Development Progress Report, week 52

Week 52. How did we even get here?

I’ve not worked on Argus and SNAFU every week since I started the project, so it has technically been a bit longer, but there have been 52 weeks now that I’ve put in at least one hour’s work in a given week.

Continue reading Anniversary Development Progress Report, week 52

This is how I find bugs

I walked into the kitchen, and put the kettle on, and put the fixings for coffee into my mug. The cat was bugging me for milk, so I gave him some.

He wouldn’t touch it, but just stared at me.

I petted his head and rubbed his back. Then he got into the milk. He needs the full dining experience.

I went to the back door, started rolling a cigarette and half-way through a nagging something in my head tried to get my attention.

“Oh, bugger,” I said out loud.

I’d found a bug in my mouse-interaction code. It was code that I hadn’t touched, or even looked at since maybe August last-year, when I wrote it initially. A nine-line function that turned mouse-clicks into proper UI-widget interactions.

Suddenly, the shape of that code was floating in my head, and it was the wrong shape. It didn’t … fit.

The code had never misbehaved, or done anything wrong, but that wasn’t the point. I knew it was wrong, and I had a feel for how it would misbehave. Even if I couldn’t remember the exact lines of code.

My instinct was telling me that mouse-clicks might pass through non-reactive UI elements and trigger reactive elements underneath. That had never happened, to my knowledge, but I was suddenly certain that it would.

So, I aborted making coffee, and my cigarette and went and looked at the code.

I was right. It was wrong. It would behave in exactly the wrong way that I had envisioned, if the circumstances ever came to pass (and they would!).

So, I fixed it. New code. New shape. It settles in more comfortably now.

This, though, is how I find bugs. 90% of the bugs I find aren’t because something goes wrong. In fact, the game behaves perfectly. It does everything it should, exactly as it should. I’ve seen no sign that there’s an issue, and nothing’s been reported.

But I’m in the bathroom, or having a cigarette, or trying to sleep, and there it is. I suddenly know that a bit of the code isn’t right, and in what way it isn’t right. There’s a kind of synaesthesia at work – the codebase exists in my head as a collection of shapes that aren’t shapes, and colours that aren’t colours.

Whatever I’m doing, or wherever I am, some part of my brain is walking over that model, looking for anomalies. And finding them wherever they are.

Eventually.

It would, perhaps, be nice if it could announce them right away, while I am actually writing the code, for example, but no. It chugs away in its own good time doing a whole-program analysis, and then bugging me about it when my attention is on other things.

At four-thirty in the morning, some noise sets the dog barking, which wakes me up in turn, and then that synaesthestic model is hanging in my head, focused on a rendering function, or caching algorithm, that’s working but is invisibly buggy. And I know what’s wrong. I can fix it in five minutes. If I got up.

Getting back to sleep again – or maintaining any kind of task-focus on anything else – is pretty hard when you’ve got one of these things dangling in your forebrain, insisting on being fixed.

Finding bugs the way regular people do (when things just plain break or misbehave) seems like a lot less trouble.

 

Being great doesn’t mean you’ll always do great work

Last night, I tried to write a simple function. It should have taken me about a minute to write, and eight lines of code.

I got it wrong. Very wrong. Astonishingly wrong.

I got it wrong in every possible way you could get it wrong, and in a few entirely new impossible ways, apparently artisinally-crafted just for the occasion.

In short, I screwed it all sideways, and sixty seconds of code turned into somewhere North of two hours of swearing and debugging.

Today, it’s all genius again. Less than a dozen lines of code adds optional mouseover logic to my widgets, which gives them a delicious, customisable, tactile feedback. Great code. Elegant, concise, and correct.

I revisited last night’s code and fixing it was trivial and obvious.

Look, it doesn’t matter how good you are. You may be smart, skilled, and experienced. You can know your language inside-out. You can thrive on it like some cyborg supercomputer hybrid. You can be a genius among geniuses.

Sometimes you are just going to be unable to sit down and do the thing without completely bollixing the whole thing up, and bollixing it worse when you try to fix it.

You will have times like this. Fifteen minutes. An hour. Two hours. Maybe a whole day. It will happen.

Own it, because it’s going to get you now and again. Sometimes you will screw up the simplest arithmetic. Sometimes you can’t get something right even though you’ve done it a thousand times, like a champ.

If you can’t do the thing, do something else. Have coffee. Play a game. Help another team-member. Get lunch. Take a nap. Ask someone else to do it. Sit in the garden and sob inconsolably – whatever works for you. Just walk the hell away from what you’re screwing up and come back to it when your head is back in order.

An even more important lesson here is to help others deal with it when it happens to them, too. Because it will, and dissing them about it makes you an arse.

Screwing up is less important than properly dealing with it.

I should have closed my editor at least an hour sooner than I did, and done something else. Instead, I kept burning time in The Pit of Fail.

Don’t do that. Do something else. Do anything else.

 

Development Progress Report, week 22

Development time this week has been split pretty evenly between code and narrative.

On the code side, there’s a revamp of the narrative-display portion of the UI, plus countless little polishing tweaks, because a UI should not surprise you. Coupled with code-cleanups and optimisation, and that’s a lot of nearly invisible work, but work well worth doing.

On the narrative side, I’m extremely pleased to have now passed the quarter million word mark.

That’s a quarter of a million words!

Continue reading Development Progress Report, week 22

How can your own characters surprise you?

You are responsible for their every thought, their every word, their every gesture. Not a one of them bears so much as a single punctuation mark that you didn’t put there.

But you hear writers say, “My characters surprised me.” It happens. It’s happened to me.


First, a little context.

I’m writing a multi-perspective branching novel, where the all of the main characters are simultaneously experiencing the narrative and making their own choices about it. You, the player, pick a character at the beginning, and ride along with them, making their choices, and following the narrative where it goes.

As seems to be usual for a writer, I selected my stable of characters, and invented as much information as I needed for them to fulfil their roles in my story. Gender, age, profession, prior knowledge of other characters, and so on. With a variable narrative you have key points where you know things need to be – or maybe points where you know they might get to. You fashion your characters to take your narrative to those milestones.

Fit-for-purpose characters, with the traits you designed, ready to line up on stage and perform whatever lines you hand to them.

But the tale grows, as they say, in the telling.

Each character’s narrative in this story is a complete thing. They speak and do, but they also think, consider and feel, all of which rolls out in a first-person narrative. Normally all that extra guff is reserved for the protagonist of a story, but I have a dozen protagonists right now. The narrative is complete, no matter who’s eyes you’re looking through.

That means you hold the characters apart, in your head. Apart from yourself and apart from each-other. You visualise each one as a living being and you think, what is going through his head right now? What is she feeling? And why?

And as the words scurry out into the keyboard from the fingertips, they surprise you.

This character has suffered at the hands of a sexist institution. That character is hiding his past. He prefers beers. She likes a certain kind of pastries. He is shy. She suffers from post-traumatic-stress disorder. He was (unexpectedly) married.

Temporarily, each of these characters gets to use your brain and your knowledge of the setting as you put yourself in their shoes. They suddenly know things about people or places or events that you did not know until they did. Having found it, it becomes a fact. And it snowballs. They make your world and themselves more solid, and the more solid it all is, the more interesting they become.

And things you planned ahead for? Well, maybe some of those have to be discarded, but what you get in exchange is just so much better.

Have you played D&D? Been the Game-Master, switching between a dozen NPCs, while you interact with your players from behind all those faces and personalities? Ever had your prepared material go out the window because of those interactions? It’s like that.

Solid characters in solid situations will surprise you. Thin characters will make themselves more solid (because underneath all your meticulous, or not-so-meticulous, planning that’s where your head is taking them).

But it’s your own head, isn’t it?

Well, yes and no. What did I see the other day? Oh, yes, this:

The king does the writing. You just whisper in his ear.

 

 

Kinetic Narrative vs Kinetic Novels: Exploring Kinetic Narrative

Kinetic novels mostly (though not entirely) derive from Japanese publisher VisualArt’s[sic], and its brand キネティックノベル (kineticnovel – smart money says it’s a trademark, so insert usual trademarks blahblah, and let’s move on). The thing that distinguishes kinetic novels as a subclass of visual novels is that they are not choice-based.

However, visual novels (whether kinetic novels or not) use a particular narrative presentation that is best described as “kinetic narrative”.


Kinetic narrative is an interesting beast. The user/reader clicks through the story a bit at a time, which reveals more. Choices that alter the story may or may not be a feature. The important part is the that the user interacts with the novel to reveal the next line, chunk or paragraph.

This brings some interesting features to the table. It allows for a kind of narrative that regular novels don’t, and might be actually a touch more reminiscent of the narrative style in comic-books and graphic novels.

Kinetic narrative allows interesting alterations in tense (permitting occasional graceful changes between past-tense and present-tense), since the user has become directly involved in the motion of the story, and the author can control what sized bites or chunks of text are revealed each time the user steps forward.

Since the user’s gaze can’t arbitrarily skip down the page or onto the next, kinetic narrative has more opportunity to generate surprises or suspense in less space, without having to more laboriously build up over time as you would in a format where the users gaze is uncontrolled.

Oddly, this seems to allow for a more natural form of writing, where you can avoid traditional gimmicks like a comic-book’s habit of placing punch-lines at the end of a page, and surprises or reveals on the next non-facing page. Consider also how traditional novel writers build suspense and perform reveals in relation to the way chapters in a book are laid out.

Kinetic narrative allows us to divest ourselves of a lot of traditional cruft that are associated with the inability to control the reader’s gaze. The reader’s gaze isn’t a problem for kinetic narrative. It sees exactly as much as we wish it to see, and no more. That allows us to create more natural flow in narrative, generate short-term suspense, surprises, create more immediacy, and handle reveals without having to resort to more cumbersome narrative forms.

As a bonus, kinetic narrative doesn’t let the reader’s eye get lost on the page (you know that bit where you accidentally wind up losing your place, on the page often due to external distractions, and have to pick it up again)?

I’m very much starting to warm to kinetic narrative over traditional narrative as a style. It’s not that I don’t appreciate both forms, but that I’m starting to see advantages to the kinetic form that were not initially apparent.