How to Solve It by George Polya.
Polya's book provides the following rubric and sample problems to test/improve your problemsolving.
He does assume a familiarity with high school mathematics (nothing burnt brain cells and wikipedia can't handle).
His section
on mathematical notation gives programmers much to think on with respect to the languages they use. And not
just the part where he says "modern computers" and means people doing math longhand in the 1940's.
Marilyn vos Savant has a good quote as well:
My first thought, maybe not thought, it's almost like a feeling, is overview ... It's like, almost, a wartime decision. I keep thinking about all of the fronts, what's supplying what, where are the most important points ....

UNDERSTANDING THE PROBLEM

You have to understand
the problem.

What is the unknown? What are the data? What
is the condition?

Is it possible to satisfy the condition? Is the
condition sufficient to determine the unknown?
Or is it insufficient? Or redundant? Or
contradictory?

Draw a figure. Introduce suitable notation.

Separate the various parts of the condition. Can
you write them down?

DEVISING A PLAN

Find the connection between the
data and the unknown. You may be obliged to
consider auxiliary problems if an immediate
connection cannot be found. You should obtain
eventually a plan of the solution.

Have you seen it before? Or have you seen the
same problem in a slightly different form?

Do you know a related problem? Do you
know a theorem that could be useful?

Look at the unknown! And try to think
of a familiar problem having the same or a
similar unknown.

Here is a problem related to yours and
solved before. Could you use it? Could you
use its result? Could you use its method?
Should you introduce some auxiliary element in
order to make its use possible?

Could you restate the problem? Could you
restate it still differently? Go back to
definitions.

If you cannot solve the proposed problem try to
solve first some related problem. Could you
imagine a more accessible related problem? A
more general problem? A more special problem?
An analogous problem? Could you solve a part of
the problem? Keep only a part of the condition,
drop the other part; how far is the unknown then
determined, how can it vary? Could you derive
something useful from the data? Could you think
of other data appropriate to determine the
unknown? Could you change the unknown or data,
or both if necessary, so that the new unknown
and the new data are nearer to each other?

Did you use all the data? Did you use the whole
condition? Have you taken into account all
essential notions involved in the problem?

CARRYING OUT THE PLAN

Carry out your plan.

Carrying out your plan of the solution,
check each step. Can you see clearly that
the step is correct? Can you prove that it is
correct?

Looking Back

Examine the solution
obtained.

Can you check the result? Can you
check the argument?

Can you derive the solution differently? Can
you see it at a glance?

Can you use the result, or the method, for some
other problem?