Developer core competencies
What should universities cover in Computer Science courses?
This tweet from @stuherbert got me thinking:
Despite the massive shortage of programmers to fill vacancies, UK comp sci grads are the most unemployed 6 months after graduating #ouch
There’s been much talk about teaching grass-roots ‘coding’, even at Primary School level. But it’s clear to many that our university courses are woefully inadequate, out of date, and little use to employers generally. Usually a CS grad is useless until they’ve got at least a year’s experience under their belt. Actually, they can be worse than useless – some poor bugger has to live with their code.
I thought I’d note down as many general ‘computer science’-like core competencies that I think modern businesses should look for as a grounding for any developer, regardless of whether they’re doing web, mobile or software development in a start-up, an enterprise or a bank. I’d love to make this more comprehensive, so please comment below and I’ll incorporate your ideas too.
- Version control, inc svn, git, hg, perforce – including branching and merging
- Key algorithms eg binary search, bubble and quick sort, lexical analysis, etc
- Game & animation physics (elasticity, acceleration, gravity, trajectories, etc)
- Maths – percentages, number systems, logic (and/or/xor), bitwise operations, randomness, etc
- Business analysis, requirements, UCD, user stories, MoSCoW
- Project Management inc Agile, Kanban
- HCI & UI design
- HTML & CSS
- Basic C++
- ‘Scripting’ with bash, ruby, python
- Code deployment and Continous Integration
- How search engines work
- Finding solutions to problems (googling, GitHub, stack exchange)
- Evaluation of code for bad smells & code review
- Teamwork & collaboration
- Security – network, xss, buffer overflows, encryption, etc
- Intros to: java, objective C, PHP, Ruby, Python
- Frameworks & MVC for the above inc separation of logic & display
- Building reusable code (note: inc OOP, but wider than that)
- Technical Debt, YAGNI, premature optimisation, over and under engineering, refactoring, KISS, DRY, not-invented-here-syndrome
- How open source works; contributing to open source.
- Operating systems – installing, using, maintaining: windows, Linux (centos+Debian?), Mac
- Filesystems – from coding to block device
- Threading (on OS and also stateless http), race conditions, stampedes etc
- Debugging & optimising inc memory leaks, stack traces etc
- BDD & TDD, automated testing, unit testing etc
- Prototyping
- Content Management Systems (inc WordPress & Drupal)
- Realtime
- Caching
- RDS and noSQL
- Storage types – strings, floats, etc, their problems
- A bit of history won’t hurt…
- Hardware? Or is that electronic engineering now…?
- Regular Expression (thanks @mrpmeth)
- API design, usage, good and bad (thanks @fooishbar)
- Design Patterns (eg Dependency Injection)
- Overview of software dev philosophies eg OOP, Aspect-OP, Event-OP, Extreme, etc.
- QA, UAT
What’s interesting is that so many of the competencies above either didn’t exist 10 years ago, or have only become mainstream as being more than just ‘best practice’ in the last 3-5 years. That’s a big challenge for education, which just can’t move quickly enough. There must a better way of keeping it relevant?
(Reblogged from http://twopointoh.co.uk/2012/10/11/developer-core-competencies-cs/)