Please Update Your Software Engineering Curriculum!

… yes, prominent university with a Computer Science or Software Engineering-related program: I’m talking to you. It’s time to get with the times. If you claim to prepare Software Engineers/Programmers/Developers for a real-world career in software development then you NEED to understand what employers are looking for and you NEED to be teaching the following things:

  • Software Craftsmanship / Clean Code – The importance of writing clean code is completely overlooked by universities. A large project that is poorly coded will dramatically increase a company’s maintenance costs as well as the cost of adding new features. When I went to college (~10 years ago), nobody — not even once — looked at the code I was writing and told me how terrible it was. Rushing out sloppy code to solve a problem doesn’t cut it in a professional workplace. We need to teach students how to write good, clean code!
  • Agile Software Development Methodologies – This is now the standard for software development. In retrospect, reading about this in a book isn’t an effective way to learn about these topics. Students need to have an actual project where they build a software product over the course of one or more semesters using an iterative methodology.
  • Design Patterns – For me, reading about design patterns in a book before having real development experience was entirely ineffective. Students need to learn about design patterns and incorporate them into actual software projects for the lessons to sink in.
  • Source Control Systems – Absolutely every single developer will be using some form of source control as part of their professional job. Students need to learn about modern source control systems (like Git) and should develop good habits early on in their schooling.
  • Unit Testing and Test Driven Development (TDD) – This is a big one. Unit testing and especially TDD is a major mind-blower for most people and has a huge learning curve. The sooner students can incorporate unit testing into their normal development process the better. An employer that has to teach a graduate about unit testing from scratch is going to be discouraged from hiring that candidate… but I still haven’t seen a curriculum that includes unit testing. Any respectable employer is going to want developers who have a strong understanding of unit testing.
  • Modern Web Development (HTML, JavaScript/JQuery, CSS) – Every software developer ought to know at least the basics of web development. There should be multiple electives that let a student specialize in this area since there is such a high demand here. The courses should be updated frequently to keep up with modern trends.
  • Data Persistence / Databases – Almost every single developer is going to need to be familiar with databases and data persistence techniques. This needs to be part of the core curriculum — not just a single class or elective.
  • Mobile App Development  – This is another skill that is in extremely high demand. Students should at least have an elective or two available in this area so they can get exposure.
  • User Experience (UX) Design – Students should have an understanding of the importance of building a good user experience. Poorly designed user interfaces make software painful to use and turns customers away.

It’s apparent to me that universities (at least in my geographic area of interest) are really dropping the ball in most of these areas. Programs like Code Academy and coding bootcamps appear to be nailing it and are looking more attractive all the time. Let’s face it: if you can take 19 weeks of straight-up programming-related classes teaching the aforementioned topics, you’re already ahead of a traditional bachelors degree university student.

Keeping current with technology and methodology trends will require close collaboration with real, practicing Software Engineers and cannot rely on professors who fall out of touch with software development. This is going to be tough, but if universities don’t get with the program they are going to be left in the dust.

Have you found a program that teaches these concepts? Please share!