Is the first step in solving a "tough" algorithmic problem always asking whether it's hard in the sense that other tough problems can be reduced to it? Not to make the scope of this question tight, what's good advice for approaching challenging algorithmic problems?
There are some domains in computer science that are very rich in having strong "tools" and "techniques" for problem solving like Combinatorial Algorithms, Operational Research Algorithms, Numerical Algorithms,...
I think the most important step is to find best catdiadate and match (best "reduction") of your problem in these domains. People proved lots of properties and they have good tools for solving the basic and fundamental and abstract problems in these domains. In many cases your specific problem should be inherited from some of these abstract and fundamental problems. You could do the extension by yourself to prove and show more properties of your specific problem.
If I want to make simple comparison, there are many similarities when you want to develop an application and solve a problem. In developing your application you consider the domain of the application and you try to find "best libraries", which simplify your development process. You extend many basic class in library to make your own specific application.
In general problem solving is an "Art". You can learn this art by practicing and broad your knowledge.