From Mobile to Backend Developer
Table Of Contents
You may have seen a lot of mobile development related posts in my blog. I have developed many apps during my career and encountered a lot of things, and written about them. Some of them are support posts, or posts chronicling journey of my side projects AKA Apps I have developed to learn something.
But as you may have noticed, I have removed or changed many of these posts. And many of the new posts mentions nothing or very little from mobile development. They mostly consist website or AWS. And the reason behind that is I have completely switched my track from Mobile (Android) development to Backend Development. And as of now, I have no intention to go back to mobile development. This post is to state the reason behind this change and shows what I am doing here nowadays.
Why I am no longer developing on Android.
I have been developing in Android since 2010. Back then it wasn’t as stable platform as it is today. The tooling, the libraries and the ecosystem was starting (almost) from scratch. There were lot of options, lot of opinions and that resulted it’s own share of confusion. But with these, there was fun developing Android apps. With time, and introduction of proper tooling (Like Android Studio and Kotlin) and frameworks(Like Jetpack), developing in Android becoming more fun because even with less options, the openness of the platform allows everyone of us to become more creative.
But with time marching on, the stability catches on. And Google becoming more opinionated on how to do things. The ecosystem isn’t as rapidly evolving as it was 5-6 years ago.And I don’t think the opinionated Google is as bad, because they’re not forcing anything on us as many other frameworks do, they’re just making easier to implement the Google way using JetPack libraries. And with every mature platform, it’s not easier to add new things. The excitement slows down untill something new (like Flutter) comes along.
But every thing in Mobile Development, be it Flutter, Jetpack Compose, SwiftUi, Room or Jetpack Navigation. Or even entirely different platforms Angular, React or VueJs. For me they’re just ways of showing, storing, and retrieving simpler form of complex data, catered for single (or limited number of) users. Managing proper connection at right time, and when being notified showing the notification information correctly, and redirecting to proper screen.
And even without new and shining APIs, we as developers are rarely utilizing full potential of our devices. Apart from Location related APIs and storage (and sometimes bluetooth) we’re rarely using anything platform specific. If you are an android developer, ask yourself following questions.
- How many desktop widgets you and your team has developed before iOS annouced widgets? And how many after that? If there is a difference, why is that?
- How many App shortcuts (Static or Dynamic) you and your team has developed? If your app does not have any shortcuts, why?
- How many of your natively developed (with Java or Kotlin) apps have Animations? If not why?
- Does your app connect with Google Assistant or Alexa? If not, why?
- If you’re developing a chat app, does it support (or you are working on to support) chat bubbles on Android 11? If not, why?
There are many such questions, and if you are answering No to all of the above questions, ask yourself one last question. Why are you developing on mobile platform, and why not developing a PWA?
And yes you’re not that alone, when I was actively developing mobile apps, I would answer No to most of the questions, and I was looking for an exit from mobile development, because I felt developing on backend is more complex. And it’s easier to get something wrong if enough attention is not there.(I will talk more about it in next post along with other things.). And for the same reason, I was attracted to develop some backend system long ago. I realised a good app stands on a strong backend, and I tried to develop some ever since I got enough confidence on mobile development.
I got a chance from my workplace to develop a backend in Mid 2019. The project is still ongoing as of May 2021 and we the team of 5 former mobile developers, we are developing a big and complex product which is feature rich with 8+ modules, 200+ lambdas (yes, we are doing serverless on AWS) and a very complex architecture which delivers fast and secure data to mobile apps and web frontends to internal teams and external clients. And I am excited to talk about this.
Moving to Backend.
As I said above, I got a chance from my workplace to work in a backend project, which in last two(ish) years, grown big. This backend is developed fully by developers who have been doing Android and iOS development for around 10 years, and the team’s total experience in AWS and NodeJS was less than a year. We learnt Databases, Node and AWS along the way, documented it for our future selves and others, and now our work has gone into a full blown product now. Many of us have got one or more certificates that includes AWS (Solutions Architect), and many Redis Certifications.
Learning Node JS was one of the most fun, satisfying and also frustrating experience for me. Compared slowness and relative complexity of Gradle (and historically Maven and Ant), NPM is much faster and came with a fresh air. Before working on Javascript and NodeJS full time, I was trying to work on Kotlin Multiplatform for a side project, and we were also thinking about introducing it to my workplace. But after working in this project, I realised that going back to Gradle is not worthy compared to NPM, I dropped the idea to learn Kotlin Multiplatform, because I don’t want to go back to gradle unless it’s required.
Also, the typeless nature of JavaScript, the ability to work and see results quickly means you can quickly iterate over things. And relative ease of testing things in Node ecosystem means you can quickly verify all the correctness of the code, with maximum code coverage possible, a phenomenon still not easily available to both mobile platforms. And NPM making it easy to define the workflow that better suits our day to day development.
But the same typeless nature of JavaScript is also a dealbreaker for many of things. You don’t easily have your code completion and documentation. You need more checks (both in code and in tests) compared to typed systems like Java and TypeScript. And even after that, everything is easily error prone and can crash on your face during production run. Plus we have faced a unique situation where some of our modules have initially designed as plugins to other modules and many modules have dependencies on each other. For example module A is dependent on X,Y,Z,W and Y itself is dependent on Z and W, which is creating many problems during our debug run and we’re yet to find any non-hacky solution which doesn’t involve duplicate dependencies and allow testing.
But overall I am happy and content with whole thing. Here is what I am or have been responsible in this project, and learnt many things along the way.
Some important points I have been responsible for.
- Handling of some base modules one of which include user management and other includes Role Base Access Control.
- In Role Base Access Control, where we define grants on multiple levels and allow and deny actions on user based on grants attached with user. The whole operation is inspired from how AWS stores and uses JSON to give access to various service to users and apps.
- Developing a script that helps deploying APIs to API Gateway. The API configuration that is handled by this script includes custom cognito authorizer, customized conditional headers, request parameters, request and response models, CORS, API’s attachment with Lambda with proper permissions to execute and their documentation. The script handles deployment, export to swagger and postman with error handling. (When I started it, we had more APIs and models then CloudFormation allows, and I have yet to get commanding hold on CloudFormation).
- Developing and managing a script that migrates latest code from Database to Redis.
- Developing script that manages pre-configured RBAC data and helps them to move properly from Dev to QA to Production databases.
- Set up unit testing framework and helping the team to achieve maximum test coverage. (Mocha, Chai, Sinon and Istanbul for coverage)
- Set up ESLint framework and default rulesets. Also wrote some customised ESLint rules to maintain codestyle.
These is the overview of what I have been working now. In next section, I will discuss what are the other things I am interested in.
My Future plans regarding to backend.
After working for 2 years NodeJS, I am attracted towards GoLang. I have been learning GoLang for couple of months. I absolutely love it, and planning to write a blogpost on this topic in near future. I do have some ideas and will try to implement it in GoLang next.
I am also impressed by Docker. It’s lightweight nature and ability to install lightweight and separated OS to do just one task is awesome. Also Google Cloud Run and recent containerized support in AWS lambda makes docker universally useful in cloud environments. I am currently able write basic docker container (this site runs on one such container). But I am planning to explore more and will explore Kubernetes as well.
This is what I have in mind. I don’t know what future holds for me. But I would like to continue on Backend and try to make something useful out of what I have learnt and what I am planning to learn….
Till then.
May the force be with you…