What's lacking in CS Degrees nowadays (Part 1)(theshyam.com)
theshyam.com
What's lacking in CS Degrees nowadays (Part 1)
http://theshyam.com/2009/07/whats-lacking-in-cs-degrees-nowadays-part-1
8 comments
Well really the issue is that the field needs to be split.
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.
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.
Exactly. I see "Computer Science" degrees being used for 3 distinct purposes.
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.
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.
The danger here is the temptation to neglect some of the CS things that are important.
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.
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.
I entirely agree. One thing to add though:
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.
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.
Joel Spolsky has also argued for this:
"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
"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
I agree, but I'm not sure if the field of Software Engineering is ready yet for us to split the degrees. For example, see the ACM's position from 2000 on licensing Software Engineers: http://www.cs.wm.edu/~coppit/csci690-spring2004/papers/selep...
Probably true. As others have pointed out, the best way to learn this stuff is to do it, hopefully with a mentor to speed you along. If you are going to learn that way, you might as well earn a paycheck at a company rather than paying tuition to a University.
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.
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.
It's getting closer. The "body of knowledge" today is substantially improved over 2000. Just look how far design patterns have come in that time. End-user expectations are also climbing higher, especially for enterprise customers that have been burned by failed projects.
I think academia is not about business and should never be about business. IMHO If the academia starts to aim industry students will stop doing research, innovating or doing teaching. This will be catastrophic for CS and industry.
It sort of depends on how you define Academia. If by Academia you mean "Liberal Arts + Sciences" then I agree, but by that definition all major universities go far beyond that.
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.
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.
Separating CS and Software engineering is a must in this case. But thinking of Software engineering as a "applied degree" is downgrading what Software Engineering could be. Software Engineering can be a research and innovation degree. But nowadays it's not thought as one.
There are just "programing degrees" specialized for these cases. (there are in Turkey. But I'm not sure about USA and Europe)
There are just "programing degrees" specialized for these cases. (there are in Turkey. But I'm not sure about USA and Europe)
But thinking of Software engineering as a "applied degree" is downgrading what Software Engineering could be.
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.
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 strongly disagree that universities should be trade schools whose objective is to prepare students for the "industry." Aren't there loftier goals in life?
I agree with you, but the reality is that most people go to college 'to get a good job'. So most people expect college to train them for that job, and most employers have come to expect people to hit the ground running.
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.
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.
I think the expectation for any engineer fresh out of school is that they will need some on-the-job training to learn how to be an engineer in practice.
Yes, but the key word is some. There is a major difference between expecting someone to grow through experience and giving them some initial guidance and training on that specific job and teaching someone everything they need to know in practice when they have some hazy idea of the background theory.
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.
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.
"Programming" and "Software Engineering" are different things.
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.
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.
"Programming" and "Software Engineering" are different things.
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.
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 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 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 agree... instead of trying to make up projects, schools should just send students on internship gigs at the end of 3rd and 4th year.
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.
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'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've been programming as a hobby for years, am now a junior in a CS program and am consistently disappointed by the level of difficulty in my classes at school. When we do have to program, the grading criteria is so loose that it's difficult to fail at all.
Where are you majoring in CS?
What are the names of some of the classes you have taken in your program?
What are the names of some of the classes you have taken in your program?
For my Software Engineering class, we had to make a contribution to an open source project. Firefox is about as "legacy system" as you get without learning COBOL.
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.
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.
I'm a CS undergrad, and I'm working building software in the 'real world' for the summer. There's no way they could teach this kind of experience in the classroom or with projects. I like the idea of OSS work as a course requirement, but the only way to learn how to _really_ program is to _really program_.
I have mixed feelings about this. It sounds like the author's needs are better suited to a degree in software engineering than computer science. A CS degree is not a degree in programming or software development, even though that's the path many people take.
Indeed. The specific stuff you get at a code review depends completely on who else is on your team -- stuff that's great at one place is terrible at another. It's stuff you pick up from the specific software industry you join when you get out of school, web, embedded, desktop, whatever.
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.
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.
Here is the link to Part 2
http://theshyam.com/2009/07/what-could-be-done-to-improve-cs...
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.