Beyond that I am helping students learn general methods of problem solving usable in other domains of programming and how to choose the appropriate tools for the job at hand. While programming in a particular language and solving particular problems is a useful skill to acquire, in the long term general problem solving and programming abilities are more important. For some classes, such as Systems Analysis, the majority of textbooks are too sanitized and take too much of a cookbook approach. Students need to understand that computing is situated within real organizations and that real organizations are not as neat as textbooks make them out to be. Working on real projects, rather than textbook cases, is essential.
Classes frequently have multiple goals.
It is important to consider each of these, to decide how best to teach it, and how to fit all the goals together. In programming I firmly believe that students need to learn by doing. They need guidance more than instruction. In Systems Analysis and related classes there is simply no substitute for the real world group project. Some lack confidence in their own abilities and need to be encouraged and given extra help to get started.