How I Learned to Code and Built a Real Software Product in 6 Months
On May 21st, 2020 I wrote my first-ever line of code as part of Harvard’s CS50 online course. I was a 30 year old with no prior experience in programming or engineering with a full-time job and a family.
Six months later, I pushed a production-ready web application (see, joyful.gifts: an automated gift giving service) for the whole world to use.
In this article, I’ll share how I approached learning to code, what the journey was like, and I’ll provide some unconventional advice for those on the same journey.
How I learned to code
From the very beginning, this journey was about being flexible as a builder. My goal was to learn the best tools available to solve real-world problems.
Take all of this with a grain of salt if your goal is to get an entry-level job as a software developer – some things here may not apply.
Here is how I approached my learning.
I focused on the joy of building
I focused on building and getting joy from what I built. If it felt like rushing through a set of material, I knew I was doing it the wrong way.
A common pitfall for beginners is to watch tutorials without following up and attempting to build based on what they’ve learned.
So instead, for example, after learning HTML/CSS, I attempted building a weekly diary application. This was, perhaps, a wholly unrealistic goal given that I didn’t know anything but simple HTML/CSS syntax yet. But it was a wonderful learning experience. You can see my attempt here.
I didn’t compare myself to others
I didn’t compare where I was or the tech stack I was using with anyone else. If it worked, and if it was reliable and a joy to work with, it meant that I was in the right place.
When you are a beginner struggling with what you are learning, new tools and technology can be more of a distraction than help.
For example, many times the temptation to abandon C and Python for newer, shinier tools was strong.
Early on, the principles of programming are a lot more important than the language or the framework you’re using. Also, stick with what’s working for you, no matter how unpopular it may seem.
I searched out the experts
I put a lot of effort in searching for true experts, and once I found them I sought their advice.
The learn to code industry is massive. Everyday it seems there is a new tutorial or framework, with a long line of evangelists who want to teach it to you.
Look for experts who work with these tools. Ask what problems these tools solve, and evaluate whether you will be facing these problems or not before you try them out.
I invested time in new tech that was relevant to me
I familiarized myself with new tech as needed, but only dived deep if it solved a specific problem that I currently had.
As a beginner, focus on what problems you need to solve and the simplest tool needed to solve them.
I tackled the hard stuff
I didn’t shy away from “hard” things if they solved a problem.
Fore example, Docker is hard to fully understand but it solved a problem I was having.
Installing and upgrading software libraries and packages as a beginner is difficult.
Also, it’s okay to struggle figuring out a way how to navigate a Python dictionary, it’s part of the process.
But, giving up because Windows and a library don’t play nice is not ideal.
I generally stuck with proven tech
Given a choice, I always choose the proven and tried technology over the new and shiny.
As technologies mature, things like best practices, security vulnerabilities, and limitations become obvious.
As a beginner, do you want to reinvent the wheel figuring out what Cross-Site Request Forgery (CSRF) is and how to protect against it? Probably not.
So when you can, stick with what’s proven in the beginning, then go ahead and explore.
My Coding Journey – Resources I used
This should serve as an overall guide rather than specific step by step directions. Software development evolves very quickly and resources get outdated.
Additionally, there are smaller topics that you need to learn along the way to ship products. A simple tutorial will do for these topics. Examples include GIT, Bootstrap, third party integrations, deployment, and text editors.
Here are the resources I used to learn to code:
C & Intro to Algorithms via CS50.
What I most liked about it: It’s the ultimate introduction to Computer Science. Why and how computers do the things we tell them to do.
What you will get out of it: What are data types and structures, what is an algorithm, what is big O notation and why it matters.
How I used it: designing and building efficient database operations & business logic.
HTML/CSS fundamentals via freeCodeCamp
What I most liked about it: freeCodeCamp is the perfect tool to get introduced to coding. You are up and coding right away and building useful projects along the way.
What you will get out of it: By far, freeCodeCamp is the best way to learn HTML and CSS for beginners. I take and retake the CSS modules to this day, learning new things every time.
How I used it: helped me create the look and the feel of joyful.gifts.
Python/Flask via CS50
What I most liked about it: Python is really a beautiful language that makes building anything possible.
What you will get out of it: How to use Python to build simple web application via the Flask framework.
How I used it: Python is a versatile backend language, and it’s the core of joyful.gifts.
Django — began via the book “Django for beginners”
What I most liked about it: A simplified approach to Django. Essentially, a step-by-step approach to building Django applications.
What you will get out of it: What is Django, how to start using it, and what can be built using it.
How I used it: Django is a stable and a mature web framework using Python. Sites like the onion and Instagram are built on it, and so is my web application.
What I most liked about it: The projects are extremely practical and applicable to real life. I was able to build a wikipedia-like web application, an email client, and an auction site.
What you will get out of it: How to build complex applications utilizing front and backend languages.
Docker via Dive into docker
What I most liked about it: Things get complex early on with a deep dive into all the details of Docker, but simplified in the end with a step by step guide.
What you will get out of it: How to dockerize your web applications and use Docker to have a sane development environment.
How I used it: As mentioned before, as you learn programming you will need to constantly download various tools and libraries. Docker simplifies that process and ensures that your programs work on any laptop or server.
Django — Professional & best practices via “Django for professionals” and “Two scoops of Django”.
What I most liked about it: it’s a great walkthrough of deploying production-ready web applications.
What you will get out of it: What best practices you should follow, and how to ensure your application is able to scale.
How I used it: There is a huge gap between building something as a learning tool, and deploying a web application with real users and money exchanged. In the latter, best practices are very important to ensure security and scalability and these helped a lot.
Some Unconventional Advice
If you want to learn, learn something brand new. If you want to build, build using what you already know and what’s been proven to work. There is a lot more room to experiment and learn when you are going to be the only person using that software.
Popular tools don’t always equal useful tools. When evaluating whether to learn a new tool or not, consider the problems it solves. Your problems as a beginner are often not the same as large companies.
Seek the advice of more experienced developers who have seen a disaster or two. Ignoring best practices and using shortcuts is okay as you learn. Reinventing the wheel is even encouraged, so you fully understand how it works. But as you start building software for the world to use, follow best practices whenever possible.
Learning to code is like learning to read or write. It’s much more powerful if you have things to say. As you are learning, observe problems around you and try to think about how writing code can solve these problems. It will make the process much more enjoyable with tangible results.
Best of luck on your journey!