We’ve all been there, perhaps some never leave:
Having wandered the halls of a haunted debugging session for most of a day, you happen upon a room containing a piñata. In delirium and desperation, you
ctrl-v
andf5
the piñata until a cookie falls out. Somehow, your mad key-strokes have busted the ghost bug; time to go home, yay!
Sometimes software code doesn’t fit perfectly. Third-party integration, protocol bugs, opaque libraries, timing and async bugs, and Katamari technical debt preclude a true understanding of the cause of the program behavior.
Rule of the piñata:
Time always runs out before excuses.
Sometimes, a programmer had a deadline, is under pressure, and is very sorry about the mess.
if (foo != null && foo.bar != null && foo.bar.baz != null) {
try {
new Timer() {
public void run() {
IllDoItAgain()
}
}.schedule(1000);
}
catch (Exception ex) {
//sorry
}
}
But most of the time the piñata programmer lacks taste or prudence. Copy-paste worked last time, so here it is the fifth time. You don’t want blocking code review comments because it’s a rush, again? You didn’t leave a comment… anywhere. You found a workaround on the web, and didn’t mention the URL next to your copy-pasta. You swallowed exceptions, with no logging.
If the piñata programmer encounters an exception because some input from some component is invalid, they will not search for the root of the problem and ensure that component’s data is valid; rather, they will beat the exception into submission by wrapping the input in a Convert() function.
The blind thrashing that is characteristic of piñata programming is often the result of divergent change. But the most obvious and most common scenario for piñata coding is when the author(s) simply don’t grok the component or framework being thrashed. “I don’t know why or when widgets must be attached to the DOM, so I’ll just attach everything, always, as early as possible.” Z-index nine thousand.
It may be the case that the component you ordered actually is a piñata: an opaque, over-stuffed framework or API that is hard to reason about. A grief box.