2022 January 20

How To Start a Career in Programming


I hesitate to tell others I am a programmer. I think the job title gets glamorized. The truth is it can be tedious, frustrating, even sometimes lonely. Not only that, but I can tell it's glamorized because 3 out of 5 people who ask me about it will also ask, “I want to get into it, how do I start?”

I can't give a clear answer for you. Hopefully, after reading this, you'll be able to get an idea how to jump into programming but more importantly if it's even a right fit for you.

If someone is sincere and truly wants my help to start a career in software development, without hesitation, I will do what I can to aid them in their journey. Let's be real, life is already hard enough as it is, so shouldn't we try to make things easier for each other?

Motivation + Intention

It all starts with motivation and how strong the motivation is. You really want to learn programming, but you might not know what exactly you want to help program. It's a big world and there are so many paths you can take.

I can only speak for Front End development, but even within this area alone - you can dive deep into web development, ecommerce, mobile, desktop, etc. You can be as specialized or as general as you wish to be. But there needs to be an intention in place before you decide on something - in other words, there needs to be a need rather than a want.

'Need' vs 'Need to Use'

A really silly example, but go with me on this:

Say we live in a world where desks don't exist yet. Everyone has been on the floor since the dawn of time. An idea comes to mind: 'wouldn't it be nice to bring things closer to us as we sit or stand?'

The idea is fuzzy at first, but a seed has been planted and the more you think on it, you think of all the possibilities that you're eager to try out. Along the way to making desks a reality, you introduce tools and resources into your process to reach your goal: a hammer, some nails, wood… voilà, you invented the desk!

What I'm trying to get at is this, if you only make programming your main goal that's like obsessing over the hammer and nails and not about considering its usefulness. Programming is an amazing skill but so is painting, or writing, or carpentry.

We need ideas, and only need to use tools to make those ideas come to life. If you have some ideas already, how necessary is it to be a programmer to achieve them?

Maybe...

  • the more you think about it, you might come to find out that programming is only a distraction, and you could channel your energy elsewhere.

  • your goal is you just want to make a sH!t tON oF mONneY, and you think programming is going to get you there. I would argue that there are better methods toward getting rich. (perhaps I'm different, but money doesn't motivate me to want to continue programming)

  • because it's cool to say that you are one. I hope this isn't you, but get ready to be humbled because you're going to soon realize how much you don't know.

Or actually, after much consideration, achieving your goal DOES involve programming. It could be you have an idea for a mobile app no one hasn't thought of yet. Or someone has already, and you would like to join them to make it even better!

If your motivations and intentions are aligned AND programming hasn't been ruled out, then you're off to a good start.

Degrees, Bootcamps, & Self-Taught

“Let's Go to School!”

With school, I imagine you get exposed to what's out there and the years of training to be “job-ready”. You get a nice degree behind your name, which grants you a competitive edge when it comes to interviewing for a job you want. It will be noticable how much more polished when compared to someone like me (self-taught), in how you explain complex problems along with a deep well of information you can pull out of your back pocket at any given time.

Here's the issue, though:

  • It costs a lot of money
  • It will take you at least 3-4 years of your time (if you can dedicate your entire life to school without needing to work)
  • Maybe you graduate and find out you hate it.

Or worse, you graduate and don't remember anything. Yikes…

But if you can afford school, and you are quite serious about this, I would say this will greatly improve your chances for success.

Join a Bootcamp

I know a few devs who have enrolled in bootcamps and have given me mixed feelings on whether it was the right decision or not.

Yeah, it's considerably less time than it is to earn a degree (3 months vs 3 years) but it can be expensive, and it might not make you “job-ready”. You just have to be careful.

There are also a few bootcamps out there that will ask you for a cut of your salary when you do land your first job too, so you have to ask yourself, “is this worth the risk?”

I'm not going to say anymore because I didn't go this route. I recommend you do your research, and if it turns out to be a good thing for you, great!

Self-Taught

This is by far the most chaotic way to go.

For starters, you're responsible for your progress, and you're taking a gamble on what you should be teaching yourself.

There is the temptation of buying tutorials: newline, egghead, codecademy, udemy, coursea, etc. You could potentially purchase a crappy tutorial where you could have found online for free on YouTube. Or worse, you never go through the tutorial at all! Or you are building projects from tutorials that aren't good. This is what a lot of us like to call, “tutorial-hell”. Many people get stuck down there and eventually give up.

Tips for Self-Taught

I'll share a secret with you: start working on your ideas now!

Go back to the dumb desk story, work towards what needs to be done and this will inform you what needs to be learned.

If you're stuck, read the documentation, watch YouTube. If you have to, buy a tutorial related to the problems you would like to solve. You don't need tutorials, but you may need to use them.

As I'm writing this I have been mostly working as a Front End Web Developer, so for me Scrimba was an excellent resource, but it wasn't my first go-to. It was only there for me when I absolutely needed to use it. But also there's freeCodeCamp that has a TON of quality videos available for how much? It's free, duh!

Here's another tip, you're never going to be “job-ready” so start applying as soon as you have a decent foundation. Get your flippin' foot in the door!

Only apply to and accept jobs you can actually see yourself in. Also try not to be so desperate, eventually you're going to land on something. A good company will be patient and train you because no one is 100% productive right on the spot. They are investing in you, and you are investing in them as well - just make sure that always stays mutual, and that one party is not exploiting the other.

Here are three things I look for now in an ideal job, starting with the highest priority to the lowest:

  1. Culture - is there training available? Are they kind to each other? Is there a good work-life balance? Do they love animals? How goofy can we allow ourselves to be? Is there accountability and self-ownership? Are people passionate about their work? Are people honest with each other? Do people like each other? How diverse is it? (no more toxic tech bros, pls)

  2. Benefits - 401K, health insurance, PTO, etc.

  3. Salary - does the pay match up to what I am responsible for?

It's possible that your first job will be what a Junior makes, but it should definitely pay higher than a barista (speaking from experience). I hope for you, you will be making more than what I made at my first job. What matters is you're getting paid to learn. You're also getting exposed to what it's like to work as a programmer, and learning how to work with others (Congratulations, you just began your career. Keep going!)

Impostor Syndrome

There's this little devil in your head, that strangely has the same voice as you, constantly telling you that you should just give up already because you're never going to make it. Ugh it's so rude, can't it never say anything positive for once!

This is the critical side of ourselves that we will always have to battle against. The truth is we need this part of ourselves. It helps us keep ourselves in check to know where we should improve, but we should never let it define who we are.

The more you learn, the more you grow as a programmer/person, the less authority this voice will have over you. Go walk to a mirror and smile at yourself, verbally say something nice you actually like about you. Ask your friend what they like about you. Find a community online! Do what you need to to counteract the negativity.

Press-on to prove that voice wrong! You got this.

What to Learn First

Like I said, it's a big world out there. I would say focus on what you could “specialize” in first. Be really good at that, then over time you will quickly pick up on other skills.

If you're going to learn Back End, spend time learning how to build servers and managing databases, and avoid building/styling a website (you can always go back to learn these at a later time).

How I got into Front End development was a rabbit-hole. A client would ask, “can you design a website?”, then “can you build a website?”, and eventually, “can you add related products as a carousel at the bottom of the product details page?”

Learn what you need to use at that moment, one step at a time.

What Kind of Programmer?

There are too many possible roles in the tech industry to list, but for Web this is a general view of how to look at where you want to go and what it could require from you:

  • Web Design - graphic design experience (principles of design), solid foundation of Adobe Creative Suite, UX/UI, HTML, CSS, possibly a little bit JavaScript (not required), understanding responsive design, understands accessibility standards. (I was only a Web Designer for a short amount of time, until I wanted more)

  • Front End Developer - (works on the front facing/client-side user experience of the web) HTML, CSS, JavaScript, PHP (not always), familiar with one or more modern frameworks (Vue, React, Angular), skilled at responive design, implements web designs on app/site, meets accessibility, SEO, and performance standards (aka lighthouse), works with Back End devs to setup services (authentication, APIs, deployment, etc.)... basically anything related to a site or application that's their responsibility

  • Back End Developer - (handles & secures all of the services and data for an app or site, on the server-side) C#, PHP, Java (languages tend to vary), builds deploys and maintains servers, API development, controls and secures access to databases (SQL, MongoDB, etc.), deployment, etc. I actually admire anyone who works as a Back End because these are people who really know the internet well and teach me what NOT to do. It also seems like they are skilled at Front End (or at least are capable of doing it), but they just prefer not to.

  • Full Stack - (jack of all trades) this is someone who is “ambidextrous” as in they excel both in Front End & Back End. However, it's likely they are slightly better at (or prefer) one over the other. So it could be someone who has been a Back End developer entering into Front End development or vice versa. Depending on where you start, client-side or server-side, you don't have to be stuck doing just one. Some people think this is “stupid”, but I just ignore that kind of pessimism because this where I want to be. How I see it, there is a gap in communication between the two that can be filled by a highly skilled Full Stack developer. I do think that it's good to be first specialized and stay up to date in one area before taking on more.

There are other things like cyber security, cloud computing, machine learning, AI, game development, AR, VR, data science, etc. The list goes on and on. Some of these will require at least a bachelor's degree in Computer Science if not a master's, but some don't require this and you can jump into it now if you wanted.

Languages & Development Tools

Don't choose a Language, let the language choose you.

I quickly learned that there is a difference between Java and JavaScript. So, the need to build a specific project informed what I would be using - which is why JavaScript became the winner.

Don't listen to people who compare tools and languages and claim one thing is superior to another. Use what you need to use. Just get familiar with certain terms if you're going to decide on Front End:

  • Language - (Java, JavaScript, Python, C, etc.) you're a human who thinks and speaks like a human should. The machine thinks and speaks in 1's and 0's. A programming language is sort of like a translator/interpreter where the humans and machines can speak to one another.

  • Library - (Lodash, AnimeJS, DayJS, D3, etc.) it's basically a set of useful additions that were programmed by someone else. jQuery is a good example where it introduced DOM manipulation that vanilla JavaScript was severely lacking in not so long ago.

  • Framework - (React, Vue, Angular, Svelte, etc.) this is more like a blueprint, or rather an opinionated way of building something. Sure you can build a site in just HTML, CSS, and JavaScript without one of these but a framework has a lot to offer that can make your code more organized, efficient, and scalable.

  • API - (Application Programming Interface) in a nutshell, it's a channel for connecting with and requesting data from the server. There's an excellent reddit thread that that helped me understand this better.

As a metaphor think of programs like cooking. At home if you want to make some spaghetti you just take the ingredients out the cupboard, fire up the stove and make it yourself. This is a program doing something on its own with its own resources. But say you want pizza - you don't have the ingredients and your home oven isn't really that suited for making a nice crispy crust. So you go to a pizza place instead. But unlike at home you can't just go into the kitchen and start using their ingredients to make a pizza. They don't want your grubby hands all over their stuff. You have to go to the counter and make an order - there will be a menu listing what pizzas you can order and what toppings or other options you can pick. This is an API.

Explain Like I'm Five: What is an API?

As a Front End Developer, this is what I use daily (if you don't understand what these mean, it's okay - you will in time):

  • Text Editor - I use VS Code that has IntelliSense for checking my logic, especially while writing in TypeScript.

  • Browsers - Firefox, Chrome, and Safari (yes all three) - developing for web must meet the standards of all popular browsers currently out there and each of them have their own JavaScript engines. In other words, a feature might work in Firefox and Chrome, but breaks in Safari.

  • Browser Development tools - getting to know the already built-in dev tools provided by each browser is essential and really does make your life a lot easier. So get to know them.

  • Documentation - I promise you, if you get used to reading docs you will find an answer much faster, google less, not depend on Stack Overflow, and prevent bugs. I keep two tabs open on my browser. A tab open for the documentation for a specific framework/library (VueJS, Nuxt, Tailwind, etc.) Another tab for MDN - this is pretty much my bible, and I am so so so grateful for it. It is documentation for many things Front End including JavaScript, CSS, and HTML.

  • NodeJS - taken from Chrome's V8 JavaScript engine, it's called a “runtime environment”. Basically, it means you can run JavaScript without the need of a browser. Because of this, there are a ton of possibilities, such changing the way we work on projects locally, writing automations for work purposes, and creating entire servers built by JavaScript, etc.

  • Mobile Devices - I still own an iPhone 6S, which is great for me to know that if the features I write work on this device, then I'm doing it right. I occasionally steal my partner's 11 Pro as well. If you have a MacBook, you can actually plug in your iPhone and open Safari to debug on the desktop. Super useful. I also test with Android Studio as well.

  • Communication App - each company I have worked for used Slack, and what more can I say? It's good, it does what it needs to do.

  • Project management Software - I have been using Notion a lot more, and I love with how flexible it can be. I have used Asana for a long time, and it's pretty good. I have used Jira - it's not my favorite, but I recognize that it's needed for large corporations.

  • Misc Tools - not required

    • Fiddler Everywhere - proxy software. We would use this a lot at one of my previous jobs. It's also really useful for when you want to redirect URLs or resources to local files on your machine. Not required though.

    • Postman - software for working with APIs, it also makes it easier documenting them.

    • Git Management Software such as GitTower - this is a git management software that helps me not lose my mind while working with others on a repository. GitHub Desktop is a free alternative, and it's pretty solid.

    • More than one monitor - when I first started, I was working on my old 13-inch MacBook (which I still use!) These days, I work on a Framework laptop, and extend my display to two additional monitors. It sounds ridiculous, but it's lovely to have when you use so many things.

Interviewing

Interviews are tough. In my experience, they all have been different - which really sucks! I would go into an interview where there was no technical part, but also one where it was nothing but technical questions. Some of these technical questions will be what you will find on LeetCode, but others are designed to intentionally stump you. If you haven't been programming for a while or don't have a degree, I'm not going to sugar coat it, it will make you feel like you're not smart enough (one interview made me cry). But that's your impostor syndrome talking, don't listen to it! You ARE smart enough.

I wish I had more advice than this, but all I can say is take deep breaths, research the job you want, and do your best. I promise you're going to find something. Don't give up on yourself!

Working with Others

It is highly recommended that you learn Git and save your projects on GitHub as it can become your portfolio. Git is version control for code, it also enables a development team to write code together without stepping on each other's toes (as much). I would recommend gaining a decent foundation in learning the basics: pull, push, fetch, merge, checkout, pull requests, and branch management. It will start to come together when you actually have a team you're working with who uses git properly. Managing branches is an art. Atlassian is a great resource on best practices.

It also should go without saying, but I unfortunately need to say it... be a good person, which includes the following:

  • If you don't know something, admit it. All of us are always learning.

  • Keep your promises. If you say you're going to work on something, follow through. Even if you thought you would get it done but are stuck, let your team know and have something to show them so they can help you. It's okay! Lean on your team.

  • If you're stuck on something, exhaust your resources before you ask someone by reading the documentation and/or googling it first. (Sometimes walking away from your desk helps)

  • Don't hand off your responsibilities onto others because you don't feel like it. If you do that, you're a jerk. But also, you're only hurting yourself because you're not learning.

  • Keep your appointments and be on time. Occasionally, we have our head down and forget the time, it happens. But if you consistently miss meetings, or don't communicate what is going on, you are disrespecting others' time.

  • Don't claim other's work as your own. (I mean c'mon, simply looking at git history will be pretty obvious who did what)

  • Don't lie. If you tell the truth even when it's difficult, you'll be surprised how forgiving your teammates can be.

  • Encourage your teammates instead of breaking them down, try to see the best in others even if they are being stubborn.

  • Be kind! Laugh about things, be vulnerable, care about people. Learn what your teammates like and don't like and work from that.

  • Work through disagreement and move forward with a solution together.

  • Trust your teammates, and know all of you just want to build awesome things together!

That's what I got so far. I really hope this helps at least one person out there. I wish everyone to be as successful as possible!

Copyright © 2022. Jake Wantulok