I've made coding choices that I can't rationalize later. But I find it's often more insidious than that.
Having made a coding choice for a particularly complicated problem, I'll come back to the code later to do more work on it (add features, fix bugs, etc) only to find I completely don't understand why I wrote it the way I did in the first place. With fresh ideas on how the code 'should' have been written, I begin a long process of re-factoring the whole mess into something that makes more sense. It isn't until after I've spent considerable time, unravelling large portions of code that I come to understand, why I wrote it the way I did the first time. Some times I get lucky and my 'fresh ideas' make for better code. More often than not, the original code stands and I've wasted time going down a dead end.