The traditional path
I know many software developers. They all have unique journeys. Many studied Computer Science or similar at university and began to work while still studying, getting their first experience through internships or at summer jobs between academic years. They took what I consider to be the traditional path to professional software development. My story is a little different, but probably quite familiar to many of today's developers.
My story - the beginning
I didn't study Computer Science, for starters. I'm a Mathematics and German graduate. After finishing university, while travelling for a month in Australia, I decided, for reasons still unknown, to do a ski instructor course in Austria in the coming winter. After qualifying and spending a few weeks teaching skiing, my season came to an early end with a helicopter ride, a broken wrist and an operation in the nearby hospital. I returned to the UK and, once I was able to drive again, found myself a job close to my parents' house.
I had considered starting a career in translation, using my German skills, but the job was in marketing, and I only got it through a friend from university. I didn't have any idea what I wanted to do, so I took the first thing available to me, hoping to figure it out along the way. Working in the PPC team (some know this as SEM, essentially just advertising on Google and other search engines), my colleague recommended I get familiar with HTML and CSS.
This is where I found Codecademy with its free courses in HTML and CSS. It wasn't long before I was hooked, spending evenings and weekends outside of work learning and experimenting with building web pages. I soon built a very crude and ugly website, figured out how to buy a domain and host it somewhere online, and after that I knew I wanted to go further in this field.
Becoming an expat
Shortly after, in late 2014, I decided to move back to Berlin, where I had spend my year abroad during university. Having so many great memories there, and with nowhere in the UK seemingly very interesting to me, I found a job in SEO at a startup, and made the move. I continued learning in my free time and, to my good fortune, it turned out that the SEO team was responsible for maintaining the landing pages for the marketing department. A colleague of mine took on this responsiblity, and I quickly expressed my interest in helping him out. He left the company a couple of months later and the burden fell onto my shoulders. I made some small changes to existing pages and created a new landing page advertising the mobile application.
At this point, I'd moved on from just HTML and CSS in my spare time and began the long and never-ending battle with JavaScript, as well as jQuery and SASS. It was also at this point that I realised how much there was to software development that just isn't obvious when you first start out.
For example, getting a project up and running with HTML and CSS is simple. Browsers understand both perfectly well and you can create an index.html
and styles.css
file, link them together, and view the HTML directly in the browser - no issues. Once you graduate to Sass, you need a way to transpile your code because browsers don't know what it is. The same goes for writing JavaScript. It might work in the browser, but production code is minified and uglified and polyfilled and whatever else. Writing ES6 code originally had to also be transpiled into a version of JavaScript that browsers would understand. (Nowadays, browsers understand it anyway, but it hasn't always been that way.) To perform these code modifications, you're getting into the realms of Babel and Webpack (or Gulp, or Grunt) and when you start to use packages written by others, you need to worry about NPM (or Yarn, or Bower) and suddenly a simple webpage that just required two technologies suddenly needs 7 or 8 to run. And some of these are not easy to get started with. I disgress slightly, but I'm sure you've had similar realisations in your journey. If not, have fun if and when they come.
I changed jobs, spending a year working in Conversion Rate Optimisation, another branch of marketing which took me slightly closer to software development, before deciding that it was time to start applying for developer roles.
Taking it professional
I don't remember how many I applied for, mostly internships, but I was eager to put my newfound JavaScript and jQuery skills to use. After many many failed applications, false starts and falling at the last hurdle, I landed myself a Junior Frontend Developer job at a German digital agency and started to understand how professional software development looked. Working with Git (and even Subversion, thank God that's no longer a thing) and other new technologies, working with other developers, designers, product managers, marketers (now I was on the other side of the table in this relationship) was a real awakening for me. There turned out to be a lot more to the role than I could have possibly imagined. After working on the frontend for an information energy website and doing bits and pieces of other projects, I was unfortunately laid off after the company suffered some unexpected losses.
Once again I found myself frantically applying for jobs. This time I had a deadline. With just a year of experience under my belt, I struggled to find the next job. Applying for every frontend developer job I could possibly find in the city, I left no stone unturned in my search for employment.
At one point a recruiter contacted me on LinkedIn, the role was a full-stack developer position with a small startup. The team already consisted of 5 senior developers each with many years of experience, so my expectations were low. I very frankly told the recruiter about my complete lack of backend experience and my very limited frontend experience. He was unaffected, a trait I've come to recognise quickly in many an ambitious recruiter. We went ahead with the application and I had the interviews. The first wasn't technical in the slightest, despite being with the Engineer Team Lead. He asked logic-based questions which I quickly figured out (they were quite mathematical in nature) and he informed me that I was through to the second round.
The second round hit me hard. The questions were highly technical, and I failed to answer many of them, hazarding a guess at some answers as they threw question after question at me. I left feeling dejected, assuming already that I hadn't got the job. My other applications had not gone so well either, even the most junior positions were being filled by other candidates and I worried that I might have to return to marketing just to be able to afford to live.
To my surprise, the recruiter called me a few days later saying that they were offering me the job. An even better surprise was the 25% pay increase that came with it! I had someone managed to accidentally fall from my first developer job, learning basic frontend skills and earning not much above minimum wage to a full-stack position where I would be learning Ruby on Rails and React for quite a bit more money!
I have no doubt that luck has played a huge part in my career so far, but this step might have been the luckiest of all of them. The role I landed, at a HealthTech company called Klara, was by far the best of all those that I had applied to.
My job at Klara was where things started to accelerate for me. Not only was I learning lots of new and interesting technologies - technologies that would ultimately form the foundation of my career - but I was also getting into the full-stack mindset. Delivering features end-to-end, even if it took me a while and was a steep learning curve.
If joining Klara was one of the luckiest and best steps in my career, leaving was probably the worst step I took to date. Even though I was learning a lot there, another opportunity presented itself to me, and it came with another hefty payrise of over 30%. My greed got the better of me, and I decided to take the new role.
It was mainly a frontend role, so it was already a step back in that direction, but it did give me the chance to build a React app from the ground up. As part of a small team, we architected and built the foundation for a web application that would replace an existing application built with Angular. This was a fun project and definitely gave me more confidence in my React abilities, and JavaScript as a whole.
The testing required for this project was a step up from what I had been used to and I needed to get familiar with testing frameworks. I also got my introduction to TypeScript here, and it was really a baptism of fire. I hadn't come across TypeScript before, and getting started with it was hard. I faced many compilation errors, many confusing warnings from my code editor and I struggled. In hindsight, I should have spent some time, in or out of working hours, reading through the TypeScript handbook and trying to get my head around what the point was and how to manage types, both simple and complex. Instead, I found it very difficult to come to terms with the JavaScript superset, and it was sometimes very frustrating.
Brand new startup experience
After over a year at that company, I began freelancing after a friend of mine asked me to help him build a product he'd started building on his own for his marketing clients. His tech skills were limited, but he'd tried to create a nice and clean web application with Python. However, when I took over, I told him I'd rewrite the whole thing with Ruby on Rails, which I did. We met frequently in the beginning and at a certain point he heard that I was looking for a new job. So he offered me one. I was hesitant to join a brand new company where I would be the only developer and responsible for building everything from the ground up, but it also sounded like an interesting project and a great challenge for me. I took the leap and started working with him full-time.
I enjoyed the role and the nature of the very small company. I got to building the web application as a full-stack Ruby on Rails application and managed to make a good start. The timing of this role, however, was very unfortunate. Just a few months after starting, the COVID-19 pandemic hit the world and many of the company's clients ceased marketing operations overnight. As business dried up, it became a challenge for us to continue working in the same way and I was unfortunately let go. This, of course, was a huge lesson for me, as it showed me how quickly situations change and that even a friend would not hesitate to make a difficult decision that was critical to keeping the business afloat, which he did. There were no hard feelings about the whole situation, it was just an unfortunate turn of events and I can't complain about it because many more people were more severely affected by the pandemic than I have been up to now.
I scrambled to find my next role. With just a month to find a replacement job to afford my rent, I was stressed, but I ended up landing another proper full-stack role with a FinTech company using Node.js on the backend and once again React on the frontend. Both were written with TypeScript, which gave me a chance to further my knowledge and experience and this is where I really improved in a big way. Once you can get past the complications and fighting with the compiler, TypeScript becomes a tool that hugely boosts your productivity. The tech team also embraced Test-Driven Development (TDD), which was new for me. Changing mindset to think about testing first before implementation can be a double-edged sword. On the one hand, you need to be intimately familiar with the testing tools that you're using and be able to write tests straight out of the gate. This can be challenging, especially at the beginning. But what TDD also gives you is a new perspective on how you build software. Everything gets broken down and coded into a set of criteria that must be satisfied. With the help of CI, it means you will never build flakey code. It might be buggy, if you don't consider a test case that you should, then of course you will miss that functionality or that particular edge case, but at least it gives you consistency.
Full-time freelancing
At this point in my developer journey, I had become a generalist full-stack developer. This is a role I wouldn't really suggest anybody to aim for since it makes you a jack of all trades, rather than being an expert in any one particular area. If I have one general regret from my career so far, it's that I didn't try hard enough to specialise earlier on. My next role allowed me to do that, and it also pushed me to go freelance full-time, something I hadn't considered at all before then. A recruiter from an agency was hiring Ruby developers for Deliveroo, and it seemed like a good idea to apply. I wasn't actively looking to move on from my job, but the contractor rate was much higher than my salary and I also thought it would be a big plus to have a name like Deliveroo on my CV. I applied and after a technical round, which I passed, all that remained was a chat with an Engineering Manager. It was quite a relaxed conversation and we just discussed how I work in a team, and those sort of soft skills than I presume most developers have gained after 5 years working professionally.
I started with Deliveroo and was put onto their Geosharding project, a project that spanned basically the entire tech team and required partial rewrites of all services. Deliveroo is a huge company by my standards and with dozens or maybe even hundreds of services, this project was a big one. To give a brief summary, our main task was to switch from interger IDs (i.e. 1, 2, 3, etc) to a string ID which contained information about what kind of resource it was, which country it was from and then a unique ID (we used UUID for this). Making this change took well over a year and I'm not sure what the result of that project was since it was ongoing when I switched to another project.
The other project was focussed on improving the performance of the database, which was under threat of crashing at peak times because of the huge amount of data that was being stored and retrieved. After some attempts to improve query performance, reduce writes to the main database and generally just reduce the load, the team ended up working on another project, which was to take 3 core tables from the database, and put them in a secondary database, which would also be connected to the application. This was quite a fun project, and I learnt a lot about how Rails connects to Postgres databases, and quite a bit about the theory of setting up a database.
My contract with Deliveroo was limited to 12 months, and before the end I had managed to secure a contract with a VR company in Munich that started as my Deliveroo contract ended. So, at the start of July 2022, I began working with holoride. Here I worked with Ruby, React, Next and a bit of Elixir/Phoenix, which was a great challenge but also very interesting.
That contract was once again limited and at the end of January 2023 I left holoride with nothing to do. I thought briefly about taking some time off to rest and to work on some side projects, but just a few days after finishing my contract, I interviewed for a role via Toptal and landed it, so I began working on a greenfield booking and scheduling project, where I was the only developer. Unfortunately, the client wasn't very experienced with working with tech teams or tech people and his expectations were far too ambitious for what he wanted to build, so at the end of March 2023 our work together came to an end and we parted ways.