What Does "Learn to Code" Actually Mean?
Tags: learning, codenewbie, beginners, webdev
Published: 2021-07-06 15:17:01

Over the years, the phrase "learn to code" has gained a lot of popularity, most notoriously as a sort of cheeky suggestion to throw at folks that aren't happy with their job. However, I can't count the number of times I've been approached personally for sincere advice on "learning computer coding" or the number of times I see something related asked about in a group on social media where I feel compelled to give advice. This post intends to shed some light on if this path is right for you, how to actually get started and how deep you may need to go, and to share some of my opinions around job prospects throughout the post.

## Let's get some confusing terminology out of the way
A mini glossary for those new to software and web application terminologies:
- **front-end (FE)**: encompasses user interfaces and actions associated with user interactions with your software; in web applications, it's code that is ran by the web browser/client; the "presentation layer"
- **back-end (BE)**: encompasses what the user doesn't see like handling data storage and processing logic; in web applications, it's code that is ran by the server; the "data access layer"
- **full-stack** (not typically an acronym): both the FE and BE, though it's common for a full-stack engineer to be stronger in one or the other

The following are my own hot takes/**my opinions** as some may disagree with my definitions, but they reflect what I've come to understand and describe how I will be using certain terms throughout this blog post:
- **web developer**: someone that works on developing basic websites. HTML and CSS are required as well as typically basic JavaScript.
- **software**: a very broad term to encapsulate applications, scripts, services, and programs that run and interact together on a device. Oftentimes it is the end product of the front-end and back-end pieces working and packaged together. "Software" can mean desktop software, mobile software, software for the web, and others.
- **web application**: software that runs on a web server
- **software engineer**: someone that develops software. Requires programming, working with data, making architectural decisions, and a much deeper understanding of a number of concepts depending on the nature of the software and the role while working on it. A software engineer for the web may refer to themselves as a programmer, web developer, software engineer, or some combination of these descriptors.

To give a brief history of my journey to help spotlight any biases I may have, I'm a full-stack software engineer currently working on web applications and I've always gravitated towards the front-end. I taught myself HTML and CSS around the age of 13, I went to college for IT and computer science, and then I attended a coding bootcamp after college because I struggled to get my foot in the door and knew there was more to learn. I've freelanced, I've worked my way up from an internship to staff level, and I've conducted and been part of dozens of interviews.

While I believe many different folks can gain some value out of this post, as you read, keep in mind that it's geared towards web development and web engineering, especially for those getting started in the front-end, and know that my personal experiences have influenced my perspective and opinions.

## Is coding right for you?

First and foremost, coding is not for everyone. Stolen from [TechCrunch's "Please don't learn to code](https://techcrunch.com/2016/05/10/please-dont-learn-to-code/)", the article states (emphasis mine):
> Don’t get me wrong; I do believe that engineering and programming are important skills. But only in the right context, and only *for the type of person willing to put in the necessary blood, sweat and tears to succeed.* The same could be said of many other skills. I would no more urge everyone to learn to program than I would urge everyone to learn to plumb.

... however, while an apt warning, it shouldn't serve to intimidate you. In fact, if you have any interest in learning, I believe it's worth putting in the time to explore because of the vast free resources available and otherwise, you'll never know; you could get lucky and fall in love with it or at the very least, find it interesting enough to pursue long-term in a career switch.

It's worth noting, though, that some people oversimplify and underestimate what it actually takes to make it in this industry - they mostly see dollar signs and think since you can "teach yourself," they just have to grin and bear through a couple hundred hours of learning before they're set when the reality of the journey is much longer and arduous. There is a lot of competition for these jobs and in my opinion, if money is your sole motivator, you're not going to make it very far in the industry.

Coding may be right for you if:
- coding genuinely seems interesting to you
- you can and are willing to make the time needed to learn
- you enjoy learning and challenging yourself at work
- you don't mind a 9-5 desk job and can stare at a screen all day
- you communicate or can learn how to communicate well through written word
- bonus: there's a particular software idea or site that you want to work on (makes it easier to learn!)

To conquer initial hurdles, the first two points probably carry the most weight. While you don't have to "love" coding (especially at first!) and consequently later, your job, to succeed in this industry, it can make an enormous difference in many ways. If you enjoy it at least somewhat, it'll make the journey feel less uphill, it can make solving bugs you run into exhilarating and carry you into the next thing, you may feel inspired to work late on a personal project because you're actually enjoying it, and excitement for software translates very well in job interviews. With that said, though, if you're just beginning this quest, do try to ask yourself periodically if this career path is right for you, but also keep in mind that initially, learning these things is probably not going to feel very "fun".

In fact, expect to feel overwhelmed because the amount of stuff out there is, well, overwhelming. Understand and try to not be discouraged by the fact that learning in the computer science and coding realm is an extremely layered experience. Concepts overlap and build on top of one another and you have to put in the time needed to gain the experience and familiarity with each layer. It does get easier, but it takes time. (By the way, the layers never stop growing. That's where the "you enjoy learning" point comes into play.) 

![tree rings showing "you" at the center](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rn22xod1hrvq1dif9kqg.png)

It's nearly impossible to guestimate the number of hours you'll need to put in because it depends on how quickly you can learn, how you learn, what approach you take while learning, how relevant what you've learned pertains to the roles you're applying for, and even a little bit of luck around what jobs are available, who you know, and how competitive the market is. Since I attended a coding bootcamp after college and personally know some folks that were hired out of them without prior experience, it may be a good minimum baseline - my bootcamp was 13 weeks long at around 60-70 hours/week. If we take the lower end and estimate 80% of that time to account for breaks and other factors, we're still sitting at more than 620 hours for learning how to work on web applications with teachers working directly with us... and bootcamps serve as a good foundation and take you through a lot in a short period of time, but you barely scratch the surface. My bootcamp also had a dedicated resource to help with career outcomes and many did not go on to a dev job after completing it due to competition in the market. I mention this not to discourage, but to be transparent about the journey in front of you. However, **if you prioritize success and truly want to succeed, you will.**

## Enough of your ranting, what and how should I learn?

You've probably seen this list before, but there's several ways to learn "how to code":
- Teaching yourself
- Attending a code bootcamp
- Obtaining a related degree

While I won't get into the nitty gritty of the options as it could be worth a post of its own, my opinion is that you should try to teach yourself before attending a bootcamp or opting for a degree to make sure it's something you're truly interested in before shelling out the time and financial commitment. If you're in high school or college now and can earn a degree without going into much debt, I would still recommend a degree as I do believe a computer science or related degree is still valuable to obtain (plus, it can make you stand out), but I also think if you want to learn web applications, you'll have to work on side projects because from what I've seen, CS degrees don't tend to apply software engineering to the web very well. If you learn significantly better in a classroom setting but are struggling on your own, can afford it, and don't mind not receiving a degree for it, a bootcamp could be a solid choice for you. Though, based on my experience, you need to have some prior experience to excel in programs that fast-paced. The rest of this post will focus on teaching yourself.

No matter what method is right for you, at the core of it, you should be emphasizing *project-based learning*. There is nothing more dull and uninspiring than working through 100 isolated JavaScript problems where it's not only easy to hit a wall and feel frustrated or bored, but it's also easy to procrastinate and to allow doubt and sense of being overwhelmed creep in. While it's necessary to work through some problems or puzzles when you're learning the basics, project-based learning lets you gain experience with concepts and connect some of those dots together, allows you to work with certain libraries or frameworks directly, debug on a "real" project, and gives you projects for your resume.

One reason "teaching yourself" is so difficult is because you don't know what or how to learn. This is the happy path that I would suggest to get you to that first project:

1. Pick a path by selecting the language(s), libraries etc. that will lead you to the job you want (more on this next)
2. Learn the basics through free YouTube videos and other free sources like blog posts or [MDN](https://developer.mozilla.org/en-US/docs/Learn), try [Codecademy](https://www.codecademy.com), and/or a "basics" course on [Udemy](https://www.udemy.com/) for around $10 
  - Note that you should not just watch videos or read docs. Get your environment set up and run exactly the same code that they are and/or work on isolated problems in something like [replit](https://replit.com/). It may take you two hours to work through 20 minutes, but that just means you're doing it right. I like [VSCode](https://code.visualstudio.com/), by the way.
3. Take those basics and do something fun with them that will help you dive deeper into understanding the language, like using free resources to find a tutorial for building something that seems interesting, such as building out an entire web page with HTML and CSS and/or [Wes Bos' 30 days of JS](https://javascript30.com/)
4. Build something more complex, like using [React](https://reactjs.org/) for a to-do application and then hooking up a server to persist the data in a database like [mongoDB](https://www.mongodb.com/), which will probably entail a lot more use of free resources or even another Udemy course to help you come up with an idea and fill in the gaps
5. Come up with your own project. Build and deploy it!

### ...But I still don't know what to pick🤔

**Another disclaimer \o/** - tech stack choices tend to depend on the type of software being built, there's not a blanket stack that just works universally. With that being said, my suggestions are based on what I think will be the most straightforward for folks to start with, what I've enjoyed working with, and what I've seen in the industry. This is also pretty basic and non-expansive and I expect others may disagree with some of it.

If you're not really interested in programming but you think learning basic webdev seems interesting, know first and foremost that competition for the kind of jobs you want to go after is likely going to be tremendous and that you'll reach the pay ceiling fairly quickly. However, it can open the door for you if you're interested in front-end engineering, designing, or some sort of entry-level tech job, like a basic website admin or hybrid junior job where your responsibility is low but you wear a few different hats like content writing as well (though, there's much more direct things to study if you want to pursue designing or content writing). If this interests you, you can start with HTML and CSS and ease your way into SCSS and JavaScript.

If you're interested in front-end engineering, you'll want to know HTML and CSS basics. When you start working with front-end libraries or frameworks though, know that you basically don't write HTML or CSS anymore, you write things that get compiled into HTML and CSS ([SCSS](https://sass-lang.com/) is great to have in your arsenal). I'd start with basic vanilla JS to understand how it works, and then move on to a front-end library like [React](https://reactjs.org/docs/create-a-new-react-app.html) to put it together. You'll also want to learn git/GitHub and basic terminal commands.

If you're interested in the back-end, you've got a lot more language options. If you think you may be interested in the full-stack or just working with JS on the server-side, I'd recommend learning JavaScript so you can learn one language and work with [NodeJS](http://nodejs.org/) and a web framework like [ExpressJS](https://expressjs.com/). If you think working with data/data scientists or AI, or machine learning is interesting, you may want to consider learning [Python](https://www.python.org/). There are other completely valid languages to learn like PHP for Wordpress, which is common for freelance work, Ruby, Java, Go, C++, C#, or Rust depending on the kind of project you want to build and what platform you're building for (the web, mobile apps, a gaming console, etc.). Regardless, you'll also want to learn git/GitHub and terminal commands.

Some other things that would benefit you to read/learn about:
* JSON, REST APIs, and CRUD apps; TypeScript (if interested in JS)
* For the FE: best accessibility practices, best or common state management practices
* For the BE: types of databases and choosing one to work with, authentication

To help you plan out your self-taught curriculum or if you're still not sure what you're interested in, try searching for jobs on Indeed or LinkedIn with various terms like "web developer," "back end engineer," "javascript engineer", or "UI developer," even other related jobs like "dev ops," "data analyst," "game developer," or "cyber security" to get an idea of what's out there in tech, and find job listings you'd love to be qualified for later. Make note of the tech and skills they're asking for as those patterns will help you make your own roadmap (or select a bootcamp).

Speaking of roadmaps, definitely [check out this fantastic web developer roadmap](https://github.com/kamranahmedse/developer-roadmap). Though, be sure to check out their "Note to Beginners."

Although I've mentioned it several times in this post already, as one recommendation I will emphasize again, especially if you're still not sure what to pick, is to learn JavaScript. JS is incredibly versatile as it is used in the FE, can be used in the BE, and even has some cross-over with mobile apps with libraries like [React Native](https://reactnative.dev/) and desktop apps with [Electron](https://www.electronjs.org/). It can be a great first language to choose since you can do so many different things with it without having to juggle two languages at once.

## Conclusion & Resources

While coding is not for everyone, if you love to learn and find the concept of it genuinely interesting, it may be something great and fruitful for you to pursue. Expect to dedicate a lot of time - probably significantly more than you think or plan to - to hone your craft. It can be intimidating and overwhelming, but try to remember that old saying about Rome not being built in a day. It can all begin for you by taking that first step and can be so, so worth it. ❤️

* [MDN](https://developer.mozilla.org) - for learning and language references
* [replit](https://replit.com/) - an in-browser IDE that you can use to isolate problems and learn language basics
* [Udemy](udemy.com) or [Codecademy](codecademy.com) - offers free or low cost deep-dive courses
* [codepen.io](https://codepen.io/) - practice your HTML, CSS, and JS in a sandbox, or browse codepens for inspiration
* [StackOverflow](https://stackoverflow.com/) - a community you can go to find answers for specific questions or ask your own
* [FunFunFunction](https://www.youtube.com/channel/UCO1cgjhGzsSYb1rsB4bFe4Q) - a YouTube channel that does a fantastic job at explaining complex JS topics. Though they're one of my favorites, the channel is not currently active. Check out YouTube and other YT channels for other free tutorials
* [hackMD](https://hackmd.io/) - I didn't go over Markdown (MD) files in this post, but MD is a lightweight markup language and the defacto standard for developer READMEs; HackMD is a nice tool worth sharing for document collaboration and to see how MD works