Not re-inventing the wheel is very important. But that comes after learning the basics. To really understand a linked list you need to implement your own. Ideally a few different ways, each implementation better than the one before. Once you actually understand what's going on of course you use something like java.util.Vector. Like wise, IDEs and source control are very important. However, you need to be able to work from first principles first. I've seen students who after a year of Java programming didn't know what javac was! The only way you can appreciate an IDE is to first do without. Then you understand just how much it is helping you and just what it does. Similarly, introducing first years to source control is too much too soon. You have four years to turn raw recruits into proper computer scientists or software engineers.

As for the GUI, it is important. Just like CGI is important, just like HCI is important. However, students need to really get the basics down first and GUIs are not the basics, not even nearly. The time to introduce people to one of the many GUI toolkits is not when they are still struggling to understand the difference between static and final, it's when all that simple stuff is second nature, when the concepts that underlie GUIs like objects and threads are properly understood.

I'm talking about laying the foundations here, not building the house or furnishing it!

Finally, the criticisms against Java in the article I linked were all about how Java was miss-used by throwing in GUIs and libraries far too soon. The raw basics first, then move on.

Bart.