I have been a software engineer for more than a decade now and my career has seen a lot of shifts through the years. For many engineers I know, their career has followed a linear progression from graduate to senior or lead role. It also means, they have worked with and gained expertise in one technology. On the contrary, my career progression has been (very) non-liner. I have had 3 full-time jobs, 4 short contracts and 2 part-time (weekend) jobs. All of which involves learning new technology. In this post, I will highlight my learnings from some of them. I will share my software engineering career journey from a young graduate writing bad code to a senior engineer writing loosely coupled code to an engineer thinking customer (user) first. The sequence of events that led up to customer first (or obsession) aspect of my career was ironic, maybe a higher power was playing a joke on me. Oh and at some point in my career, I felt like I was training to be a cage fighter in an underground fight club. Ok, that’s a long enough intro, let’s get into it.
Software engineering career
I was not the smartest kid in high school, I was just not as interested in some of what I learned there. That changed once I (somehow) started studying computer science at a university. I loved it, all of it and everything made sense including that networking class full of acronyms. I enjoyed all aspects of what I was learning. This meant, academically I was always a high distinction (HD) student. My highest score was 96% for a Java programming class. However towards the end of my undergraduate degree, scores meant little… why? I published my undergraduate honours research on human like artificial intelligence in games at a well ranked international (IEEE) conference on Neural Networks. Few things come close to the joy of reading my name on a document of knowledge. Anyway with university done, I was ready to start my career in software engineering.
Stage 1: Ready for the world
One of my first jobs in software engineering was a consulting role where I was a consultant/engineer who built solutions at a client site. I worked with clients such as a financial services company, a mine, government departments etc. The tech I used to build solutions were relative to the client site. I built solutions in Java, ASP.NET, C#, SQL server, Oracle DB, SSIS, SSRS etc etc. The one that was consistent across all clients was Oracle PL/SQL. There was a lot of writing PL/SQL stored procedures. I even did a DB admin course. I was the only person in the company who could work on any technology, the rest were specialised to one tech e.g. Java engineer, DB Admin etc.
Around this time, I was also working a Java engineer job on weekends for a real-time inventory management system for a chain of furniture stores. It’s called Furniture Bazaar, it’s like IKEA but it’s a Perth, Western Australia only operation. This job was fun, it was a huge application built with Java 1.4, Struts and MySql among other things. It had a steep learning curve as some things such as the persistence framework were custom built. I was also involved in building and deploying production builds.
These were some of the first jobs of my software engineering career and I was a typical entry level engineer. I was writing procedural code, separating out logic into other classes and methods thinking I am doing the best thing. For my consulting role, I was well liked by both, people in my company as well as those on the client sites. My manager loved the fact that everyone at the client-site know who I was. I was not just a consultant sitting in a corner coding, I was making small talk with people in the office.
I was one of the smartest kids during my undergraduate degree who published his honours research at a conference. Then, I was at a job where people liked me and I had a weekend job where I was responsible for deploying production builds. I was writing good object oriented code by separating out code in different “Helper” or “Util” classes, I totally felt like I was the king. Yet, at some point I asked myself, I am a king of what? Perth? a small city and a job where I am good because, a) my personality and b) I know what others in the company do not. Also, I am writing all this awesome Object Oriented code but has anyone reviewed it?
Stage 2: Time to get good
My desire to get better and publish more in AI research, lead me to move to Sydney, Australia for my post-graduate research. I enrolled in one of world’s top universities for computer science research, University of New South Wales!!! University life in Sydney was brutal. My god!!! People at the university were smart, so so smart. We are talking about some of the brightest minds in the country. Tech companies such as Amazon, Facebook, Google etc are always inviting research graduates to interview and work for them. As per my research, hmm, it was in computer vision, AI and robotics and I had to build something in C++ as it had to run on the robot. C++….yea, it took me about 6-10 months to get back into it. Ah!!! after years of writing managed code, it takes a while for memory management to sink in.
During my research I took up about 4 short contracts (3-5 months each) to build solutions for clients. These involved a Java solution, an ASP.NET/Sql Server solution and 2 Python/Django solutions. While, I delivered the solutions, I felt the cracks (in my skills) were starting to show. I started feeling I was not as versatile an engineer as I thought I was. Of course, I had only been coding for about 3-4 years at this point. It was bad enough I felt this way and then came the mother of all: THE JOB!!! – an important phase in my software engineering career.
As I reached the end of my research, I accepted the role of a Java developer or a full stack Java developer at a SaaS startup here in Sydney. I had breezed through the interview and I thought it was going to be great. Once I settled in, I was given a major task, which at the time was the most complex problem I had worked on. I had to stay up all night and build a working solution for it. Next morning my manager did a code review and re-wrote the entire solution. In the code review, he mentioned how my Java code maintained state by relying on class variables, it was tightly coupled and not scalable. There were questions thrown in, as “this was so simple, how could you not see it?” “it looks like this piece of code was meant to be convoluted, why?” “I tried this myself and I did it easily, not sure why it took you so long?” This would continue on for 3 to 5 months before it would stop. This project involved working with Play Framework, JQuery, CSS and a lot of Google Visualization Library.
I have not mentioned all other aspects of that job and how isolated I was over there. It’s like you are in a room full of people, yet you are lonelier than if you were home alone. My manager is a great engineer, has empathy but lacked the ability to show it. If I ever raised my concerns, the response would be, “this is how it’s going to be, you can find another job if you don’t like it”.
I hated my manager’s feedback but I knew he was more experienced and better full stack engineer than me. So I would grind my teeth while I read the code review but make the suggested changes anyway. In retrospect, I probably should have separated myself from my code. My code was crap, I was not. This was 6 years ago and as per my a*hole manager, well…. I am still in touch with him. I drop him an email once a few months and catch-up over lunch every now and then. He’s awesome and his negative feelings were about my code, not me. It was just business, nothing personal. I enjoyed that project a lot, I was solving interesting problems. If my manager had better people skills, I would have would have stayed longer. I am happy to dedicate myself to my job, put in long hours or late nights when needed. However if I feel I am not valued at a workplace, I will talk about how I feel twice and if not addressed there won’t be a third time.
Anyway, after a few years of working there I was better engineer and more confident at building full stack solutions, end-to-end. I felt ready to take on my next challenge where ironically, I would discover no body cares how good your code is.
Stage 3: User first
I decided to give my own startup a try in 2015. I had an idea for an adaptive task management app and I felt I could really see it through by dedicating my time to it.
Year 1 & 2: The code
The first 2 years at my startup were all about writing scalable and loosely coupled code. I made sure it had no unused dependencies or import statements. It always worked offline i.e. it was built to be usable without an internet connection. The reason for this was, what about certain remote places or countries where not everyone has stable reliable internet. Yea, nobody told me so and I just built this because I thought that’s what people “wanted”. Also, as a smart engineer, I was always thinking of how I can increase efficiency to building something. I was building solutions such that the next time I build something similar, it only takes me 30-50% of the time it originally took. One of the things, I am proud of is sharing my unique solution for building native iOS apps with html-powered UI on Github to 66 stars.
I was quite happy, the revenue while not as much as it would be if I was working full-time, was ok, I was making progress. Slow but steady progress, then something happened.
Year 3 & beyond
This is when things took a turn and there was a major twist. The flagship product of the startup ( My Day To-Do for iOS) experienced a major spike in downloads and it was organic growth. I asked one of my friends to share a post about the app on Chinese social media site, Weibo. There was a download spike from China after that post and close to 5000 downloads in the week that followed. Around this time, I hired a marketing intern to work with me, you can read about it below.
Change in objectives
The download boost meant, it was important to understand what my customers wanted. One of the first new initiatives post download spike was localising the app to Chinese language (this probably wasn’t necessary, I made this up myself). From here on out, instead of adding new features that I think would be helpful and cool, it was all about doing what users wanted. I hired interns, contractors from Fiverr, partnered with a language school at my old university and localised the app to 7 languages. I/we distributed flyers, posted on forums and did focus group studies, gave out the pro version of the app for free to customers in return for some insight etc.
The first two years of my startup were all about the code and writing good clean code for cutting edge features. Now, technically, I can build a solution in whatever tech you ask me to. I have seen people days days or weeks building something that I can knock off in a couple of hours.
However, as it happened I soon realised it’s easy to make an app but the question is, can you build something that people want? Good clean code is very important, but it’s more important to think about customer needs when building something. Backend or front-end whatever it is, always think about how it can bring value to your customers. Instead of telling customers what the app can do, ask them about what they want the app to do for them.
Ironic right? I spend years working in a bad environment, take it all the negative feedback, get good, be on top of my game and then realise it does not matter. I suppose it is a natural evolution for an engineer passionate about the job.
I mentioned, I hired interns, which includes engineering interns, so what kind of a manager was I to junior engineers? Not good. I failed to show empathy and as such they were not as productive. I attribute their performance to my failure as a manager. I guess the environment I was trained may have played a part in this. You see, when others were being nurtured to grow as engineers in the land of unicorns, sunshine and rainbows, I was training to be a cage fighter in an underground fight club. Yes, that’s what stage 2 of my career felt like. I was getting bruised, bloodied and fighting to the death to survive, every single day. I may have been unknowingly harsh in my feedback while working with interns. I realised when working juniors, it’s important to keep the environment light. It’s good to make a joke at your own expense every now and then. Self deprecating humour often makes others feel comfortable enough to share their frustrations with you.
p.s. Cage fighter, fight club, pop culture references…. I grew up watching South Park, hence my sense of humour.
Software engineering career – Summary
This is what life has been for me all along, it follows a non-linear plot with unexpected twists. Just as in my personal life, my software engineering career too follows a similar pattern. It’s like an M. Night. Shyamalan movie that always has a twist (remember him? The Sixth Sense, Signs etc). All his movies except The Happening where it just “happened”. Trees did it.
Anyway, here’s the moral of the story. If you are on top, it’s always good to ask yourself the question, why are you there? Are you there because you deserve to be? Or is it just the case of winning the race because you are the only one in it. I asked myself that question and left my little town to move to a big city to have my confidence destroyed. Then I spent years re-building it to reach a point where I was really good only to face the next plot twist. It does not matter, when building products, tech is the easy part of the puzzle, what matters is what customers want.
For all the engineers out there, learn from my example, please do not spend more than a decade before you realise, customers (users) matter more. Remember, building something is easy, so when building something, ask yourself this, what value will it bring to the users? Oh and also, learn to show empathy. It’s ok to make yourself look silly every once in a while.
If you find any of my posts useful and want to support me, you can buy me a coffee 🙂
Or you can buying or even try one of my apps on the App Store.
Also, if you can leave a review on the App Store or Google Play Store, that would help too.