While reading this interview with Bjarne Stroustrup on education. He had this to say:
I’m not sure how much of the problem is Java itself and how much is the emphasis on using libraries, though. The trouble is that Java has in many places been used to dumb down the curriculum while at the same time increasing the apparent level of delivered goods. It is good to be able to (quickly) build new things by calling libraries, but often that’s not a skilled, challenging job. If that’s all you have seen, you are completely lost when faced with a job for which a pre-packaged solution does not exist. This is just as bad as trying to build everything from scratch yourself. I think the problem is one of attitude, more than an issue of programming language.
I've found that many libraries and toolkits abstract away and hide the mechanics of what they are doing under the covers which is an excellent way of allowing developers to create a complex solution quickly. Think of what you are able to do with a few simple STL containers and algorithms.
But this simplicity is a bit of a two edged sword. I've noticed that many developers just "look at the tin" to see what a library/toolkit is capable of without really looking deeper to understand what is going on under the covers.
As Bjarne says above:
...you are completely lost when faced with a job for which a pre-packaged solution does not exist.
BTW This question, and especially its relation to Java, is also featured heavily in this interview with Robert Dewar.
So. How much time do you invest to understand what's really happening inside the libraries that you use?
Edit: Not knowing what is happening in the libraries and toolkits that you use is leaving your self open to "programming by coincidence" as The Pragmatic Programmers call it. Everything is fine when it works, but when it breaks, you don't know what's actually going on under the covers and you'll be completely lost trying to find out where it's broken. Never mind working out how you're going to fix it!
Edit Part II (The Revenge) (-: I'm thinking the answer below about markets and food is spurious because surely you don't have to understand what the market is doing to provide you with the food? You wouldn't have to debug your interraction with the market if they couldn't provide you with the result you wanted.
It's a question of complexity of the solution provided by the 3rd party. That is, buying some food versus a forward iterator over a container of objects.
If your 3rd party library stops working in the way you were expecting, and you don't know what's actually going on under the covers, you'll be pushed to debug why the library isn't doing what it's supposed to do when working in conjunction with your code. Any previously good behaviour was totally due to coincidence.
cheers,
Rob