Computer Science Education Is A Partnership
By Adrian Sutton
Some time ago, Jeff Atwood posed the question: How Should We Teach Computer Science? In the article, he laments the fact that formal education doesn’t teach students about deployment issues or source control:
And yet, as Greg notes, existing software engineering textbooks give this crucial topic only cursory treatment. Along the same lines, a few weeks ago, a younger coworker noted to me in passing that he never learned anything about source control in any of his computer science classes. How could that be? Source control is the very bedrock of software engineering.
While I agree that any good software engineer needs to know about source control and deployment, I think it’s unreasonable to expect that formal education is going to teach students everything they need to know. What universities are good at or at least should be good at, is teaching people to learn. The actual content they learn isn’t anywhere near as important as developing the skills to go out and learn things for yourself. There’s simply no way that students can come out of university knowing everything they’re ever going to need to know in their jobs, so they need to learn to learn. That’s why Jeff’s suggestion that computer science should be taught in conditions as close to reality as possible is the wrong way to look at it:
Today’s computer science students should develop software under conditions as close as possible to the real world, or the best available approximation thereof. Every line of code should be written under source control at all times. This is not negotiable. When it’s time to deploy the code, try deploying to a commercial shared web host, and discovering everything that entails. If it’s an executable, create a standalone installer package that users have to download, install, and then have some mechanism to file bug reports when they inevitably can’t get it to work. Students should personally follow up on each bug filed for the software they’ve written.
This kind of experience is a critical part of student’s education, but it’s not the only important part. Getting a solid grounding in all the abstract theory, the history of computers and a range of different types of programming languages – even if they’re almost never used in the real world. If education is just trying to simulate the real world, we’d be better off just canceling all the CS courses and letting people learn on the job. What’s missing in the IT industry is the understanding that providing education is a partnership between educational institutions and the industry. Neither can provide the education new software engineers need alone. That’s why most software engineer jobs require or at least prefer a CS degree.
Universities should focus on providing the theoretical knowledge that underpins computer science and teaching students how to learn for themselves. Industry should provide internships and partner with universities to give students experience working in real teams on real projects. A simulated development environment will never be as successful as a real one and on the job training will never give students enough of the technical underpinnings to master their craft.
That’s why Ephox got involved with Griffith Uni last year to bring in a team in their final year project where they developed real software for us in a real environment – complete with source control and deployment. That’s why we prefer hiring people who are quick learners and passionate about technology even if they don’t have all the knowledge or experience yet. That’s why we go out to university events and make contact with universities (and schools) to help bring more of the real world into their education and to help make them the best possible software engineers.
Computer science education is a partnership – what have you done lately to hold up your part in that partnership?