Anyone who has been out from under their rock in the past five years cannot have failed to notice the continual adverts for courses that promise to make you an iOS developer in three weeks.
I dare say that at least some of these courses have merit. The problem I see with them is that anyone competent at programming knows full well that they do not need a course to learn how to do something. They need a set of instructions on how to install the build tools, which is almost always the painful bit, an example project (that actually builds), and a good internet connection to the documentation and StackOverflow. Plus some time to play. Anyone employing (competent) engineers should know the same.
Naturally you can learn all of that from formal tuition as well. But what formal tuition will rarely give you - and where the value of the engineer with five years experience rather than three weeks lies - is not knowing how things work. It is knowing how to work efficiently, effectively, and how to cope when things don't work.
For example, five complexities of iOS that you are unlikely to pick up from a short course
- NSURLCache just does not work properly.
- If you change Photos permissions, your app will restart.
- An OTA install of an application on iOS 8 requires that the identifier presented in the plist be different to the original install. But on iOS 9 it has to be the same.
- You cannot set cornerRadius in Interface Builder - but you can if you address it as layer.cornerRadius in a User Defined Runtime Attribute.
- Background behaviours of Bluetooth on iOS. No link provided - this is going to be a whole blogpost series by itself.
Even if your course happens to teach you all the gotchas on an operating system, it will only teach you the ones the instructor knows about - and there are new ones appearing all the time. The value of an experienced developer is that they know how to debug problems when things go wrong. And it cannot possibly teach you all of the gotchas as well as the critical foundation of how a computer actually works under the hood.
And that's just the raw programming. I took a look at the lecture list for a three week course, and compared it to some of the books hanging around the office here. There were several things absent from the syllabus that I would consider critical to being a competent engineer, or let us say developer, as opposed to a programmer.
- Understanding Requirements
- Design
- Estimating
- Testing
- Debugging
- Performance
- How to write robust, maintainable, portable code.
- Source Code Control (subversion,git)
- Release Management
What do these courses promise?
- No pre-knowledge required - I'll teach you everything you need to know
- Develop any iOS app you want
No it won't; and no, you won't.
- Get app development jobs on freelancer sites
You can get those anyway. Just submit the lowest bid. The trick is delivering it for a profit, which I would argue is almost impossible for those sites unless you compromise immensely on quality.
At best, a course will enable you to write fairly standard applications in fairly standard environments. If you are competent, you will spend the next few years gradually improving the quality of your code, your estimation skills, your processes, and your repertoire of tools to be applied when things fail to work the way they should. And if you are competent, you will realise you never needed to pay that money for the course in the first place, because while a three week course may have saved you a little bit of time overall (if the instructor was really good), it has certainly not made you an expert developer.
If you are incompetent, you will fail to do all of these things, and you will leave a trail of half-finished (more like 20% finished) projects behind you.