How I got started as a software developer
June 9th 2020
I started working as a 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, so I thought I'd document my process here.
This blog post was originally going to be a short explanation of 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 to program 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 to 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.
Over the coming months, I continued going through freeCodeCamp's curriculum, 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 putting 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 a lot, and I mean a lot, 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 coming 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 from the beginning of 2018 until April 2019.
Back to programming regularly
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 a burst of productivity followed by months of nothing. It was only towards the end of the contract at the 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 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 a 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 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 solid 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 javascript.info did an excellent job to help drill home the nitty and gritty parts of JavaScript, such as closures, prototypal inheritance and promises. I highly, highly rate javascript.info 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 as asking for advice when I went to meetup events. I learnt a lot 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 I was 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 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 in 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 weaknesses 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 also seems to be very popular). The instructor had an excellent approach to teaching where he'd show possible/suboptimal solutions and then lead you to best practices and why they work well.
This course completely and utterly humbled me. 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 (it turns out React has a good page on it!) Clearly, there were gaps in my knowledge, and I 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 of which came in November. The offers were for two completely different styles 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 follow up, 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 fortunate 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 and 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 a lot of time - including the time for feedback from friends, family and rewriting drafts. You could argue you might be better served using that time actually to 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 a developer wearing a hoodie who's programming alone in a dark room with lots of 0s and 1s 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, quality assurance 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 gotten a job has had their own trials and tribulations. I had quite a lot of luck to get here, and there are many things you could critique me on - one of those being consistency!
Working as a developer has been a fantastic experience so far, and I'm happy 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.