3/2/2022
Considerations
The target audience for this intro roadmap is really folks who are just starting on their software journey. Maybe you've learned a couple of HTML elements, maybe you've written a couple javascript scripts, or maybe you have no idea what code even is. In one of the upcoming entries I will give you an opinionated setup to help you go from 0-100.
There are a ton of paths you can take to get started. Some people have an easier time if they spend a couple months just learning a single programming language up front. And some people find success by just diving in, learning the core, web tech (HTML/CSS/JavaScript) and just building their first small app. With my mentees the latter has been extremly effective.
Before you dive in I have a couple of thoughts I want to share about things that have nothing to do with specific technical skills. These are things which will either help measure your chances of success along this learning path, or ways to think about what it is you're doing that help differentiate you from the other tens of millions of people that learned javascript.
Be Aware of my Biases
I just want to take a moment to call out my own biases. It's hard to always be aware of all the ways in which you have biases. For example, in the environment setup article I am going to prescribe you a unix environment. Whether that be MacOS, Linux, or WSL on windows. I will justify that choice fully in the article, but the quick justification is: in my experience, when you get a job doing programming stuff, the company will hand you a macbook day 1. Unix skills will be expected, and the more familiar you are with Unix, the better. A large majority of the web software in the world is deployed to linux servers.
Personally I think this is more than enough reason to use unix over doing something on native windows, for example. By no means, however, is this any sort of evidence that the windows ecosystem has less value. There are tons of engineers that use windows tools like C#/.net (yes, I know they are now cross-platform as well) or things like VS Code, and host their apps on IIS or Azure. It's totally a valid ecosystem and if that's something you enjoy doing you should keep doing it.
I don't want you to get caught up on this particular point. The takeaway here is not "use unix", the takeaway here is "question everything I say, because I am a human being and inherently flawed/biased." While I have a ton of experience and can help you cut through a lot of the noise and bullshit, you still have to take my opinions as biased and potentially flawed. I can never tell you the best or most perfect way to do something, and expecting me to be perfect is unfair to me.
Time and energy
Learning a new skill is challenging. Programming is no different, and building apps is a time consuming pursuit. If you're just beginning your journey, you really need to be writing as much code as you possibly can. It doesn't matter what the code is for, every line brings you closer and closer to mastery. In all reality coding and, more importantly, app development, is a finite set of concerns. Every single thing you learn and master decreases the list of things you still need to learn. You could argue that the list is also filling as the industry grows and new tools/methodogologies pop up.
I really can't stress this enough. Your success metric here should be "I am putting as much time and energy as humanly possible into coding and building apps." It really depends on your goals, but I'm writing this content for the people whose goals look something like the following:
- Learn how to build apps
- Become valuable to the job market and get a position as a SWE
This stuff works in the same way as compound interest. You want to front load as much as energy/learning as possible. If you're anything like me, you will go through cycles. Sometimes you will have a ton of energy and passion for software stuff, and sometimes you will have zero. You should aim to maximize youre upcycles so that your downcycles aren't as punishing. If you half ass your upcycle, your downcycle with feel extra awful. But if you cram a massive amount of learning and progress into 3 months, taking the next 3 months off to play video games becuase you burnt out won't feel quite as awful
Ultimately you know what works for you. After working with people starting at ground zero, I just really feel that I cannot stress enough how much time and energy this is going to take you. Take it seriously and you will succeed. Treat it like a secondary concern, and you will feel the pain of that over time.
Text Editing is a skill
It's worth noting that this whole section is one of these cases where I'm extremely biased and opinonated.
As long as the human race sees value in the written word, your ability to edit text quickly and efficiently will be valuable to you. I know a ton of very intelligent and successful senior level engineers who believe that text editing, your keyboard setup, etc., are not important aspects of your journey. I very strongly beleive they are wrong. I had this intuition for a long time after learning vim and later switching to use QMK-based keyboards. You should absolutely take your text editing ability seriously.
I am more confident about this now than ever after watching my newby students struggle to move around in their text editor. I 100% do not care what tools you use, but whatever you decide to use, you should take that shit seriously. Put consistent time and energy into mastering your toolset. In fact this may honestly be the most important thing I can teach you. Back in the day I was always switching IDEs and text editors and using the new greatest and latest thing. Programming langugaes come and go, but text editing has always been a ubiquitous part of software work. Explore the landscape of tools, pick something, and works towards mastering it. I've decided that I'm going to use Emacs with EVIL mode until I'm dead, and I mean that very seriously. I do not and will never need anything else. Work towards mastery.
It took me a decade of professional work before I realized how important it was for me to take notes. As someone with severe ADHD my brain has a ton of trouble remembering all the context from one day to the next. I can draw a line to the exact point of my career where I had the biggest level up as a professional, and it correlates 100% with my decision to be extremely serious about taking notes. I take notes for every meeting I have, every idea that pops up, every small thing I agree to. When I come across something neat in a code base or learn a new thing, I take a note about it. I can search those notes later using a bunch of different tools.
Generalism over Specialism
Some people know very early on what they want to do. "I want to build phone apps." "I want to make games." The software industry heavily values generalists in the current era. Specialists have their place as well, and once you hit a certain point in your career, you will spend a lot of time thinking about the paths ahead of you. Right now I heavily recommend that you do not focus on this type of thing. Don't worry about the specific programming language or framework you are using. Your goal is to build apps, and that is a discipline which is orthogonal to the technical skillset you use to build any one app. You can build great apps with React, SwiftUI, and even raw assembly (at least, probably. I don't actually know tbh). At the end of the day, building a web app in the javascript ecosystem requires almost entirely the same skillset as building a windows desktop app using C#/.net tools.
Getting stuck on some particular tool and evangelizing it doesn't help you. Discussing the merits of python vs javascript is a waste of your time right now. After all, they are both turing complete languages. They are just interfaces into the current state of your ideas about how a system should function. Your ability to have good ideas to translate into these languages is far more important than the acutal translation process. As you grow and learn more languages you will have strong opinions about things like static typing or whatever, and that's totally fine. But you will also be developing your "idea brain" in tandem with your "translation brain."
Just use the thing that helps you do whatever it is you're trying to accomplish. Right now you are probably just trying to get the biggest bang for your buck in terms of which platform to learn, which is why I start my students with building javascript apps. I'll justify this more thoroughly in my post about the web platform itself.
Ask me questions on twitter or email me at ty@tytr.dev