What I wish they would teach in universities
A few weeks ago I gave a talk about what makes a good developer. And more to the point, what doesn’t. We are in a hiring sprint now, so we spend a lot of time thinking about this. Primarily, I’m concerned with having passionate people who love what they are doing. But that isn’t the topic of today’s post.
We get a lot of CVs from people who went to good schools, had excellent grades, and can’t actually write real world code worth a damn. Actually, I look at the previous statement and I really don’t like it. “Writing real world code” implies that writing the code is the most important aspect of the work, and it isn’t.
Real world projects is about a lot more than just the code. What about using a source control system. And not just knowing that there is such a thing that is better than this:
I’m talking about actually using a source control system to manage code, to review past work, to see the flow of changes, etc.
What about knowing how to debug? I’m talking about a bit more than F5 and F10. I’m talking about practical things like being able to debug a big system and understand how to work the debugger to give you what you want. Knowing how to look at the stack trace, or understand the difference between an exception that is thrown (and handled) and an unhandled exception.
What about actually solving real world problems? Like a project that has a double assembly reference because of a bad merge, and you need to be able to track it down and fix it.
What about actually reading code? Given a non trivial amount of code, figuring out what is going on and making changes there.
Those are just some of the things that bug me because people come out of the university assuming that they can start pumping code, and they don’t know how to actually work on projects.
I wish a four year degree would also mean having a a four years project, that you started to work on day one, and to modify and work on throughout those years. That would give newly graduated students some concepts about how to manage a codebase over time. For that matter, I see questions like this being asked, and I don’t really know what to say.
There is a very strong need to have practical learning as well. Not just learning algorithms or how things work, but also how to actually work.
Comments
Computer Science is not programming. Like at all. It is amazing how time of young programmers we waste with such courses.
Schools need some level of book knowledge education, but what is really important and what you are implying here is that experience is the true teacher that produces in us the skills to succeed. I would bet you the best candidates you get are the ones that sought out experiences outside of their school curriculum, e.g. pet projects, open source contributions, their own website, etc...
I remember a few group projects that did a pretty decent job of approximating real world scenarios. At the time I thought we were just jumping through hoops because the professor was a jerk. I distinctly recall a conversation about a team member who wasn't pulling his own weight, and the professor said "look, in a job you don't get to choose your team either", to which I replied "yeah, but in a real job somebody like this would be fired". His only reply was a chuckle.
Lately I've wondered whether or not college is a good thing for a developer. Can't you just get a helpdesk job with no experience and work your way up from there while drawing an actual salary in the same 4 years college would take? Some of the best developers I've worked with followed that plan.
Peter Norvig's "teach yourself programming in 10 years" does a good job of setting the expectations right for what it takes to be a computer engineer.
I would argue that it was never the universities' job to prepare people for practice, buy to teach how to learn and to expand upon what we know (I.e. Working in the realm where no Google search brings you further). Practice is learned out in the wild and some degrees will put that into their curriculum, but it I'd say it's primarily the industry's responsibility to provide the platform for practice.
I agree with Adam. Programming is an art. Universities don't teach arts.
It seems like Hibernating Rhinos, more than most software companies, benefits from what students actually DO learn in a traditional university computer science curriculum, though. That's probably trumped by the lack of practical skills, but I suspect that, being in the business of building high-performance profilers and database systems, it's probably easier to teach people to code and use source control on the job than to understand distributed systems, standard data structures and algorithsm, asymptotic complexity, etc. on the job.
I completely agree with Dathan. Learning source code tools and such would require a trivial amount of training. Some companies that don't care about distributed systems, algorithm design, scalability, etc. don't understand the benefit of a CompSci degree. Also, companies really don't train their employees. It's probably partially why so much enterprise software has a large amount of technical debt.
I fully agree with Frank, it is not the job of the university to prepare the people for practice. Its the job of the companies to teach/provide practice. In computerscience you don´t learn a lot programming, this you will really learn in practice.
"Writing good real code" you can can only do after years of experience and support. Why? Because you see failing/breaking things, you would never ever expect.
Adam, That has certainly been my experience, yes. The problem is that I don't think that students are going to get actual value from the degree if they don't have a way to practice that, and doing that as an extra curriculum activity seems... strange, given that this is the core reason to study in the first place
Frank, People consider a degree today as the baseline for having a good job. A few would go for the pure academic learning, but most do that so they have the skills to find a job. Teaching how to learn doesn't really take that long, and shouldn't be "now you are ready to go out and figure out things independently, hope you had fun"
Dathan, Sure, we do a lot of classic CS stuff here, but that is actually a relatively small part of the job. We spend a lot more time working with the project than writing complex algorithms.
Dathan, Beside, you typically need a masters degree level of courses before it gets really interesting. A CS degree usually touch those topics at either peripheral or non realistic manner.
Rashad, Learning a couple of git commands is very fast. Actually knowing how to utilize source control? That takes a lot of time & practice. Good debugging skills are hard to come by and train.
Those are just a couple of things that are actually really hard for people who are just starting
Yesterday I read a good article about that problem (it's in russian though, so I'm not going to post a link). In Russia at best you get a very good understanding of algorithms and data structures and that's about it. We don't teach students here to produce any enterprise quality code (I saw a code once that won some IT competition from top students of one of the top schools in Saint Petersburg, it was awful). So in order to be any productive at actual job you have to seek knowledge somewhere else and still you'd need someone with actual experience to at least give you some directions. Of course I don't know how things are going in the rest of the world but from what I read on the internet I assume it's pretty much the same for US and UK.
Oren, that's a mistake some tend to make. Debugging is not merely an art that you hone over time. There is a systematic approach to debugging. You should have your junior (and senior) engineers read the book Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems. For code quality and effectively using version control, that can also be taught quite easily. In some universities, we are taught software engineering principles. However, it is one of the easiest software engineering/computer science classes. Any computer science student that is both humble enough to learn from others and smart enough to know data structures, asymptotic complexity, distributed algorithms will easily "grok" version control systems, agile development, coding guidelines, etc. So, I would look for university students that are smart, eager to learn, and humble.
Boris, there are books that address this issue. Code Complete 2 comes to mind. Simply require all new developers to read, comprehend, and apply the guidelines mentioned in that book.
Rashad, That is pretty much my point. You can teach debugging as a technique and practice. But learning this on an ad hoc manner, on the job? That seems to be a much tougher challenge.
I usually teach debugging (sadly on the job) following this formula:
After a few months they dont need to write anything down, but their understanding of the debugging process changes so much that debugging becomes second nature. They can now piece appart whatever problem in workeable assumptions and pinpoint defects much faster.
Federico, In our case, debugging is often an issue of. We have an issue in production, we have limited about to figure out stuff if we didn't put it in ahead of time.
That's exactly the point.
We cannot expect someone that is not well versed in step-by-step hypothesis proving to be able to:
The higher you are in the chain (design, development, production) the most reason to have your best guys in diagnosing. Generating hypothesis that can be proved is an essential (if not the only) skill that a debugging wiz must have.
I always wonder how the "apprenticeship/training" system is in other countries. Could you write something about that for Israel?
Sam, When we hire guys with limited experience (from college or without it), we typically pair them with an experienced dev for a week or two, give them tasks that will help them get familiarized with the toolset, the codebase and the way we do stuff
I agree with Frank. We've turned universities into something they aren't meant for, flooded them with students, and then are shocked to find the price has gone through the roof and people aren't getting a good return on their investment.
Plus, if someone is there to "get a good job", they aren't getting much of anything of what the University should be providing.
Comment preview