I have had many job interviews during my career, for different companies. Most of them were for a position as an iOS developer. I still have such interviews from time to time, even though I am a freelancer. This happens when big companies want to add me to their existing team to temporarily speed up their development process. Do you know what all these interviews had in common? They never focus only on iOS development. I would actually say that the questions about iOS development are usually around 50% of all the questions.
Am I saying that knowing iOS development are not so important? No, not at all. It is of course required to have a solid understanding of the platform for an iOS development position. Sometimes the interviewer might settle for something less solid, but only for junior positions, where it is implied that the candidate will have to learn a lot (and accept a lower salary because of that). Still, there is another half that is not about iOS development. What is it about then?
Software development is much more than just knowing about a specific platform. It implies a lot of knowledge about programming and computer science. These concepts are broader than the ones you learn when making your first iOS apps and are required for any development job, regardless the platform or the technology. Software development is a craft that takes time to perfect and the top developers in any field are constantly learning new things. These concepts are, of course, needed in iOS development as well.
Internet forums are full of people asking where to start in developing iOS apps. What many people don’t know is that making iOS apps requires to know more than just iOS development. This is not to discourage anyone. If you put the time into it and want to learn and understand, making iOS apps is definitely a rewarding skill to have. This is true both for personal satisfaction and for the career opportunities that will be available to you. Big companies are always looking for skilled iOS developers.
I decided to write this guide on what it takes to become a skilled iOS developer. Beware that this is not a guide on how to write your first iOS app, for that you can read my other articles on this blog. Although those are helpful to dip your feet in iOS development, I want this guide to be different. I wrote this to give people who want to learn iOS development a broader perspective. I also want to answer some of the common questions that get asked again and again when someone starts learning.
So this is not a guide for those trying to jump ahead ignoring the fundamentals. These people usually end up just copying and pasting code from the web, hammering it until it sort of does what they want, without really understanding why. If you are like that, this guide is not for you. There will not be any code here for you to copy, so you can stop reading now.
This guide spans over many concepts that took me and many other developers years to learn. Most of these are going to apply to any software development field, but I will focus on iOS here.
A warning: you cannot learn all these things at the same time and in a short period of time. Although there are definitely some things you should learn first, what you need to learn depends on the path you are following and both the short and long term goals you have. Pick the next topic that makes sense for you at the moment and proceed from there to fill the gaps in your knowledge. It will take time, but if you are deliberate and methodical, you can steadily improve and surpass the troves of copy and paste developers present on the web.
So let’s dive in.
First of all, do not panic: you are not going to become obsolete
Before entering the details of what you need to know, I want to dispel a worry that clouds the mind of many people approaching iOS. You might feel that you need to learn everything quickly, or the next big thing will make everything you are learning now obsolete. There is not going to be such a thing. The foundations of computer science and programming have been the same for decades and still will be for decades to come. The history of computers went through big mainframes, personal computers, the creation of the internet and the modern mobile devices we carry in our pockets, just to name a few. We introduce new technologies at a fast pace, but the foundations of programming and software development always stay the same. Once you have a good grasp of them, you are able to embrace any new technology much faster than you are now. When Apple released Swift last year, it took me a couple of hours to read the guide and start using it in a project for a client of mine. That is not to say I am special. Any experienced developer is able to do this. But you are not when you are starting, so the first time it will take time.
The easy part of iOS development: the technicalities
You need a Mac computer for iOS development. If you don’t have one, it might be possible to run Mac OS X on a Windows or Linux machine somehow, but that won’t be easy. I recommend you to get a Mac computer. It does not need to be the newest on the market, you can find some good second hand machine on Ebay. Just make sure it can run the latest version of Mac OS X, since that is usually a requirement for the latest version of Xcode.
Xcode is the integrated development environment (IDE) used to make iOS apps. The reason you need its latest version is because iOS development evolves with time and some of the latest features are only supported by the latest version of Xcode. You can get Xcode for free in the Mac App Store, so the computer is the only real expense you need to make if you do not own a Mac already. You do not need an iOS device though (iPhone or iPad), since you will be able to run the apps you make in the Xcode simulator. This simulates any iOS device on your computer, so it is enough for learning. I developed my first iOS app only using the simulator. You will need a real device only for more serious app development and testing. This is when you want to submit your app to the App Store and ensure that your app works well on a device, but it is not needed just for learning.
Should you learn Swift or Objective-C first for iOS development?
You would think that one year after the introduction of Swift the answer to this question should be decided. That seems not to be true. Many people who approach iOS for the first time keep asking this same question again and again. The answers are of course always contradicting each other. So I am going to give you my answer here: learn Swift.
Since you are not going to be happy with just the answer alone, I am going to spend some more time on the reasons of this. This seems to be a blocking question for many.
These are the reasons to learn Swift first:
- Swift is easier to learn. It has a friendlier syntax, like the one of many other languages. You can also run code in Swift playgrounds, which are interactive and enhance the learning process.
- Swift is the new preferred choice from Apple. Everything they are doing now is in Swift. All the new material they release is in Swift. They are bringing new features to Swift only, while the improvements they make to Objective-C are only to interoperate better with Swift.
- Swift is a more powerful language and is defining new paradigms for iOS programming. An example of this is a recent talk about protocol oriented programming given by Apple at WWDC You want to be able to follow these new trends if you want to stay on top of your game.
- Every new resource is written in Swift and you want to know the language to be able to understand them.
- You will need to know Swift anyway. But you might not need to learn Objective-C at all in your career. Every new app is going to be written in Swift and you need to know Objective-C only to work on projects that were started before Swift existed.
Still others advise to learn Objective-C first, so these are my counter-arguments:
- They say you need to know Objective-C to work on existing projects. As I said, this is true. But this is something you should not be concerned about if you are learning iOS now. See above.
- They say Swift is new and still evolving. True, but that does not pose a problem and plenty of apps have been written already only in Swift. The new features are making the language better. They are not changing the language completely. Xcode has a code migrator that helps adopt every new version of the language.
- They say there are not enough resources. That might have been true when Swift was released. But even while it was still in beta, people where already writing resources for it. Now there are plenty and every new resource is going to be written in Swift. If you are going to miss anything is not learning resources.
- They say that existing frameworks are all written in Objective-C. This does not matter. Swift interoperates seamlessly with Objective-C. You need to know the latter only if you want to contribute writing code for a framework, not if you want to use it. You can use Objective-C frameworks using Swift syntax, so how they are made internally makes no difference.
- They say learning Objective-C will be easier. I do not know where this comes from. If anything, I always hear people complaining that the syntax makes Objective-C hard to learn. At the beginning I found it confusing too. There is nothing in my opinion that makes Objective-C easier to learn.
- They say they interoperate perfectly. Which is true and also an argument in favor of Swift and not Objective-C.
- They say knowing Objective-C will help learning Swift. Probably. As knowing any other programming language would. Some concepts in Swift come from Objective-C. That does not mean you have to learn them in Objective-C first. You can perfectly learn them in Swift. Knowing Italian definitely helps you in learning Spanish, but nobody advises you to learn it first if all you want is to learn Spanish.
- They say that most of the learning materials for Swift assume you know Objective-c already. Nope. Not even close to true. Some things have been written to ease the transition for Objective-C developers, but most of the material does not assume you know Objective-C
- They say it is easier to visualize what is happening in terms of CPU instructions and memory accesses when working in C or Objective-C. And why should you care about this exactly? The whole point of programming languages is to move away from that, or we would be still programming using machine instructions.
They say Objective-C is going to be more performant than Swift. Nope. Swift has been made with the specific goal of being much faster than Objective-C.
- They say Objective-C syntax is not so hard. In the meanwhile every newcomer ever has complained about Objective-C syntax. I have used it for years, and true, it is not so hard when you have experience. Also Russian or German are not so hard when you speak them for years. Does it make them easy to learn when you come from a language without declensions? Not at all.
As a closing argument, while you will be learning Swift you will be learning Objective-C along with it. The reason for this is that Swift got a big inspiration from Objective-C, and borrowed many ideas and features from it. That is also why the two languages can interoperate easily and coexist in the same project at the same time.
So, by learning Swift you will be learning concepts you use in Objective-C as well. Swift includes also some more advanced concepts that Objective-C does not include, which means your knowledge will cover all you need for Objective-C. So while you are learning Swift you will be learning Objective-C at the same time. The only thing you will be missing is the syntax of Objective-C (which can be a bit annoying), but provided you know all the concepts in Swift already, learning Objective-C will be a matter of hours or days.
You can find a Swift learning roadmap on my blog and I also wrote a free Objective-C guide for developers for when you will need to learn it.
The first aspect of being an highly skilled iOS developer is knowing programming well.
With the decision on which language to use out of the window, let’s see what knowing programming really means. Swift is only a programming language and programming is more than just knowing the features of any language.
If you are learning programming for the first time, my advice is to learn it separately from iOS. Programming and iOS are two huge beasts, and it takes a lot of effort to tame them both at the same time. This is why the internet is so full of people who are confused after following tutorials or courses that teach both at the same time. At the end these people do not understand either and cannot write apps on their own. Sure, you can pick some concepts of both sides when you learn them both at the same time. But remember this is not a guide to end up only being able to copy and paste code from others. Programming and development on a specific platform like iOS are two separate concepts and you should treat them as such.
So let’s see what it really means to know programming. There are different layers of knowledge you need to be a good programmer.
- The first layer comprises the basics of programming. This includes of course the basic syntax and constructs of the language, like flow control, collections, loops, functions, classes etc. But these are only tools. It is important to understand how to reason about problems and solve them using these tools. Remembering every feature of Swift is not going to be useful if you do not know what to use and when.
- The second layer is object oriented programming. Practically speaking OOP is a programming paradigm that helps you to organize your code. This is not a different mode of programming and you will still need to use the basic programming constructs of Swift listed above. What you need to understand more here are concepts like encapsulation, composition, inheritance, polymorphism etc. And do not forget design patterns, which are general reusable solutions to a commonly occurring problems. These will make your code much better.
- The third layer comprises algorithms and data structures. You can go along way only knowing the first two, but this is what makes a truly skilled programmer. Programming has existed for a relatively long time now. During this time constructs and methods that have been developed to help solve problems that are more and more complex. What you need to understand here are concepts like recursion, basic algorithms like sorting and binary search, and basic data structures like stacks, queues, hash tables, linked lists, trees and graphs. Plus of course the algorithms to handle all these structures.
The second aspect of being an highly skilled iOS developer is knowing the foundations of iOS itself.
As I said, iOS development is a separate topic from programming. iOS is a platform, and as such it has its own design pattern and technologies that make possible to write apps. Every software platform is different and treats certain design patterns differently. So even if you are already a developer on some other platform, you probably will have to revisit your knowledge of some common patterns that in iOS are handled differently.
The first thing you should focus on is the foundations of iOS. iOS is a big platform and includes many different technologies to achieve different things. They are all cool, but most of them you will not need at the start or even in your entire career. Conversely, if you do not learn the foundations first, it will be hard to learn all the rest.
For example, if your app does not do any image processing, you do not need to know Core Image. If you are not making a game, you do not need to know SpriteKit or GameplayKit. If your app does not need geolocation or maps, you do not need to know how to get data from the GPS sensor or how to use MapKit. Pick only the aspects of iOS that you need in the apps you are working on and leave the rest for later. If your knowledge of the foundations is good, you will be able to pick any other part of iOS as you will need.
This is a quick list of where you should start is studying the foundations of iOS.
- Xcode and Interface Buider. These are the necessary tools you will be using to make iOS apps.
- The Model-View-Controller pattern and View controllers. The MVC pattern is a the center of iOS development. You will need it in every app you will make. Similarly, view controller are a required part of iOS app development.
- The view hierarchy and Auto Layout. Everything that is on screen and the user sees or interacts with is part of the view hierarchy, so you need to know how it works. Nowadays user interfaces are laid out through Auto Layout, so you need to learn that too.
- Containers and storyboards. Containers are what make the flow of the interface from one screen to the next happen, and storyboards are the way you create and organize this flow.
The third aspect is what surrounds iOS development.
This is less important than the first two aspect I listed above since this is more generic computer science knowledge. Still, if you really want to be at the top of your game, you need to expand your knowledge to cover these topics as well. Again, it all depends on what you need to do in the apps you are developing, so proceed in the direction that makes the most sense for you.
For example, if you are calling a web API in your app, it helps to know how the internet works. This might include concepts like the HTTP protocol, the DNS system, what a router or a server are, how a REST API is usually designed, what a CDN is, etc. You might also need to know some lower level networking concepts, like the TCP/IP stack.
Another useful topic could be how databases work or how to write SQL queries, how an operating system works. This is not to say that you will need to implement any of these, you probably will not if you are an iOS developer. Still, I studied these concepts at the university and they have been useful many times during my career. Even if you do not need to deal with any of these aspects directly, you might find yourself discussing about these with the people that actually do. If you have to work with backend developers in defining an API with which your app needs to interface, it is useful to know how things work on the other side.
Again, in my opinion these are the least important aspects and you might need to know them only superficially. After all you are not a backend developer or a system administrator. But a little knowledge in these fields can give an some edge that other developers do not have.
Finally, a bonus.
Computer Science is a vast field and so is software development. There is a lot more cool stuff you might want to learn, like artificial intelligence, machine learning, natural language processing, neural networks, image recognition, etc. You need these only for the most complex things. I studied them at university and never used them in my career as a software developer. But they are indeed interesting topics and required in some of the cutting edge products.
Good luck on your career, and again, do not panic. It took me and many others years to learn all these topics, but you can starts from the basics and go incrementally. I think it is often underestimated how far the knowledge of the foundations can bring you. A good basis already enables you to start making apps. You don’t have to know everything at the start. Pick the next step that makes the most sense in your path and proceed steadily. You will get there.