The Foisting of an Infinite State Machine

by transmediale

“I will not allow you to foist this convoluted scheme on the bank!”, said Sam, raising his voice.

This was fun in a lot of ways. First of all, come on, this is a bank, three or four full floors of programmers all enthralled by nothing more technical than getting through the day unfired and back on the train home to their families and here is this aging card punch nut job throwback not only noticing Someone Else’s Code but caring?!

Second, I did not make that up. Sam actually used the word “foist” without trying. I use SAT words all the time but I am usually trying, you can see my eyebrows arch a little as my language organ reaches for the thesaurus. Nothing shabby about “convoluted”, but “to foist”? And Sam tossed that off in earnest in anger in the heat of diatribe sans affectation and it is not clear to me I have ever before or since heard the word used in vitro. Which brings me to the third fun bit.

Sam was Jewish. Classic Orthodox home-by-sundown-on-Friday Brooklyn Jewish and of course he would be good with words. Right, get all PC on me and denounce me but what can you say?, he used “foist” in a sentence on the fly and I think I win on this. So there he is with this classic Billy Crystal Princess Bride accent yelling at me for foisting convoluted code on the bank.

“I will not allow this!” he cried. “I will stop you!”

Oh, please, tho Sam was a sweetheart. Yeah, “was”. I heard he passed, Lord keep him, a beautiful soul. I could have choked him in that moment but at least he was attacking me for Code Quality. What was my sin?

My Sin

I had been tossed a throw-away job of persuading two applications to exchange information reliably when either app was free to collapse in a heap at any time and I was not to lose any information. Nowadays we just pull packages off the shelf for that but this was a while ago. Oddly enough, in my first IT job ever, I had had to do the same and it was fun because there was nothing theoretical about it, the two applications did even during development reliably disappear left and right allllll the time. Decnet, PDP-11, RSTS/E, 1981… you understand.

What was different was that somewhere in the intervening ten years I had gotten this crazy idea of creating a domain-specific language to make it easier to develop a software Algebra tutor so I had gotten a book on compiler design because I did not realize I could Just Use Lisp. I do not like reading so I did not get very far but fortunately one of the earliest chapters was on parsing so I ended up learning about finite state machines.

This post came up because I am doing some Web2.0 programming these days from Lisp and I wanted to send over Lisp sexprs and since Javascript for some reason lacks a Lisp reader I was going to have to parse it myself and after ten minutes of trying to do it without a finite state machine I realize, damn, I should code up a finite state machine.

Finite State Machines

I will not in this space try to explain what is a finite state machine but it is really simple and powerful and no matter what level programmer you are you need to have it in your toolbox. The example I learned on was a pocket calculator, when folks still had those.

Your initial state is “initial”. Duh. Then what happens?

We get the first user keypad input. Oh, wegot a “/”. Bzzt! Or just ignore it and our next state is still “initial”.

Now we get a “1”. Great! Save that, our new state is…I dunno…”got a digit”. We’re on a roll.

But wait, what other inputs could weget? A “+”. Ummm…well, it seems no different, but we’ll say “got a plus sign”, and indeed when we are done one of the cool things that can happen is that as we fill in the table (did I mention that rows were for states and columns were for inputs?) we may well discover that the row for the state “got a plus sign” might be no different from the row “initial” and we first go “whoa, enlightenment” and then collapse the two rows into one. I digress.

But the idea is that we just break it down into cases. A fun example is that we now know whether a “+” is addition or a plus sign (or an error) without really trying, because we have aggressively exploded the analysis into all these different states like “just got a digit” or “just got a left parens” or…yeah, it goes on, but guess what? Here comes the name! “Finite State Machine”! There are only so many!!! You may think there are a kabillion but after ten you are done, maybe after twenty. And you can collapse inputs (1–9 become “positive digit”) and so you have a finite number there. Do you now have 150 cases to handle? Yeah, and each one you can code in your sleep. The alternative is one hyperglutinous mass of conditionals, tests, and branches that will fail on the one millionth execution because of a first time path execution.

Back to Sam

I have realized that the reliable exchange between two autonomous systems permitted to fail at any point will best be solved using my old friend the finite state machine and I have enthusiastically shared this with Sam. Somehow I am now being denounced for using an algorithm learned from the top book in compiler design. Specifically, I am being denounced for foisting. I will be stopped. The bank will be saved from my convoluted scheme.

Ooooookayyyyyyy. Well, what can one anachronistic lost in the Torah yarmulke-wearing card-punching goto-coding nut job do? Would you believe he could force a code review? Nay, a defense. Sam forced a frickin defense of about thirty lines of the best simplest most powerful correct code that bank had ever seen. Mind you Sam is also the man who produced my favorite line of code ever, using the Vax Basic statement modifier mechanism:

return if flag

That’s right, an action at a distance code teleportation straight out of the middle of a seventy line for-loop using a flag he had named “flag”. You can imagine my reaction. And this guy is challenging my code?

If you are not yet suitably horrified, understand that novice programmers were regularly crashing production runs because no one anywhere was looking at their code and they were going to call a meeting of like twelve programmers to review my foistation of convolution upon the bank? Sorry, my ire is showing. Chase cut to.

Code review/defense: twenty minutes, here it is, any fucking questions?

Yes, that was pretty much the tone of my presentation — I like to consider people skills one of my strengths. And then Sam spoke and you will see why I loved him. At pain of repetition, probably no one else on those four floors would have even listened to me as I bragged on my FSM, but go to the mattresses to stop what he thought was bad code? One in a million. And one in ten million in my experience would have said what he said.

“OK,” Sam he said. “That looks fine.”

Of course now I am pissed off because I am just getting my turbines spun up for a full bore antler to antler knock down drag out kickin and a gougin in the mud and the blood and the beer round fifteen thrilla in manila finish and Sam is saying…fine?

“That is simple,” Sam continued, gesturing towards my whiteboard diagram. “The infinite state machine idea is complicated, but this code is simple.”

The beauty of that being……no. I would only ruin it.

RIP, Sam. RIP.

Developer and student of reactive systems. Lisper. Aging lion. Some assembly required.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store