views:

272

answers:

7

I am a reasonably experienced developer (.NET, c#, asp.NET etc) but I'd like to hone my problem solving skills. I find that when I come up against a complex problem I sometimes implement a solution that I feel could have been better had I analyzed the problem in a different way.

Ideally what I am looking for is a resource of some type that has 'practice problems and solutions' as I think my skills will only get better by practicing this more and adopting better practices.

I hope my question is not to vague and I wont get upset with people answering with opinions etc..

thanks

+7  A: 

Project Euler has many good problems. Often they have obvious but extremely inefficient solutions. Finding an efficient solution can be quite challenging (and fun).

Solutions are not posted, but can usually be found online if you look for them. Once you solve a problem you can view other people's solutions on their forums.

James McNellis
Solutions are posted in the forums, which you only have access to after you solve the problem. Though many of the solutions are short, I would not call them by any means "trivial" - they start to get really difficult after #50 (I've not been able to solve at all many of the last half)...
BlueRaja - Danny Pflughoeft
+1. Nice link. That looks like a fun site.
David Stratton
A: 

To improve your problem solving skills you have to learn the patterns in solution of other problems. This you can do by reading source code of other projects and problems.

Hasan Khan
+3  A: 

Try a new programming language. New as in lisp from C#, not C# from Java. To quickly get your feet wet pick one interesting language or another and use it to solve a few of the problems in Programming Praxis.

wilhelmtell
I hadn't seen Programming Praxis before. Some of its problems look like fun. +1 and thanks!
James McNellis
Yes, choose a new language which has some different ideas than what you are used to. Choose a functional language if you are already doing OO. Choose an OO language if you are doing scripting. Consider some design patterns too: http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124/
Matt Sherman
+1  A: 

There are already some good answers, here, so I'm basically just adding some free additions to the suggestions already posted.

Don't forget the obvious things, like bouncing problems or ideas off other, experienced developers that you trust and listening to their responses. Try to get at the reasoning behind their ideas, and see things from their perspective.

Also, remember that a lot of programming problems have already been solved, so learning best practices and the reasons behind them go a long way to helping your decision-making skills. The more you learn about why certain principles are recommended as best practices, the more likely you are to train yourself to think correctly.

One last suggestion - hang around with people who are completely opposed to your normal views. If you're a conservative, be sure you have liberal friends. If you're a liberal, listen to the conservatives around you, and most importantly try to see the world from their perspective. You don't have to agree with them - You're just training your mind to think outside the box.

Good problem solving skills take time to cultivate, and you have to discipline yourself to look at things from different angles at all times.

David Stratton
A: 

I think Euclid's Elements is good for problem solving skills. It's the book on geometry by the father of geometry himself. It's not specifically programming, but I have found that the logic used in the proofs is a lot like the logic we use in programming. (Not only that, but it is also fun to see the geometrical proof and diagram for things like the Pythagorean Theorem. You'll see the actual square on the hypotenuse equals the actual squares on the other sides.)

I have the Green Lion edition of Euclid's Elements.

Zach Johnson
A: 

If you're looking to improve your algorithmic problem solving skills, TopCoder is an excellent resource. It includes a problem archive of several thousands of problems, complete with solution write-ups and access to solutions other people have written.

stubbscroll
+1  A: 

I'd recommend reading Polya's How to Solve It.

Summary here:

http://www.math.utah.edu/~pa/math/polya.html

Also... given that a lot of your experience is in recent, object-oriented languages, I'd recommend giving Steve McConnell's Code Complete a read. It's a little dated but there are relevant observations about what makes good code, a good process, and it's pretty educational to think about how the common wisdom about the practice of software engineering has changed over the last 20 years.

Weston C