This is a story about my knowledge as an iOS Developer and how I transferred that knowledge to a different language and SDK.
The path to become an iOS Developer
Back in 2008 when Steve Jobs announced iOS SDK (I was still studying Computer Science) I made the most important choice of my life so far. “I will become an iOS Developer” I thought to myself.
Having no experience as Software Developer, the path to become a professional iOS Developer was not easy at all. Long story short, I landed my first job as iOS Developer two years ago.
There is a controversial saying: “Jack of all trades, master of none” which I totally agree. It implies that by trying to learn a lot of things, you won’t master any of them. I consider myself as “jack of all” but not by choice. I previously worked as Systems Engineer for five years and after switching to iOS Developer, I was working on web projects when there was no iOS projects in the queue. So, I can build a full product myself but still, I do not master any of these technologies. So I wanted to focus on iOS only and master that field.
My biggest concern was: What will happen if iOS devices reduced to 1% and no one wants an iOS app? I know I can easily transfer my knowledge to macOS apps but nobody asks for macOS developers in my country. So, what I learned so far will be useless, right?
It depends on your experience the time you decided to focus on that specific language and SDK. For example, if you don’t have experience in multithreading, working withs GCD, NSOperations, NSThread etc (multithreading in iOS and macOS), will help you understand the concept. If you go deeper you will learn about Race Conditions, DeadLocks, Atomicity etc. On the other hand if you are already experienced with multithreading going deep on GCD or NSOperations, wouldn’t be helpful for other languages and SDKs.
From iOS Developer to Mobile Developer
So, I got this offer for Xamarin Developer that I couldn’t refuse. I thought that C# is very good language and also I will get the chance to get familiar with Android OS, so why not?
As I said before, Objective-C and iOS were the first language and SDK that I went deep. So, I didn’t transfer any knowledge and I learnt everything from scratch.
Software Design Patterns
Coming from university’s C style programming I had no idea what Software Design Patterns means(in real software). Creating a couple of projects in Objective-C helped me to undestartand the concept.
Apple is using a poor implementation of MVC in their examples. After building some big projects I realised that Apple’s way of building apps (at least how they build their examples) wasn’t suitable for me and I looked for alternatives Software Design Patterns. Then I got familiar with MVP and MVVM. I ended up using MVVM.
This kind of knowledge is fully transferable to other languages and SDKs. For example, to build an app for iOS and Android with shared business logic, MVVM is the way to go.
Object Oriented Programming
Again, coming from procedural C, I was using classes as structs in Objective-C. For example, if I had a class Movie and I needed to manipulated the data, I would probably do it in the ViewController. But, as the project was growing, I would need the manipulated data on another ViewController also and I realised that this “logic” should be handled by the class.
Object Oriented Programming is also fully trasferable.
Multithreading approaches might be different for each language. There are some low and high level APIs. I didn’t go very deep on multithreading in iOS, but I am familiar with Race Conditions, DeadLocks, Atomicity etc. This knowledge can be applied to other languages and SDKs as well.
Mobile way of thinking
The approach for building a mobile app is very different from building a website.
First of all you need to be careful what data are presented to the user. Since the screens are small, there is no need to present unnecessary data in a List View.
You also need to consider the resources of the mobile devices. For example a user might be using cellular data, so downloading 10 MB of data each time your app starts wouldn’t be a good idea.
Some other tricks like showing cached data to the user while the new data are beeing downloaded, will keep the user busy without having him/her watching a progress bar.
In this case the knowledge is transferable only because I am moving from mobile to mobile SDK.
When I started using Git, I was only using Commit, Push, Pull. Then I learnt about Branches, Tags, Conflicts, Pull requests etc and I developed my own flow. This knowledge is also transferable.
In my case, I was able to transfer about 80% of my knowledge to a new language and SDK. Because I was totally inexperienced before starting as iOS developer, I was able to transfer a lot of basic knowledge. It also helps that I moved from mobile to mobile SDK.
I am still learning new things with C# (like Inversion of Control) that I could apply in other languages in the future.
So, what knowledge you can transfer, depends on your experience and if you are moving to a similar SDK.