A rigorous computer science education is certainly beneficial to programmers. It provides you with the ability to see the bigger picture, and a more in-depth understanding of many topics that will ultimately make you a better developer.
I would argue however that it is far from actually being necessity. For many programming jobs, a computer science education is akin to having a mechanical engineering degree when working as an auto mechanic. You’ll certainly have a great understanding of the job you are doing, but a good deal of what you learned academically will fail to resonate with what you do in your day job at the body shop.
What the programming world needs is good, reputable vocations schools. Such institutions should take an extremely hands-on approach, be taught by veterans in the field, and prepare students for how to actually program in the real world from day one.
Focus on SVN and Git, rather than on Petri nets. Teach students how to name identifiers in their code, how to organize code, how to test, how to work with Unicode, how to develop desktop, web, and mobile applications, how to write secure code, how to sell software, how to bill clients, and other software engineering best practices. Give priority to practical topics aided by plenty of exercises and useful projects that represent the kind of work students will one day find themselves doing for an employer.
This type of school may not give us a modern day Turing, but it would definitely help establish a new generation of competent craftspeople who can begin building useful products in the real world before they’ve even donned their mortarboards. And it could easily be a 2 year crash course, rather than 4 years.
I think such an approach would be a huge improvement over the status quo of far too many Computer Science graduates who can’t write a decent program after four years of theory based education (not to mention that they are still indebted years after their graduation).
Assuming that the instructors and material were both great and not your typical “Java school” curriculum, I would recommend this route to most of the people I know who are considering getting into this field.
What do you think?
Get more stuff like this
Subscribe to my mailing list to receive similar updates about programming.
Thank you for subscribing. Please check your email to confirm your subscription.
Something went wrong.
There are lots of 2 year programs out there. There is even a 6 month Object Oriented program here in Calgary.
In your opinion, what skills (languages or otherwise) would you like to see a graduate of a 2 year program posses ?
I could not agree more! As a hiring manager, I’m increasingly frustrated by the lack of actual programming experience or education that most graduates of university four-year programs exhibit. A vocational approach as you’ve outlined here is not just a good idea – I’d say it’s positively *necessary* for the industry as it’s evolving.
Then you’re simply hiring the wrong people. Instead of simply looking at school credentials why don’t you also look for personal projects which can tell you a lot more about a person’s programming ability than any degree.
I wouldn’t be so quick to say he’s hiring the wrong people. It is likely that the mass of potential prospects for hiring just have zero knowledge of a real production environment, both dev environments as well as server stacks.
I’m not advocating that college is worthless. We’ve hired three college graduates, have an intern that is finishing his degree, and have hired a copywriter with two masters.
But we’ve definitely felt the burn training the newly graduated developers about basic things like git, web stacks, APIs, etc.
I think it is not the place for colleges to teach these things, since they focus on the foundational knowledge, but I agree with the original post… it would be great to hire someone with a degree AND some sort of training time in a trade school that teaches the modern day ropes, so we can get them running on day one.
Or even better, the dev is the hacker type who does this on her own 😛
Now *that* is the only requirement we have at our shop 🙂 Degree or not, you’ve gotta love this stuff or we’re not all too interested in the potential hire.
Related to this, some have argued that ALL K-12 students (and teachers) should learn at least some basic programming. Enough to where they could learn more on their own in the future, too. Programming could be viewed as a 4th fundamental “R” – reading, writing, arithmetic…and programming.
See http://edtechdev.wordpress.com/2008/02/05/programming-the-new-literacy/
Actually a lot of education majors nowadays do have a computer literacy requirement. Definitely a step in the right direction.
Reading, Writing, Arithmetic and Ruby.
Hank, if you reorder that a bit, you’ll have a better acronym: RAWR
Software best practices change way too quickly for any institution to be able to keep up. At least the computer science stuff that is taught is timeless knowledge that serves as a useful base for further improvement. This simply isn’t true for industry practices because today’s patterns are tomorrow’s anti-patterns.
Couldn’t agree more with David here. Unless you are coding in C or something, most practices/language change and/or expand all the time. I think a degree like that would only create a false impression that they are “ready” for the job.
Some of the best coders I know have little or no relevant education.
I disagree. Things don’t change so fast that a school shouldn’t be able to change with it. I just don’t see how building a compiler is going to help somebody building a LAMP, or a mobile application. There could be some core classes (like ‘how to use libraries’) but even those would change based on the popular languages of the decade.
I would also like to see courses like this for software testers (NOT like the ASTQB syllabus), product managers, and project managers.
I agree that a focus on theory like Petri Nets is not particularly valuable for most software developers. However, a focus on the use of today’s tools and techniques will produce people who may not be able to adapt with the speed our discipline requires.
It is important that people realize that all CS degrees are not created equal. For example, our computer science undergraduate program has the hands-on focus that you are asking for. Our software engineering students build real products for real customers using current agile techniques and tools. They graduate with enough theoretical background to be able to adapt to change combined with the skills to use up-to-date techniques to develop a product with a team. Our students are well-sought by employers who know our programs.
Perhaps we don’t need special schools – but we do need industry-focused paths within the current programs.
Out of curiousity, what degree program is this? Sounds fantastic!
In Canada we have a pretty big difference between university and college. Our universities are like American colleges, and our colleges, would almost be like community colleges I guess.
What you’re describing is exactly what our colleges do. They focus less on the theory and more on the practical stuff that you’ll actually need. In fact most of potential employers for my school actually prefer college students over university students. They’re just less useless for the first two weeks.
> For many programming jobs, a computer science education is akin to having a mechanical engineering degree when working as an auto mechanic
Maybe, especially early in someone’s career, you find roles that don’t require any understanding of computer science.
But what about the many programming jobs that you need at least a computer science or software engineering degree to advance and improve the products delivered?
> Such institutions should take an extremely hands-on approach, be taught by veterans in the field, and prepare students for how to actually program in the real world from day one.
This entire statement has problems.
What quality Computer Science degree doesn’t teach by doing?
How do you ensure that your “hands-on approach is going to be relevant when they graduate?
What computer science degree is taught by novices?
How do you ensure that those veterens understand what kids have to know to start their career, and then extend it?
Define the real world?
How do you ensure that the program is relevant for many jobs in the industry? One kid might get his first gig writing PHP for a web dev place, another might get a junior role for a bank, and another might be writing UI for an online gambling company. All of these kids need different skills, and require experts with different levels of expertise.
How do you tailor make the programme to role, without creating a million programmes?
> Focus on SVN and Git, rather than on Petri nets.
This is terrible advice. The option to understand and express what is going on in distributed systems is going to be one of the major routes of visualising computing in the future, and you just want to suck that option away from them?
Besides, you’re talking about SVN/GIT. That’s a single tutorial worth of effort. If your hires can’t work this out on their own projects, or within an afternoon on the job, you shouldn’t hire them.
> Teach students how to name identifiers in their code, how to organize code, how to test, how to work with Unicode, how to develop desktop, web, and mobile applications, how to write secure code,
Out of interest. What quality universities that offer both CompSci and Software Engineering are any of these options not available to the student?
> how to sell software, how to bill clients
Are the majority of programmers required to do either of these things in their career?
> software engineering best practices.
Why not just promote Software Engineering degrees?
> Give priority to practical topics aided by plenty of exercises and useful projects that represent the kind of work students will one day find themselves doing for an employer.
How do you know what kind of work students will one day find themselves doing for an employer? The amount of options are massive!
> Assuming that the instructors and material were both great and not your typical “Java school” curriculum, I would recommend this route to most of the people I know who are considering getting into this field.
I firmly believe that your idea would close more doors for people than it would open. I believe that people would do these highly focused courses and may be able to hit the ground running on day one, but their advantages would vaporise after the first quarter. Meaning that to advance in their careers they would be up against CompSci/Software-Engineers with the exact same experience, but a much deeper understanding of what’s going on about the product.
Not to mention that you completely ignore the complexity of development. It’s not like software development is like developing stuff in the physical world, everything is an abstract built on an abstract. If you don’t /understand/ what’s going on within the abstracts, you really have nfi what’s going at all.
Lastly, one question to you. Why not recommend people study Software Engineering?
there are a lot of schools that fall in the category of vocational, but since that apparently has a bad rap in the US, everyone wants to be a university,which then forces them to stray from the vocational nature of the programs. I agree about the practical itemsmyou list. I teach college andmi try to get those items in as much as possible, but it can be difficult in a traditional setting.
Digipen Institute of Technology’s Real Time Interactive Simulation degree is a good example of such a program. I went to University of Central Florida for computer science, and am currently attending Digipen. The hands on approach at Digipen has made me a significantly better programmer than the theoretical classes at UCF.
I agree, though I recently read that most graduates with C.S. degrees can’t code a for loop to save their lives. Even a friend of mine, a mathematics major, couldn’t wrap his brain around the concept of a for loop. Why not just evaluate job applicants by their portfolios–their git repo’s (mathematics/coding), websites (web design/documentation)?
What we really need are good vocational schools for managers. Think about it: a business administration degree requires an order of magnitude less effort and talent than an engineering or science degree. Why do these BA students need to spend all that time in university?
It’s just a way to fill the universities’ coffers with tuition fees while all these people waste time while they could get to work years earlier. They may not be as smart as the average programmer, but you could still teach them all they need to know in 2 years of vocational manager school.
Not only would this increase the pool of employable managers, it would also reduce the wage demands of the most clearly overpaid positions in the corporate hierarchy.
@LaC
Amen to that!
A degree is a lot more than just “preparing you for a specific job”.
If you don’t want people who are well rounded, intelligent and able to learn, stop bothering looking at university grads and look at high school grads.
Its not learning mechanical engineering to work as an auto-mechanic, its that so many people wanting to hire auto-mechanics are trying to hire Mechanical Engineers and wondering why they don’t have the right skill set.
@Andrew I wish companies would evaluate job applicants by their experience and portfolios.
I’m a high school graduate with 13 years experience in development. I’ve been using Rails since 1.2. I currently have 5 projects in production, I’ve created 3 plugins, 1 open source application, and the first application I created 13 years ago is still in production (albeit not for much longer as I’m working on a replacement).
I’m sure there are much more impressive developers and I’m not trying to toot my own horn but I believe I would be a benefit to many development teams. Over the past year I’ve applied for over 60 jobs and haven’t had the first interview. There could be another explanation but so far the most likely one I can come up with is not having a degree.
Thank you for sharing your thoughts!
I recently completed a 1 year motorcycle maintenance course, which was very theory-oriented.
I now have a holistic understanding of how a motorbike’s components work together. So while I might have trouble performing the actual repair flawlessly, I am able to point towards the probable cause of a problem.
I have since worked a lot on my own bike and closed the gap between theory and practice. I was able to do that because of my theoretical knowledge and resulting confidence.
Relating back to programming, the question is whether we want to produce builders or architects.
I believe we need both.
Absolutely agree! Some of the best programmers I know take the “vocational” route, learning online.
We launched the appendTo Developer Learning Center to begin to facilitate this exact thing. Our first course is small and focused, but it’s a start.
wont happen.
there must be an education reform that permits this kind of approach. education reform, i mean, more like a revolution.
education is based on the industrial model, with “phases of manufacturing” (classes), lot numbers (school year), different high/low grade finishing (uni/college).
it is so outdated that even yourself forgot to mention teamwork. which i believe is the one thing that is missing to really kick the world sky high in the information golden age.
and an instance of an outdated system cannot evolve parallel to an industry that is changing, more or less, radically each 6months (in perspective of technology and knowledge base). even for a genius like myself is hard to keep up. 😀
To be honest, I think you have no idea. Your post sounds like “Only brush the teeth who ache”. When I studied, everything I learned at bachelor level was obsolete at master. But what I had learned was a pattern and how to use my cognitive skills. How should that work when I learn a language in 2 years that is obsolete after 2 years? Another graduation for 2 years, so I’m on and off every 2 years?
What you are asking for is what I ask project managers or anyone in administration to know. And we can be pretty sure it will be standard next decade. No doubt.
Let me tell you something about me. My father was an engineer, so when the first PC came out we were one of the first to have one. I started programming at the age of 8, giving me a total of 27 years of coding. There is no topic, algorithm and no language that I haven’t used in my life.
Took a break 2 years ago after I had to work 16 hours each day for 3 months straight. I went freelancing for fun. I had much more success than expected. My clients made too many bad experiences with companies led by non-programmers who use non-programmers for hiring their staff. I tell them they all suck and get a lot of money for that.
And your text sounds like you never really wrote a program yourself. I can read subtexts in your posting which scream “productivity paradox”, “trend of persistence”, “sustained yield”, so that I’m pretty sure none of your programs will be in use after 3 years.
Learn chess. Play it a lot. Maybe one day then you will understand why the most obvious first step is not always the best one. If CS students will graduate as you want them to do, I will make much more money.
I’ve been thinking of how to start this sort of program for several years (27 years embedded software experience). I even reviewed the Colorado State University CS and EE programs and was shocked at how little useful programming knowledge is taught. I honestly believe I could teach good embedded software techniques to Jr High kids, assuming they had the right kind of mind for the task. Where to start?