Think in Math
Why do most engineers jump to code before they've understood the problem?
George Pólya said "understanding the problem" is the most neglected phase of engineering. He was right — and nothing has changed. The mistake is treating syntax as thinking. Before you write a line, there's an invariant underneath every hard problem: a property that stays true through every step of the algorithm. Find that first. The sliding window, graph connectivity, halving, the two-pointer, the choice tree — these aren't techniques, they're the shapes problems take. Once you see the shape, the implementation follows naturally.
Pattern over memorization
A graph traversal in a DOM tree and a graph traversal in a social network look completely different on the surface. They're the same problem. So why do engineers memorize solutions instead of recognizing structures? Probably because school rewards getting the answer, not understanding why it works. I think that's where most engineering education fails — it teaches the solution without teaching the shape.
The three stages
Terence Tao describes mathematical maturity as three stages: pre-rigorous intuition, the grind of formal proof, then post-rigorous fluency where you've internalized the rules so deeply you can work from principle. Most engineers stay at stage one. The ones who don't have been through stage two enough times that they solve backward from the goal before writing a single variable name.
Code is just a record of a problem you already solved.