What's lacking in CS Degrees nowadays (Part 1)
theshyam.com
theshyam.com
Colleges are optimized for getting broad ideas and theories across. Theory of computation, algorithms, etc. are necessary for programming.
The point this article makes is that those ideas and theories are not sufficient for being a professional programmer. So what? Almost all engineering fields require some sort of on-the-job training. For software development, it's about writing maintainable code. I don't think this is something that can be taught easily in a CS program, and you'd have to stop teaching something else to do so (probably lots of something elses, since I don't see how you could do it in one semester).
Furthermore, either the majority, or a substantial minority of CS PhDs can't do this right, so it's strange to think that they will be able to teach this.
Universities teach those, but they also have some programs focused on practical applications (and some people think of Academia as simply "what universities do"). The obvious example are the professional degrees such as the JD, MBA, MD, etc. Engineers and architects are also expected to emerge being able to put those skills to use almost immediately after graduation. They all come with some on the job training, but that is true of virtually every job/profession. Those with "applied degrees" are expected to have received the vast bulk of the training they need to enter and work in that industry at college and it would be catastrophic for industry if they did not.
Now, CS as it (mostly) is now is an academic degree in the former sense. The question is whether "Software Engineering" should be separated out form CS as an applied degree similar to other forms of engineering.
Personally, I think it should. This would free "Pure CS" to focus on theory and algorithms and the mathematics behind them and general research while providing employeers and those students primarily interested in becoming employed with a more focused degree that can include more methodology while deemphasizing the theory.
There would of course be vast overlap between CS and Software Engineering, but this is just like chemical engineering and chemistry being separate. The overlap between the two is huge, but they are not identical and different people chose one of the two deliberately and with good reason.
There are just "programing degrees" specialized for these cases. (there are in Turkey. But I'm not sure about USA and Europe)
It is largely a point of view, but I would respectfully disagree. I suspect most people would think of an MD as an "applied degree" (or applied doctorate as the case may be), but many MD's engage in research and innovation. The same is true of the engineering degrees.
I too once thought my CS undergrad was worthless because it was all this theory and no practice (at least not practice at inheriting bad code, improving it, and leaving good code to someone else). But really the problem was that I went into CS thinking I was going to get a degree in Software Engineering. They are in fact very different things, and should be different degrees in my opinion.
Just like there is a different degree for Math and Accounting, or Architecture and Architectural Engineering, there is a pretty big gap between CS and Software Engineering. Of course they have things in common, and could share many introductory classes, but separating them would make it more clear up front what you are getting yourself into, and make it more clear at the end what you actually learned.
That said, I'm glad that separation hadn't happened when I was an undergrad. I went into college thinking that I wanted to be a Software Engineer, and was fairly disappointed to 'waste all my time' on this theory stuff. But now, a few years after graduating, I find the theory much more engaging, and am going back to grad school for more of it. If I had had the option of a Software Engineering degree when I started, I might never have discovered the fun that is CS.
If you were setting up a Software Engineering degree, one good route might be to partner with some local company. They get cheap work, and the students get real world experience and access to mentors (senior people at the company) to rapidly improve their abilities. Courses would probably center around languages and classes of tools (Introduction to Source Control Management, Introduction to Automated Testing), and, like Architecture, lots and lots of studio time.
"I think the solution would be to create a programming-intensive BFA in Software Development--a Julliard for programmers. Such a program would consist of a practical studio requirement developing significant works of software on teams with very experienced teachers, with a sprinkling of liberal arts classes for balance. It would be a huge magnet to the talented high school kids who love programming, but can't get excited about proving theorums.
When I said BFA, Bachelor of Fine Arts, I meant it: software development is an art, and the existing Computer Science education, where you're expected to learn a few things about NP completeness and Quicksort is singularly inadequate to training students how to develop software."
See more here: http://www.joelonsoftware.com/items/2008/01/08.html
First is what I consider the primary use for a CS degree: researching the science of computing. This includes all the specialties, from AI to Algorithms to Databases to whatever, but it's different than the next two. A true CS major should primarily be a research scientist but possibly a software architect. Chances are good that a BS CS isn't that employable in that role and would require graduate school for more depth.
Then there's software engineers that specialize in designing and delivering software. There's certainly some overlap with the CS degree coursework.
Then there are computer programmers that just write code. These don't need a 4-year degree. They could be trained at junior colleges or even modern trade schools.
So if I compare that three-fold path to electronics, the CS degree is closer to a degree in physics, the software engineering degree is closer to a EE degree, and the computer programmer went to soldering school (or was trained on a wave solder machine). EE students take physics classes, but then branch off into "applied physics" specialties.
Then there are computer programmers that just write code. These don't need a 4-year degree. They could be trained at junior colleges or even modern trade schools.
This already happens. Lots of junior colleges and specialized trade schools will teach this. I also know several good programmers that are entirely self taught (or similarly, taught by a mentor).
Personally, I transitioned to software design after getting a degree in math. It is certainly a related field, but I made the jump through self study of the practical aspects and picking up a couple of certifications just to help with HR.
Analysis of algorithms is one of those things that is super important, yet it requires some discrete math and theory of computation.
Strangely enough, the classes that were most useful to me now as a developer were the more theory oriented ones. The "real-world" type classes were all either out-of-date or just too ivory tower to apply.
My grandfather started working as a draftsman for a pipeline company after the Korean War. He had nothing more than a high school diploma, and he said he took the job because "it paid $3 an hour and I liked to draw". He spent the first year being trained in a special facility the company had set up just for that purpose. What company does that nowdays? I'm sure there has to be some, but it's far from the norm.
This is particularly true in software. I do not know about other companies, but when I got my first "real programming job" I was given two weeks of on the job training. That focused on things like that particular company's code layout standard, naming conventions, an overview of the code base already written for the piece I would be working on, and some of the HR/administration requirements and procedures.
I was expected to know how to program already.
Are there any engineers in the audience - not software engineers, or even computer engineers, but mechanical, electrical or civil engineers? My guess is that there's about the same level of "what you learned in school is never enough for practice" as with the "real" engineering disciplines, but I don't have any experience with it myself.
Very true, but beside the point. My point is that while some exceptions do exist, most companies expect you to start knowing how to do at least the basics of your job.
I laid out my experiences when I was starting as a programmer to illustrate the level of on-the-job-training common. That was the last job I had any official OJT and the last one I had that was remotely entry level. Since then, I haven't even been given that kind of official walk through the code and their standards. I have been handed problems to solve and either given or ended up writing their formatting standards/naming conventions.
Of course, I deliberately try to find jobs with small organizations or small, insulated sub-organizations within larger companies since I think small teams tend to work best, so YMMV.
As a side note (now I'm going off point a little bit), most people I talk to do not currently consider "Software Engineer" an entry level position but rather something worked up to after doing things like programming. This may change if there was a more focused specialty in college.
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'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 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.
What are the names of some of the classes you have taken in your program?
I think the better question is why didn't this guy seek out the MULTIPLE opportunities to do "real" development (Open Source, _Good_ internships, etc?
It's not as if we're all (College CS Majors) twiddling our thumbs and being useless all year long.
The stuff you learn in school is useful for any of these, and is the same for all of them. Equally important, you can really tell who's been through those courses or not, independent of how well their code fits the normal maintainability or performance requirements. Higher-level concepts are just lost on them, or, if they've managed to pick some of it up informally, so intermangled with other conceptually-different topics that clear thinking and analysis is nearly impossible.