A group of junior front-end developers from @theJustProjects(opens in new tab) was trying to recreate my website as a way to exercise their skills. They came to me and asked me to give them a few pointers on how to get better. In this article, I've given my approach to learning and growing in the software field.
offsetLeft(opens in new tab), I wanted to animate the text, so I learned about
setInterval(opens in new tab) as well.
Little by little, I wanted to add more stuff. At some point, I decided to make a game out of it. Text comes from the right side of the screen and goes left. When you type the text, you push it to the right. Your goal is to type fast enough, so that you finish the entire text before it reaches the left side of the screen. Once I had the idea, I started researching on how to build it. The result was Typegame(opens in new tab), my first ever project.
Apart from the book I've mentioned, I didn't have anything else development related. I didn't go to webinars and conferences, I didn't go through any free or paid courses either. I'm not saying those things are bad or that they couldn't help. I'm merely saying that they're not required. Everything I've learned is a result of curiosity and persistence, all by myself.
Unlike other jobs, like a lawyer or a surgeon, all you need to become a software engineer is an internet connection. This is especially true for web developers, because what we're building is the internet. All the information you need is already out there, provided for free. You just need to look for it.
With that said, I'll share what I think are some of the most important concepts for learning.
Always doubt yourself. But not in the bad way - don't doubt your abilities. Doubt your knowledge. Always assume that you may not know something, or that you are wrong. If something isn't working right, don't blame the thing, and don't blame yourself either. Blame your missing knowledge about the thing. Remember:
If something's wrong, you probably don't know enough about the problem. So you need to ask yourself questions. By asking questions and searching, you're going to find information. Then, you need to connect that information with what you already know, in order to form knowledge. Then, with that new knowledge, you go back and ask better questions.
Learn what's a debugger(opens in new tab) and how to use it, if you haven't already done so. It allows you to stop your program during its execution, giving you the ability to inspect what values your variables currently have and to step through your code line by line. With that, you can easily figure out what happens with your program and therefore what doesn't work as expected.
I must admit that I only started using debuggers just a couple of years ago. For a long time I only used just logging (e.g. with
console.log(opens in new tab)). I still frequently use it, because it can be quicker and easier, but you should definitely learn about debuggers. There are situations where they can save you a lot of headaches, especially for tougher problems.
But it doesn't matter if you use a debugger, write logs, or search on Google. Ask questions, find information, form knowledge, then ask more questions. What does that variable hold? What does this function do? When does the
if condition pass? Don't make assumptions. Make sure you know what's going on.
Also, when something does work and you don't know why, it's equally important to figure out what happens as it is when it doesn't work. Your primary goal may be to make the code function correctly, but an even bigger goal for you personally is to learn. So if you don't understand something, make sure you dig into it, even if it works, and ask questions the smart way(opens in new tab).
Logic before code
When you want to solve a problem, you don't start with the code. First you need to figure out what your approach would be. You need to familiarize yourself with the problem.
Imagine that I want to break your password. I could try "1234", "12345678", "password", but assuming you have a decent password, that won't be it. Then, I could start trying each possible combination, for example "a", "b", "c", then "aa", "ab", "ac", and so on. This is called brute-forcing(opens in new tab) and is very inefficient. A far better approach would be to shift my focus away from the password and onto you. What's your date of birth, your pet's name, your favorite ice cream flavor, etc. It's very likely that you've used one of those in your password.
Similarly, in software, you need to focus on the problem first, not the code. Think of how you would solve the problem in plain English. For example, "I'll get all elements X on the page, when the user does Y, I'll do Z with some of the elements." If you can't explain your solution in plain English, how do you expect to do it in code?
When you start with the code, you not only have to think about the problem, but the constraints and syntax of the programming language as well. By doing this, you box yourself and limit your problem solving ability. When guessing and blindly spewing random lines of code, in the hopes that they would somehow work, you're wasting time. Even if you manage to piece up something, you probably won't know how or why it works. You won't learn anything and you won't make progress.
One of the tricky features of my blog are the line numbers (to the left of this text), because I wanted them to also be clickable anchors to parts of the content. While working on them, I spent the majority of the time not writing code, but just staring at my screen and thinking. Once I had loaded up the problem in my head, I would even go in front of the window or lay on the couch, staring at the ceiling and thinking.
When you've thought of a way to solve the problem in the abstract sense, you just need to translate it into code. Sure, you might not know how to do something, but at least you know what you have to do. You've got the grounds for asking questions and learning!
On a side note, because I mentioned passwords earlier, the best way to deal with them is to have them randomly generated and stored in a password manager, instead of you having to remember all of them and therefore picking weak ones. I use Bitwarden(opens in new tab). It's free and works perfectly. Also, set up two-factor authentication(opens in new tab) for your accounts, whenever possible.
Don't get emotional
In the beginning, I didn't understand much and it was hard when something didn't work. I would get mad at my computer for not doing what I wanted it to. I've broken several keyboards and mice. I've cried a lot as well…
You need to understand that frustration is a part of the process, and you need to learn how to handle it. Getting angry never helps. In fact, it makes things worse, because you're not thinking clearly and you start missing very obvious things.
Computers can't just randomly do whatever they want. There were many times where I'd think that something makes no sense completely and my computer was just joking with me. But I've always ended up finding out that there was a logical explanation after all. Remember that even the most random things have a very concrete reason for happening. Always!
I've had numerous occasions where I'd spend an entire day banging my head against the wall, only to solve the problem in a few minutes the next morning. Sometimes, the solution even hits me when I'm under the shower or while commuting.
When you feel stressed, angry, frustrated, disappointed, or in any way uncomfortable, take a break. Have a glass of water, go for a walk outside, take a nap. Take your mind off the problem. When you get some rest, your perspective changes and you start seeing details and patterns to which you was previously blind.
That's why building projects is important. You'll find unknown things and you'll study them not just for the sake of "becoming better", but because you need them. Then, you can connect them with what came before and what'll come after. At the end, you would've not only learned new skills, but you would've also made something fun or useful.
Think of something you'd enjoy making and just make it.
Take care of yourself
Software development is all about thinking and solving problems, so a very determining factor is your mental health. But because you're sitting all day, taking good care of your physical health also becomes important.
Make sure you sleep well. Sleep is the most important thing. It's essential for countless vital processes in your body. It gives you the mental clarity needed for programming and improves your mood, which is important because getting emotional is not productive, as I've already said. I try to sleep from 11PM to about 7AM and avoid alarms. The "Huberman Lab Podcast" has good advice on sleep(opens in new tab) that I follow.
Make sure you eat well. Avoid processed foods, sugar, and coke. I've found that a ketogenic diet works best for me. It keeps hunger away for longer than usual and helps me think clearly, because I can focus on what I'm actually doing, not on food. "What I've Learned" on YouTube has great material about keto(opens in new tab). More specifically, I follow these nutrition guidelines(opens in new tab), made by the personal trainers I go to over at Spider Sport(opens in new tab).
Make sure you work out. Sitting a lot leads to shortening and tightening of the muscles, which ruins your posture, among many other things. Find a workout program you like or even a personal trainer and try to avoid muscle imbalances. Don't forget to stretch and get massages every now and then. I also use a foam roller(opens in new tab) after a long day to relax and reduce the tension.
Make sure you take your mind off programming. Have a hobby that really demands your attention and sucks you out of your everyday life. For me, that's salsa dancing, folklore dancing(opens in new tab), b-boying(opens in new tab), and occasionally karting too. Find your own thing. It doesn't matter what it is, it just has to make you smile.
Learning is about asking questions and turning information into knowledge. It's about thinking and solving problems first, not writing lines of code. It's about resisting frustration and understanding that it's part of the learning process. Finally, it's about building things and overcoming the challenges you face along the way, while balancing that with taking care of yourself.
It was hard for me in the beginning, because I learned those things the hard way. I didn't have a mentor who would tell me what to do. I had to figure it all out by myself. Other people might have a different approach, but that's what has worked for me and continues to help me grow.
I don't have talent. I just persistently followed these rules and taught myself everything, with the help of the endless ocean of information on the web. If I can do it, you can do it too.