3 Things They Should Have Taught In My Computer Science Degree

That’s right only 3 things. Oh, there are plenty of things that I wish I would have learned about at university, but I am well aware that no degree will give you an exhaustive education in your field. A degree is meant to teach you the basics and equip you with skills so that you can learn the rest yourself. However, as I get more experience as a software developer, I find that I am increasingly frustrated about not having been exposed to these three things before I entered the workforce.

I believe that any Computer Science degree can be made a lot more relevant simply by paying more attention to these three points. Had I had more exposure to these things before starting my working life, I believe it would have given me some real world skills that I could have applied straight away, rather than having to scramble to learn everything I needed to know on the job. It would have made me better able to deal with the requirements of my work and would also have made me a better citizen of the IT community.

1. Open Source Development

I found that open source was never really taught. Some students found out on their own and got into it, but the majority didn’t find out at all. At no other time in their lives will students have as much time on their hands to get involved as they do at university; it could truly be a mutually beneficial relationship. Instead, a great opportunity is lost here both for the students and for the open source movement.

I believe most CS subjects should encourage students to either start their own open source projects or preferably participate in existing ones. It should be part of the curriculum and part of the grading process. Open source projects could gain valuable contributions, while students not only gain skills in a real-world setting, but also the use of tools, processes and valuable interpersonal skills that a simulated university environment just can’t provide.

2. An Agile Process (e.g. XP, Scrum)

I’ll amend this; I wish they taught any process to such a degree that people can actually gain at least a passing familiarity with it, even waterfall. I found process was more or less glossed over during my university time. Sure there were a few lectures that mentioned it, but noone really explained the need for process and there was never any practical application of the knowledge. In this case without practical application it is almost impossible to take-in the concepts.

Of course it would have been even better had agile processes been taught since these are a lot more relevant to the industry today. Teaching agile processes to university students is probably one sure-fire way to start changing the software industry for the better. Students would come out with a decent understanding of how software should be built and would be a lot less likely to be brainwashed by companies with outmoded modi operandi (lets face there are still plenty around). Instead students enter the work force completely ignorant about how things should be done and another great opportunity is lost both for the students and for the IT industry in general.

3. Corporate Politics/Building Relationships

It may not seem so to most people, but I believe that this is by far the most important point where my CS degree let me down. So much emphasis is placed on technical subjects that you never get to find out how life really works in the corporate world. Of course this is the hardest to figure out on your own.

As a freshly minted CS grad, you think technology is the most important thing in the world. So, when you find your feet in the corporate world it is a bit of a rude shock how everything seems so dysfunctional and moves at such a glacial pace, until that is you figure out that technology is not the most important thing at all and that corporate politics rules the coop.

Even in high technology companies, politics is king and the cornerstone of politics is relationships. The right relationships can let you get things done, and make your life a lot less difficult. However the concepts around politics and relationships are not well defined, there are no hard and fast rules, everything is very relative and fluffy. Of course for technically minded people this is the most frustrating thing in the world.

It doesn’t have to be like this though, just like everything else, politics and relationship building have basic principles that can be taught, so I fail to see why they are not. Had they been maybe industry wouldn’t crying out anywhere near as much for technical people with great interpersonal skills. Because it is not the interpersonal skills that the grads are lacking (there are plenty of CS grads with great people skills), it is the ability to use these skills to effectively build relationships.

Well that’s, my take on it. It has been a few years since I was at university so maybe in the intervening years things have improved and what I mention above is part of the curriculum (somehow that strikes me as unlikely). Then again perhaps you disagree with me on one or all of the points I mentioned. Do you think there are any other vital subjects that your CS degree should cover? Let me know.

  • http://42gems.com 42gem

    I’d definetely have to agree with the first one, about open source development. My university has a strong Microsoft bias and our profs hardly ever mention open source.

  • Dominic Orchard

    I just graduated from the University of Warwick in the UK with an MEng in Computer Science and I’m happy to say we had all 3 of the above nicely covered.

    Our department has a strong handle on open-source: all workstations are Linux based, use of open development platforms like Eclipse are actively encouraged, open-source code is frequently used, and the use and development of open-source code is often encouraged. Many students in their 3rd year projects are encouraged to take on existing open-source projects, or open-source their own projects.

    Software development processes are mandatory. In the second year you take “Software Engineering Principles” (http://www2.warwick.ac.uk/fac/sci/dcs/teaching/modules/cs240/) and undertake a group project in which you MUST use industry software development processes and MUST document the use of in your project report. A lot of people opt for Agile processes. In the fourth year you take “Sotware Lifecycle Management” (http://www2.warwick.ac.uk/fac/sci/dcs/teaching/modules/cs408/) which includes processes again but in terms of HUGE projects and massive product timelines. Also you must use software development processes in your fourth year group project which must also be documented. We learn Waterfall, Spiral, Agile (XP), and all other things like SCRUM etc.

    And point 3- First year module- “Professional Skills” http://www2.warwick.ac.uk/fac/sci/dcs/teaching/modules/cs133/ and then in the third year there is a “Business Studies” module (mandatory for MEng students like myself) which covers Marketing, Organisational Behaviour (relational stuff), Finance and Accounting, and Business Strategy and Policy. These courses are very informative about being in the real world.

    The Department of Computer Science at Warwick University seems to have this pretty nailed. So if you’re looking for a great Computer Science degree, go there; its one of the top 10 institutions in the UK.

    These are certainly 3 good things to be taught if you are planning to go into software development and into industry. This article certainly reflects the shift of “Computer Science” degrees in the direction of vocational software development degrees as opposed to pure, broad, theoretical computer science.

  • Carlos

    I agree with you on the Open Source portion. Especially now with all the great software that is available today. It also would help them learn how to write code with a global team.
    Open Source software, I believe, goes with the university mentality so it would be a good way for these institutions to generate talent that will continue to give back even after graduation.
    Open source participation not only gives you exposure to software development projects, it also brings awareness and exposure to the community that is out there.

  • Pingback: Great Blog Post About Why We Can’t Always Count On Structured Education | Internet Marketing 4 Noobs

  • Richard Stansbury

    The Computer and Software Engineering program at ERAU (www.eraucse.net) has a computer science program that meets most of those needs. While I do not think that our students get involved in an open source project, they are made full aware of the concepts and licensing involved within some of the software engineering curriculum that is required. In multiple courses, we have addressed agile processes. In senior design, which I teach, we use a cross between more traditional processes such as TSP for requirements and initial design, but then utilize our version of Crystal Clear (Cockburn) to carry out implementation, testing, and component design. Lastly, our senior design puts them together in teams with hierarchies. They have team leads, managers (TAs), senior managers, and corporate officials. They also have to deal with a customer either internal or external.

  • Dominic Orchard

    Indeed I completely agree.
    Computer Science degrees seem to be becoming increasingly vocational business/software engineering focussed, losing their theoretical side.

    I think there should be clear and separate degrees: theoretical computer science, and information systems (or whatever). My degree was pretty theoretical, but they have recently changed the course for new undergraduates and some of the theory I learnt and love has been dropped :(

  • Patrik

    You forget the most important one; source control.

  • Pingback: Tech Conversation » Blog Archive » Coisas que deviam ter ensinado na faculdade

  • http://www.apebox.org directhex

    Actually, making nerds more people-friendly was a first-year module on my CS degree. Add the Electronics and CS students were taught a module entitled “Professional Issues”, which covered engineering disasters and process failures

    And to ensure that nobody could bring technology into it, our “project” for the module involved developing a paper bridge

  • http://timwells.net tim

    I totally agree! We never even talked about #1. We talked about #2 in Software Engineering, but I sure didn’t remember anything about them. I got #3 because I changed my major to Computer Information Sciences, which was meant to be less focused on programming. The only difference really was that the advanced math classes were replaced by business classes such as accounting, marketing, management, etc. I hated most of these classes while I was in them, but now I’m glad I had them.

  • pete

    Got to agree with the open source although you put preferably current open source projects, maybe not recommend this until later on in their courses otherwise their code will get trashed by the other project developers. Let them develop internal first where they have developers at similar levels which can teach each other bits before they get to the real world.

  • Tali

    There are some degrees that address the first and last point. My degree (BBIM) and others (MBIT from Melbourne) do both and more, by giving us the foundation of how corporates work, presentation/public speaking skills, building relationships etc and have found that I have used many of the non-technical aspects of my degree in my current job.
    However I must admit that I hadn’t even heard of the second point until today… so I guess that goes to show that there will always be some gaps.

    Good points though, I have found the very technically focused CS grads are particularly lacking in point three :)

  • chars

    I was taught this in tafe company politics and relationships and the first one open source I played with slackware in my class as a server so things are progressing but my course needed more focus on other things besides microsoft products in my opinion.

  • http://whatisearchfor.blogspot.com/ James Barton

    I am interested in learning your point of view on politics and relationship building. Perhaps it could be a follow-up to this brilliant article. Thank you.

  • http://spectralmud.org/ Richard Salts

    I think process is what a software engineering degree is supposed to be about. CS was more of a research focused stream at the university I attended, while many of the subjects were the same Software Engineering had a compulsory set of management subjects and a group project that was farmed out from industy in the final year.

  • Steven

    Maybe my school was crazy progressive but we were taught all those things. We had 3 courses focused on a mixture of agile and design patterns. A further 2 courses had some element of open source work, although I would like to have had more. As for business contacts, every other friday afternoon we took a trip to an CS related company where we were treated to a presentation and free beer.

  • http://www.thereheis.com SLEZE

    All accredited Computer Science programs are required to teach Software Engineering and that is where process should be taught. I believe, however, that it could be augmented in other classes as well.

    For example. From the very first programming assignment in Freshman 101, the assignment problems should be referred to as “requirements” like so:

    1.0 Hello World
    1.1 The program shall return “Hello World.” upon execution
    1.2 The program shall be commented with the students name
    1.3 The program shall be commented with the assignment name
    1.4 All comments shall be listed at the beginning of the source code.

    From the very beginning, students would be familiar with well structured requirements, even though they don’t realize the importance. It should continue like this in every technical Computer Science course.

    Also, all Computer Science students should be required, in my opinion, to take Public Speaking and Technical Writing courses.

  • guy that actually has a CS degree

    This is absolute BS. I am a recent graduate of one of the top CS programs in the US, I’ve worked at open source companies, and I have worked with Microsoft technologies. I can tell you that these three things are just nonsense. What CS majors should learn is COMPUTER SCIENCE:

    Strong background in algorithms and data structures.

    Strong programming background in C and C++

    Strong background in Object Oriented programming, and functional programming concepts and code.

    Strong background in programming defensively and in debugging code (C or Java/C#).

    Strong background in a specialization: OS, Networking, Robotics, AI, whatever. They need to specialize in something, and be aware of the other areas as well.

    None of the other stuff matters, because it is all specific to where you work. If you go get a job at Google tomorrow then those open source ideas might matter, but if you got a job at Microsoft then not so much. If you got a job at a place that was smaller and had less hierarchy, then all that networking / politicking stuff might not be as important. People who get CS degrees need to go for Computer Science degrees, not some kind of idiotic management degree that puts them in a desktop where they will manage some software product.

  • Naveen

    Couldn’t have agreed more…this does sound like an advert for Wikinomics, but then, that’s what IMHO holds the key to CS in the future…

  • Seamus

    There is no such word as “noone”.

    Sorry, pet peeve, otherwise an interesting and insightful article.

  • http://www.misterinfo.de/users/erichansa erichansa

    Eye contact. They should teach the CS people how to make eye contact.

  • http://blog.nicotine.co.za Nico du Plessis

    Good article. I totally agree with the open source argument. It’s amazing to see how many CS graduates are unable to work in a team of developers and lacking experience with SCM technologies like Subversion or Git

  • http://blog.nicotine.co.za Nico du Plessis

    @guy that actually has a CS degree

    Congratulations …

    If open source actually mattered for people who work at Microsoft, well, perhaps they’d produce better products

  • Jimmmy Dolittle

    Ah yes, corporate politics. That is important especially if you go to work for a large hospital. Never ending politics and Directors to oversee directors.

    JD
    http://www.useurl.us/17n

  • Yoyo

    For me it was not a prob coz i was given a scholarship by an aviation solutions company when im 19! and hving the work xp and the degree at the same time! I work for 4 days at the company and 2 days for the degree, think such programs wud help in future.(at least for a geek)

    Nice post! Cheers!!!

  • CR

    It’s funny that the majority of programming jobs these days basically deal with moving data around. (I’m trying to think about how many commercial applications that i’ve worked on did not contain a database… maybe 2). Yet, the majority of new hires come in saying that they’ve never used a database before. I’d be happy if we got someone off the street that could write a select statement.

  • Anonymous

    WRONG, you are confusing computer science with SOFTWARE ENGINEERING.

  • Rich

    REAL configuration management in the context of team development.

  • James

    I think CS degrees should also teach people not to have an unconditional hatred of Microsoft products. It was literally part of our courses, to hate on MS. I agree that there are legitimate complaints and concerns about their products, as with any product, but in most CS and programming jobs, programmers will be using MS products in some way.

    Teaching MS products is as essential as teaching open source.

  • Sumeet

    I think all your points are absolutely valid and the third point stands out specially in that.

    However the main thing here is that probably there is already such a shortage of good teachers, that all these things seem difficult.

    Obviously most of the Universities do not have people that are skilled enough.

    Do you think that people skilled to such an extent as to be able to teach under-grads these kind of subjects would ever go in to teaching ??

    They would rather go to IT and get themselves some fat salary. Moreover, to be able to play politics, you have to be there. You can’t just teach them the theory and no practicals. And teaching practicals of politics in Universities would surely mean more bitterness among friends at the University.

    But I would agree with you that the Open Source and the Agile Process thing should indeed be tought at the University.

    —Sumeet Agrawal,
    India.

  • csw

    What school did you attend? Not only have i learned all of these skills from my school, i feel 1 and 3 were overdone. I came out of college feeling overly prepared for life in the real world. The problem: lack of experience. I spent nearly 60g’s on an education, but could have spent 5 years working for $10 an hour. If i took this course, i wouldn’t be unemployed still.

  • Sam

    That isn’t what computer science is about, it’s an academic discipline, not a vocational training program.

  • Ronald Hobbs

    I couldn’t dissagree more.
    a Bsc in CS is not a practical degree, I did one, and I actually wish that is was much more theoretical in nature. CS should be all about algorithms, data structures, compiler design etc. and less about building yet another windows application.

    By it’s very nature a scientific degree should not be agile. at all. you need to employ rigorous scientific method, etc.
    Open source in a degree tends to lead to shortcutting the learning process by using other peoples tools/thinking. which students do anyway but at least they try and understand and interpret the ideas first. Any decent degree should involve a fair amount of group interaction, even within the course, but office politics fall outside this by a long way. maybe follow that tech degree with an MBA?

    My point is, a CS degree exists to give us brilliant technical minds that work to progress the science of computing. I’m waiting to receive mine any day now.

    Perhaps instead the negative stigma of the other degrees, eg Information systems or softtware engineering should be looked at again so that people do the degree that fits with what they want to do without feeling like they’re not doing the “best” course.

  • Joe Duncan

    These are three great things that all computer programmers should be taught, but unfortunately that’s not what COMPUTER SCIENCE is about.

    Anyone taking COMPUTER SCIENCE to get a job as a software developer has obviously no idea what COMPUTER SCIENCE is about.

    If you want to be a software developer / computer programmer, don’t go to university for a CS degree, go to college and get a diploma in computer programming. I’ll bet the curriculum even covers the three things you mentioned.

    Adding these types of courses to a CS degree would be a tragic dilution of the actual computer science being taught.

  • Pingback: Chat Marchet News Digest » 3 Things They Should Teach In A Computer Science Degree

  • Vaibhav Kulkarni

    What? CS degrees should have Corporate Politics/Building Relationships in the curriculum? The fact that you require Corporate Politics/Building Relationships is because you’re in an industry (no matter which) and are earning. It has nothing to do with Computer Science.

  • UK Grad

    I regard the 4 years I spent at university a rather expensive waste of money and time.

    I learnt ‘new’ languages – COBOL and prolog – learnt ‘new’ methods of project development – one year long software project (no agile techniques)

    I didn’t advance my knowledge of any languages I knew and learnt nothing apart from how to do academic style projects.

    Should have spent the 4 years on an arts degree and read the internet for the same education.

  • http://www.macewan.org Robert MacEwan

    Corporate politics should be taught in school. Even in my MH/DD/SA work I’d say it’s a must learn skill.

  • Court

    I don’t really see how any of those three things can be considered parts of computer science. Isn’t that what more hands-on degrees like software engineering, MIS, and CIS are for?

  • JE

    Very well done. Absolutely number 3 is most important. The reality is most CS grads aren’t paying for college just to graduate and then make no money. So the software they will produce is profit driven and with that comes corporate politics. CS departments in general are slipping further behind the curve on preparing grads to face the real world.

    Software development and project management are two key ingredients in a successful career today. Graduates must understand that in business there is always time vs money. All too often companies hand an impossible project to a newly minted grad expecting it to be done quickly AND cheaply.
    Good luck to you all.

  • JE

    As for whether computer science is an academic discipline vs vocational training…this is an ongoing argument. The reality is that companies are requiring degrees in computer science and cs grads are applying for these jobs. So the industry as a whole does not agree that CS is not vocational. A four year degree in computer science should teach students how to best use their skills in a range of environments be it within the confines of a university or within corporations.

  • http://blog.asurroca.com asurroca

    Funny, I’m taking a degree that teaches a lot of this stuff, but is not computer science. “Digital media” (which is basically a mix of art, business, and computers) usually focuses a lot on development process, business/client dealings, and a smattering of programming on the side.

  • David

    lmao

    read up on Asperger’s Syndrome… which, coincidentally has a large tendency to show up in tech’s, programmers, mathematicians, engineer’s, and so on. Number ONE characteristic, “difficulty in understanding interpersonal relationships”. They don’t teach #3 because to the norm’s it’s a no brainer. They don’t NEED it, they do it instinctively.

  • Greg

    @guy who actually has a cs degree

    Agreed! CS should not be a “career tips” degree! CS is an academic discipline, like math, history, art, politics or physics. Would you put a “professional networking” class in any of those disciplines? No. Specifics like “development processes” (scrum/waterfall) and “x technology stack” (Open Source, Microsoft, Web Frameworks) should be taught elsewhere. They change rapidly and experts in CS research are NOT going to be experts in these things. These courses are useful, but much better suited to business programs or professional conferences/seminars.

  • Cole

    Speaking as a holder of a CS degree from a four-year university: this is rubbish. These are things that people seeking CS degrees OUGHT to seek out in their own time, perhaps, but these do not belong in a proper CS curriculum. This should be a checklist for a VOCATIONAL degree. This goes right along with all the hand-wringing done over what schools teach with java and which teach with C++.. it simply does not matter. A proper degree does not necessarily teach you which tools to pick, it imparts the wisdom to pick the correct tools and go about learning how to use them yourself.

    Otherwise, your degree will be worthless in less than a decade’s time, do you understand?

  • keegan

    I completely disagree. A computer science degree is a degree in _computer science_, not programming. If you want to learn something more relevant to programming work, do Information Systems.

  • justin silverton

    “Congratulations …

    If open source actually mattered for people who work at Microsoft, well, perhaps they’d produce better products”

    and OSS is better? There are only a handful of OSS projects that are better than their proprietary counterparts (IE: mysql, php, and apache).

    I don’t think software politics should be integrated into any computer science program.

  • Nishant Kanitkar

    at my uni they seems to love linux quite a bit. there are several upper-level courses that make it mandatory to have a unix operating system.

  • lew

    Systems.

    I work in Silicon Valley, have been a consultant, worked in a lot of companies. I am currently working at an System-on-Chip company.

    A system, e.g. an SOC, is more than the sum of its parts. It has emergent properties that are not shared by any of its subsystems. It exhibits mathematical chaos effects, is very complex in algorithmic/computational complexity terms.

    An SOC requires a system to specify, design, simulate, manufacture, validate, produce the software, validate the software, … before it is released as a product. This requires interactions between all of the components of the company, a process developed and monitored by QA, …

    The corporation is a system, good corporations include customers and suppliers as part of that system.

    We live in the midst of huge systems, e.g. the economy, gov, that are far beyond human comprehension.

    Yet most CS people, nearly all EEs, MBAs, … never take a course that would acquaint them with a systems POV, don’t have a vocabulary to discuss anything they might observer in the real world. Biologists get the best understanding of systems, most have the vocabulary.

    “The Systems Bible”, Gleich’s “Chaos”, Harel’s “Computers, Ltd” and “Algorithmics”, Goldratt’s various books discussing “Theory of Constraints”, beginning with “The Goal”, if you are interested in all this.

    Lew

  • greg

    The first two are taught at the school I ‘attend’. It’s an online school called TUI. They teach test driven development in the first session of object oriented programming, but go on to ignore it from that point in the same class… sadly.

    JAVA and Eclipse are the tools, so at least they aren’t tied to evil empire.

    Agile is great provided that the customer contract is firmly set and that the developers determine the schedule. Having worked as a developer for 6 years now, nothing sucks more than having management fold to a customer whim and pulling long hours to meet a deadline change from 7 months down to 8 weeks or less.

  • http://www.ursino.info Mark

    Regarding #3 — that’s why you need to go on internships/co-op during college. By the time you graduate, you have corporate experience so you know your preference — large company or small. You’ll also know how it works in the real world. I’ve learned more valuable “real-world” subjects and gained knowledge just by being at the bottom of the totem pole as an intern 3 times (18 months total) before even graduating (May ’09). If you have no field work experience before you graduate, you’re in for a surprise.

  • David Zhang

    Learning scrum, or the newest agile development philosophy, might benefit a developer for a short amount of time. It’ll be great impressing the boss when he or she realizes that new hire knows how existing processes work. However, I’m certain that will quickly wear off when the boss realizes that the new hire lacks core CS skills.

    By core CS skills, I mean data structures, discreet mathematics, compilers, algorithms, operating systems, networking, statistics, computability theory, programming languages, etc. These skills are timeless, whereas agile processes vary between company to company.

    Furthermore, I’m a big supporter of open source. I believe that open source is an overall good on the community. However, at the same time, I believe that it really shouldn’t matter if you use Microsoft’s products or a GPL’ed product. After all, are Microsoft’s linked list that much different from GPL’ed linked list? Software engineering is all about figuring out the right tool for the job and, despite screwups, Microsoft sometimes get things right.

    The point is … until a programmer understands that it doesn’t matter if its a Microsoft or Google product, he or she will never be a great programmer able to make the compromises needed to develop a working product. It’s akin to the old programming language debate: is C, C++, Java, C#, etc. better than any other language out there?

  • Xphile

    These three things should NOT be taught in a Computer Science Degree.

    They should be taught in a Software Engineering degree, which is not computer science. To be a good software engineer you should learn these three things, and go somewhere that teaches software engineering and not computer science. This would be like saying that CS should teach you how to install and configure a Windows server and put exchange on it…

  • fjpoblam

    The third is definitely the one I missed, but it is the one most difficult to persuade CS students to study, the one most difficult to convince them they’ll need. (oooh bleah, what a weenee class!)

    Yet here I am e.g. with a $$$-minded upper management client, trying to convince her how appropriate it might be to make web pages cross-browser compatible OR accessible to the disabled OR EVEN standards compliant, and she says, whip the website out in two weeks with a flash home page and a click to the inside rest of it, and we’ll talk about the rest, later…

  • Rhawk187

    Some schools do better jobs at separating SE from CS than others. I think part of it might be because the accreditation boards have no idea what the difference is. I can’t stand SE, hence why I’m a Ph.D. candidate in CS.

    Schools need to realize if people want to become code monkeys then put them in the SE program.

    If they actually want to learn about quantum algorithms, or Delay Tolerant Networking, or making IPv6 work, or GPU vs. CPU technologies, then put them in the CS program.

    Sure the first year, or two, they may take the same classes, but that is what cross-listing is for.

    CS is for the smart people that want to actually improve the world. SE, IT, and MIS are for people that want to become cogs in the machine.

  • Pingback: SearchRoads » batman cover art gallery 3 Things They Should Teach In A Computer Science Degree

  • noo1776

    http://raikes.unl.edu

    The namesake of Jeffrey S. Raikes is a school dedicated to teaching CS and Business concepts integrated for real world practicality. Raikes is one of the VP’s of Microsoft- the one in charge of MS Business and is the new President of the Gates Foundation.

  • FooBar

    Most of what you outline is what should be taught in a Software Engineering degree/curriculum. That stuff is obviously practical but not really relevant to the field of “Computer Science” from an academics standpoint.

    # 3 seems a little contrived, because that is just a general skill that everyone needs to have and not something that should be specific to a CS curriculum. You can’t really expect universities to spoon feed you people skills.

    Open source/Agile/XP development has little to do with the “science” of CS … it’s a skill that most people can pickup on their own.

    Of course not everyone wants to go into CS for the theory and some people really are more interested in the engineering side of it (CS truly is one of those fields which crosses the border between practical and theoretical)… So I think you make somewhat valid points. I think the way we do it at Stanford is best:
    Focus on the theory (Require it) … but offer students the ability to take practical electives (Programming in Cocoa/Developing for Windows/Software Engineering Principles etc..)

  • http://www.stationripper.com Greg

    The degree I got taught the last 2. It was a CIS degree (Computer Info Systems). Which teaches both computers AND business.

    So if you want a a degreee that’s pure science, very good if you just want to learn or to maybe teach at some point (or go into the real world and have to learn a bunch of other stuff), get a CS degree. Otherwise get something like a CIS degree, that teachs both the computer stuff and the business stuff… and might end up teaching you something useful for the real world :)

  • Mike

    Learned all that and more getting and computer engineering degree!

  • Chuck

    I went to work for Ross Perot’s EDS back in the late 60′s. When I got the job, I thought I had entered heaven. Two and a half years later I quit in absolute disgust after having been repeatedly denied the opportunity to get into an area where they needed people with my experience and abilities. Corporate politics was the entire problem. There were some ‘little Caesars’ above me who were not about to let me get by them. I never fell into the delusion of working hard for a company to get ahead again. The only good thing that came out of the experience was that I was able to learn this hard ‘company realities’ lesson in my first good job.

  • Fifi

    I always thought I’d come out of uni with a soft degree, not technical enough (Bachelor of IT at Swinburne) but we actually did two of those three things – studied software processes, and did the artsy social interpersonal organisation behaviour subjects that I so hated at the time! Maybe it wasn’t such bad thing after all.

  • Ankur Patwa

    If I had to single out 1 most important thing I was not taught in school; I’d pick writing legible code. Nobody teaches how to write code for others. Only the results mattered. And the coursework lasted only 50 hours. So, we didn’t had to look back on shitty code. Now; as a professional coder; it matters a lot.

  • Joe

    The discipline is called Computer Science not Software Engineering. If people want to learn Software Engineering, they should petition to have a new major created for that purpose.

    Computer Science is and should be a science. I prefer if they left the engineering parts out. People argue that it would become a useless degree. Well, if you’re worried about that, then go into CIS or something.

  • http://www.ralree.com Hank

    Also, Scripting ability – any scripting language would do. Many schools focus on compiled languages only (Java, C++) and not enough on quick perl hacks or the like.

  • redsoxsfan

    How about Multi-tasking operating systems – obviously no one at Microsoft has ever heard of the concept

  • Paul

    The 3rd point is the most relevant for me … too often my developers just become cubicle shut-ins, genuinely believing that their work should extend no further than coding and kicking up the most amazing stink if asked to participate in anything else.

  • Will

    This is why I’m currently studying to get a double major in CIS and Business (Marketing specialized because it forces you to interact with great numbers of people). I’m only a Freshman, but I did get my CCNA, and the new CCNET last year. I think that I’ll be alright.

  • http://asarazan.wordpress.com Aaron Sarazan

    Design Patterns.

    They really didn’t tackle effective design patterns at all, and left you writing shitty code with bad style. Honestly– just a semester of best practice would go a really long way.

    After that’s done, teach me all the Scheme and data-structures in the world.

  • http://www.cosp.org Shoaibi

    Agreed!

  • Andy

    Well those are some interesting points, but as quite a few other people pointed out, those points are totally wrong for a CS major. #1 is only beneficial if you intend to be involved in open source development, and if you do, then let us ask why you are not already trying to be involved? If you understand what IF/ELSE,WHILE,FOR do, then I think you have a pretty good understanding to learn ways of putting those things together. #2 is a subject that Software Engineering needs (and does at my school) to study. It is more of a management goal, and study in making chaos manageable. #3 is not something either a CS or SWE program needs to take into account. I think developing skills to interact with other people is something that needs to be practiced, and not taught in a classroom. Couldn’t interpersonal skills be better developed by walking across your campus and starting up a conversation with someone while you’re doing it?

  • http://www.skorks.com Alan Skorkin

    The feedback to this post has been absolutely great. There are a few things that I am getting from the comments, and I am quickly going to address some of them.

    Firstly there are a number of people who agree with some or all of my points :) which is great and I thank all those people.

    Secondly, there seems to be a big group of people who think that I am confusing CS and Software Engineering. While I see where you are coming from I disagree. There are 2 main career paths if you do a CS degree, either you go out into industry after you finish, in which case all of my points are valid since that is the point of view I was coming from (the vast majority of people I did CS with are working in industry right now).

    The other option is a career in academia, possibly doing some kind of CS research and maybe a few lectures. A couple of my family members have had careers in academia, and I will tell you that if you think knowledge of politics and relationships is not going to stand you in good stead, you have a big surprise ahead of you :). Academia is highly political in some ways even more so than industry. After all universities are a business too these days, the same rules apply.

    My point about agile processes also stands, it is all good and fine to apply rigorous scientific principles to your CS research, but unless you are not going to be writing any code, do you really think knowledge of things like refactoring and test driven development is not going to be helpful. A healthy dose of the agile “attitude” also would not go astray for some, like respecting individuals, there seems to be a bit of an elitist attitude from some pure CS minded people, towards people doing other disciplines (e.g. one of the comments had words along the lines of “if you want to be a code monkey then do Software Eng” etc).

    I would also like to point out that I never advocated not teaching things like, algorithms and data structures, my idea was that the 3 things I mentioned would be taught in addition to what is already taught in a CS degree. Science shouldn’t be “just about the science” because in “real” life things like people, money and many other factors play a role. It is in your best interests to know how to deal with these.

    To those who already go to a school that nicely covers my three points, you are very lucky people and I am sure that many of your peers envy you greatly :). However be vary of thinking that using Linux as your OS means you’ve had sufficient exposure to open source, because my first question to you would be, which open source project have you contributed code to?

    To those people who don’t know how open source can possibly be helpful and to those who want to set themselves apart from the crowd I have this to say. If you turn up to a job interview and tell them that you’re a committer to the Apache Maven project (or equivalent), you’ve will have put yourself head and shoulders above many of the people that company already employs let alone the other candidates going for the same role.

    And yes, I think design patterns and source control and most of the other things that were mentioned are all very worthwhile things to know :).

    Thanks everyone for reading the article and contributing your thoughts.

  • Pingback: 3 Things They Should Teach In A Computer Science Degree

  • Adam

    Another thing that desperately needs to be given attention in current CS degrees is how to properly write multi-threaded parallel applications. This doesn’t mean simply learning the “thread” keyword in Java or what a mutex is in your OS class. It involves learning to properly analyze and decompose an algorithm to utilize the multi-cored processors that are becoming the norm.

  • http://www.skorks.com Alan Skorkin

    Agreed, threading knowledge is a major weakness that is prevalent throughout the whole industry.

  • R

    That’s weird I learnt all of points at the Univeristy I attended. Maybe you just went to a “poor” University. :p

    We studied methadologies and actually practised them, including agile and waterfall approach (on a year long project).
    We also dealt with corporate details such as management and techniques with handling people in a working environment, all of this was part of an informations systems degree covering all the technical details i.e. programming.

    Just depends on your University I believe.

  • R

    I do agree that these points should be covered in all computeing degrees.

  • http://bugsnerror.blogspot.com ranjeet

    ya.. i m totally agreed..we CS engineers miss these thing and also the real life problems..we just keep on solving stupid algos for all 4 years..

  • C

    Someone went to the wrong school… That’s all taught in undergrad at Carleton University.

  • Richard N

    OK..I give up. I’ve read the entire thread and now I don’t have a clue as to how to define a CompSci from a SoftEng or HardEng or whatever. I’ve been coding and inventing and the whole bit for 20 years.
    So, give some feedback: You have a project that involves optimizing a quad-core processor to parallel processing a 3-D data matrix (this is called rendering). This will probably involve designing graphics chips. Which “degree” does what part of the project ???
    My take- The CS manages and plans, SE does all code and testing and HE does design of hardware then farms it out to be made.
    Any other ideas on this ??

    BTW, good article. I esp. think #2 is important. You just must know how all the little parts work, so to speak, and… why.

  • http://www.theviewfromoutsidemytinywindow.blogspot.com The Logistician

    I think that you are absolutely correct re Point No. 3, corporate politics and relationships. I went to engineering school first, and then to law school, and they could have probably taught us the same No. 3 course for both lawyers and computer software developers.

    I started college in 1969, and was engaged in computer programming as part of my udndergraduate degree. Writing programs seemed to make sense back then. Now, although programs are purportedly “user friendly” it is as if one has to hunt for the logic, especially with Microsoft programs.

  • Ijon

    “guy that actually has a CS degree”, I agree with you. And there is one thing to add to the list : Strong mathematics

    Most of the CS graduates don’t know Math well therefore it’s hardly say they are scientists.

    And as the name implies Computer Science is a science :)

    1 and 2 are all about practices. Practices and approaches all evolve and change. Therefore I’d better focus on theory…

    Finally, Building relationships and corporate politics is about experience. It’s a very relative thing that you can’t learn in a lesson…

  • The Curmudgeon

    These are important things to learn, but they are not remotely part of a Computer Science education. The last thing we need to do is further dilute CS. Finance majors don’t take relationship building courses! Business majors don’t take classes on ISO certification processes! And nobody gets credits for learning to play nicely with others. The problem is the entitlement mentality that many techies develop as a result of a lifetime of knowing more about a subject than most other people. But this is an area that individuals need to take responsibility for their own development, not expect to be spoon-fed skills that are expected of normal functioning members of society.

  • Aaron

    You seem to be massively confused in that you think computer science is about writing code that will satisfy industrial requirements. The point of university CS is not to get you a job. It’s a research area — the study of algorithms and problems. Naturally this impacts and is useful for programming jobs, but it’s not the point of the area.

  • Maheswaran Krishnan

    Good Article. Open Source and Agile definitely needs to be thought/practiced in universities.

  • Bob

    Four things I wish they taught in a physics PhD course:

    1) Typing and document editing
    2) Personal lifestyle develoment
    3) Business management
    4) Bicycle riding

    Now, they may not immediately seem to be a part of “science” any more than “open source” is somehow a part of computer science, but they’re things that scientists might benefit from therefore they “must” be taught.

    Three things I wish they taught to the people applying for the computer science course:

    1) The difference between “computer science” and “software engineering:
    2 The difference between “computer science” and “software engineering:
    3 The difference between “computer science” and “software engineering:

    Now, I realise that techincally that’s just one thing, but I thought it was so important that it was worth mentioning three times.

    Also, I can define the relevant different, for those not keeping up:

    A computer science degree is something that will allow you to teach courses and publish academic papers. Because noone told you this, you’ll be shocked when the real world isn’t like what you learned about and will end up developing your software engineering skills on the job, leaving the industry, or ending up on the DailyWTF and not understanding why your academic quality code is being laughed at.

    A software engineering degree will allow you to get a job in a company and apply all the things you were taught by the person who took the computer science route. But you’ll be lost if someone demands a formal proof that your software meets some abstract requirement.

  • k

    Automated testing automated testing automated testing. Requiring automated tests and grading based on their quality would have made life easier for the TAs, and it would have made me a better student.

  • http://firsttimemanager.blogspot.com Praveen

    Yep, very true, I am yet to figure out how to start a project on source forge :)

  • Lee Francis Wilhelmsen

    I graduated from my university over 10 years ago, but looking back now I wish that my university would have gone into the depths of the TCP/IP protocol stack and not just skimmed the top of it, focusing mostly on the principals behind the OCI model.
    Software licensing, trademarks and copyrights is also topics we just have discussed more.

    • http://www.skorks.com Alan Skorkin

      You’re right, depending on the kind of work you end up doing, those things could be really valuable.

  • http://assarconsulting.blogspot.com Nirav Assar

    Alan, this is a superb posting. I wish I had thought of posting something like this, as I have had the same opinion in the past.

    What is funny is the people in academics where I did my Master’s and Undergrad were brilliant and very hardworking, as well as open to learning new things. However, they were a bit out of touch with industry and innovation, especially when it came to Java, Agile and Open Source. I encountered this one professor during my short attempt at a doctorate that railed us and laughed when we proposed research based on effectiveness of TDD! He thought we were ludicrous to suggest testing before implementation is complete. Little did he know it was a widely accepted practice.

    Kudos on this article!

    • http://www.skorks.com Alan Skorkin

      What’s even more funny in my opinion is the fact that this is not the case in every institution, some universities are quire progressive and the professors are in touch with what is happening in the industry, and then there are cases like you describe :).

  • Pingback: On teaching software engineering « Schneide Blog

  • http://sychan131.wordpress.com Siewyin Chan

    Note: This comment also appears on my blog – http://sychan131.wordpress.com

    I couldn’t agree more with Skorkin’s point of view. I graduated with a B.I.T. degree majoring in Management. Thus I have been given exposure on some business courses like Accounting, Finance, Marketing, Business Communication, and so forth. Until today, however, I haven’t had the opportunity to apply these knowledge in workplace, yet (I’m a graduate student doing CS). The current degree which I’m pursuing emphasizes more on analytical thinking and technical skills. My Supervisor, of course, does hope that his students are equipped with soft skills. That’s why he also expects us to have daily discussion in the lab, mentoring juniors and joining weekly discussion between him and his project students.

    Back to the other 2 points. An Agile Process is totally new to me. What I could remember from a Software Engineering course taken during my undergraduate is the Waterfall and V model. Neither did my University taught me Open Source. My undergraduate final-year supervisor was (and is still) pro-Microsoft. For some reasons, he has strong disapproval of Linux as well as open source. My second and current supervisor who comes from a Unix background does not involved in open source development either. Keeping abreast with the latest industrial technologies, he tends to cling on well-established IT companies to exploit any advantages and pull their resources (e.g. people, hardware, training, etc) to our University. Even the entire culture in my Faculty isn’t toward open source. AFAIK, only one academic staff is pro-Linux, but he has been away on three-year sabbatical. Very few students I met implemented their projects on Linux. Thus, to encourage the students here to use Linux is difficult, not to mention open source development.

    Indeed, Skorkin’s post has triggered me to think about my future academic path and has raised awareness that open source projects are invaluable teaching materials too. Driving the students to open source projects is time-consuming, though. When I was once a part-time lecturer, I spent one third of the semester to allow my students to pick up basic Linux commands. Skorkin mentioned that using Linux isn’t enough. It seems that I’d need to involve myself in open source projects before being able to enlarge the sphere of influence.

  • http://nikhilkardale.wordpress.com Nikhil Kardale

    Good article. You make an excellent point about giving students an idea about the actual work culture in the offices and developing basic inter-personal skills.

    There is a lot more emphasis given on Open Source Development these days at the college/university level, with some people even organizing student competitions to develop an interest and liking in the field.

    Unfortunately the same cannot be said about topics related to Software Architecture / Software Project Management. Though the universities have compulsory modules related to these topics, they are mostly theoretical and on almost all occasions the lecturer never gives the actual low down on how the ideas are implemented – you talk about Agile but even something as basic as software design patterns. As a result the subject falls under the ‘boring’ category amongst the students and gets neglected.

    In the current climate though, I would love to see some more attention given to User Interface (UI) design and development, especially after the ‘less is more’ adage for UIs for softwares targeted towards mobile handsets and other portable devices.

    • http://www.skorks.com Alan Skorkin

      I agree, UI is becoming more of an area of focus. As far as lecturers giving the low down, the problem is, you would be lucky if your lecturer actually knew the low-down, it is hard to give it if you don’t have it :). Seriously, people find it difficult to keep up with recent trends as they get older/busier and many lecturers aren’t very involved with industry. It is an ongoing concern.

      • http://nikhilkardale.wordpress.com Nikhil Kardale

        That’s true. Its warrants a more of industry-university interaction maybe. A model where the professors do brief stints (lasting 2-3 months maybe) in the development industry in between teaching schedules and the industry guys too give their insights to students over weekend-only lectures.

  • Pingback: links for 2010-05-22 « Donghai Ma

  • Pingback: Joegle » links for 2010-05-23

  • Steven E.

    I was a computer science major but found that I became instantly sick of it because I already knew how to program. I dropped that major and signed up for…. drum roll pleeeease… Technical Writing. I know, I know, its way far away from the CS degree but let me tell you that it has served me very well. I am employed as a software engineer now for a large company and we use Ruby on Rails for pretty much everything, but still maintain Java and .NET apps as well. That’s all well and good but being one of the few people that can actually write decently has put me into areas of the company that I would never have been able to achieve before.

    It worked so well for me that I decided to go one further and get a masters in technical communications. It’s pretty interesting as I am focusing mostly on information architecture and web layout in terms of textual placement and content. It’s kind of the perfect amalgam since I still get my programming rocks off but am exposed to a different side of the field.

    Just my $.02.

    Best,
    Steven

  • Pingback: How to know computer science

  • Wakjob

    Agile is BS and is the cause of many project failures. You wouldn’t try to build a skyscraper whilst continually changing the blueprint, would you?

    • Will

      You are misinformed, agile is not about chaining requirements its about small iterations. Every company advertises agile when they don’t know what to call their process which more than likely handles requirement changes in mid development. I do think that the topics mentioned are important but I think they are already offered in other degrees namely CIS which is more business centric.

  • Pingback: 计算机科学专业应该传授的3件事 - 博客 - 伯乐在线

  • Shaun

    I second all three things.

    It’s funny I got a BA instead of a BS Computer Science degree. I took a bunch of interpersonal/small group communication courses instead of intro to physics 1 + 2.

    People gave me crap about it then and even when I first entered the industry (why don’t you have a BS like everybody else). I now make more money than the majority of my peers I attribute my ability to deal with peers as the reason why and not my technical knowledge. PS I have just as strong or stronger a knowledge of how to code compared to my peers as well but I think being able to effectively communicate is almost more valuable than the technical knowledge.

  • CorporateMan

    Number 3 is pretty much missing in CS, Engineering, etc..It was a brutal shock for me. It also would make a lot of sense to have a course on the art of influence and the art of sales.

  • Pingback: 计算机学科专业应该传授的3件事 | 『敏捷开发南京俱乐部』agileNanjing.org

  • Pingback: 计算机科学专业应该传授的3件事 | xiaos07 | x伯乐

  • Pingback: The land of marking | luminousmonkey

  • Pingback: 计算机科学专业应该传授的3件事 | z36ker