I agree with many of Andy’s points, but there’s one glaring flaw here: You would have a hard time getting rookie programmers to distinguish between good code and bad (the difference is never as obvious as one thinks, “clean” code isn’t necessarily “good” code, regardless of what anybody who writes Ruby for a living wants you to think) in an open source project, or you’d have to spend a significant time vetting said projects.
Once somebody has the grasp of the fundamentals, something more akin to an apprenticeship is what would be more beneficial to just about any developer. Stick a novice with an advanced programmer and make them work together on a small project, or wing of a project. One of the biggest influences on my programming abilities and style was when I joined the CoRD project soon after making a concerted effort to learn Obj-C; I would write a huge chunk of code to do some new, cool thing, only to have Dorian, our project lead, chop it up and boil it down to 3 lines of code. His focus and drive for efficiency and stability produced solid, tight code, that as is evidenced by CoRD’s performance and success, even as it ages. But going through that process, me writing bubble gum code, him making changes and corrections, and me reviewing those and sometimes having to figure out how his code accomplished the same thing as mine, was great experience. As Andy points out, nothing trumps experience. But education, particularly education around the engineering fields, is supposed to be about relaying the experiences in such a way that the pupil can comprehend them fully, and recognize similar situations with familiar solutions, and be able to adapt as the parameters change.
The biggest failure I usually saw in education was a huge disconnection between what was being taught, and the impact it would have on anything in the future. Professors always made it difficult to see the forest for the trees, as it were. This made what I described above, comprehending what was being taught enough so that similar, but not identical, situations could be recognized in the future, that much more difficult. That ability I didn’t even start to develop until very late in my college career, which is a shame, because I realize now how much more rewarding, productive, and even fun several of my classes would have been, had I not been looking at it from the wrong perspective.
I have never seen a software engineering course with a syllabus that makes any sense.
“Software engineering” means many things, but let’s consider approaches for building projects large enough that a single person could not keep one in his head. At this size, the structure of the software…