This may get me in an assload of trouble but I think it needs to be said. Following the announced restructuring of the University of Florida CS program and this classic quote about how Yale shouldn’t be in the business of teaching “trade skills” (meaning, applied software engineering), I’m going to argue that more (not all, but more) academic computer science programs should be shut down or reorganized. Here’s my rationale:
- Most undergraduates and professionals actually want to learn applied software engineering, not “computer science”. Most companies want to hire college graduates who know applied software engineering. But most university CS programs don’t actually teach applied software engineering. This isn’t to say that CS isn’t useful or valuable (even to someone who goes on to become an applied software engineer). But the majority of university CS programs are oriented to training undergraduates to become either systems programmers or academic computer scientists. I’m going to go out on a limb and say this isn’t what most 18-year-olds who enter undergraduate CS programs actually want to do. And I’m certain that the ratio of the demand for software engineers to systems programmers in industry is on the order of 100:1 (maybe even 1000:1).
- University undergraduates are not discriminating consumers of education. This has a lot to do with the “halo factor” of schools that are perceived to be elite. If you get into the University of Michigan (which has an elite CS program) and you spend forty hours coding in Java while you get your four-year degree, you’re probably feeling pretty good about yourself, at least until you get your first job interview after graduation and they realize you can’t actually code. But if you’re in a CS program that happens to be awful, there’s no way you’d know it as an 20-year-old undergrad. This means that consumers of the resource (which in an economy usually punish substandard products by taking their business elsewhere) are really a captive audience. This is one big reason why all universities are slow to adapt and reform in general.
- It should not be necessary for two universities located within commuting distance of each other to have the same academic department (this goes for any department, including English Literature as well as CS). To put this another way, wouldn’t it make more sense for UCLA and Cal State LA to have a single, combined computer science program that’s among the best in the country, instead of two mediocre computer science programs? (The city of Phoenix doesn’t have four major league baseball teams for the same reason.)
- Applied software engineering is a discipline that lends itself to being effectively taught online. There’s no reason to suffer through a mediocre or outdated CS program when lots of good online courses are available. If you’re looking to actually learn something (instead of just getting your ticket punched) you should be able to pick from whichever course best suits your learning objectives, even if that course isn’t available at your school.
- Most university computer courses simply aren’t that good if your goal is to get a job doing applied software engineering. This is because the Ph.Ds who are teaching in these programs generally got their degrees from five to ten years ago at a minimum, when the tools and tactics for software engineering were very different. The industry simply changes faster than academia. Most (not all, but most) universities just can’t keep up with this pace of change using the standard administrative playbook. This isn’t a criticism of the smart, hard-working folks who work in our CS departments; it’s a criticism of the way their departments are organized.
- University academic departments in general should have limited charters and should be reorganized frequently. (Again, not just CS departments, but all departments.) I spent nearly all of my undergraduate career working in academic administration, and I can say that academic departments exist mostly to protect resources (mostly money and people). They don’t really exist to serve students. One good example is cited in an awesome book on educational reform called Crisis on Campus by Columbia professor Mark Taylor: one of the most pressing problems that humanity has today is obtaining clean drinking water. Yet no university has a Department of Water. Why is this? Because campuses are an endless successions of zero-sum games: the formation of a new department necessarily means that resources must be taken away from existing departments, so existing departments viciously defend the status quo, even when that doesn’t align with reality. Computer science education has not been in alignment with reality in a long, long time.
I’m going to pre-empt the inevitable Hacker News countertrolling by responding in advance to the arguments that always come up when I talk about the way that software engineers are trained:
- You need to have a good basis in algorithms and higher math to be successful as a software engineer, and computer science provides that. That’s probably true for systems programmers. It’s not really true for the remaining 99% of software engineers, the vast majority of which will never do pointer arithmetic and shouldn’t really have to. (If you accept this argument, then you must also accept the notion that all plumbers must have the ability to smelt copper and forge their own pipes, because how could you possibly lay pipes effectively without having ever created one with your bare hands from elemental materials?) Otherwise, you’re just enforcing the priesthood of the technologist, which is not a good thing for the profession or for society.
- I’m a systems programmer and/or a CS major and your post makes me confused, sad, or angry. It’s great that you’re a systems programmer and/or a CS major; I value your service to humanity. But this isn’t really about you. This is more a criticism of university administration than the relative worth of systems programmers.
- Coders should learn by coding, not sitting in classrooms. I’m actually not a big fan of classrooms either, but this unfortunate argument is like an abused child who boasts about how a lifetime of beatings was responsible for their good manners and generally pleasant demeanor. The state of software engineering education today is terrible, so it’s no wonder that a lot of good coders are forced to become autodidacts. But learning it on your own isn’t the best or most efficient way to do it. Saying you learned how to code on your own isn’t an indictment of the discipline of teaching software engineering; it more likely indicates that the quality or quantity of software engineering instruction isn’t what it should be. Which leads us to…
- You have a dog in this hunt. Yes, of course. I’ve taken coding courses in CS departments at three different US colleges. I’ve taught coding at the university level as well. I started CodeLesson because I wanted to provide awesome, up-to-date instructor-led coding courses, since a lot of universities and businesses aren’t providing this today.

I was lucky enough to get some good advice about 15 years ago as I was entering the software engineering business – which was “don’t bother with college – it isn’t really going to help you learn how to code and become great at building software. Go figure out what you need to learn, and learn it. Buy books, get training, whatever you need – but a degree from today’s average CompSci program isn’t going to serve you that well.”
Jason, I got an English degree and I did OK but it took me approximately 10 years to get where I wanted to be professionally. It should have taken me 18 months, maximum. One of my biggest professional regrets is that I did not have access to the right learning resources at the right time. Undergraduate years would have been ideal, but a few years after would have worked well too. This feeling is one of the things that informed the creation of CodeLesson.
At certain points in my SE career I have had thoughts and feelings about wanting to “give back” like you’ve done with CodeLesson because I too came by a lot of my knowledge and skill as a developer by my own hard work, but also by a lot of guessing and asking others and reading their code. I am at the point now where I feel like I can pick up a new language/framework/technology within a week at the most but it wasn’t always that way. I should make it clear that my previous comment isn’t a knock on college or undergraduate programs. I think for certain careers a college degree and the process by which you obtain it is necessary. It’s just that I spent those years from age 18-22 on lots (literally hundreds) of books by Wrox, Microsoft Press, O’Reilly, etc. and got busy writing a lot of code, while my college-attending friends were sitting in “computer science” classes, reading theoretical and academic books on the “science” of computing. I can recall several times hearing them dreading busy work, pointless essays and due dates on projects that they had little interest in, for they couldn’t figure out how the work was helping them progress towards “building cool stuff”. After 4 or 5 years of us being on our respective paths, I was much further ahead of them in terms of understanding the things that will help you engineer software effectively. One of them graduated and couldn’t tell me the difference between HTML and XML (seriously!) let alone some of the finer points of OOP and design patterns. I feel that in teaching software engineering, “hands on” learning (writing code, architecting applications, etc) is *one* essential part of the process, and not that many CompSci programs require students to actually build much of anything during their pursuit of a degree – which does not serve them well when it comes time to turn that degree into a decent-paying job/career that is going to demand they build stuff.
By the way, to add my two cents to the whole “foundation in math” side-discussion going on – in high school I excelled in math despite hating it and was told all throughout high school by my teachers (especially the teachers in computer classes) that I was really going to have to have my math skills down if I wanted to make it as a programmer. Get this – the first time in my career that I ended up really needing to understand more-than-just-simple math was about 6 months ago when I was doing some math-heavy HTML 5 Canvas JavaScript programming. Up until then, I had never needed to know more than simple addition / subtraction / multiplication / division. The areas of knowledge that have been far more valuable to me as a developer than math, IMO, have been philosophy (for logic and critical thinking skills), communication (thorough discussions about details) , sociology (learning how to manage your co-workers and bosses without them knowing it) and english (yep, ENGLISH!) for being able to effectively express to others the things that are sometimes not easy to understand.
I agree with your premise that undergrad CS education needs to evolve.
But you are really undervaluing a strong foundation in math, data structures and algorithms.
Higher math really has nothing to do with pointer arithmetic, not even sure what you were trying to say there.
But stating that only systems programmers need a good basis in algorithms is so off the mark it really undermines the other points you make. Even if a programmer is only using (not implementing) things like collection/storage/memory frameworks, without understanding algorithm fundamentals they will tend to write very suboptimal code. You can still grind a modern computer to a halt by organizing your data naively or searching it using the wrong algorithms.
Without a background in algorithms and data structures you can fail to even see what is possible.
Frank, I’m not saying there’s no place for algorithms (and ultimately I couldn’t imagine an undergraduate curriculum that could possibly be devoid of them). But I am saying you can teach the basics and the theory alongside the applied stuff.
Agreed. I hate to break it to the academics, but 99% of undeegrad degrees are/should-be about getting a real job. Your journalism degree gets you a job at a newpaper. Your law degree gets you a job at a law firm. Your HR degree gets you a job in HR etc. If you want to study nothing but the priesthood of how to teach theory for its own sake, there’s a place for that: grad school, and the only job that need come out of it is becomming a professor. I see the trend of people with CS degrees becoming like people with English degrees – where the most successful people you meet with those degrees are the professors who have no real use except creating more professors.
My experience as a CS major was quite different, but it probably depends on the school. The curriculum provided at the highly rated CS program I attended from 2001 to 2005 was structured so that students could experience both worlds, with highly applied programming/algorithms courses taught by instructors with up-to-date knowledge in the first two years and more theoretical courses taught by professors in the latter two. Some courses did end up being less useful, (Formal Model of the Java VM or Computer Architecture for example), but it certainly broadened my view of the craft. Since I had no idea what I wanted to do back then, I can certainly appreciate the opportunity to be introduced to the entire spectrum instead of just a small subset.
Your experience sounds ideal. I think a lot of people are missing the nuance of my argument (they think I want to convert top-tier CS departments into the Truckmaster School of Coding, which is not what I wrote). You don’t have to lose out on the fundamental/theoretical aspects of CS education by adding more practical material.
“I see the trend of people with CS degrees becoming like people with English degrees – where the most successful people you meet with those degrees are the professors who have no real use except creating more professors.”
It doesn’t seem to be heading that way at all, to me. I go to an engineering school that has programs that are considered to be top in the world. However, the computer science program still ends up with the highest rate of students with a job after graduation (and the highest average starting salary!) Based on friends and other classmates that I keep in touch with, most students feel well-prepared when they start work and employers definitely look to recruit.
We have a mixture of both classes that are heavy in theory and some that are more practical – which might help.
I feel like my school is similar to your school, only not quite as highly rated. However we have top programs, and ‘good’ CS program. However, as you progress you will learn that the ‘theory’ classes, while they do contain useful tidbits here and there, are not a valuable way to spend your time if you are trying to learn to code.
I recently took ‘Automata’, hoping to learn more about regular expressions and language grammars. Sadly the theory hardly corresponds to reality on those topics, and while I was supposed to be writing proofs of the pumping lemma and drawing finite-state machines, I instead learned Bison and wrote my own language.
My advice: if you get to a point where you are doing A LOT of theory, learn something useful instead!!!
Silliest idea I’ve ever heard. I got a bachelor’s in CS in India (here’s a hint about Indian colleges; if it’s not an IIT, the quality of teaching is poor). I got my Master’s in the US and even though I’m a web programmer, I wish I’d learned my core CS skills at a better school. Even a non-systems programmer needs to know how to make decisions and the consequences of those decisions: what web server/environment/framework to use (if it’s compute-heavy, Node.js is a bad choice), how to configure your Apache server (threads? processes? event-hybrid? I don’t even know what these things are, but they matter, and you need to know CS well to understand them).
N00bs who lack CS knowledge but can spit out code, can make stupid decisions that are easy to code (like writing to disk or making network calls in a loop, using inefficient or inappropriate algorithms). If you’re approaching programming as an engineering discipline, it’s essential to know the building blocks and medium you work with. Find me one civil engineer or architect that isn’t required to know what concrete is made of, or hasn’t taken courses in mechanics. Or a chemical engineer that doesn’t know basic atomic chemistry, or a mechanical engineer who learns nothing about materials and metallurgy.
If students graduating from colleges in the US have poor engineering skills, these are remediable by making software engineering courses mandatory (and having more of them). But not at the cost of neglecting the fundamentals. Engineering skills can always be learned on the job, given the right foundation.
Jayraj, it sounds like you think coding should be a priesthood. I can’t agree.
If you don’t know what threads and processes are, you’re making your school look very poor indeed.
None of the things you mentioned have anything to do with the ivory-tower teachines that jeffrey is saying are not needed. They’re all very much on the applied side.
“how to configure your Apache server (threads? processes? event-hybrid? I don’t even know what these things are, but they matter, and you need to know CS well to understand them).”
Computer Science doesn’t cover anything nearly as applied as configuring Apache.
We need a balance, in the US the Computer Science departments are filled with mathematicians.
I definitely agree with Jayraj. Probably, as Brandom suggests, it is a problem of content in US Computer Science departments, but it does not mean that all CS degrees are useless in practice – it’s only neccessary to reorganize them. In Spain the bachelor lasts 5 years, so we have more time to improve practical skills. For example, we can study foundations of AI, and design a game that use these algorithms.
On the other hand, I agree that programming is not exclusive to CS graduates. Everybody can write code which a computer executes, but that’s not what they taugh us at the university – we’re supposed to apply this theorical knowledge in real problems. Quoting to Jeff Atwood, “It assumes that coding is the goal. Software developers tend to be software addicts who think their job is to write code. But it’s not. Their job is to solve problems.”
Yet if you can’t code, you can’t actually solve problems.
A five-year program with a year or two of practical instruction sounds like it would be terrific. The thing is, software engineers should necessarily be lifetime learners; if they aren’t continuing to learn after their years in college they’re doing it wrong.
My problem with your post is that it seems to advocate University CS programs become focused on teaching trade skills that you yourself said have a shelf life of about 5 years.
That’s the kind of thing I’d expect of a 3-year College program maybe, but there is a place for proper CS programs, and it’s not about competing with the DeVry’s of the world.
I would argue we need all of our existing CS programs graduating competent students *and* more software development trade school graduates.
Christopher, I never said that. The point is that they can teach practical alongside the theoretical. Python in year 1, Theory of Computation in year 3.
Biology departments also teach things that were discovered in the last decade. Just because it changes fast or because it’s hard doesn’t mean it’s not worth doing.
There isn’t much point focusing on practical skills in year 1, as you pointed out, the skills would be out of date by the time graduates joined the work force.
Honestly though, any *good* CS program I’ve seen does teach practical alongside the theoretical. However, if you want to skip the theoretical altogether and get on to the job market quickly with some practical skills, you ought to shun any institution that needs four years to get that understanding across.
Python was just an example but it came out in 1991 and my sense is that its rate of adoption is accelerating. An undergrad who learns it today can certainly get a job with it in 2-4 years
In 1991 though you’d have not chosen Python as the language to teach your students. You wouldn’t have even chosen Java. If they were lucky you’d have gone with Smalltalk, but C++ had a very good shot.
The point is, it doesn’t take terribly long to teach the trade skills you are referring to, and that is a good thing, because their value isn’t terribly long either. That kind of education isn’t what Universities should be focused on, and there is indeed plenty of demand for people with the expertise Universities *should* be teaching.
Reasonable question though: should we really be getting all these people whose careers are built around vocational skills with short half-lives, or should we perhaps provide these skills to enhance existing careers.
A big part of the problem is that the pace of innovation in the profession has accelerated since the 90s and professional education has not kept pace
I think you’re missing the point that Christopher (who disturbingly seems to share my name) is making. Namely, a university education needs to be something that will be relevant in 40 years time, because that’s when most of today’s university-educated students will be retiring. When a big point in your criticism of universities teaching software engineering is that the teachers are five to ten years out of date, it’s clear that you’re asking for something that’s just not a very good fit for university education.
If your point is that programmers should not get their education at a university, then for some of them I could agree with you. We definitely need more of a skills-based trade school side to software development, and we need more of a cross-disciplinary training approach for people whose core skills are in something besides programming, but do some cobbling together of libraries.
The problem is when you identify a kind of training you wish you’d had, and then decide that universities should go turn themselves into that.
I will probably be dead in 40 years time. Anyway, who says they can’t provide education that’s relevant both today and in decades hence? Virtually every other technical discipline seems to be able to do that.
I’m going on the assumption that they want to teach at least SOME practical programming along-side the mountains of proof-writing.
The practical stuff should at least be current. You can’t just give up on teaching something because it will be obsolete in 5 years. These are computers! It’s going to change quickly, CS departments need to adjust to it.
Plenty of universities have “Departments of Water”, it’s just called Civil Engineering or Environmental Engineering.
The core of Mark Taylor’s point is that the civil engineering and environmental engineering disciplines tend to be focused rather monolithically; the point was that if we have academic departments with limited charters (the Department of Water being only one possible example), the territorialism can go away and there’s more opportunity for interdisciplinary research and teaching.
“Yet no university has a Department of Water.”
Stopped reading there.
It’s called the School of Freshwater Sciences: Great Lakes Water Institute: http://www.glwi.uwm.edu/
If you can’t fact check your basic assertions why should I trust the rest of your argument based on false facts?
You might want to consider actually looking at Mark Taylor’s book since this is not what he was talking about; at any rate it’s just an example to illustrate a larger point which you seem to have missed
I second Frank G’s comments – algorithms and data structures have theory attached to them that is not all that easy to self-teach, yet is vital to not screwing up the performance of your code.
And your first point about companies wanting to hire applications programmers is true, but irrelevant – most companies want to hire someone who fits their needs exactly, needs no additional training, and works long hours for little money, because most companies don’t want to invest in their staff.
Really it is not that hard to self-teach. Understanding the concept of Big-O is probably the hardest part in it all and that’s not that hard. Beyond that there’s a handful of special cases, such as sorting algorithms that hit their worst case when things are almost sorted, or something like that.
I also think that you’re missing the fact that this discussion is mostly limited to very high-level programming that makes up 90% of actual code written. We (unfortunately) don’t have a great deal of choice on our data structures. By and large we get a hash table. Our arrays and even objects are often implemented in terms of hash tables.
Which is fine and dandy if you’re just implementing the next clone of popular website X; but if you’re interested in hacking out the guts of the next revolutionary system (such as node.js and zeromq, or mongoDB) you’re going to need a better understanding of those concepts, and much more besides. Want to work in gaming? Better work on your lin alg. Is it impossible for non-university folks to pick up and learn those things? Not at all. University students have a leg up, however, as they’ve gone through all of this in a (hopefully) structured environment.
Obviously; I never said there was no place for those skills. But the ratio of developers to game developers is huge
The point is that a geeat many of the self-taught never even know they need to know about Big-O concepts – that’s the real benefit of an academic base, you are exposed to concepts that are not obvious, but necessary
I agree that there are non-obvious concepts that a good programmer needs to be exposed to in order to be effective. This is especially true when it comes to security. Self-taught and inexperienced programmers open up their programs to numerous vulnerabilities and security holes just because they don’t know that their methods are insecure.
It is the place of Universities to be Universities – communities of teachers and scholars. The fact that we have decided to make them into training grounds for “jobs” and “careers” is the fallacy here. We already know that people will have multiple careers, let alone jobs in their lifetimes now. We should prepare them for life, not the straitjacket of a “career”.
All else stems from that.
The financial mess of student loans and subsidy of the for-profit schools, the Peter Thiel nonsense, and all the various manufactured “crises” about STEM and competitiveness.
I attended a college which is over 660 years old at a university over 800 years old. Computers have only been around a fraction of that time. Universities work best when people study what they love, learn how to learn, learn basic skills like communication, analytic thought and about the world.
If you want people to get the most out of University, grow them up to be curious and have a nurturing school environment. They will go on to University or not, and they will go on after that to whatever, giving us Nobel Prizes, PayPal and hotornot.com.
When people ask me the most important language to learn for programming computers, I tell them it’s English. Communication is the #1 skill for all software development which sees the light of day.
Cade, The notion that a university shouldn’t be a “universe” of knowledge was not what I was implying. You can learn Pascal and Chaucer in the same year; I certainly did.
But Universities are there for the sake of the knowledge, not the sake of the marketplace. If people want to learn software development, why would they take a Computer Science major course? Is is not clear what the curriculum is about?
IIRC, computer science is the science of computation – a lot of discrete mathematics, complexity, numerical methods, and algorithms. Eventually getting into things like parallelism, compiler design etc. Whereas the majority of software development typically only uses small amounts of that and large amounts of learning problem domains, documenting, communicating with teams, analyzing system behavior – a lot of engineering, planning and programming using what IEEE/ACM call the SWEBOK (software engineering body of knowledge). And who knows just what kind of programming you might be interested in until you’ve been exposed to it anyway?
I don’t think a standard undergraduate degree in computer science is what people who already know that they want to be programmers (or software developers) should be looking for.
So why does “Computer Science” and the departments thereof need to be reformed? If other offerings can compete, let them compete. You seem to be implying that there is not a level playing field within the University for more courses to come in because of a self-preservationist attitude in the institution. And that’s probably true from a short term perspective, but they do change, just at a very slow pace. But incentive for that comes from less people wanting to take Computer Science because they realize it’s not what they want to be taking (for whatever reason).
You need to give people those reasons – whether it’s better education about what they will and will not get out of Computer Science courses or showing employers they shouldn’t be requiring Computer Science degrees.
You had me until the math part. A good software designer need to not only know that sha256 works, she needs to know WHY it works.
Otherwise we have what keeps me busy: a bunch of slackjawed deer in the headlights types that stare quietly when complexity arrives.
If you want to be a great programmer, take physics, and be bad at it.
I don’t know how sha256 works even though I’ve used it in apps I’ve written. Why would I need to know how it works? There are people who specialize in that stuff.
” Why would I need to know how it works? There are people who specialize in that stuff.” I think that’s a fairly unprofessional way to think – and I mean no disrespect – because it then makes you very dependent on other people’s understanding and expertise. I think practical and applied CS really tries to make sure you needn’t take that managerial approach. Besides, SHA256 is a pretty awesome algorithm!
Let’s use an analogy from another field: do you think every psychiatrist should necessarily know how to perform brain surgery?
No, but that is why psychiatrists aren’t allowed to perform brain surgery. You just said that you have used SHA even though you don’t know how it works.
Let’s go one further: do they think one must understand quantum entanglement to trust the stool they’re sitting on?
I think that’s a misleading analogy. That would be more analogous to the computer scientist needing to know how the hardware works down to the register level. Which.. actually, can help in optimization.
At any rate, I think it would be more appropriate to ask if a psychiatrist at least understands the core theories of mind and cognition, in order to better understand the mechanisms that underlay their treatments. In that way, they are better able to tailor their treatments to specific situations instead of applying the same blunt treatment to everything because they don’t understand better.
If you don’t understanding security, let people who specialize in “that stuff” put it in.
They already did – the sha library was written by a crypto specialist who I’m sure has years of CS training from a top notch school. Then he packaged it as a library so that mortals could use it.
The majority of the security problems we face are from people who slap together a bunch of functions from libraries. Understanding SHA256 or hashing algorithms, their weaknesses and purpose is essential to having real security. To understand them you’ll have to figure out how they work.
What part of my post stated that people shouldn’t learn about how libraries work?
You can’t possibly be implying that every programmer must be capable of cobbling together cryptography libraries from scratch. That’s the “plumbers must be capable of mining and smelting copper or they’re not really plumbers” argument.
I’m saying it’s critical to understand the theory of security algorithms. You can’t just hand someone a library and show them how to use it. Without the understanding that comes from the theory, you will implement significant security holes.
Does that mean you have to understand SHA256 to use it? No. But you need to understand the theory.
The plumber analogy doesn’t really work either. Being a plumber doesn’t mean creating something completely new every time, rather it’s just maintenance; knowing how to patch what’s broken. To create a plumbing system for a house or a large building, there is a lot you’re going to have to know about your materials and physics to make sure your water gets from one space to another.
“a bunch of slackjawed deer in the headlights types that stare quietly when complexity arrives” ROFLMAO.
OP – the vast majority of programmers do indeed get by without knowing much math or algorithms or whatever. “getting by” is what they do. Doing plumbing is what they do. And often, plumbing is all that is needed.
However, getting by, connecting standardised components together, has its limits, and we do need people who can advance the state of the art. We do need computer scientists, people who can create the components, and we do need people who can understand the components and how they work.
A case in point: the hashtable. I have interviewed hundreds of people, and I always ask a simple question – “in broad strokes, how does a hashtable work”. Most people have no idea, even though this is a components everyone knows how to use. But, I have also struck people who have been using hashtables incorrectly “table[key1.gethashcode()^key2.gethashcode()] = value”. This kind of error is only possible from people who have no comprehension of how a hashtable works. This is like a plumber not knowing how a valve or a pump works.
Damian, this is not a algorithms versus high-level programming discussion; I stated as much in my post because I knew people would see that and get confused. You’ll want to re-read the bit where I say “this isn’t to say that CS isn’t useful or valuable”. There is no reason why you can’t learn Python in your first semester of a CS program and not go on to implement B-trees in year 3. I am saying that the balance is way too far in favor of theory and basics that nobody will use in practice, and that it wouldn’t kill academic CS departments to teach stuff that is less than 20 years old.
Using bullet points doesn’t magically turn opinions into facts. You could’ve tried harder and actually looked for relevant references as well.
Anon, this is all opinion. Maybe a few more courses in the English department for you would have make that clearer.
Anon probably has taken many many English courses as evidenced by the fact that they’re complaining and not actually creating any value of their own.
Jeffrey, your points are dead on. I recently left a failing CS program at a public university. I was 4 years into college, 2 years of which I had been studying CS. I’m now 22 years old, almost a year since I dropped out, and I am successfully running my own web development business (Drupal) – ZERO thanks to ANY of the education I learned in school.
Even if the curriculum had been practical, the quality of instruction was very, very low. Although my professors were good people, they were too busy with administrative tasks to prepare lessons, answer questions outside of class, or really provide ANY help with code whatsoever. What ended up happening is I would partner up with one of the students who actually know how to program, and basically beg them for help any time I could. Those hours were the only time I ever learned anything about actually programming. Ironically, these were also the kids who were doing the poorest in their general education and math classes, and really have dismal hopes for ever graduating. It is really sad to see the whole situation.
The main point to be stressed is that real world software development is a different discipline than CS. If you are interested in pursuing academic level CS research – or are interested in a math heavy science like physics or economics – then a CS degree is appropriate. But, you need to plan to continue through a graduate level.
In fact, that was the only reason I stuck it out through my second year. I was planning to pursue graduate level education and go into research in graph theory and network analysis. As appealing as a research career is to me – I REALLY wanted it – the Federal government took away my need based scholarships and I was forced to drop out.
I have no plans on returning, and am actually THANKFUL that I was forced out so early. The only drawback is that I do not have as much time to self educate, since I am working constantly to make the damned student loan payments every month. It’s really really frustrating, but things are getting easier as my rates continue to rise.
The failure is happening on so many levels that the entire structure of all university programs is going to be reworked out of necessity. Technical programs face different challenges than the arts, but everybody is facing some serious shit right now.
I want to specifically address the issue of learning the fundamentals of CS. My experience is that the courses were drawn out needlessly, and that all of my assignments were essentially meaningless. Sure, I learned what a stack is and coded one up by hand, but I can learn what a stack is in about 5 minutes from a book. No client cares if I ever coded up a stack, and if I needed to for some reason, I would pull it out of a pre-existing library. But, learning about vectors, stacks, and linked lists took an ENTIRE SEMESTER, and hundreds of dollars of tuition money. Seriously?
Now, when it comes to research level problems, things are very nuanced. No generalized curriculum can bring a student up to par efficiently. Rather, it is ALWAYS up to the student to study ON THEIR OWN to learn about truly advanced topics. All the while, they are distracted by NONSENSE assignments like coding up stacks and integrating equations by hand. Literally every day while I was in school, I was forced to put down my actual research project and work on something completely irrelevant to my interests and natural inclinations. WHAT A WASTE OF MY TIME.
I will not be surprised if projects like CodeLesson will be replacing CS degrees over the next few years.
1. competition isn’t a bad thing. maybe there’s nothing wrong if two or more schools in the city teach the same course. infact allowing students to share credits from different schools might be cost effective. (example situations: i find it difficult to follow course X taught by this professor, or it clashes with another course schedule, or i work a paid job during that time. let me take the same course from the other university in town or an online course and then transfer the credit for graduation).
2. my grad school required me to take two core courses each from systems, theory and applications. and 4 other courses based on student interest. i took software engineering and a scripting course. i don’t complain about the coursework now, even though i’m not as good a software engineer as i would like to be.
3. having said the above, i feel merging computer science, computer engineering, electrical and electronic departments is not such a bad idea for smaller universities.
The notion of competition is a good one, unfortunately universities make it painful to transfer credits from one campus to another. They act like monopolists in this regard.
I started out building crystal sets in my grandmother’s basement. I went to experiment with germanium diodes instead of Galena lead crystals.
I am happy that I started out building crystal sets using galena lead because now I have a firm understanding of the principles of scratching into the crystalline lattice structure in order to make a good electrical contact.
I got out of college a year ago from a west coast public school. To put it bluntly this is how I viewed computer majors. (I am biased so take it as you wish)
Computer Engineering: Able to do everything a computer scientist and software engineer can do, and more since they have a strong background in software, hardware and complete systems development.
Computer science: If computer engineering is too hard, go here, you might be able to get a job, but you’ll never really understand how computers work, which stop you from ENGINEERING good software. (Or good systems, if that’s your thing)
Software engineer: Easy Peezy… Not much to say. Can hardly code, knows nothing about computer architecture or how the words they type on the screen really work. They claim that they know how to organize software, but so does everyone else. Last to get hired, first to get fired, everything they can do, the two previous majors can also do, but better.
Keep in mind, this has nothing to do with people out there in the work force with experience, this is the value of the degrees when you come out from school. If you can do someone else’s job better or more effectively, then you will probably get a job.
If you are in a SE program, you better be hitting the books outside of class, because there is a lot to understanding programming, algorithms, data structures and so on that has nothing to do with software. Knowing processor architectures and knowing how to build a computer will allow you to write more effective code, and come up with more intricate solutions for your problems.
I’ve worked at tech companies large and small and I can guarantee you that the first to get fired has next to nothing to do with where the coder went to school or what their major even was. Nobody pays attention to that after you’ve been out of school a few years, seriously
Sounds like your CE department wasn’t very good. True CE departments don’t teach software, that’s for the poor ones. It’s like the poor CS departments that teach SE. In good schools, CE / CS / SE are neatly siloed, with each of them being very deep, but also very narrow.
This is very true. And Like I said, my comment did not apply to anyone in the work force with experience, it applied for students graduating with those degrees. I had friends in all the majors mentioned above (as well as being in one) and a year after college I can safely say that what I stated above is true (anecdotally). It was and still is, much harder for the software engineers to find jobs. They have a harder time solving the programming riddle tests that companies like to give. Not only that, but they often take longer to get up to speed on a company’s code base since they have not worked much on complete system implementation.
I was also not saying that the degree determines your odds of getting an interview, but once you have that interview, I have found that SE and CS students tend to be lacking in the department of problem solving. At my school, Computer engineering was required to take at least 5 quarters or math classes. CS and SE students didn’t need more than 2. Computer engineering had to take 4 physics, 1 chem, 1 biology, 2 Mechanical and 1 statistics class. These were considered support classes outside of the required core curriculum. SE and CS needed 2 quarters of any science. So unless and SE or CS major really wanted to step up their game, they became sub par at all levels, especially since digital and embedded systems development was not in their curriculum. All they could do was high level languages (which computer engineering is also required to do), and even then they did not understand how simple things like stacks and the heap work. It’s very difficult to be a good programmer/coder if you have no understanding of the undercarriage of your platform. I’m not saying it’s impossible, just that it’s really difficult.
I apologize, this was meant as a reply to Jeffrey’s reply of my original comment.
You’re extrapolating from one crappy program to the world of software developers. The (possibly crappy) program that I’m most familiar with required everybody to take two physics, two chemistry, three calculus, etc. whether they were EE’s or CE’s or in CS. And there seemed to be plenty of demand for the CS folks.
My own similar extrapolation (despite plenty of wonderful examples to the contrary over 20 years in industry as a systems programmer) is that the hardware-oriented folks could write code, but not good code that other professionals could read and modify.
The chief problem with software development is that it’s too easy: you choose a problem, code up a solution, and then pat yourself on the back that it works. Anybody who’s half-decent at it thinks they’re a genius within a few weeks of learning to program.
“Why spend four years learning CS when I taught myself to program in six weeks?” “Why bother with Med School when I managed to put on my own band-aid?”
I’m gonna get tired of repeating this, but I never proposed that CS should not be taught at all. I’m interested in reforming tech education, not destroying it.
I hate to be mean, but if you’d explained yourself clearly in the original post, you wouldn’t have to spend so much time in the comments thread correcting folks’ misimpressions.
I went back and looked over the original post, and it really is a mess. And not a hot mess.
Sorry this can’t be expressed in 140 characters. That is why I have a blog.
The real problem is that people bring a *lot* of baggage to this discussion and as a result they project on it what they want to see (particularly when they read 200 comments on Reddit first, then click through to actually read the post). The tipoff is the point where I repeatedly state in the post that academic CS and systems programming is valuable and necessary, and then people respond by asking me why I don’t understand or value academic CS or systems programming. I’m not sure how I could state it any more clearly.
If there’s something in particular that’s unclear, let me know, I’m happy to clarify. But it’s very clear to me that a lot of people are skimming the piece, projecting their own biases, and getting it wrong.
I agree with the need for reform, which was the point i was trying to make when comparing the level of education associated with different majors in college. CS to me has become lazy. My mother (Undergrad and masters in CS) would tell me stories of the kind of work and classes they had to do/take, and it always seemed difficult. Now-a-days the CS/SE programs don’t seem to teach problem solving, but repetition and focus more on knowing a language than understanding why certain methods are employed when trying to resolve and issue. It’s become a case of, “do it this way, because it’s right.”
And I don’t think you did not make yourself clear in the original post, I was just giving you my view since I was in school not long ago.
Please keep in mind, this is for the US only.
I live in Switzerland and our education system is different and i guess other countries also have a different system.
After the 9 year elementary school (mandatory) you can go two ways:
- either go to high school (which has a few tracks you can choose but more like math, languages, physics/bio, …), i think 4years
- apply for an apprenticeship which takes 3-4 years, usually you work 3 days and go to school 2 days, you can also do upper vocational school during this time. You need to do a final exam in both.
So if you went to high school, you can go to any university where you can study CS. But if you made the apprenticeship with the upper vocational school, you can go to the advanced technical college where you study applied science (takes 3 years), where you get a bachelor in applied science. You can only do the advanced technical college if you already have work experience in that field you like to study.
Furthermore, in the university you have to hand in solutions to the exercises every week, if you don’t hand in, you’re not allowed to take the exam. For example, the Algorithm & Datastructure course: every week you have a problem with the recently discussed datastructure/algorithm and you have to solve it in C++/Java/Eiffel.
In the masters course, you have to take 2 out of 3 courses which are heavily based on a programming project. One of these is Algorithm Laboratory where you have to solve 3 or 4 problems with an efficient solution (correct datastructure and algorithm). This is verified with a server, which runs the application, checks it correctness and runtime.
I don’t see why any of our university should change or shut down their CS department. You definitely can program if you’ve done the bachelor in CS
Without the ability to shut down or reorganize an academic department there is very little motivation to improve curriculum, particularly in a world where tenured profs prioritize research over teaching. This is why many American CS programs only teach Java and why Yale dismisses the most important social and technical innovation of our generation as “trade skills”
I agree fully with your observations. I did my undergraduate studies from a well ranked engineering school in India, but the quality of the department really did not reflect well on the ranking. There is no course I took during those four years which has influenced my skills as a developer today, which I strongly attribute to my involvement with open source projects and the time I’ve spent online reading about other work.
I fall within the systems-programmer-in-academia category, and good software engineering practices in this area are truly lacking. I try my best to follow good testing practices (because really, I want some degree of confidence in the systems I write, and the last thing I want is to publish buggy results), and I spend a lot of time trying to learn how to design large systems, making sure the system is well testable and also trying to ensure sure that my code has unit, system, and integration tests. I’ve once been asked by a colleague what unit tests were, and that he’s never heard of them before.
I believe the reason behind this widening gap between CS programmes and reality is that a good majority of professors have been in academia all their lives (and it’s them who end up deciding the curriculum). The TAs they hire to teach programming are again fresh out of an undegraduate programme, and aren’t really pros either.
Lalith, even I went to the same school. School is highly ranked (~20) because of its NIT status. Computer Engineering department is absolutely piece of crap, with just two airhead professors who treat department like their household. However story is different in IITs and perhaps other NITs.
Self made system analyst here. When it comes to computer science, imho, you either have it or you don’t. I have zero college experience but have been working in the field since I was a young teen. I tried to take computer science in college and found it to be a waste of money and well below my actual expertise. However, computer engineering is a completely different story and it takes a completely different background to become one. I have also learned that most employers expect you to know a decent bit more than one programming language so you can’t spend all of your time focusing on one language over another or you’ll find yourself struggling to adapt at your first job.
I think the discussion here is focused too much on the undergraduate part. Computer Science programs in this country are mostly known for their graduate programs whose intended output isn’t just a handful of software engineers or system developers. UF Gainsville has always been known as a stellar CS grad program. To shut that down is just criminal.
If they’re really stellar, they should stay open. I didn’t propose to shut down “all” programs, I proposed to reorg or shut down “more”.
UF Gainsville is in nobody’s world a “stellar” CS school, grad or undergrad.
The grad program is ranked 39th in the nation. I don’t think of that as stellar, but I think that it merits continued existence.
What’s your cut-off? How many slots should be available for students interested in learning CS? If you’re not “elite” enough to go to MIT or CMU, should you just go home and get a job as a plumber?
39th doesn’t qualify as stellar. It’s a good school, but not stellar. That’s my point.
Everyone who wants to learn should be able to. The only excuse for a mediocre program is institutional inertia.
Re: “wouldn’t it make more sense for UCLA and Cal State LA to have a single, combined computer science program that’s among the best in the country, instead of two mediocre computer science programs?”
Typically universities do better if they are clustered around a hub. Competition for the same students, teachers, ratings, and sponsors is good for quality. Facilities have a lower barrier in university hubs.
It’s the same reason the car industry centered around Detroit. You couldn’t compete if you weren’t in the hub.
I agree with you to a point, but I think what you’re missing the boat on is while many people go to college to learn a “trade,” the goal of college is not to treat you a trade. That’s what ECPI is for. The goal of college is to teach you how to learn and to expose you to a breadth of ideas and approaches that are extraordinarily difficult to obtain on your own. I’m not sure there are many people here that could write a Rabbin Fingerprinting algorithm, a function to calculate the Levenshtein distance of two strings, or implement a QuadTree off the top of their head. But a CS/CpE/EE graduate would have been exposed to these structures and would know the various applicable scenarios to leverage them. Could you create your own spatial search without a QuadTree? Sure… but it probably wouldn’t be nearly as efficient. Could you create a good Captcha without understanding entropy? Probably, but it wouldn’t be as robust.
It’s pretty easy these days to be a Microsoft stack developer, but without understanding the bridges between managed and unmanaged code, what that means and why you can still have memory leaks in such a modern system can lead to an application with a wonderfully intuitive and functional user experience on the test bench, but crumbles under its own weight when opened to the public.
The same could be said for all applied sciences/engineering. On the job training/self-taught is perfectly valid, and sometimes preferential. Somebody that’s grown up in a Power Electronics family and has a symbiotic relationship with transformers would probably make a great engineer, but experience will only take you so far if you don’t fully grasp the underlying principles.
One problem: perceived value vs. actual value.
As a professional developer who is a college grad without a comp sci degree, when I interview they want to know if I graduated college and if I have a comp sci degree. I’ve been doing professional software development very successfully for 10 years with no comp sci degree. I’ve been turned down for many many jobs for lack of a comp sci degree but those who overlook it haven’t missed my lack of skill with compilers or building an OS’s memory management. Furthermore, the stuff I learned while getting my college degree has also been irrelevant to every job I’ve ever had.
These are the same problem. Prospective employees need a college degree because it’s perceived as relevant. Prospective programmers need a comp sci degree because it’s perceived as relevant. If you want a job as someone else’s employee, you don’t get to change this perception. You have to take it on the chin and play along.
Jeffrey McManus, you do not know the first thing about writing code. Without the scientific and mathematical foundation that computer science provides, one cannot hope to write useful code. I suggest that you actually attempt to write up complex algorithms instead of writing a poorly argued blog post that is really about your company, CodeLesson.
You should re-read my post, particularly the points at the end. It doesn’t say what you think it says.
> wouldn’t it make more sense for UCLA and Cal State LA to have a single, combined computer science program that’s among the best in the country
I think the problem there is that there’s a better chance you’d create one large but mediocre computer science program.
> then you must also accept the notion that all plumbers must have the ability to smelt copper and forge their own pipes
Not really. Do you often say to a plumber: “I want a new bath, but not like any other bath that you’ve ever seen, it will have new and unique features X, Y and Z”?
> I don’t know how sha256 works even though I’ve used it in apps I’ve written. Why would I need to know how it works?
That’s part of the problem: You don’t know what you don’t know. This maybe isn’t the best example, but you never know what the future may bring and the only thing that can prepare you for it is teaching the conceptual underpinnings rather than the specific, current technologies. For instance, who would have though 5 years ago that there would be a real possibility of writing 3D games as a front end web developer?
I like the distinctions you made between computer science and applied computer engineering. It makes a lot of sense and over the past 10 years since graduating, I have struggled, adapted and finally found a balance between the two that allows me further my career as a developer.
I don’t think that eliminating CS departments around the country is a good idea. I think a more applicable approach, would be to split CS into the two groups you defined and make one of the aspects of the cirrculum for applied engineering to be business and communication classes.
I fumbled for years as a developer fresh out of college. I was excited, anxious to put my education to the test and actually code things that were useful. The largest obstacle I had, was maintaining professionalism and communicating with both business partners and other developers in a healthy, goal oriented way.
Elimination of programs is a mistake. Augmenting them with people skills and/or making the distinction between the science and the engineering would help future developers succeed quickly in the high-pace speed of modern business.
The problem is that without the threat/promise of eliminating the department, it’s very challenging to enact reform
I found the CS components of my SE degree the most useful in practise. However, perhaps this is because I did SE, and the CS course I did were the more important ones. While I feel my university was lacking in quality of SE courses, I do think that SE / CS in university could seriously benefit from teaching more real-world skills. Especially skills that diverge from CS / SE. Business, general problem solving / math, economics, law. I do think all of these are important supplements to a good SE degree.
Only yesterday I drew upon skills I learned in a CS course (an elective of my SE degree) to solve a real-world business problem. I doubt I would have solve the problem as quickly and as well if I hadn’t learnt those skills. My employer doesn’t know the difference between SE and CS. Make of that what you will. I don’t know….
It’s true, there are some truly dismal CS programs out there. But there are also some very good ones that achieve a good mix of theory and practice. I happen to teach in one of them, after 30+ years in industry, in everything from digital electronics through embedded systems to AI scheduling systems.
Over the years, I’ve worked with programmers (I would not call them software engineers) who lacked a good grasp of basic data structures, algorithms, and concurrency, not to mention basic process elements like revision control and regression testing. It’s extremely limiting, and can lead to serious problems. A few years ago I was called in to troubleshoot a situation where a group had built a database app for a client without understanding what transactions were for. They cost their employer a boatload of money and nearly got the company sued out of existence. While it’s true that not everyone in a development team needs to understand graph theory, you really need at least a core who understand at a pretty intuitive level the basics of complexity and concurrency, on pretty much any non-trivial project.
I have mixed feelings about this. I was fortunate to enter the field when you could still make a fortune in your garage. Not going to college for an intended career in software development was a no-brainer in 1979 but in 2012, not so much. People insist on the sheepskin now.
That said, back in my day if you studied anything computer related it was connected with the math department or involved learning to keypunch. Zero practical knowledge. You were a god if you “understood computers”. I think the situation has improved from when your typical computer science department was using 5 year old textbooks and computer systems and whatever practical knowledge you got was obsolete going in, much less coming out. But not nearly as much as you’d think.
I can and have run circles around college graduates. One memorable situation was when I was hired in to “help out” a kid with a BS out of University of Arizona who was not getting a project to release. I was shocked to find out that he had not even run the compiler for weeks. He was obsessed with everything being perfect and theoretically pristine before he could even bring himself to compile and test the code, much less release it. As soon as I conveyed this info to the business he was out (and off to study for his masters degree in Texas — he’s probably a professional student to this day) and I had them into production within a couple of weeks. That company went on to be one of the few dot-bubble companies with a business plan and an income stream and the owners ultimately sold out for a few million bucks and were happy.
This illustrates the contrast you are trying to draw. Software development is as much a craft as a science, perhaps MORE craft than science. College does not by and large teach craftsmanship, pride in workmanship, and appreciation for elegance. If you cultivate these things in yourself you will “smell” bad practices and wrong-headed ideas even if you don’t have an intimate acquaintance with all the internals of the components and tools you’re working with. The notion that learning systems-level theory is an efficient path to practical competence is mostly misguided unless you intend to do systems-level work.
My advice for young coders is to get a degree, but get it from a program that has an emphasis on partnership with business, on internships and open source participation and the like. One should be able to hit the ground running when you graduate. If you can’t do that then you’re wasting a boatload of money.
I’m a finance guy and don’t have much idea of what you’re all talking about, but I am interested in that I have 4 young kids (first about to enter high school), and I work in the technology/innovation part of our society. I struggle giving guidance on how best to prepare my kids for the innovation world they’re entering, and the post and comments at least help me formulate better questions to ask my kids and the schools they hope to attend some day. Nice work!
Thanks Mark. My daughter is 10 so I’m thinking the same way. One approach we’re taking is to not accept the limits of her school’s menu in terms of breadth and depth of curriculum (we enrolled her in an online math learning site called ALEKS to prepare her for middle school math and she’s kicking butt with it). I wish that more students would be open to doing this instead of being limited to whatever’s on their school’s schedule of classes.
[...] I expect there will be a fair bit of outcry over this, however Jeffrey McManus has a great article here that makes some great points that seem to soften the blow. Share this:TwitterFacebookLike [...]
I was a little enraged after reading the title of the post, surprisingly I agree with your observations after reading the post. I’m in my final year in cs undergrad. In the final year it seems that it wasn’t a very good idea to take up undergraduate studies in cs. I think at this point there is a confusion among students and professors, since some of them think the students are here to learn theoretical computer science, some of them think they are there to learn software engineering (here some of them include parts of faculty as well as students). Its not clear to anyone what the other thinks or expects. The fact remains that there is a huge demand of software professionals in the industry and people will keep going into cs studies to find themselves becoming software professionals in the end. The distinction should be made, In my view CS departments should be merged with Mathematics departments and Engineering studies should be different and Software Engineering students should take up necessary courses of CS curriculum.
Great viewpoint, thanks for posting. I think that a coding course of some kind should be mandatory for all undergrads.
Jeff, I think you’ve missed the point completely. CS graduates and those with advanced degrees go on to work at firms like Google, Microsoft, IBM, Intel and so on where they produce the tools and software that I use for productivity every day. One does not get a CS degree to become a coder. I started out as a coder in COBOL over 25 years ago. Today I am a SQL Server developer. I have a BA in History and an MBA, which had nothing to do with my job. However, I have a unique understanding of database technologies and an appreciation for the computer scientists that developed these technologies.
You win the award for being the 100th person to skim my post and decide I’m all about doing away with CS completely. Wrong!
@A.J., another point here is one of positioning. The terms “programmer” or “coder” can be somewhat derogatory or suggestive of someone doing noncreative rote assembly work. Perhaps “departmental” or “casual” programmers fit this description to an extent at times. Personally I prefer to refer to myself as a software developer as it has the right balance … it conveys that I am a professional, go through a complex process, that I am something of a generalist, and it also implies the consulting aspect of things. One must understand business and businesspeople if one is going to do an effective job of software development. The biggest failing in my field, IMO, is the failure to make sure that software serves business needs and doesn’t just represent technological masturbation.
I don’t understand why you’re making the point that one does not get a CS degree to become a “coder” or software developer or whatever you choose to call it, when this is exactly the point that Jeffrey made in his blog post. What he’s saying is that most young people don’t understand this until too late. Too many of them pursue CS degrees and then discover, like the young fella I spoke of above who was afraid of the compiler, that they can’t actually develop software. That’s the problem.
I wonder how many people get a CS degree, founder around for a few years, teach themselves the craft, and the degree becomes nothing other than a checklist item that gets them past the HR gatekeepers to the entry level jobs. Also as Jeffrey also pointed out, and you are sort of validating, once you’ve been at this a few years no one cares what degree you have or don’t have, only what skills you’ve actually demonstrated in the workplace and what kind of reputation you’ve built.
Agree with your points about reforming computer science programs. But how can we make that happen?
What’s missing is what actual actions can we (consumers of education) take that will result in better computer science programs that turn out graduates who have both theoretical and practical skills?
That’s probably a different post, but as a consumer of education you can: steer toward schools that have a practical instead of theoretical focus (assuming that making software instead of delving into theory is your goal), take on extra projects that expand your knowledge, and pursue courses that aren’t necessarily available on your campus (or in your area of specialization). Online learning has a lot to offer here, although I doubt that most college students who are dissatisfied with what they’re getting on campus think to turn elsewhere to round out their knowledge. (This is true for college students as well as professionals, by the way.)
If you accept this argument, then you must also accept the notion that all plumbers must have the ability to smelt copper and forge their own pipes, because how could you possibly lay pipes effectively without having ever created one with your bare hands from elemental materials?
====
So your argument is “hey, doctors don’t need basic chemistry because they don’t make their own drugs”. Well, the truth is they do. They need to know biology, chemistry, Latin, and many other things.
Just like software engineers need to know memory, pointers, and what XOR does. Truth is, this stuff is trivial. It’s not rocket science. People that can’t comprehend such trivial things shouldn’t be in the business of software development.
As far as CS departments not adapting to the modern times — you got it all wrong. Bad CS programs teach to program in Java and C#. Good CS programs teach people to understand the fundamentals, since picking up a new language is a trivial thing for anyone who knows how computers work.
So I need to be capable of building a cryptography library in order to use a cryptography library. No, sorry, that’s not how software development works on my planet.
I think that with crypto, especially, that if you don’t have a good understanding of the fundamentals, you ought to just stay away from it. I mean, “I’m running my app under SSL,” is all well and good, but “I decided to kind of pick and choose different pieces from this library to make an SSH-like crypto protocol for my app,” or “Gee, I thought I’d change the way this random number generator works just a little bit,” are both fantastically bad ideas that have led to no end of suffering on the Internet. If you don’t *really* understand crypto, then, yeah, you shouldn’t be doing it.
Perhaps you should pick a different example? If you don’t really understand how to build your own graphics library, I have no problems with you writing a GUI app.
As a student in a very academia-oriented bioinformatics program, I have trouble giving that much importance to the practical/theory balance in a program’s contents. I feel like having a good knowledge of data structures and algorithms combined with a strong understanding of a commonly used programming language like Java, c++ or python is enough to get you started. Since both CS and engineering programs seem to provide these basics, the choice between focusing on concrete or fundamental stuff should be personal.
A smart CS major is worth a smart software engineer and I think they can (maybe with a short adaptation period) produce the same quality software.
It’s this particular mentality that is flooding the market with bad programmers – or people who perceive themselves as programmers.
A programmer needs to learn the basics of programming from a reliable source (which is a university), and not by trial and error and posting questions on stackoverflow.
I have worked with many outstanding programmers who have spent no time in university. I know even more who attended university but did not have a technical major.
I have worked with many outstanding programmers who have spent no time in university. I know even more who attended university but did not have a technical major.
That’s almost proof that the university doesn’t have a huge role to play in that space, except perhaps as a graduate program and a few electives on the undergraduate level. A took a class in software engineering and a few classes that required a large amount of programming. The rest was learned on the job and through internships.
A lot of engineers in the automotive industry have degrees in Mechanical Engineering or Materials Engineering. The number of specialized Automotive Engineering programs on the undergraduate level is very small. I think that’s as it should be.
Industry simply moves to fast for academia in a lot of these programming issues and methods, so I think that academia is smart to concentrate on its core competencies.
Just because the university does not do something today does not mean it should never do it. School isn’t prison or the military.
I think the issue comes down to the role of the university. Professors generally hold that universities exist to facilitate scholarship, and that students attend universities on the premise that it benefits them to get a taste of that. However, to get government money (either directly or via aid to students), universities have allowed people to believe that college education is a ticket to higher earnings.
The promotion of scholarship and the disregard of skills development is typical of academic life. The business school refuses to teach salesmanship, the psychology department refuses to teach you “how to get your way by using psychology on someone”, and the professors of social studies aren’t interested in teaching you how to become more popular (i.e. more social).
totally agree, although there are a lot of professors who love teaching and are great at it. the fact that their priorities are skewed so far in favor of research has more to do not with their desires but their incentives. publications are much easier to measure than successful teaching. interestingly this dynamic is being messed with now as the internet opens up new opportunities for publishing and traditional peer-reviewed journals demonstrate a number of serious shortcomings.
I didn’t read other comments, but if it hasn’t been said already, the following is one of the most idiotic things I’ve ever read on the Internet.
“It should not be necessary for two universities located within commuting distance of each other to have the same academic department.”
Have you ever been to Cambridge, MA? Whose chemistry department do you think should be shut down, Harvard’s or MIT’s?
“I didn’t read other comments” is the most idiotic, actually.
Did you read any of it? You must have missed the part where this addresses programs that are not top tier.
You have some good points, but I agree with some of the commenters that a knowledge of math can be very essential. “Pointer arithmetic” is not a very good example of all the various branches of applied math used in programming.
The amount/type of math involved is no doubt very dependent on the particular programmer & application. Some programmers might encounter it only sporadically, others (like myself) use it on almost a daily basis. My POV is the better your understanding of algorithms, data structures, graph theory, limitations of floating point arithmetic, etc etc, the more powerful applications you can build.
As for the “plumber-copper smelting” analogy… yes, it’s possible to take cross-disciplining to enough of an extreme that it becomes infeasible. You have to find a balance.
I have to say, having been in the software industry for almost 25 years now and having worked with and hired many many software developers, my opinion is, that it doesn’t make a damn bit of difference what formal training (or not) one has had. A programmer/software engineer is either good or bad. I think it is an innate skill and can’t be taught. Sure you can be “taught” a new language, but no matter what you are taught, if you don’t have that innate ability, you will NEVER be a good programmer. Good programmers in my experience, have taught themselves most of what they know. Some of the best I have ever worked with are not even degree educated.
And my biggest bugbear – graduate “architects”. Kids coming out of programs and being hired as architects. What a joke. These kids have never written a “real” line of code in their lives which makes it pretty much impossible to be a good architect (of course, that may be an oxymoron anyway, but that is beside the point!
).
I learned things in my computer science program that are only now coming to fruition — in other words, my degree program prepared me for the next twenty years of evolution in computer programming and architecture.
But then, I went to a really, really good computer science program.
I’m really not a fan of the ageism in this article. “University undergraduates are not discriminating consumers of education?” Really? Come on. Some know what they’re doing and some don’t, just like people in every other group.
The ageism is yours, since I never said “19 year olds aren’t discriminating consumers”. But if want to discuss the assertion on its merits, then make your point.
Well.. The Computer programming boost the Technical word itself…A new era is going to began with computer programming..
The funny thing is that most jobs don’t require so much education; the truth is that most software developers are monkeys in comparison to a minority. I had an internship as a J2EE developer working on big name commercial websites(think Toys R Us, Toshiba, etc) in NYC and it was the most monotonous thing ever. I felt like I was a hamster running on wheels learning a thousand ways to do the same thing. I’ve since started graduate school and a research assistanceship and honestly it depends on what you’re looking to do with your career. Most of the research is actually extremely relevant at the grad and PhD level; for example, at my school which is ranked in the 70s just off of the top of my head I know of a research project for CUDA advanced graphics processing algorithms, tracking disease spreading via the context of Facebook/tTwitter crawler data being posted and something I will hopefully be contributing to soon is using new algorithms in biometrics for security in mobile applications. Honestly, anyone who can’t see the practical side to education simply isn’t in touch with using both hemispheres of their brain(which is perfectly okay because most jobs are not ground breaking from a sense of new techniques/application and thats okay because there is still innovation in ideas themselves that affect our lives). Think about this though — without academics who could apply their application, you wouldn’t have had Ada Lovelace or all of the other special obsessives with their “abstract ideas”.
If you can’t handle a monotonous job, flunking freshman physics may be a symptom of that.
Great article indeed.