So I read through the slides of a talk recently, by the incredibly talented Anna Debenham. The talk is about the state of web education in schools. It is an incredibly good talk and thankfully there is a video of another talk by Anna that covers pretty much the same things here, which I highly recommend you watch. The thing is, what Anna says about web education equally applies to any form of software design and development. The education system teaches it badly, all the way from primary school through to university. They are either too theoretical or too outdated.
I've long thought about building the ideal software development training course. The problem is there is no good course that I know of that makes good developers. There are courses out there that teach you software engineering or computer science, but they output very few good developers. There are also many courses out there that teach you how to program in certain languages.
The issue is, a lot of these courses are either too theoretical (computer science) or too tied to a certain languages/toolset (pretty much all of them). You end up with lots of C programmers or Java programmers or C# programmers but very few software developers. Now, there is nothing wrong with computer science. It teaches people how to be computer scientists. The issue is that a lot of people who take computer science are wanting to become software developers, not computer scientists.
What is a software developer?
Good question section header! What makes someone a software developer and not just a programmer. Put simply, a software developer solves problems, a programmer just implements them. A software developer is capable of coming up with an app idea, of designing the app, of understanding user experience, accessibility, interaction design, dealing with user feedback. Basically a software developer could write a full app from scratch on their own, a programmer couldn't.
The issue is that people who are programmers are often classed as developers and this has led to such terms as 'rockstar developer' to mean 'someone who can do more than just program'.
What should be the principles behind this ideal course?
The overriding principle should be to teach people how to be software developers. It shouldn't focus on one platform, language, IDE, architecture, pattern etc but it should teach people how to learn and evaluate them. And it should do the things that other courses don't do or skip over. It should teach about version control and developer tools. How many people actually learned how to use a VCS at school or university? How many people had to learn how to use an IDE themselves? How many people were truly taught how to debug?
And possibly the most important principle. This should not be seen as an engineering course or a science course. It should be seen as an art course. As much as we like to paint software development as an engineering or scientific discipline, it is much more of an art. Sure, there are best practices and patterns and such, but there are best practices and patterns in music, graphic art, literature etc.
So what should be the course syllabus?
I think there should be various threads to the syllabus of such a course:
- Debugging & Testing
- User Experience
- Building Software
- From The Experts
So what does each of these entail? Well I'll go into each in a bit more depth:
Programming - This will be a large overview of programming and be the closest to what other courses do. It will teach how to program, type theory, data structures and all that stuff. However, it will not just paint these in terms of theory but show how they apply to certain programming languages. It will cover various types of languages: procedural, object oriented, functional.
Most importantly it shouldn't focus on one single programming language. Ideally it would use scripting languages, compiled languages, dynamic and static languages, verbose and concise languages, high level and low level languages. And it would explain the benefits of each type of language. By the end of the course students should know 5-10 programming languages to varying degrees, but most importantly students should have the skills to go and master those languages and learn new languages.
Debugging & Testing - This thread will do exactly what it says on the tin. It will teach people about testing, all the way from unit testing to integration testing to UI testing. It will show them various tools and approaches. It won't cover anything like TDD as this is just a technical thread, that will be covered in Building Software. As for debugging, while it will teach how to use various debuggers, learning and using a debugger is easy. The key thing here is how to debug and basically building up the problem solving skills.
Tools - It's pretty hard to program without tools. So this thread will cover everything from text editors to IDEs to refactoring tools to version control software to compilers to issue trackers. It should explain the purpose of the various types of tools and show the basics of each tool.
User Experience - A software developer who doesn't care about user experience isn't a real software developer. This section will pound into the students the principles of user experience. It should focus on things such as usability, aesthetics, accessibility. It should teach some fundamental principle of UI design. While the student may not end up an expert, they should hopefully have an appreciation of UX.
However, this won't just be about UX for user facing apps, but should also consider the programmer as a user. As such it should also cover how to create clean code and design APIs. Not all software is written for consumers and some is written for other programmers. An API is simply another UI.
Building Software - How do I come up with an idea? How do I flesh that idea out? How do I create a list of functionality? How do I cut that down to a 1.0? How do I architect the software? These are the sorts of questions this thread should help answer. It should also cover various methodologies, giving pros and cons and examples but not pushing any single one over the other. It should look at how and why to choose certain fundamentals such as "web, desktop or mobile?" and "which language/API?". It should build up the skills of working in a team and actually creating real software. This is basically the thread that ties together all the stuff learnt in the previous 4.
From The Experts - The other 5 threads make a point of not saying "this is the way you should do this", but aim to teach many different ways, give objective overviews and essentially teach you skills rather than just knowledge. This last thread on the other hand is the opposite. It should bring in people from various parts of software development to give talks on subjects close to them and give their opinions on why you should do something their way (or even why you should do it another way). One week there could be someone saying that unit testing is useless and the next someone talking about why they write unit tests for everything, but this will give two opposing views for students to consider and make up their own minds.
Will we ever see such a course
I honestly don't know. If the money could be found and a competent set of people found to teach this stuff then it could definitely be done. But the question is whether the will is there. Would the industry see the potential of such a course and help back it. Would a university run it or would it need its own establishment? I'd love to see such a course and to have taken such a course and if the opportunity ever arose I'd love to help create and maybe even teach such a course. But until then, I'll just keep dreaming.