I think my skills as an experienced developer come from having solved many problems (as well as having made plenty of mistakes) in the past. When I look at a problem these days I try to think back to similar problems in the past, what worked and what didn't. Its not so often that actually need to sit down and think through a new algorithm. So it comes down to "remembering things" as much as it does to "working things out".