We get a number of resumés trickling through every week, with a fair proportion coming from Computer Science graduates.
I look at the list of modules they’ve studied, and although they sound very interesting, there seems to be little relevance to the current jobs market:
neural networks, computer vision, artificial intelligence, robotics, compiler engineering, machine learning, quantum computing,
Bayesian networks, embedded systems… How many of these graduates will go on to regularly use this information? And these aren’t dodgy
establishments teaching these modules; I took this list of modules from the curricula of the ‘Top 5′ computer science departments in the UK
(graded by a respectable national newspaper).
Part of this mismatch (between education and skills) could be caused by the misguided notion that ‘Computer Science’ graduates don’t
necessarily go into ‘Software Engineering’, so are taught a more scientific approach, rather than vocational. However, the
Computer Science graduates I know have software/programming careers, not science. Interestingly, from a random selection of
about 10 or 15 university courses I researched for this weblog entry, only 2 offered Software Engineering.
The ’science’ bias could also account for the large number of mandatory maths modules in these courses; one of the top 5 universities
has 25% of its mandatory modules dedicated to mathematics (including 1 mainly on 3D maths). Another top university states that the
final year project is to ‘Develop a game’. Great for attracting students, maybe not a great idea for getting them a job? I just
did a search on monster.com; there were 31 ‘games programmer’ vacancies, and more than 1000 for ’software developer’, and more than 1000
for ‘web programmer’. Not much use knowing how to handle three dimensional diffuse lighting vectors when
you’re trying to create a customer feedback form for an insurance company.
And, quite surprisingly, only 1 course mentioned XML, which was in an optional module. Is there any modern software
these days that doesn’t use XML? So why can’t computer science graduates tell me when to use SAX and when to use DOM?
So, what would you include in a modern Computer Science/Software Engineering course? I’ve started jotting some draft notes
below (in no particular order, this is just a stream of conciousness…)
- The basics of Programming (variables, data types, references, pointers, scope, error handling, iteration, core algorithms - searching, sorting, etc.)
- Basic mathematics, basic statistics
- Patterns and Anti-Patterns (With real world examples, not just theory)
- Real world Databases (Normalisation and De-normalisation, SQL, Indexing)
- Basics of good code architecture: Loose Coupling, etc.
- OO Design, Interfaces, etc.
- The importance and tools of Planning: Spec’ing,, UML etc.
- Architectures: client/server, SOA, P2P, etc.
- A ‘Big’ language or two (Java, C#, C/C++)
- A scripting/’agile’ language or two (PHP, Perl, Python, Ruby)
- XML (DOM/SAX, XSLT/XPath, etc.)
- Economics, Business Studies, Costing Projects, Commercial pressures
- Copyright, Privacy, Data Protection
- Project/Time Management
- Internationalisation, Localisation, Encoding, Unicode
- Grammar, punctuation, concise and clear writing
- Interface Design, Usability, Accessibility, HCI
- Code Reading
- Common Protocols (TCP/IP, HTTP, SMTP, FTP)
- Testing, Debugging, Performance, Re-factoring
- Problem analysis
- Source control, change management
- The typical Software lifecycle
- Metadata, Information Architecture, etc.
- The basics of GIS
- Touch typing
- Health and safety (nutrition?)