The last year has been one hell of a year for me.
After eight years of full-time iOS development and 11 years of developing for Apple devices, I decided to move on to something new that I have wanted for longer than I was willing to admit.
A quick recap of my most recent professional life:
I released my first “official” application for OS X when I was 19 years old. I had been developing Software long before that, for friends and family. At age 21, there came a personal breakthrough since my application was featured in a Greek Magazine in 2007. It all went uphill from there. I released a successful application for iOS – iGreekNews – which paraded in the top 2 Paid apps for 3 years and allowed me to earn money to leave Greece and pay for my tuition, rent, food (and everything else) in France in Telecom SudParis.
That trip changed my life. I thought I knew what Software was before I attended this school and had the chance to meet with the professors there. That trip made me realize something I already knew but couldn’t explain.
Regardless, I decided to return to Greece and continue my work as a mobile developer for big corporations. During my stay in Greece, I managed to create a team from scratch; I became a Lead Developer, then a department Director… It seemed as if no one would ever throw all of that away.
But I did.
One day I just filed my resignation out of the blue – at least that’s what it seemed like at first. It took a lot of explaining to give the actual reasons of my departure.
Looking into the past to set the future in new grounds
Software Engineering has little to do with computers. That’s right. Software engineering is actually ideas, notions, abstractions, logic, architecture. You think about something; you visualize it, you design it, then draw a sketch on a paper. Only the last part of software development concerns programming (writing code).
At my age of 31, I had already used more languages and technologies than many people older than me, and it was about time to understand what drove me to not stay within the boundaries of just one platform. I was developing for Apple platforms as a full-time job, but for the past four years, I was also developing in NodeJS, tampered with microservices for my clients, and did so much more (Angular, React, Node, etc) than what my day job demanded. Why?
Because as I realized, I don’t care much about what language and technology I am using, as long as it allows me to do what I want efficiently. The joy of designing a solution for a large-scale problem was the same as implementing it in any language or technology possible. As an iOS developer – even as a lead developer – I could only have just one part of the whole “Solution” ecosystem.
When I realized that, I reflected on what I was going to do next. I wanted to move on to developing large-scale backend systems with the liberty of designing them (or at least parts of them). Once the opportunity unexpectedly came, I welcomed it. I took the plunge to take a job that would allow me to do that. For the past year, I am a full-time backend software engineer (Spring Boot, NodeJS, xSQL, MongoDB).
What is this transition about after all?
So here is what abandoning something you are an expert in (mobile development) to dedicate yourself to something different is about in Software:
It’s about serving (APIs) and not being served anymore
Designing an API is not hard. Creating a good API is very difficult, however. It’s never about returning JSON. It’s about talking with REST semantics, making HTTP conversations using specific verbs as actions, communicating with API consumers using a particular dialect of your invention. And having consumed countless APIs, it’s interesting to see what’s happening on the other side of an API. This time you have to think ahead of what you are going to serve.
It’s about using the right tools for the job – not just a single one
Desktop and mobile application development usually involve using one technology – one tool to get the job done (no matter the libraries and frameworks used). On iOS, I had Xcode; for everything Windows, I had Visual Studio.
Web development is about using everything. Every day I use IntelliJ, Docker, Datagrip, terminal (a LOT) and a dozen of tools to verify what the others are doing.
I miss the hardware though. Macs are the best tools for the developers, period. Google and Facebook agree with me. KDE Plasma 5 and Kubuntu made life much easier for me, and I loved it. Windows is not that bad, but if you want to get your dev job done, you use a mac. I miss using these beasts.
It’s about your conform zone and what “comfort” means to you.
For some, comfort means routine and stability. They need to know where they are heading to, why, and when they are going to do that. It means learning something, sticking by it, and squeeze every little ounce this “something” has to give you.
For others, getting comfortable by exercising a “routine” is second in their priority list. They feel more comfortable when “staleness” as a concept is as far away from them as possible when making decisions. This usually leads them to change their lives fast, trying new things. Failure for them comes when they stop changing.
In Software, getting uncomfortable means changing directions and domains in a search to learn new things and be better at Software, not specific technologies.
It’s about thinking differently – changing mindset.
While working for iOS apps, I found myself very easily changing implementations just to squeeze some more performance from the mobile processor. 50ms delay in a screen update would indicate an underlying problem – thread safety was paramount, and algorithmic optimization was an everyday routine happening at compile time & programming time – scaling up means going deep into how the processor works.
In backend systems, optimization usually happens at design time, and scaling is mostly horizontal before any lines of code are written. Algorithmic approaches are a distant second in the developer’s priority list. You don’t have to think of just one user – you have to think in terms of having many users. You need to figure out the most appropriate caching mechanism, and topology of your service. Technological choices will most probably have to do with the requirements and not your preferences – NodeJS, Spring, SQL, Mongo, Redis, Kubernetes, etc.
In iOS and Android development, you need to accept the fact that you have to take advantage of 100% of just one processor. In web development, you need to accept the fact that one machine (or 2, or 3) will never be enough – and that your web app will surely go down one day because of load issues. That changes everything.
It’s about taking risks – and having confidence
Giving up something you are considered to be an expert in means that you will need to prove your way up all over again. It takes a lot of professional confidence and determination to step down and follow a different path willingly. It also requires people to trust you.
Fun fact: I took some pleasure from my colleagues’ faces when they asked me, “Why are you going to throw all this work away?” and I just answered, “Because I can – and because many others wouldn’t dare to.”.
(btw who says that knowledge can be thrown away?)
…it’s about gaining an understanding of how to do things differently and see how the world works.
As I mentioned, software engineering has little to do with computers. And for me, it has little to do with iOS. It mostly has to do with how I decided to bring my ideas to life. I will surely not stop developing for iOS – it’s just not going to be my full-time occupation for a while.