I remember a specific time when someone very knowledgeable on C++ described friend functions (I think it was) and how there was this thing that he was trying to do. After some thought I came up with some abuse of friend functions to do what he needed. He asked me how I came up with it and that's not how they're supposed to be used. I said I went by what a friend function actually does, not caring why it's called such or prescribed uses.

There's a similar principle about the separation of policy and mechanism which never gets enough exposure. Top-down programmers leak high level concerns all the way down so the underlying parts are only good for the one thing, often naming them in the caller's context rather than by what they literally do. A quote I like is that a poet is one who gives many names to the same thing and a mathematician is one who gives one name (mechanism) to many things (policies) -- Henri Poincaré (paraphrased).