I’ve always loved to learn. I want to know what makes the world work and why. There are so many interesting and beautiful things in our universe: Music, Language, Mathematics, Spacetime.. And I've wanted to learn about all of them! Well, now I’m in my 30s and I can say that I have, in fact, learned about all of them. Well, not everything about all of them… but I have spent a considerable amount of time learning about each one, and most of what I know I have learned on my own.
For the past year and a half, I have been dedicating my time to being a self-taught Software Engineer. I left my job as a high school computer science and mathematics teacher here in NYC to pursue a change and start a new career. After teaching people how to learn for many years, and teaching myself as well, I wanted to share some strategies I’ve used that have helped me be more efficient and productive as a self-learner. I know some of this information may seem intuitive, and most of it should, but I’ve realized sometimes you just need to hear someone else say it.
I've found that a lot of the skills I've learned as a teacher have been transferable to being a software developer. From understanding how to manage your time appropriately, to being able to plan out projects and ideas, or being consistent with your work, most, if not all of these skills I've had to use somewhere in my teaching career and I'm using them again now in my journey to become a software developer.
One of the most important concepts I’ve realized about learning something new is that time is your best friend. We need time to retain the information we’re trying to learn and ultimately be able to recall it. As we learn new concepts or ideas, new connections between neurons in our brain are being formed. Every time we reinforce our learning (reread a concept, practice more code, watch another tutorial, etc), these connections get stronger and the impulses sent become more and more efficient. Compound this effect with a healthy diet, lots of sleep, and – you guessed it – plenty of time! And before you know it, you’ll have learned something new.
Take a moment and think to yourself about something you’ve learned in the past: riding a bike, tying your shoe, learning to drive, etc. Were you able to do it perfectly on your first try? For most of us the answer is most likely no. Learning how to be a developer is no different. I’ve seen many people (including myself) start to learn a new topic and think: “I’m never going to understand this,” or “It’s just too difficult!”. That’s okay! It’s okay that it’s difficult. It’s okay that you don’t understand it. I promise you that if you go into it with an open mind, a positive attitude, and just give it some time, it’ll click. Pieces will start to come together, ideas will start to make sense, and you’ll even start to remember how to do different tasks – It’s really quite amazing.
If you combine time with being consistent, you can be unstoppable. Okay, maybe not unstoppable, but you can definitely accomplish a lot; I can attest to this first hand. Over the years, I’ve taught myself how to play several instruments, how to speak two foreign languages, and now, I'm teaching myself to become a developer. Any of you who have learned a new skill can attest to how much practice is required to improve that skill. You wouldn’t expect to become a professional athlete by skipping practice, the same goes for becoming a professional developer – you have to show up, and you have to put in the work.
When we are consistent, we allow ourselves to create good habits. We reinforce these good habits by doing them over and over, allowing them to become part of our daily or weekly routine; after a couple of weeks, it doesn't really feel that difficult anymore. It's sort of like going to the gym – it's really tough to motivate yourself at first, but you always feel great after going and eventually you don't know how you lived without it. Sometimes we fall off the wagon, and that's okay too! Don't beat yourself up, just get back on.
Planning – here’s a tool I wish I had learned earlier in life. I didn’t fully realize the benefits of planning until probably half way through college; and what a game-changer! Who knew that if you took some time, brainstormed, and then organized yourself, it would make a task that much easier. Taking a project and breaking it into small, achievable steps, will really help you feel like your goal is attainable.
Let’s say your goal is to build a blog site (or whatever the project is you want to build). How would you go about it? Sure, you could sit at your desk and just start hacking away at it, but this can easily start to feel overwhelming. You may not know where to start, or which order to build your components in, and ultimately, avoid doing the task all together.
Here are some steps to help you alleviate this. On your current or next project, I want you to try the following:
- Open up a Google Doc (or ToDoIst, or some other equivalent note taking app)
Write out an overview of what your project or task will entail – small paragraphs or bullet points are fine. For example:
- Bullet Points
There is something so satisfying about crossing a task off a to-do list. You feel like you’ve accomplished something and it's very motivating. By breaking your project down into small steps, all you have to do is open your computer and just do the first one – and there you go!, you’ve accomplished part of your project. Now, do the next small step, then rinse and repeat. When you come back to work on your project the next time, you can pick up right where you left off. Also, you will be able to see exactly what you have done already, reflect on how that went, make adjustments if needed, then keep moving down the list.
Ok, so we’ve set out a couple weeks/months (years?) to learn a new skill, we’re ready to be consistent, and we’ve planned out all the steps that we need to do for our project – now what? Well, when exactly are we going to do all of these things? Three times a week? Every other Tuesday?.. We need to make a schedule for ourselves. Making a schedule can have a variety of formats depending on how much structure you want/need to have.
If you need a lot of structure, an agenda can be very useful (See example below). This type of format ensures that you spend a certain amount of time on each task. Also, it’s rigid, much like if you were in university or high school – you know exactly where you need to be and when you need to be there. Of course, you can always allow for some flexibility and give yourself a couple minutes or so on either end of any of the time blocks.
If you don’t need as much structure, you can try creating daily goals. This strategy definitely requires a bit more discipline and time management skills. For my personality and needs, I find that this strategy works best for me and I typically create 3 - 5 goals per day. I usually start on the most difficult one first and continue working my way down the list from there; following with the next most difficult, etc. Depending on what you have going on that day, it’s easy to rearrange the order in which you complete the tasks. Maybe you knock out 3 of them right away, creating a sense of accomplishment so you can start your day feeling good. Then, you're able to spend the rest of the day working on the bigger tasks knowing that that’s all you have to do the remainder of the day. There is a lot of flexibility and freedom to be had here, so play around with it and get them all done!
Now it’s time to roll up your sleeves and get your hands dirty. You know exactly what you’re going to do, how you’re going to do it, and when you’re going to get it done – it’s time to start learning and time to start coding!
I really want to emphasize the importance of just opening up your IDE of choice and Start. Building. Something. I can’t express enough how important this part is; I will admit, however, it did take me a little while to realize this. One of the more difficult parts about learning on your own is that you don’t have anyone guiding you, telling you when it’s time to move to the next step or that you're going in the right direction. And it's easy to fall into the trap of watching tutorial after tutorial, or reading book after book. While these things are very useful, and I still use them, the amount I’ve learned from actually building applications, and more importantly making mistakes on them, far exceeds what a tutorial has taught me. I know you’ve probably heard this from everyone because I have too. Now, I believe them, and I hope I can stress the importance to you as well.
Also, don't be afraid to start over or backtrack in your project via Git (and commit often!). While it may seem like a waste of time, all you're really doing is reinforcing what you've learned already and allowing yourself to see where you've made a mistake. I have definitely gotten stuck in a project before because I was "just trying to get it done" instead of actually taking the time to understand what I was working on, only to find out when I ran my code that there was some error and I couldn't figure out why. Had I taken my time, ran and tested my code more periodically, and committed more frequently, I would have spotted my mistake and wouldn't have needed to start my project over. It was unfortunate, but I did learn a lot in the process.
There are so many great resources out there – free and paid. Most of the information you can get for next to nothing, if not completely free; however, it's important to do your research on each of the resources and understand if it's worth your time and money. Chances are that someone has reviewed this resource you're interested in on one of the many forums that exist today. Take some time to understand what each one offers first and try to make an informed decision. That being said, I wanted to share some resources that I've been using to help me learn on my own:
- Most of us have heard about this site. They always have sales, just be patient and you will find it. Or create a new account because it seems that they are always offering cheap courses for new users.
- Also this Instructor Stephen Grider for learning React. He's very smart and teaches well.
- I've also taken a couple of courses in Portuguese. I've been learning Portuguese so it helped me immerse myself and learn some new skills. For those of you who are interested, I really like this teacher Leonardo Leitão. Very easy to follow, explains very well, moves at a good pace.
- EdX was where I first learned how to code. I took an MIT course for intro to Comp Sci in Python. I've taken parts of other courses there, but this one is the one that stuck out to me. If you're just beginning, I definitely recommend it.
- Coursera is great too. You can audit the courses and get all the information for free, you just can't do any of the assignments or quizzes unless you pay for the class. I've also taken parts of a few different courses here. But, I did complete one of their specializations which I thought was awesome. Built some interesting projects, made some games, and most importantly learned a lot!
- I feel like now-a-days people don't like to use books to learn. I, however, find books to be invaluable, especially as a reference. You can usually find PDFs of books online if you look hard enough. But when I find a book that I think is really useful, I'm happy to buy it to contribute to the author. Here's a couple books I've read and used so far:
Documentation for the Technology
- Sometimes these are difficult to read, but being able to understand them and utilize them is a vital skill of being a developer.
- Often the solution you need is in the technologies documentation, written in a very formal manner. If you have trouble understanding it, look at one of the many forums.
- I use this forum almost daily, maybe even hourly. Another invaluable resource. A community of learners helping each other completely for free. When you get better, you can contribute as well.
- Almost any time you google a question, chances are someone has probably asked that question already on Stack Overflow and people have responded and posted solutions.
Other Developer's Blogs
- Just as you're reading this article, I have done the same with other developer's blogs and will continue to do so. I've learned that there is a whole big community of developers out there willing to share what they've learned and most of it is completely free.
Geeks for Geeks
- I use them often as well. They have a lot of good explanations with examples for basic coding concepts.
- My partner taught me this phrase and I think it is hilarious. It basically means scouring through the internet until you find a solution. When in doubt, Google it. If you can't find it on one of the previously mentioned sites, there is probably another site that has answered the question somewhere.
- Documentation for the Technology