I find this to be sadly true. I work for a university, writing software for research groups. I only have a Bachelor's degree, and many of the people I work with are working toward's ph.d.s or already have them and are doing post-docs. What they don't have is practical programming knowledge. I spent 3 hours yesterday convincing a group of grad students that the just because the library we are working with claims to be standards compliant does not mean that it is. I even wrote code to demonstrate how the library was broken and the simple steps to work around it. The other group members refused to believe the real life results, because the documentation and some ph.d. (who wrote the docs) said otherwise. The worst part of this is: it is not even a core bit of the research, it should be simple to say: hey this 3rd party thing is broken, but when we do foo, we get the behavior we want.
I firmly believe every CS degree should include a practical component such as internships, or a demonstration of skills by working on OSS or similar. This would not only help cement the theory, but also help with practical issues like making code maintainable. Most current curriculums use throwaway homework assignments, encouraging and reinforcing ugly code.
I had 6 internships under my belt by college graduation and they taught me a lot. However, by and large, I learned more about workplaces and teamwork than about difficult programming situations. Internships, in most of my experience, don't encourage really hard programming work.
I got that with my CS degree. The theory classes were 7 out of the 15 classes I took, but the programming classes were just as intense. We did complex image recognition in groups in Java the first year, tons of Scheme and Oz to learn concepts, and then wrote a whole networking stack and basic Linux OS in C. The latter two projects were significantly harder than anything I've done at an internship and required teamwork and a great deal of self-teaching.
It may be that my experience was abnormal (the school had a small but recognized CS dept), but I got the meat of my practical programming skills at school (ignoring independent work for the sake of focused discussion). Internships were certainly useful - but in my reflections I don't think they increased my programming power, if you will, all that much compared to school.
Waiting until the 3rd and 4th year makes even less sense. The sooner that schools can get their students out in the real world, doing real world projects, as the author described, the sooner they'll learn how to develop good code. Schools should be pushing students to get internships after their second, and even after their first year.
I'm in an internship after my second year of school, and I have many times wished I'd had an internship last year as well. Even still, I've learned way more this summer than I did in the first two years of college combined.
I firmly believe every CS degree should include a practical component such as internships, or a demonstration of skills by working on OSS or similar. This would not only help cement the theory, but also help with practical issues like making code maintainable. Most current curriculums use throwaway homework assignments, encouraging and reinforcing ugly code.