Mo Jama

How I got started as a software developer

June 9th 2020

I started working as software developer back in November 2019, just over half a year ago. I'm completely self-taught; no computer science degree and no bootcamp. Finding a job without any professional experience was quite the challenge and so I thought I'd document my process here.

This blog post was originally going to be a short explanation on how my job search went. However, I think writing about what came beforehand gives better context for some of the decisions I made.

Learning about software development

I started learning with Python back in early 2017 when a friend recommended the book Automate the Boring Stuff with Python. At the time I was living in Japan as an assistant language teacher on the JET Programme. I had no prior experience with programming whatsoever aside from a few commands in the terminal I used to tweak some of my computer settings.

The book was exactly the kind of thing I was looking for; a gentle introduction into programming and writing programs that had real practical use cases. I am the kind of person who loves to fiddle around with settings in the software I use - the book spoke to that part of my personality. I went through just over half the book and did the exercises before finding out about freeCodeCamp.

freeCodeCamp was the start of my interest in web development, and where I first started to consider it as a career option. I was much more engaged with freeCodeCamp than I had been with Python, right from the get-go. It was satisfying seeing how the code I wrote would immediately cause changes on the page. Another thing I loved about freeCodeCamp was the lessons taking place in its own sandboxed environment with tests - no set up needed so I could do a few lessons during my lunch breaks without having to bring in my own laptop.

I continued going through freeCodeCamp's curriculum over the coming months; chipping away until I got to the section on building front end projects. The big issue I was facing was that I had no idea how to build a project. I knew how to reverse a string and filter through an array of data but I had no idea how to put what I learnt into practice. This seems to be a common thing for self-taught developers; you'll often see it being called "Tutorial Hell".

Eventually I managed to create these projects by searching how to implement their most basic features. For example for a weather app I'd ask:

  • How can I get a user's current location?
  • Where can I get weather icons for each weather state?
  • How can I get only the weather data like temperature, current weather?

This method served me pretty well. I'd search the web for how to accomplish something, read articles, see how it's been implemented and try to do it myself. It's a simplification of course, I had to read alot and I mean alot to get my head around certain things like using APIs but I think it worked out well.

Taking a break

I moved back to London after 3 years in Japan at the beginning of September 2017. I searched for roles towards the end of my time in Japan and also for a while after come back but it was pretty obvious that I didn't have the knowledge employers were looking for. Also I had other more important things to worry about so I decided to take another job and put the web development job search on hold.

That pause lasted about from the beginning of 2018 until April 2019.

Back to programming on a regular basis

Up until April 2019 I tried here and there to continue working on web development via some Udemy courses and freeCodeCamp. I just didn't have the determination and discipline to follow through with it - I'd have burst of productivity followed by months of nothing. It was only towards the end of the contract at my previous role that I started to think more seriously about what I wanted to do in the future. I kept coming back to the same answer; I wanted to be a software developer.

I decided from then that I would make it my goal in 6 months time to be good enough at software development that I could apply for some jobs and get an interview for an entry-level role. Not that I would become a software developer (I can't control someone offering me a job) but good enough at software development where I'd be invited for interviews. It might sound silly but that framing of 'apply to at least 10 software developer jobs' vs 'be a software developer' was critical for me; I felt I had more control in the situation.

During that time I was in the fortunate enough position to be living at home and contributing little towards rent/utilities using my savings. I had a plan - I was going to be treating learning about software development as if it were my full-time job.

The first few weeks were pretty slow. I bought a Udemy course on Web Development and started going through it alongside filling my gaps. I still had some lingering HTML, CSS and JavaScript knowledge but I definitely needed a refresher. I wasn't particularly productive at the time and was getting frustrated with my progress. My confidence was low.

Things started to change after I met other self-taught developers. At Silicon Milkroundabout, a job fair for tech professionals in London in late April I met a friendly guy, E. He gave me tons of great advice about steps I could take like building various of mini-projects and having something to show to employers - anything small but something I built myself. More than anything he gave me confidence that it was possible to be completely self-taught and have success. A few weeks later I went to a freeCodeCamp London event and heard the same from other developers who self-taught; they assured me that my plan was achievable. My confidence was going up. I met another aspiring developer called R. He would become a study partner of mine; we shared tips, ideas and resources and met up to work on our projects. R was a great influence on me - he had a very strong work ethic and was very good at keeping me accountable.

Getting there

I was starting to see some improvements. I spent more time focusing on JavaScript and how it works. The site did a really good job to help drill home the nitty and gritty parts of JavaScript such as closures, prototypal inheritance and promises. I highly, highly rate for anyone who wants to get a solid understanding of how JavaScript works. The more difficult concepts are explained in a very simple to understand fashion, with enormous depth in content. It's free and open source too so if there's something you feel can be improved you have the power to change it.

Once I had a firmer grasp of JavaScript I picked up React, a popular JavaScript library used to build many websites. Most companies seeking web developers were looking for knowledge with React (they still are, alongside many other great libraries/frameworks like Vue). I used React to create a Pokedex app, which took data from the PokeAPI. Here's an old version, and a more recent version - both versions don't use the PokeAPI anymore.

I remember struggling quite a bit with it. There were React concepts I thought I understood but I actually didn't (state and lifecycle events, especially with class-based components). The only way I thought to overcome this was to continue reading articles, documentation and StackOverflow posts, as well asking for advice when I went to meetup events. I learnt alot from doing that project and actually did a short presentation at freeCodeCamp London about it and some of the things I learned - one of them being you know something is definitely wrong when your relatively simple site loads 10MB of data...

The Job Hunt

I created a few side projects that was I relatively proud of and added them to my portfolio on my old site. I thought this would be a good time to start looking for jobs and evaluating my skill level. I applied for 2 roles, which were part of an apprenticeship scheme specifically for aimed at entry-level developers. There was some early success; I passed the initial application and phone screens for both of them and was onsite for the final stage. This all happened within the month of July. I didn't get those two roles and was rejected for both within the space of two days.

It was a tough couple of days. Going onsite, getting a feeling for a company and meeting people who could potentially be your coworkers - you start to imagine what it would be like to work there. I took a few days to mull over some of the reasons why I didn't get those roles. I thought I presented myself well and I could connect well with my interviewers so I didn't think my soft skills were the issue.

Being honest with myself, the lack of knowledge was definitely the reason I was rejected - no real two ways about it. I struggled with some of the questions during the onsite technical test. I had regrets about how I phrased certain things and was perhaps too hasty when it came to presenting solutions. I had to admit it - I wasn't good enough for those roles. That same week I sat down and wrote up some of my weakness and ways I could solve them. For the gaps in my knowledge that I could see, I wrote down a list of courses and books that could help fill those gaps.

A few weeks after I came across Full Stack Open 2019 and decided to take it. It would be an understatement to say this course is the reason I could finally start understanding how React worked. Pretty much right away you can tell from the content, exercises and the way the course was structured that it was a well-thought out one. Reviews were very high for it and it was developed by the University of Helsinki (their Java Programming course seems to also be very popular). The instructor had a very good approach to teaching where he'd show possible/suboptimal solutions and then lead you to best-practices and why they work well.

I was completely and utterly humbled by this course. I thought I knew React well enough to get an entry-level position - that sure wasn't the case! Heck, I could barely explain what happens when you access a webpage. I remember being almost dumbfounded by the fact I didn't understand how passing functions to components as props worked (turns out React has a good page on it!) Clearly there were gaps in my knowledge and had them in droves. Luckily I had this course to patch those gaps.

It was September. I spent my days doing Fullstack Open in the morning and job searching in the afternoon. I felt much more disciplined at the point - I'd do something code related every single day. During the evenings I'd go to tech events in London such as freeCodeCamp London and other JavaScript related events to meet others and see what's happening in the field. It was kind of a reward as well as a way to keep socially active.

For the job search itself I mostly used Indeed. While I found their default search average at best, their advanced search is very good. You can filter out terms from titles such as "senior", entire phrases from descriptions, job posting dates and much more. This type of search (Boolean search) is super powerful and saved me a ton of time trawling through roles I knew didn't suit me. I made a spreadsheet with all the roles I was applying for together with the stage in the application, company type, job specification etc. I targeted companies that promoted a positive working environment that fosters learning and growth. I figured I'd have more success with companies that seemed willing to mentor their more junior members of staff.

Altogether since starting the job hunt, including the two apprenticeship style jobs I spoke about earlier, I applied for 13 roles and got 2 job offers, both which came in November. The offers were for completely different style of companies - one is a very small agency and the other is a much larger organization; this is where I currently work now. Most companies didn't respond, some companies responded initially but then didn't followup and some rejected me outright. I applied for the first two back at the end of June and started with the others at the end of August/beginning of September.

Takeaways from the job search

It goes without saying that I feel extremely lucky to be found a developer role with relatively few applications. I heard from others who applied to more than 50, sometimes more than 100 companies before getting a role.

I think one reason I got responses back was that I spent time writing personalized cover letters to each company I was applying to, emphasizing my passion for programming and interest in developing my skills further, as well as showing I was interested in their company. The odds are stacked against you when you don't have commercial experience, but writing a cover letter that gives insight into who you are as a person can go some ways into mitigating those odds.

Now, some would say that a cover letter is a waste of time, and yes, writing them does take alot of time - including the time for feedback from friends, family and rewriting drafts. You could argue you might be better served using that time to actually code something. However I still think it's worth it. Alison Green from the site, Ask a Manager, has some fantastic advice on writing better cover letters. This paragraph says it all:

For employers, picking the best candidate for the job isn’t just about skills and experience. If it were, they wouldn’t ask for cover letters at all — hell, we might not even need interviews. We could just hire based on resumes alone. But of course, other things matter, too — things like personal traits, work habits, communication skills, people skills, intelligence, drive, and enthusiasm for the job. That’s where your cover letter comes in. It’s supposed to give a window into these things.

Software development is a field where you need great communication and people skills, contrary to stereotype you see of developers programming alone in a dark room with lots of 1s and 0s glaring on their screen. You need to be able to explain your thought process as well as complex technical ideas to your peers - you're building a product in collaboration with many different people (product owners, user experience designers, QA engineers etc.)

A cover letter is a good way of demonstrating these things - it shows employers you are someone they can work with.

Closing thoughts

What worked for me won't necessarily work for everyone and indeed, everyone who has a job had their own trials and tribulations. This was my approach and while you could critique alot, it worked out well for me.

Working as a developer has been a fantastic experience so far and I'm really glad I tried to become one. I've learnt so much in the past few months and been lucky enough to work with some really great colleagues. Writing this post and looking back, it's hard to believe how much I've progressed when I compare myself to this time last year. I'll keep trucking along so I can hopefully say the same next year.