The Ultimate Guide to Learning How to Code
I have been coding for eight years now. For context, I'm Sophia, and I currently work as a software engineer at Amazon. Previously, I worked briefly in fintech and studied computer science in University. Looking back at my journey, there's a mix of things that I got right from the start and other things I wish I had done differently. This article is the ultimate guide I wished I had when I first started learning how to code.
This article contains a step-by-step approach, some useful resources, good examples for projects to grow your skills, the correct mindset that you need for programming, all you need to prepare for interviews, and also all the skills that you need to develop other than programming when you work as a software engineer.
Step 1: Understanding the Basics
Typically, you are presented with a problem where you need to find the result given a set of input. Your role as a programmer is to determine the set of instructions that the machine needs to execute in order to fulfill that goal. Coding is the act of writing these instructions following a set of syntax rules. Each programming language has its own set of rules, but they all share the same fundamental concepts.
These concepts are: * Variables * Data Types * Loops * If Statements * Functions
As a first step, you need to understand and be familiar with these concepts. I recommend choosing one programming language and focusing on it only. There are many languages that you might have heard of, like JavaScript, TypeScript, C, Java, and Python. The most recommended language for starting to program is Python because it's simple and not as verbose as other languages like, for example, Java.
Now that you have chosen your favorite programming language, the next step is to start solving coding problems. Two platforms that I can recommend are: * Codecademy * freeCodeCamp
Once you feel confident solving coding problems, the next step would be to learn about object-oriented programming and some of its concepts, like classes. While using platforms like Codecademy is great for starting, it's also good to learn how to write and run programs on your laptop.
At this stage, you have the basic skills to start writing some simple programs. Some examples of good projects to start with are: * A calculator * A Tic-Tac-Toe game
Algorithms and Data Structures
Now that you have the fundamental skills, a good topic to learn more about is algorithms and data structures. There are many resources online on Coursera, for example, Udemy, or simply YouTube. I personally followed a course on Coursera that has been really great. The goal here is not to learn everything, and you shouldn't do it. I would suggest starting with arrays and hashmaps, which are basically the most used data structures out there. The goal here is just to help you learn tools to solve bigger coding challenges.
Architecture and System Design
Now comes the fun part: learning about architecture or system design. The simplest basic architecture consists of a client, a server, and a database.
Think about a website, for example, that gives users the ability to create and save documents. They would be able to create their accounts and then save these documents on their account. * The Client: In this context, refers to the customer-facing application providing the interface through which users can create an account, log in, and manage their notes. * The Database: Serves as the storage unit for saving these documents. * The Server: Is the component of the system responsible for receiving read and write requests from the client and ultimately accessing the database to fulfill these requests.
There are three words that are very popular in describing software engineer jobs: front-end, back-end, and full-stack. * A front-end engineer specializes in the customer-facing part of a service. For example, they would be the ones implementing designs for websites. They would be experts in using JavaScript, TypeScript, CSS, and HTML. * Backend engineers are usually the ones responsible for the part of the service that handles requests but also databases. Languages that get to be applied here are, for example, Java and Python. * Full-stack developers are the ones that can do both, plus mobile development, which is basically developing applications in iOS or Android.
Another interesting concept to learn at this stage is APIs, which is basically how services talk to each other. Architecture and system design is where the whole difficulty resides when you are working as a software engineer.
Note: A great book that I recommend is Designing Data-Intensive Applications by Martin Kleppmann. This is really the book that you need to read for getting to know more about how to design systems, what the different components are, what types of databases exist, etc. Really read this book; you won't regret it.
Starting a Personal Project
Now that you have an idea about how software or web applications are designed and implemented, you might be wanting to start your own personal project. Here, you would be looking at learning frameworks. The most popular ones out there are: * Frontend: React and Angular * Backend: Django and Spring * Mobile: React Native is a good place to start.
Before you start implementing more complicated projects, there are two tools that you must learn about. 1. Version Control: A tool that will help you track and manage your source code. The most popular one is Git, and by extension, you need to learn about GitHub. 2. IDE (Integrated Development Environment): A software application that will help you develop your code more efficiently. Two popular ones are VS Code and IntelliJ.
Note: Hackathons are a great opportunity for you to start your own project. There are different events all over the world, both in-person and online. I would definitely recommend you check the website of Major League Hacking to find an event that would be appropriate for you. This will also help you connect with and learn from others, which is really important in this field.
If I can give you some examples of personal projects, they would be: * Create your own personal website: This is a great way to practice your skills, and you will end up with something you can show to others. * Create a to-do list app. * Create a weather app that connects to a public API.
The Right Mindset for a Programmer
Hopefully, by this stage, you have all the necessary knowledge and tools to grow and progress as a programmer. The next thing we will be talking about is the correct mindset that you need to have.
- Be humble and open to learning and receiving feedback. Since there are a lot of things to learn, receiving feedback is one of the things that can help you develop your skills and learn from your mistakes.
- Never copy code unless you know what it does exactly.
- Train yourself to think about the solution first before searching for it. This will help you develop your problem-solving skills, which are really important in your career later.
- Finally, enjoy the process. Programming takes a lot of time and dedication, so it's better to find joy and fulfillment in the adventure itself.
Preparing for Interviews
Now that you have a solid experience in programming, have built a portfolio with a few interesting and exciting projects that you also added to your resume, you might start interviewing for either an internship or a first job. There are two types of companies in terms of their interviewing approach: the tech language-agnostic approach and the tech language-specific approach.
Language-Agnostic Companies
These companies are open to hiring developers proficient in various programming languages. That's why in their interviews, you usually get to choose the language you would like to code in. The notorious companies following this approach are the FAANG companies. Preparing for their interviews requires mastering two topics: 1. Algorithms and Data Structures: I really recommend Cracking the Coding Interview. This is personally the only book that I really studied for algorithms and data structures. Mastering the exercises here will help you prepare for these types of interviews. 2. System Design: I will also recommend again Designing Data-Intensive Applications. I think this is the perfect book that will help you prepare for these interviews. If you don't have a lot of time, there's also System Design Interview, which is also really good.
Language-Specific Companies
Other companies look for specific skill developers that are proficient in a certain language or a certain framework. Here, you basically need to be proficient in those skills and be able to answer any type of questions you can get.
Skills Developed on the Job
Finally, I wanted to talk to you about some specific skills that you develop only when you are working as a software engineer in a company. In companies is usually where you practically see complex architectures and get to work on them.
- Understanding Complex Systems: One of the skills you need to develop is learning how to understand these systems and how to navigate through the intricacies of each one of them.
- Continuous Development and Continuous Integration (CI/CD): A second set of processes that you will get to learn more about. All companies strive to get more code done and released as efficiently as possible, so these two concepts are very important to understand.
- Monitoring and Performance: Here, you will learn how to track the metrics that are important for your services and also how to efficiently monitor their traffic.
- Writing Documentation: As a software developer working on many different services or different parts of a service, you need to be able to write clear, concise documentation for yourself but also for others.