Tips on becoming a self-taught developer
Tags: career, javascript, webdev, programming
Published: 2022-08-29 18:38:36

Almost 8 years ago I've decided to make a career switch, learn to program, and become a professional software developer. Even though it was the goal, I still didn't believe that I'd manage to get a full-time job in a field I knew close to nothing about. Fast-forward a year and a few months, and I was working as a junior web developer at a local startup. Currently, I'm a senior software engineer, something I couldn't even dream about when starting my coding journey.

Lately, I have been asked increasingly often for some tips on how to become a self-taught developer, so I thought I'd write a post about it, reflecting on my experience and pointing out the things I'd do differently.

In this article, I'll try to give general advice on how to improve for those considering or maybe already on the way to becoming self-taught software developers. It should be noted that the focus of the post is on front-end development since that's what I did, however, a majority of the advice can be applied to becoming a software engineer irrespective of focus.

The post is structured as a list of bullet points. Although I did try to put the points in order, following them strictly is not necessary. I'm just talking about my personal experience, it may (and should) be different for everyone depending on learning preferences and other factors.

### Start writing code as soon as you can
Learning to code was my New Year's resolution. However, I haven't written that many lines of code for a few months, until I started building my first app. Instead, I've spent that time reading various programming books, trying to build up enough theoretical knowledge. Eventually, when I thought I was ready to make the first simple app and set out to write it, I realized I had no idea how to do it. All that theoretical knowledge about a programming language that seemed to be solid while reading the books, seemingly evaporated when it was about to be applied in practice. The thing is, it's easy to feel like you know enough when learning a new topic, just to see that knowledge falling short in practice. It's really hard to internalize all that new data just by reading it, it needs to be practiced. Additionally, theoretical foundation books usually outline the specifics of a language, without teaching how to piece different parts of it together to build an app. Therefore, my advice here is to start writing code as soon as you got the basics of a language down. It doesn't need to be a full-blown app either, one of my first projects was a simple function that solved quadratic equations (it's way simpler than it may sound). And if you're struggling to start writing code, you may find the next point helpful.

### Study the code of an existing project
It's quite normal to struggle with writing a few first apps or websites after doing a bunch of courses or reading some programming books. In that case, I'd recommend finding a ready project on the same topic and seeing how the parts you're having issues with were implemented there. That's what I did when I set out to make a quiz app, where users would select an answer to a question and receive a score in the end. Nothing fancy, but I still struggled to figure out how to combine all the pieces. I found the code for an app that did the same things I wanted to do, and followed it along, incorporating some pieces into my app. Ultimately I've got my app working and as a bonus, understood better how to change the content on the screen and use some CSS transitions.

### Use online interactive resources
Another great resource for learning programming is online interactive learning courses. They are great for practicing coding skills, particularly for beginners, who might not know where to start or lack structure in their studies. The best thing is that you can learn and apply the new skills at the same time while receiving immediate feedback on your progress. I went through [Codecademy](https://www.codecademy.com/) and [freeCodeCamp](https://www.freecodecamp.org/) courses, which since then have both substantially expanded and received new content. I particularly liked freeCodeCamp because each module has a list of projects to make, which is a great way to build up a portfolio, especially if you're having trouble deciding what to build. On top of that, finishing all projects in a module awards a certificate of completion, which is a good addition to your CV.


### Learn HTML and CSS fundamentals - build a portfolio website
If you're aiming to become a front-end developer, knowing HTML and CSS is a must. Website markup and styling are integral parts of any user-facing web application. You don't need to master all the topics but should know enough to make a basic website. I would even argue that the first project you build should be a portfolio website, which doesn't require any JavaScript. It can be as simple as just one page that has screenshots for each project with a link to both the project and its underlying code (don't worry that you don't have any projects yet, they will come in a due course). It is also pretty easy to host a static website on something like Github pages. Building a portfolio website has two important benefits. Firstly, it's a good way to practice HTML and CSS. Secondly, it's one of the best ways to showcase your knowledge without having any practical experience. That's how I got my first full-time software development job - I've sent the link to my Github profile and my portfolio site together with my CV. At the interview, we discussed some projects in the portfolio, and a few days later I received a job offer, no whiteboard interview or live pair programming was required. If you're just entering the field of software engineering and have no working experience to show, having a nice portfolio of projects is an invaluable way for getting a job.


### Learn CS fundamentals
I would say it's not mandatory for a front-end developer to have a deep theoretical knowledge of computer science, however, having a grasp of its fundamentals is quite beneficial for the expansion of the ways of thinking and increasing coding proficiency. To get some basic insights into computer science I took highly-acclaimed Harvard's [CS50 course](https://www.edx.org/course/introduction-computer-science-harvardx-cs50x), which gets a strong recommendation from me. The course is a great introduction to programming concepts and brings familiarity with a few programming languages (back when I took it the web part was taught in PHP but has since then been swapped to JavaScript, which is even better). The course has weekly assignments (some of them can be quite challenging) so there's plenty of practice to supplement the lectures and reading resources.


### Join a group or community with the same goals / Get a mentor
Eventually learning to code can start feeling a bit lonely if you have no one to discuss your progress or share the new knowledge with. Additionally, anyone would benefit from quick informal feedback if they're struggling with some concepts. That's where learning communities/groups of interests come in. Discussing the issues you've encountered or solutions to them is a great way to reinforce your knowledge and broaden it. Luckily there's no shortage of communities for new code learners nowadays. I used to hang out in the IRC channel for the #learnvasasctipt subreddit, however, it's not that active anymore. A few communities I've heard good things about are [CodeNewbie](https://www.codenewbie.org/) and [freeCodeCamp's forum](https://forum.freecodecamp.org/).

### Make coding a habit (at least an hour per day)
While all the points mentioned before are important in some way, the most important one by far is making coding a habit. Moreover, for the best result, it has to be a **daily** habit, and I cannot stress that enough. Ultimately it's way better to spend one hour every day writing code than doing a ten-hour coding session once a week. Even as a professional who writes code for a living almost daily, it usually takes me some time to get familiar again with the code I wrote a few weeks ago if I wasn't actively working on it recently. It may seem like everything is clear and you'll easily get back to the code you wrote a week ago, but the reality is that our brains don't work like that. I cannot count the number of times I looked at some of my old code and was trying to figure out how it works. It applies even more to the new learners. You may have all the coding concepts and relevant knowledge in your head when writing a particular piece of code, but it will not get easily internalized unless it's done at constant short intervals. [James Clear](https://jamesclear.com/) has written a lot of content about making lasting habits, which in itself is quite a fascinating topic.

### Try coding challenges
If you want to add a bit of gamification to the learning process, coding challenges could be a good option. I used and can recommend [Codewars](https://www.codewars.com/) - it has a large number of challenges in different programming languages. They also vary in the degree of difficulty, so anyone can find a kata (that's what a challenge is called) that suits their level. There's also a progression system that makes solving challenges a bit more engaging. The variety of challenges is indeed great, but I find the website more useful to practice some fundamental coding concepts in a new language or to get a hang of some new syntax.

### Read programming books
I've mentioned earlier that one of the mistakes I made at the beginning of my learning journey is putting too much emphasis on reading instead of actively coding. This doesn't mean that reading coding books is useless in any way. Quite on the contrary, it is a great way to get a solid, in-depth knowledge of programming concepts. The best way is a combination of reading and coding. I usually pick up a book after trying a new concept/language. For example, I have started writing some simple Go code. After doing that for a bit, I got a Go programming book, which helped me solidify and deepen my existing knowledge.

### Write blog posts
It may sound strange at first, but one of the best ways to learn a topic is to start teaching it. Writing a blog post or an article is one example of teaching, although I didn't think about it in this way until my first post. Turns out, the amount of research and getting to the bottom of how things work is quite impressive when working on an article. As writers, we want to make sure that we fully understand the content covered. As an example, I was writing a post about testing a pretty simple React component. Initially, I thought it'll be quick work to write it up, however, once I got to the task, I realized that I should also be able to explain the reasoning behind my choices, how is one approach different from another, their pros and cons, and so on. This in turn led me to realize that I do not have a full grasp of the ins and outs of everything I was trying to write about, forcing me to go deep into documentation and look for examples of best practices. As a result, I have substantially improved my knowledge of testing React components and was able to share it with others. You don't need to be an expert on a subject to write, the best way to start is to make a quick write-up of a newly learned concept. Additionally, websites like [dev.to](https://dev.to/) make it extremely easy to publish, so there's no need to set up own blog or anything like that. It can also be done in a form of a learning diary and doesn't need to be shared publicly if that's not your thing.

### Get good foundations instead of going straight for frameworks
I'm doing a fair amount of technical interviews at my current job and one thing I've noticed is that a lot of developers, even at a senior level, do not have a solid grasp of the main JavaScript concepts. This is because a lot of them jump straight into using frameworks without getting to a good level of the underlying language. Again, you don't need to be a JavaScript guru before picking up a framework, but if you've been working with React for a while but still cannot explain what a Promise is, something is wrong there. It is a good idea to learn enough of the language to be effective with its frameworks before jumping into frameworks themselves, especially if you are a beginner.

### Try answering questions on Stack Overflow
This is more of an optional recommendation and for a bit more advanced learners, but I have personally got a good value from answering questions on Stack Overflow. I mostly answer React or JavaScript-related questions, and it helped me to better understand what concepts developers struggle with most (e.g. there used to be a lot of confusion related to the React hooks when they were introduced) and get better at those concepts myself. Additionally, it's pretty nice to be able to help someone solve the issues with their code. Stack Overflow might be quite intimidating for beginners, in which case one option would be just to try to answer some questions without actually posting an answer.

### Stay focused
Programming is a very broad topic and even if you study something more specific, like front-end development, the number of things to learn can be quite overwhelming. Here I'd recommend creating and following a roadmap, without sidetracking from it. I remember when I was learning JavaScript, I discovered so many other things I wanted to learn about (e.g. NodeJS, animations with GSAP) and eventually ended up spending a few weeks on a MongoDB course. The course turned out to be quite challenging as I didn't have that good knowledge level at the time. On top of that, I haven't worked with MongoDB since then. Although it was interesting to get familiar with non-relational databases, in hindsight I'd be better off spending that time on improving my JS knowledge, before moving on to databases. Keeping focused on a specific topic and not letting yourself be distracted when there are so many interesting things to learn is quite important at the beginning. Also learning those other topics will be easier when you've gotten the basics nailed down. 

### Conclusion 
Aspiring software engineers find themselves in quite a privileged position when learning programming as it can be done without a university degree and there are plenty of free resources online. However, this creates issues on its own, such as were to begin, how to stay on track and what to learn. In this post I tried to briefly describe my experience and the choices I've made with a hope to make it at least that bit easier fo those considering getting into the field.