In The University: An Owner's Manual, Henry Rosovsky discusses the varied "owners" of a university: students, parents, alumni, employers, and faculty. Similarly, academic departments are always torn between who their customers are. This always affects faculty discussions about almost everything.
In the BYU CS Department, we have a goal of developing and graduating CS majors who will have influential careers. That's a hard thing to define and difficult achieve. There are some who argue that "influential" is wishy washy and while it sounds nice isn't anything that can really drive decisions. I disagree.
Designers, architects, and CTOs are more influential than programmers Note first off, that we're not talking about how to help the best students to be influential. They'll probably achieve that regardless of, even in spite of, anything we do. The issue is how to help average students gather the skills they'll need to be influential.
If I look at the places a CS student might end up, I think one path that leads to influence is the role of software designer, architect, and even CTO. I contrast this specifically with programmer and even lead programmer positions which, while important, don't offer the same opportunities for influence. I also think these design-oriented roles are much less prone to outsourcing, as an additional benefit. So, how do you help someone prepare for those roles?
I think teaching them to be a competent and effective programmer is necessary, but not sufficient. We spend a lot of time ensuring that regardless of what other knowledge our students gain, they can at least do a good job of programming. Some of what we do is structural; we require that senior level courses require big projects, for example, so that no matter what electives a student takes, they get some experience with big (by academic standards), group projects.
Closely related to programming is problem solving. Designers and architects are good problem solvers. Programmers generally learn problem solving (although some are better than others).
So, beyond programming, what is there? One important item is communication skills. Not just technical writing, but presentation skills as well. I think we do a spotty job of this. Giving students time to make presentations takes quite a bit of time in class. Grading writing assignments can ruin a Christmas vacation. We need to find ways to more consistently develop student communication skills.
Another important item is to develop and appreciation for business in CS students. I'm not necessarily suggesting that every student should be required to take a business class of some sort, although that's certainly an option. Too often the feeling among technical folk is that the business side is not worthy of study because it's somehow soft or easy. I try to talk to each of my classes about business ideas and requirements and how they impinge on what we're talking about. Admittedly, my background makes that easier for me than it might be for others. We also have a software entrepreneur course that I encourage all students to take, even if they don't think they'll start a business soon.
We need to emphasize design more in all our classes and speak explicitly about software architectures. I'd love to see a senior-level architecture course, but that's not likely to happen anytime soon. I suspect our senior-level software engineering course could do more of this, but I'm not sure it does.
A capstone senior project/thesis would go a long way to building these skills into the curriculum if it was designed correctly. Making students interact with real customers would help them learn communication skills and they'd gain appreciation for business requirements and needs.
One thing that I think is important that is hard to do structurally, is building a culture of curiosity and innovation. In my experience, good architects have broad knowledge and skills. They generally picked them up because they're curious and self-motivated. As I said, the best students will do this naturally. Average students, however, tend to struggle more just getting the course work done and tend to spend less time just playing around and exploring. I'm leery of techies who don't want to program their own thing when there not doing something for work. Conversely, I'm always excited by students who want to show me something they built "just for fun." You can see the excitement in their eyes and those are the ones that I would hire and who I believe have a great shot at being influential.
Related to this is the ability and background to continue to learn. If students have the right background (these are usually defined as the classes they don't want to take), they will more easily pick up new concepts and technologies. See Understanding XML as an example of this.
So those are my ideas. What are yours? What can we teach to undergraduate CS students that will help them have influential careers after they graduate?