I often find it useful to implement an algorithm, architecture, or data structure in order to fully understand it. It's a good way to think critically about the problem at hand, and work out the bugs in your solution.
Read that again.
"... work out the bugs in your solution."
Implementation is not the same as solving the problem. Solving the problem, ideally, should come before implementing the solution. You should have an idea of the issues at hand before you implement them. Perhaps, once you start implementation, you will discover flaws in your logic.
The point is that, for learning, implementation is a good thing. That's why, in computer science courses, you implement things like stacks, queues, trees, graphs, sorting algorithms, etc. After implementing it, you understand the complexities, benefits, and downsides of all these things. Once you understand those things, it allows you to use these concepts in a meaningful fashion.
However, in the real world, implementing these is not viable. They are solved problems. You don't have to implement them in order to use them. Recognizing that they are solved problems, and that you can save time (and thus money) by using pre-built frameworks and libraries is part of being a good programmer.
I suspect my education was similar to yours. I had a very theory-based curriculum. There were things we put into practice, but they were mostly to better understand the theory.
Now, I look at a problem and solve it before implementation. Using theory. I work out a solution when I'm out walking, or when I'm talking with coworkers, or when I'm at lunch, or when I'm at the bar after work. No computer necessary. In the end, the product is what matters, but the theory is what builds the product.
In conclusion, implement to understand the solutions you are using. Experiment. Hack. Read. If you can, improve solutions and libraries. But recognize that there are people out there who have put a lot of time and energy into the solutions you need.