A few weeks ago I was contacted by a follower (Andre) who said he really likes the content I’ve been putting out and that he would love to hear more about how I taught myself to program.
When I began writing this post, I started by compiling a list of resources I used when I was learning— links, books, general advice, tips and tricks, etc. — but I soon realized that there are already hundreds of posts online just like the one I was writing. That’s when I had the idea to share a more personal story of how I taught myself to program.
This post might not be exactly what Andre was hoping for, but I still think it provides a lot of value because it focuses on how and why I taught myself to program instead of the what I used.
If you don’t have time to read the entire article, you can skip to the end where I outline my top 5 lessons. They will still make sense if you don’t read the story, but they will be more powerful and meaningful if you do.
I’ll be the first to admit that I didn’t have a lot going for myself in high school. I grew up playing sports and dedicating a lot of time, effort, and emotion into excelling as an athlete, but when I entered high school I realized that I probably wasn’t destined to become a professional athlete.
So I quit football and basketball and decided to focus on my studies. Well, that’s what I told myself and everyone else, but really I decided to focus on playing video games.
I was probably like a lot of 14-year-old boys — I was awkward, pimply, quiet, and had a crush on one of the prettiest girls in my grade. I liked the idea of doing well in school and getting into a great college, but 99 times out of 100 I found myself playing video games from the moment I got home until I went to bed while neglecting even the notion of doing homework.
The one thing I’ve always known I wanted to do is own my own business. Neither of my parents went to college. They had me when they were 21 while my Dad was working as a laborer pouring concrete for peoples’ patios and driveways.
Over the years my Dad, Grandpa, and Uncle have built my Dad’s work pouring concrete by hand into a large construction company located in Denver, CO. I’m proud to say that I got to live through my Dad growing his business. I remember getting up on the weekends when it was still dark out to drive around to worksites in his truck (I don’t know what I would have done without Pokemon). I remember hanging out at his office helping him calculate how much concrete he needed to pour by measuring blueprints. I remember working at the office doing accounts billable and receivable since I was in middle school. I remember living in a family with little money and becoming relatively wealthy within the matter of a few years as my Dad’s business took off.
The Great Recession hit when I was a freshman in high school. I’m sure I don’t need to tell you this, but construction was not a great industry to be in during the financial crisis. So by the end of my freshman year and into the start of my sophomore year of high school (2007 and 2008), the family business was struggling and companies were filing for bankruptcy that owed my Dad a lot of money.
Thankfully, my Dad and Grandpa are smart, conservative business people and instead of taking on lots of debt prior to the financial crisis in an effort to grow at an unreasonable rate (like most of their competitors), they had some cash stockpiled and were able to wait out the storm.
But the experience changed me. Since I grew up around success and hard work, I always assumed that success would find me without effort. Seeing things go the wrong way for our family was a real slap in the face.
It wasn’t the changes in my lifestyle that affected me, it was how I saw it affect my Dad. My parents have always been the type of parents who are willing to give their kids whatever they need to follow their dreams without questions. My Dad was always one of the coaches for every sports team me or one of my siblings played on. Throughout our youth my parents gave us so many opportunities and advantages. They were supportive of our goals and were always willing to put their time and money towards helping us achieve them, whether it be golf, dance, football, cheer, basketball, baseball, guitar, academics, chess, piano, or singing.
Suddenly, I was hearing my parents stress over the mortgage and family business, and that’s when I thought back to all the time and money they had put into me throughout my life and how little I had given back to them. The guilt of me doing nothing with my life and borderline failing many of my classes in high school (I had a 2.5 GPA my first two years) changed me. It took difficult times for me to see how much my parents have sacrificed for me and how lucky and privileged I was.
The change in my attitude and motivation didn’t happen over night, but it did happen relatively quickly. As I entered my junior year I was determined to turn my grades around and use my time to learn skills.
So I started taking guitar and singing lessons and slowly began to rip myself from my video game habits and focus more time and energy towards school.
They say the best time to start something is yesterday, but for me it felt like the best time was several years prior.
Even though I was now putting effort towards school, the years of scraping by with C’s made catching up seem like a monumental task. Whenever we learned something new in class, there were three or four foundational skills I had to go home and learn first.
I worked really hard my junior year and the first semester of my senior year, and my grades improved dramatically. I was getting 4.0 GPAs, but the damage of my first two years had been done and it would follow me for a long time pushing my face in the dirt occasionally.
All of my family — parents, aunts, uncles, cousins, grandparents, great grandparents,… — are from Colorado. We have always been close, so when I started applying to colleges, I knew that I wanted to stay in the area.
At that time in my life, I still wasn’t 100% sure what I wanted to go to school for though. I’ve always had an interest in programming, but didn’t have the opportunity to learn early in life. With dreams of one day following in my Dad’s footsteps and starting my own company, I was excited to choose Computer Science as my major on my college applications.
I applied to the Colorado School of Mine and got rejected. I applied to the College of Engineering at Colorado State University and got rejected. I applied to the College of Engineering at the University of Colorado (my top choice) and got rejected. I had taken many AP courses the last two years of high school and gotten A’s, but colleges care a lot about the cumulative GPA of entering freshman, and mine was pretty low.
Luckily, someone from the admissions office at the University of Colorado (CU) took note of my hard work and the turnaround in my grades. They wrote to me saying that they admitted me to the College of Arts and Sciences (a less competitive college at the university) as a “pre-engineering” major. Whoever that admissions person was saved me.
I still remember my high school graduation day as one of the most embarrassing days of my life. Since I had tried hard in school for the previous two years and taken a lot of AP courses, most of my friends were from the smart crowd and graduated with honors. Everyone questioned me about why I didn’t graduate with honors, including my girlfriend’s family. It was painful to have to explain countless times that I had some bad grades and to see the shock and judgement in their eyes; awkward silence usually followed.
I don’t think most people were trying to be mean, they were just surprised.
No matter what their intent was, I still felt judged.
College was my fresh start and I was determined to get ahead of the game from day one to avoid the mistakes I made in high school. Especially since the stakes were even higher, college is a lot more expensive than high school. I was going to make my parents proud and show them that their efforts all my life were not taken for granted.
The only problem was that at CU the College of Arts and Sciences is separate from the College of Engineering, so as a “pre-engineering” student in Arts and Science, I couldn’t enroll in any of the engineering courses. I knew I wanted to become an engineer, but the thought of starting out behind just when I had caught up was disheartening.
My first semester of college was frustrating and I spent a lot of time emailing staff around the university asking for help enrolling in engineering courses (there were often unfilled seats in the classes I wanted to take), but the best advice anyone could offer me was to get good grades my first semester or two and apply to transfer colleges within the university next year.
So I ended up behind yet again. All of my friends and peers were taking interesting engineering courses while I was dinking around with soft sciences awaiting the day when I would be deemed worthy to be an engineering student.
I made the most of it though and got good grades in all my classes. I figured out that there are even a few courses offered by the College of Arts and Science that could be applied towards an engineering degree — such as calculus and chemistry — so I took those to keep from falling a full year behind.
The second semester of my freshman year rolled around and near the end of it I was finally admitted to the College of Engineering starting in my sophomore year. I was excited, but nervous. I had done well in my college courses, but all that my engineering friends ever talked about was how hard their courses were and how much harder they probably were than similar classes I was taking.
I was still self-conscious about my intelligence; I was unsure if I had the ability to even pass engineering courses let alone excel in them. For the previous three years I had always felt like the dumb one in class struggling to catch up, that I wasn’t smart enough to be an honors student or an engineering student, and that regardless of what I had accomplished academically, it paled in comparison to what my friends and peers had done.
Flashback to high school for a little more context…
At the end of my junior year of high school when I was getting good grades and trying to get my academics on track, I told my math teacher that I wanted to enroll in the advanced math course for my senior year and he flat out told me I probably wasn’t smart enough for that because I’m “not that good at math.”
Ya, f**k you Mr. Leech.
And at the start of my senior year I wanted to join the honors society since all of my friends were in it and were pressuring me to join. I genuinely wanted to do it for the volunteer opportunities and to be part of the community, it wouldn’t even make a difference on college applications at that point. Since I was taking all advanced courses and getting A’s, everyone in my classes was in in the honors society except me. Even though I had gotten >4.0 GPAs for three semesters in a row, my cumulative GPA still wasn’t high enough, so they wouldn’t let me join.
It was time for me to choose an engineering major, and I knew I wanted to do computer science. When I told some of my friends their responses were less than encouraging. They used my interest as an opportunity to complain endlessly about how hard even the entry-level computer science courses were and that if I thought the Arts and Sciences calculus was hard (let alone the Engineer calculus), then I would probably struggle in computer science courses. Hell, even they were barely passing, and I clearly wasn’t on their level.
Unfortunately, I believed them, so I avoided computer science because all of the smartest people I knew were struggling with it and I avoided math because I had been told by a teacher that I wasn’t very good at it. I had done well in my college chemistry courses though, so I chose Chemical Engineering as my major even though I thought the entire profession sounded painfully dull.
I was an engineering student now, which meant that 50% of the conversations I had on campus were about how hard courses are and complaining about why the professors make the tests so hard that averages are in the 50s. I was a little behind, but not so much that I couldn’t catch up and graduate in four years.
All engineering majors at CU require a good amount of math coursework, so even though I was trying to avoid math, I was forced to take calculus, differential equations, and linear algebra. I was nervous to take these math courses and sure that I would fail them, so I worked harder than I’ve ever worked in my life, and to my surprise, I actually got A’s in all of them. In fact, in three of my math courses I was emailed by the professor at the end of the semester saying that I finished with the highest grade in the class.
Hmm, so maybe the people around me don’t know everything about me.
CU has an Applied Math Engineering degree, and since I was doing well in my math courses, I decided to switch majors. Unfortunately, I was still too afraid to give computer science a shot even though that’s really what I wanted to be doing.
Engineers at CU are also required to take one computing course where you learn basic stuff in VBA, MatLab, etc. It’s more scripting than programming. Even though I had done well in my other engineering courses, I was still nervous to take this course at the start of my junior year since it was computer science related.
Luckily, I had a great professor and even though we had to use archaic languages, she tried to make it interesting and applicable. Our final project was to create a k-means image classifier… in VBA. This was my first taste of machine learning and I thought it was super cool.
I ended up loving my computing course, and my teacher approached me at the end of the semester to tell me that I got the highest grade and that I should consider taking some graduate-level machine learning courses given my major. I thought it was a nice gesture, but that there was no way I would be smart enough for even an undergraduate class in the computer science department let alone graduate-level courses. I had the interest, but I was still recovering from years of having my confidence worn down.
I worked every semester the first three years of my college career as a research assistant at CU, but as the end of my junior year approached, graduation became visible on the horizon and I had still never done an internship or any work in industry. While I was good at math, I didn’t know what I could or wanted to do with it after graduating. The clock was ticking, so in the Spring of my junior year I landed an internship at a tech startup called Mocavo doing data analytics.
I can’t think of anything I’ve ever been more nervous for than my first day working at Mocavo. I was going to be working with an entire team of programmers and I didn’t want to look stupid.
The people I worked with at Mocavo changed my life. If any of them are reading this story, I hope they know how much of a positive impact they had on me. Everyone was friendly, positive, down-to-earth, talented, smart, and willing to help me learn. While I didn’t start out writing code for my internship work, I was now around people programming every day, which demystified the domain for me.
It took me a while to dive in and start coding even though everyone offered to help me learn from my first day. I had been told countless times how hard programming is and that I might not be capable of doing it, so I didn’t want to fail or look dumb in front of all my coworkers whom I admired.
Finally though, after about six month of peppering everyone with questions about programming, how hard it is, how long it took them to learn, etc., I took the leap. After six years of being discouraged by the people around me, it only took a few positive experiences with my coworkers to launch my career as a software developer and ignite my love for programming.
I only wish that I could have been brave enough to start earlier.
It didn’t take me long to become infatuated with programming. Every new thing I learned seemed to open up a whole world of possibilities I didn’t know existed or didn’t previously understand enough to take advantage of.
I’ve had plenty of struggles as I’ve learned to program. On more occasions than I can count I’ve spent half a dozen hours failing to get seemingly basic things to work. More than once I thought I might not be cut out for programming after all and that I should give up forever.
But I powered through the learning pains and spent every free hour on nights and weekends working through problems until I figured them out.
In the beginning, every time I Googled how to do something I would discover that there’re five other concepts I needed to understand first, and three more to understand each of those concepts, and so on. One of the most difficult things for me was feeling like I was never making progress because just when I thought I might be getting good, I would learn about the existence of an entire domain, or language, or best practice, or framework that I hadn’t even touched.
But I was used to feeling behind in life so I stuck with it.
I remember an interviewer embarrassing me in front of a group of people a few months after I decided to learn to program. Apparently they needed to put me in front of five engineers and watch me struggle on a whiteboard to determine that I was not capable of learning what they do. This was for an unpaid internship and I had disclosed in my application that I had only been writing code for a few months.
But I had been told I wasn’t smart enough before, so I knew that with hard work I could prove them wrong.
I remember a different interviewer embarrassing me six months later in front of one of his interns. I learned from my first interview experience that I should be upfront about what I knew and what I was still working on, that way they could decide not to interview me if they were expecting certain skills and knowledge.
So in my cover letter I explained in detail that I was a beginner and outlined the holes that I knew existed in my knowledge. When I showed up for the interview my interviewer made me struggle for the entirety of our meeting (60 minutes) trying to solve a single question that I admitted I didn’t know in my cover letter and told him I didn’t know when he first wrote it on the whiteboard. I still remember the smug smile on his intern’s face as I struggled to do something that was laughably easy for him. Software engineers can have big egos…
But I knew not to let it get to me. I could see how far I had come and I knew I would succeed if I stuck with it. I used these experiences to motivate myself instead of discourage myself.
Finally after 1.5 years of dedicating all of my free time to coding, I landed a software engineering job. It was one of the happiest days of my life.
My path to becoming a paid software engineer was by no means a straight shot. I struggled with motivation, learning, failure, discouragement, life direction, confidence, knowing myself, feeling behind, letting other people put me down, restricting policies/rules,…
If you’ve been putting off learning to program, I hope this story shows you that not all software engineers are child prodigies who were destined and groomed for the field. It doesn’t matter how much you know today or what obstacles you think you might face, you can learn.
If you’re a programmer who took a more traditional route to software engineering, I hope this story will encourage you to build people up who want to program instead of putting them down.
Here are the top five life lessons I’ve taken away from my struggles and successes.
Criticism from skilled people is one of the best ways to learn, whether it’s constructive or not (hopefully it’s mostly constructive though).
Don’t let other peoples’ opinions bring you down; leverage their opinions to learn and make yourself better. There have been many times in my life where people harshly criticized me to make themselves feel smarter or to belittle me.
I used to believe people who told me that I was bad at X because I wasn’t smart enough to learn X.
Now I know that when someone tells me I’m bad at X I can use that information to improve myself, and regardless of how true their opinion is, they are unqualified to determine if I’m capable of learning X. Only my own determination and hard work can decide that.
I firmly believe that most of the population is capable of learning to program. What separates the people who succeed from the people who fail is less about intelligence and more about determination.
The people who are most determined to learn to program will. Everyone has their own learning obstacles and has to figure out how to solve them.
There are geniuses with no willpower who will give up when they get stuck and there are average people who will fixate on problems until they solve them. The former will fail, the latter will succeed.
A lot of the people I meet who want to learn how to program assume that they’ll be able to learn everything in a few weeks or months. They’re hard workers and are willing to put in a lot of time upfront to learn, but they expect to be able to coast through their career after the initial push of “mastering the skill.”
This school of thought might be OK for some professions, but if you enter software development with that mentality you will become very frustrated. No matter how much you work at programming, you will never be a master at even a subdomain. There will always be room for improvement, technologies will always change at a rapid pace, and your employers and peers will expect you to constantly learn new skills.
That’s the reality and culture of software engineering.
This is why it’s important for you to decide if you’re the type of person who can enjoy a lifelong journey of learning, improving, and perfecting before starting a career in software development.
It will probably take you more than a year of hard work learning to program before you get a job as a software engineer. Start your journey with this expectation.
The hardest part of learning to program isn’t the difficulty of the concepts, it’s having the patience, determination, and willpower to build up your skills even when it seems like your work will never pay off because there is too much to learn. If you work hard and endure failures for long enough, you will succeed.
Everyone is in the same boat here, so don’t get discouraged if it takes you a while to break into the industry. This is normal and if you begin with a long-term mindset, you will feel better about your progress along the way and you will be less likely to give up.
We learn far more from our failures than our successes. When you challenge yourself, you learn faster. When you put yourself in uncomfortable situations, you grow as a person.
The only benefit to focusing on small, risk-adverse growth is feeling comfortable.
When I look back on my journey most of the pivotal moments happened when I set difficult goals and put myself in situations where the cost of failure felt high.
At some point you have to say,
F**k it, I’m going to try my best and if I fail I’ll use the experience to learn. I really don’t care what anyone else thinks.
**Don’t forget to clap if you enjoyed my story and comment if you have any thoughts or experiences to share.**
If you want a few concrete tips on how I think you can learn faster, check out my 9 ways to accelerate your learning and stay on the bleeding edge.
I’m currently on a quest to discover how to create side projects that generate passive income. If you want to stay up-to-date with my writing, ideas, and projects, you can find more info and links to all of my social channels on my personal website: