by Leon Rosenshein

RCA

RCA can be a lot of things. Most of the usage of RCA I’ve seen has something to do with the Radio Corporation of America

rca

and all of the inventions and spin-offs from it. But more recently, RCA means root cause analysis. As in “Why did that really happen?

As in “Why did the program crash?” Easy. Like it says right there in the stack trace,

panic: runtime error: invalid memory address or nil pointer dereference

[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4a52c6]

goroutine 1 [running]:

main.log(0x0, 0xc0000a9f68, 0x1, 0x1)
/tmp/sandbox483371455/prog.go:28 +0x66
main.main()
/tmp/sandbox483371455/prog.go:23 +0x74

Program exited: status 2.

So the fix is to test if format is nil and drop the message or log an error. That will always work. But is that the root cause? That’s certainly the proximal, or immediate cause, but that doesn’t tell the whole story. Why did it really panic? I mean the program usually works (outside the playground. It always works there, but that’s a different issue). But is that the right fix? To know that you need to know why it really failed.

Figuring that out is doing root cause analysis. And figuring out the root cause is crucial to making sure it doesn’t happen again. One way to figure out the root cause is to keep asking why.

Why was there a nil pointer reference on line 23? Because nil was passed in. Why was nil passed in? Because it wasn’t set in the conditional. Why wasn’t it set in the conditional? Because the conditional checks for before/after noon, and before/after 5PM, but ignores those two specific times. Why are those two skipped? Because English is a slippery language and computers are very literal. The requirements say “Greet with good morning before noon and good afternoon after noon”. The code does that. The requirements don’t say what to do AT noon, and the code does nothing. Now depending on how you define noon, the chances of the test happening exactly at noon go down, but because computers are discrete, there’s always that chance of testing exactly at noon.

In this case the right answer is probably to check for hour <= 12 instead of hour < 12, but you’d have to go back to the user to be sure. Or you could go for the snarky developer solution and set the default format to `‘Good <indeterminate time of day because the specs were incomplete> %s\n’.

There’s one more why you should have probably asked in this case. Why does log take a *string as a parameter instead of a string. If you fix that problem the compiler will make it much harder to make the mistake. But before you go fix that, you need to understand Chesterton’s Fence, but that’s a topic for another day