Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

We've all heard it; whenever there's a discussion about CS grads having poor development skills someone eventually says,

Computer science isn't software engineering.

The problem that I see is that programming and software development are taught in CS courses. They're just commonly taught poorly. If it's being taught, then why not teach it right the first time? *

So I would like to see what the opinions are on 2 questions:

  1. Is the CS != SE argument a copout or excuse for not properly teaching programming skills.

  2. Regardless of your answer to question 1; if you were in the almighty position of making such a decision: would you force an emphasis on proper teaching of programming in CS courses?

*. I have a suspicion, based on anecdotal evidence I obtained throughout my education, that most academics in the field haven't had to write code to be maintained and haven't maintained code, and as a result don't have the knowledge/skills to teach it effectively.

share|improve this question
7  
I'll clarify my comment; in my mind, they are different (CS != SE). So if I replace CS and SE with 2 other fields A, B, where A != B, you could get something like Bowling Lessons != Japanese History. Then you're argument becomes: is the BL != JH an excuse for not properly teaching JH? This is now an absurd question, and should be dismissed. If you saw a CS grad that didn't know why you'd use a hashtable over a linked list, he was taught poorly. If you saw a CS grad that did a poor job refactoring code, that can be excused. –  Jeremiah Nunn Oct 13 '10 at 15:47
2  
@Jeremiag Nunn: To use your analogy: Japanese history isn't taught in tandem with bowling. I'm making the argument that every CS programme, does in fact teach programming and that they use the "CS != SE" argument to excuse themselves from teaching it well. –  Steve Evers Oct 13 '10 at 16:01
2  
Another thought: is the lack of SE skills in a particular CS grad the fault of the school or the student? In each class you'd likely have a pretty wide skill spread from competent to horrible. –  Anna Lear Oct 13 '10 at 16:25
2  
@SnOrfus Software engineering is the craft of building software. Computer science is the theory behind the software. Knowing both is ideal, but they are still separate. A better analogy (IMO) than @Jeremiah's would be one of building instruments vs. playing them. –  dash-tom-bang Oct 13 '10 at 16:34
5  
The footnote about academics not having to write maintainable code is almost exactly the point. That's not what CS cares about. –  dash-tom-bang Oct 13 '10 at 16:35

17 Answers 17

I don't think it's a copout, but rather an assertion that computer science isn't software engineering, it isn't programming -- it's, well, the science of formalized computation. In essence, it's math (in fact, many CS programs started off as applied mathematics programs).

I think the problem lies more with industry than academia. Industry sees a CS degree listed on a résumé and thinks, "Great, this guy's good with computers," and hires him to do anything related to a computer: IT, programming, software development, whatever. Those things don't necessarily lie in the realm of expertise of a CS graduate. In turn, a lot of people who like building computers or playing videogames enter a CS program expecting to do that kind of stuff, and get a rude surprise; i.e., a lot of students going into CS don't really belong there, and would be better off in a more targeted degree program.

Secondly, there's a very limited time to teach CS -- a very broad subject -- in a typical undergraduate curriculum. My undergrad curriculum had 8 CS courses (for a BA) or 12 CS courses (for a BS), plus all the required math courses. That's not a lot of time to teach CS and math and programming and software engineering, so at some point you have to decide what's important, and what a student can pick up on their own.

That last point is crucial: I think a good student -- in any subject area -- will explore ideas on their own. I have a CS degree, but I think I came out of college as a decent developer, because I studied and wrote software on my own. College isn't all about classes; it's also about giving students time to develop their skills semi-autonomously, while still giving valuable guidance.

I maintain that teaching theory -- CS, math, etc. -- is just as important, if not more important, than teaching specific job-related skills. If you teach a student the why behind methods and techniques, and not just the what, you'll end up with someone who is much more adaptable when applying his knowledge. For example, I went to a much-maligned "Java school" and thus was taught in Java, but I also had courses in programming language theory, which explained the why behind many languages; as a result, I've learned to write much better software than if I didn't have that background. Sure, I don't write software in Haskell in my day job, but knowing a lot of programming language theory has allowed me to gain insight that has been applicable to my job as a programmer.

I also think industry is expecting too much from college students. Industry wants to cut its own costs, so instead of training new recruits for their jobs, they expect colleges to become trade/technical schools; in effect, they want colleges to do their training for them. College graduates can't be expected to know everything fresh out of college. Being a good developer is as much about experience as it is about knowledge (especially in a relatively young field like software development).

share|improve this answer
2  
@SnOrfus: To the extent that programming is applied mathematics, yes. But just as computer science != software engineering, programming != software engineering, either. –  mipadi Oct 13 '10 at 16:45
1  
@David Thornley: Firstly, myself and everyone I ever know who took physics used an oscilliscope when studying waves. Still though, the analogy doesn't hold. Students are _already being taught_ programming as part of a CS degree. You were, I was, all of us that attended a unveristy were. It wasn't even a one-off section of one course. It's an integral part of at least 1-2 classes per semester. –  Steve Evers Oct 13 '10 at 21:36
2  
+1 for explaining that school (college, university, whatever) should teach you how to fish and not just give you the fish –  Emiliano Oct 14 '10 at 10:16

Part of the problem here is the fact that 4 years is not enough time to become a polished software engineer. Given that we want the undergrad to have exposure to more things than just math and CS courses and the fact that there is plenty of pure mechanics to learn (algorithms, data structures, language syntax), we can not expect a green CS major to be a software engineer.

I would agree that CS != SE and I'm not sure you can just go to school and become a SE (even with a Masters)

share|improve this answer

CS is in fact not SE. And people seem to conflate the two all the time, even while admitting it. Computer science should really be renamed something like Computology, or the science of computing. In fact, computer science has very little to do with computers. It's graph theory, algorithm analysis, data structures, etc.

People want to assume a fresh CS grad is actually an ITT grad; they want someone who has been trained in a vocation. Computer science is science, programming is an art. These are not the same.

This is like asking why a fresh Physics grad isn't a good car engineer. It's silly.

share|improve this answer
2  
Programming is a craft, not an art. –  dash-tom-bang Oct 13 '10 at 20:22
6  
Programming is craft, engeneering and art. –  Maciej Piechotka Oct 13 '10 at 23:14
2  
I would not rename it. What is Computer Science, but the science of computers? in other words, the study of calculating machines, which implies the study of calculating. –  Michael K Nov 12 '10 at 18:56
1  
Should be renamed because people made confusion on it as you. do you know Edsger W. Dijastra ? he once said, "computer science is no more about computers than astronomy is about telescopes." :) –  boos Jan 19 '11 at 19:52
1  
Art creates beauty; craft creates utility. Art is created for its beauty; craft is created for its utility. Art might be useful; craft might be beautiful. Software Engineering creates utility; therefore, Software Engineering is a craft. –  systemovich Jan 20 '11 at 15:52
  1. At least in the United States, education as a whole has become about profit. Schools are dumbing down curriculum across the board to increase enrollment. There are more people in college that don't belong there than ever. Learning proper techniques is not something you can teach easily so they don't.
  2. Personally I would put more emphasis on SE than there typically is but I believe CS as a program is less appropriate for people looking to get into industry. I think more institutions should offer a practical SE program.
share|improve this answer

Is the CS != SE argument a copout or excuse for not properly teaching programming skills.

No. CS is not SE. That's a fact, not an excuse.

Regardless of your answer to question 1; if you were in the almighty position of making such a decision: would you force an emphasis on proper teaching of programming in CS courses?

No. It would be like forcing astronomers to learn the details of building telescopes. Or forcing programmers to learn the details of building computers. Related stuff, but one man doesn't need to know everything.

share|improve this answer

Yes, this sounds like a cop-out to me, and a sign of CS's immaturity as an academic discipline.

An American Chemical Society accredited B.S. program requires you to have passed specific courses to demonstrate particular proficiencies in both theory (lecture classes) and practice (lab classes). At present, CS has nothing like that as far as I know.

One of my grad schol profs was a very ivory-tower theoretician whose office was never sullied with anything more physically chemical than a fishbowl with Magic Rocks, but when I was his TA for freshman chem, he also proved to be a quite competent bench chemist.

When I worked as an industrial paint chemist, they'd have laughed their heads off at the notion that I'd have a bachelor's and be incompetent in the lab. Of course the details of what I was doing in the lab were different than what I'd had in lab classes in school, but the principles were the same - we just used a paint mixer and a can, rather than a beaker and magnetic stirrer.

If one were to apply the same approach to CS, the details of what one might teach as practical software development skills for a CS/SE curriculum might vary from school to school, and over time. But it just sounds crazy to me that it's acceptable that somebody could get a degree in the field and not be competent at writing, debugging, and maintaining some kind of code. (Of course, that's how things actually are in many CS programs, but it's still crazy.)

share|improve this answer

I agree that 4 years is only enough time to give them a good foundation on which to grow. However, I think one thing that really helps is when people from the industry get involved in developing the curriculum and even teaching in the classroom. Last year I was an Industry Fellow in a Software Development class at a local university. It was a very eye-opening experience for me. The professor and I worked together on the course content and we put a lot more information about the development process, industry best practices, and "real-world" situations then they had been doing before. What we discovered was that, because most of the instructors do not develop widely used and maintained code, bringing in someone from industry helped to identify and teach the skills needed to do that. The professor did all the grading and provided the teaching expertise that I lacked.

share|improve this answer
  1. Yes it is a copout 100%, they should be teaching long term skills which will be useful throughout our career. Whether or not your intention is to go into academia or the industry you will need to be able to program in a way that can be maintained, even if it's only by yourself.

  2. Yes, although it would only be stressed in the proper courses. Personally, if I have to talk to you to better understand how you tried to implement an algorithm I would mark down your grade.

Even if you go pure CS research you will probably have to create code to demonstrate your ideas. Proper programming skills will be useful to you at some point so why not begin in college.

share|improve this answer
1  
IMHO CS is needed to be able to approach more complex problem, a lot of people around here, dont need a CS degree to write code, but if you need to handle a matrix 10x10 Million of data, and manipulate it, i cant figure how a SE can handle it without a CS degree. –  boos Jan 19 '11 at 19:47

I think our problem is that we're much more like doctors than we're willing to admit... We have this idea that a four-year degree should prepare students to write software. It's not even close.

Our profession is largely in its infancy compared to other disciplines. Maybe the question should be: how can we improve CS so that the students who graduate with that degree are better suited to become productive members of a real-world software development team in a much shorter time span?

Maybe we should be more like medicine. Four years of basic work (CS degree) and then residency - practice of the craft under the supervision of a more experienced software engineer. Maybe that's what we already have, but it's less formal... I mean, like a resident, we learn our most valuable skills at the workplace in our first jobs.

Maybe as as discipline we just need to formalize this better.

share|improve this answer
1  
The M.D. program is not a science program. You want to study the science, you take biology. If you have a medical problem, though, you don't take it to a biologist. –  David Thornley Oct 13 '10 at 20:40

I have a CS degree, and for a whole year of my program there was no programming, only theory. We were told that we are not getting a degree in programming but in Computer Science. If you want to be a programmer go to community college.

We learned about algorithmns, design patterns, and alot of the theory about solving problems without a spacific language. Programming languages come and go, but the underlining theory stays the same.

So, to your first question, no I don't feel that CS != SE is a copout. It's a fact.

To your second question, no, I don't think I would. How do you properlty teach programming? Beyond loops, ifs, methods, classes and OOP, what would be 'proper programming' and how would you make it relevent to any programming language out there? You need experience writing code, something that a 4 year degree can't prepair you for.

One thing I would do though is provide a class on Development in the Real World. Source control, ticket/bug tracking, code tracing, and all that jazz would be a good start to prepare all the soon to be grads for what they will face in their new jobs.

I think it's on us when we hire a new grad to understand that they probably aren't going to be writing award winning code. They need guidance and direction.

share|improve this answer

It is important for the university to strike a good balance between theoretic knowledge and practical skills. While attending different courses I learned both. During first years there was a lot of math and algorithms/data structures. What followed was a choice: either you could continue learning computer science (kind of artistic path, where you could for example attend courses with sophisticated string matching algorithms) or focus on software engineering. You still had to get some solid programming background during this time.

I chose software engineering, because I was never very interested in abstract problems. But even those who liked pure computer science had to:

  • program small file system in user space, create a linux kernel module and modify kernel itself, write a pure object oriented game in SmallTalk,
  • write own communication protocol and then implement one, chosen by the teacher (it was really cool, when programs of two students could easily communicate, though they didn't collaborate before),
  • create a larger project in Java in a team of four,
  • build some functional programming project,
  • write several solid programs in C for parallel programming (the ideas were abstract, but reviews were pretty harsh, like losing points for not providing proper output, when program failed, like a good unix program should do),
  • create a web portal using some web framework (we chose django, which made me love this framework),
  • create a pretty large program using LAMP (I still have nightmares about php, but used postgresql instead of MySQL and I am very happy about knowing this DBMS now),
  • and if someone chose, he could write a program for his masters thesis - I wrote 10k lines python desktop program using PyQt.

Maybe there were other projects, but I simply forgot them now.

My point is: it all depends on the school. I have great dislike for pure software engineering approach, where Java is the main language. I had to help a friend once, who attends such school and had to write some program for parallel programming. I had to write it for him basically, because he though, that sizeof(some_string) in C gives the length of string.

I will be honest: I hated math, I was in pain, when I had to prepare for abstract tasks, that would be served on algorithms/data structures exams. But it gives me certain edge: I can think in a very abstract way. It's like when you learn martial arts and don't keep your guard (at least in those, where you are supposed to). Coach just keeps coming and hitting you in the head, when you lower your hands, because you forgot or because you are to tired to keep them up. But after some time, you just keep them up. And it becomes really hard to hit you in the face. The same with abstract algorithmic problems. Understand content of Introduction to Algorithms and really few things will surprise in work.

share|improve this answer

I think the answer is yes (in a way).

The thing is it is not possible to teach to kids in a short period of time programming. They should be tought the programers logic thinking, how to solve (in a smaller scale) the programmer´s problems.

I´m certain the school´s programms should be revised, I my very small "third world" country, fortunately, an effort is being made for this to happen. We are the first country to implement OLPC program; http://laptop.org/en/

share|improve this answer

From my own experience (I'm a student at the moment), I've gotta say yes,it is an excuse. Everybody refers to CS as a science that teaches us all the basics of computers, and SE as a special branch in CS that is explicitly teaching programming. Imo, everyone that has BS in CS, has to know how to write good and optimized code (even if programming isn't his/her speciality area). So yes, if I had a almighty position of making such a decision I would force the students to gain good programming skills.

share|improve this answer

Assuming the goal is to educate good software engineers (programmers) because the world needs them, is it OK to answer by saying what I think should be taught?

First, this is important because currently the knowledge transfer is very inefficient. When prospective programmers are in classes, their minds are open and they absorb what they are taught. At the same time, professors (I was one) all too often are more interested in filling the graduate-school pipeline with students who can work on esoteric subjects. When the objection is raised that students are not being prepared for real-world problems, I've seen professors claim that's not their job. That's the real world's job.

Then when students become programmers in the real world, are they eager to learn from their new colleagues? Not in my experience. Rather they are eager to spread whatever gospel they acquired in school. I remember as a student and young practitioner thinking how hard it was going to be fostering new ideas among the old fuddy-duddies out there. Now that I'm an old fuddy-duddy I see how hard it is to open new programmers' eyes to the difference between theory and practice.

I was an engineering student, in mechanical and later electrical engineering. A fundamental part of that was a) mathematical foundations, and b) practical problem-solving. Software engineering should be like that, not just programming.

I think software engineering (programming) should be taught with enough computer science to be a working knowledge - basic automata theory and information theory. These do not need to be done in great depth. After basic programming skills are taught, there should be cooperative projects of nontrivial size. An essential part of these should be proposal and consideration of alternative solutions of specific problems, with analysis of pros and cons, not just the latest religion or "next big thing" or one-size-fits-all. Finally, there should be cooperation and partnership between industry and academia, so that ideas and improvements can be communicated both ways, greatly enhancing quality control.

share|improve this answer

Those that can, do; those that cannot, teach.

At my university, the knowledge base of the teachers is woefully deficient. I have seen teachers struggle to understand how to represent semi-structured tables in XML while holding a PHD in Database Design. I've seen my Assembly teacher ask me what my code is doing when it's his code snippet I copied and pasted. I've seen my software design teacher tell us the Agile method is the same as the waterfall method, only faster, that iterative development process model has and can only have 3 iterations because that's what the picture the book uses as example depicts. One of my teachers did not even know what an elseif statement was.

I don't believe they are 'coping out', or making excuses, I truly believe they are doing the best they can with their experiences, which they have precious few.

I agree with the other people posting here that 4 years is not enough to become a seasoned programmer, but the experience my teachers have had is not enough to make them seasoned either. It's much like in Ender's Shadow, where Bean notices the metrics used by the teachers in battle school fall short because the last war which is the guide rule, was too short to truly show what is actually needed. In otherwords, the teachers were doing the best they could, but failed to have the experience to know what is really needed to make a good commander (or good programmer in this case).

share|improve this answer
3  
I think many of your examples are obviously just cases where your teacher is trying to simplify things for your own benefit. Those that can, do; those that cannot, teach. I also don't agree with this at all: academic and industrial careers lead to completely different lifestyles. Much of the world's research comes from academics. And I don't see any way in which you answered the original question. –  rmx Oct 13 '10 at 18:11
2  
What does XML have to do with database design, besides the fact that one could if one were so uninterested in performance, use XML as a backing store for a database? Not to say that some teachers can miss the point (I remember arguing with an instructor over points removed due to "excessive commenting" when the curriculum to that point taught "comment like the wind") but it's sort of overstated. If someone wants to learn Java, there are cheaper ways of doing it than going through a CS curriculum. –  dash-tom-bang Oct 13 '10 at 20:27
1  
There's also the fact that some universities are worse than others, and yours may have a particularly bad CS department. Traditionally, CS people with graduate degrees have been able to make a lot more money in industry than academia, so the ones in academia were the ones who really want to be there and the ones who couldn't hold a job in the real world. I've seen both, and suspect the ratio varies across universities. –  David Thornley Oct 14 '10 at 15:39
1  
XML used like this is still an implementation of a database theory. It is not itself the theory. –  dash-tom-bang Oct 15 '10 at 16:27

Computer Scientists and Software Engineers are different. The scientist are the guys who perform the crazy experiments and come up with the algorithms that we Software Engineers leverage to be better.

Think of chemists conducting experiments for a pharmeceutical company. They don't care about how to produce the chemical en masse. Nor do they care about marketing, packaging, distribution or anything that happens to the drug after they discover it. Hell they don't even care about the certification process. All they care about is finding a chemical that has an effect when given to test subjects. The company is responsible for moving it beyond that.

Computer Scientists are like those chemists. All they do is test out theories with code. They don't care about how maintainable the code is. They prove a theory and move on to the next one. Someone else packages that algorithm up and makes it useful for the masses and we have MP3 or computer vision with the Kinect or streaming video on your iPhone. So CS!=SE is a valid argument.

WRT the second part of your question. If I offered a degree in Music Theory, there might be a required course in songwriting or something, but wouldn't require anyone to study an instrument. It's up to the student to seek out the knowledge they want. Computer Science is not Software Engineering...if you want to learn SE, take a double major.

share|improve this answer

Edsger Wybe Dijkstra was a Dutch computer scientist.

He received the 1972 Turing Award for fundamental contributions to developing programming languages, once said:

"COMPUTER SCIENCE IS NO MORE ABOUT COMPUTERS THAN ASTROMY IS ABOUT TELESCOPES."

CS is REALLY DIFFERENT FROM a SE. ( CS != SE ).

A CS is a scientist who has acquired knowledge of COMPUTER SCIENCE.

COMPUTER SCIENCE or computing science (sometimes abbreviated CS) is the study of the theoretical foundations of information and computation and of practical techniques for their implementation and application in computer systems.It is frequently described as the systematic study of algorithmic processes that create, describe, and transform information.

Computer science has many sub-fields for example:

  • Theoretical computer science
  • Theory of computation
  • Algorithms and data structures
  • Computer elements and architecture
  • Multiprocessing
  • Computational science
  • Artificial Intelligence
  • Software Systems

Many of us don't need any of this skill in every day work or at least a little of it.

SOFTWARE ENGINEER (SE) is a profession dedicated to designing, implementing, and modifying software so that it is of higher quality, more affordable, maintainable, and faster to build. It is a "systematic approach to the analysis, design, assessment, implementation, test, maintenance and re-engineering of a software by applying engineering to the software"

As a CS knowledge he's suppose to have the knowledge to manage real complex problem without knowing any really good programming language. IMHO here we can open another thread, where a DEGREE for me is ONLY a STARTING POINT and not a END GOAL.

As SE knowledge he's suppose to have the knowledge to manage the production of this real complex problem and manage the development of a team or a project about this field.

Together make the research in science made by a CS in applied Science with the help of a SE.

I don't mean CS is better than SE, i mean CS != SE.

This kind of question is the same question that non computer people ask to themself when ask to you why, as programmers, you are not able to fix by phone the problem of the program X,Y,Z on the operation system J,M,N. ;)

Actually I'm really bored of coding after 10 years of unix system development in security field and after reading this question i get the point, i need to study more computer science and less computer language and computer system or protocol!

No one at my work can handle the difference about SE and CS! it's really a bad things.

If you think that a CS can be an excuse to bad programming skill you are really miss the point about what it's a CS and what is SE.

I suppose you are a SE, do you know for example that all language, all paradigm and all computer language related stuff can be expressed mathematically in a set of partial recursive function and whatever you learn a new language, ANY NEW LANGUAGE, you are only learning a new abstraction over the SAME recursive partial function ?

have fun :)

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.