This book is for informational purposes only. Except when an external source is cited, everything in the book is the author’s opinion. The author makes no guarantee about the correctness or accuracy of any content in this book. Furthermore, you may disagree with and/or find certain content offensive.
Read at your own risk. Do not continue reading if you do not accept full responsibility for all actions you take as a result of reading this book. The author is not liable for any damages including, but not limited to, academic failures, career path mistakes, financial loss, feeling upset, and physical/mental injury.
Your youth is the best time to grow academically. As a child, you get three months of summer vacation each year to do anything. After you start working a full-time job, you’ll never have three months of freedom like that again until you retire. In addition to summer vacations, you also get plenty of free time during the evenings and weekends after you’ve finished your homework. If you spend your childhood free time wisely, you can grow and prepare for what’s coming in college.
Ironically, childhood summer vacations can also be the hardest time to grow. Children don’t know what the real world is like and many parents don’t think far ahead either. The kids grow up without anyone steering them in the right direction. They fail to utilize the wealth of free time and waste their summer vacations having fun. Many college students who get As throughout high school describe their freshman year as “humbling” or “shocking” when they start getting Cs on their exams. College prepares you for the real world and both are starkly different from grade school. Lack of parental guidance during childhood sets back lots of students, but it’s completely preventable. This chapter provides the proper direction that a parent should provide to a child considering a future degree in computer science.
If you are not yet in college, then I applaud you for taking early steps to boost your future career prospects. If you are already in college, you can still read this chapter and identify the skills you must acquire by the end of college for the real world software engineering that lies beyond. And if you are a parent, use this chapter to guide your child in the right direction. It is important to dedicate free time in your pre-college years to the activities in this chapter.
The first step towards success in college computer science is to start programming as early as you can. The more time you spend programming before college, the more of a running start you get in college. If you have no programming experience, start with Python 3 and search online for “free python 3 beginner tutorial.” Python is a beginner-friendly language and that lets you learn programming basics without extraneous noise.
As you learn your first programming language, come up with ideas of fun projects. Hangman game? Tic-tac-toe? Calculator? It’s okay if you aren’t sure how to code everything. When you have questions about how to do something, someone before you probably already asked the same question. You can find the answer through a quick online search.
In the beginning, you’ll run into roadblocks and errors that you can’t resolve. Don’t give up though. Take a break and come back later. If you don’t have any insights after taking a break, write up what you tried and post your question online at Stackoverflow (stackoverflow.com). Or, try to find someone more experienced to help you. Like picking up a new hobby, stick with it and you’ll get comfortable with your programming language after a few months to a year.
After you gain comfort with programming, it’s important to look ahead at the technical skills software engineers need for industry. The two main technical skills you need are problem solving ability and engineering ability. Let’s analogize software engineering to building a skyscraper to better understand these concepts.
Problem solving involves the ideas behind what you’re creating. When building a skyscraper, the problem solving process involves designing the foundation, selecting a shape for the building, and researching materials that will be strong enough to keep the structure together. In software engineering, the problem solving process involves taking a user’s demands and selecting the proper algorithms and data representations to meet their needs. Problem solving finds ideas that can be turned into actual products to satisfy your customer.
Engineering is the actual construction process. When building a skyscraper, the engineering process involves creating blueprints, erecting all the beams in the right place, and assembling walls, floors, and ceilings. When creating software, the engineering process involves design documents outlining the code you will write and how it all fits together, and then writing the code in a clean and understandable manner. Engineering is the process of turning your problem solving ideas into reality.
Without engineering, you can’t build anything. Without problem solving, you can’t build anything effective. Thus, both dimensions are critical for success in software engineering. Problem solving and engineering only come with practice. You’ll get plenty of practice through your college coursework: homework and exams test your problem solving ability, and projects train your engineering ability. But it never hurts to reinforce these concepts during your pre-college years; if you get a head start, you’ll have an easier time in college.
Day-to-day problem solving comes naturally for humans. If you’re walking to your car and accidentally drop your car keys in a thorny rosebush, what do you do? You can’t reach your hand in because the thorns will cut you. Many people naturally apply their problem-solving skills and look for a stick to fish the keys out. This problem is easy because most people interact with the outside world all the time and have dropped stuff in hard-to-reach spaces before.
Abstract problem solving is more difficult for humans and requires practice. Suppose I open a new bank account that pays 1% interest each year. How much money do I need to deposit at the start of each year to retire in 30 years with one million dollars? For most people, this solution is not as obvious as finding a stick to fish out your keys because numbers and percentages are abstract and people don’t do financial planning very often. For financial planners though, this calculation is a piece of cake because they solve this style of problem everyday. You improve your problem solving in a specific domain through practice and repetition.
Leetcode (leetcode.com) is a popular website with tons of practice programming problems for honing your problem solving skills. You write code to solve a problem and submit it. Leetcode then runs your code against a variety of test cases and checks for correctness, speed, and memory usage. Your code doesn’t have to be clean or well-engineered; it just has to produce the right output fast enough on all the test cases. If all the tests pass, then your solution is accepted and you’ve solved the problem.
Start with the easy problems and slowly progress to the medium and hard ones. Furthermore, Leetcode has an “Explore” section where you can learn about data structures and algorithms, which form your problem solving toolkit. Do the explore section in conjunction with the problems to build up your problem solving skills. If you get stuck, take a break and come back later. If you absolutely cannot solve it, view the “Discussion” tab and read other people’s answers. After reading an answer, make sure you fully understand how it works; otherwise, you’re simply cheating yourself. As you spend weeks and months practicing, you will gain more familiarity with problem solving in the programming domain.
Competitive programming is one step up from Leetcode and for those who want to develop a strong intuition for solving programming problems. There are a plethora of competitive programming sites, but I recommend the USA Computing Olympiad (usaco.org), abbreviated USACO.
USACO provides a structured curriculum that takes you from beginner levels to advanced levels beyond what Leetcode covers. The historical training site is at train.usaco.org. There are text documents explaining how to apply various concepts and problems that test your understanding. You submit solutions to the problems and they are graded in a few seconds. Once you pass all the problems in a section, you are permitted to advance to the next section.
USACO also released an updated training site at usaco.guide. In addition to the modern aesthetics, the new training site provides more-detailed instruction, links to helpful external resources, and many more practice problems for you to solve. Start at the bronze division and work your way up.
Problem solving takes years to develop and mature; the more you develop before college, the easier your life will be in college and the job search. Problem solving ability impacts your chances of success in technical interviews. To consistently pass technical interviews at the top-tier companies, you need to be able to consistently solve Leetcode hard problems and USACO gold division problems. Of course, you don’t have to achieve that level of mastery before college, but the more of a head start you have, the better. In your years before college, take your free time to hone your problem solving skills.
Engineering is about organizing your code. Some people naturally gravitate towards structure while others hate it, but anyone can learn to incorporate and appreciate a robust software engineering process. Engineering is more of a trial-by-error process and the more practice you get, the more intuition you develop for making the right choices.
All people start out as awful software engineers. The first time you write a thousand lines of code, you’ll discover a major flaw in it, rewrite five hundred lines of code, discover another flaw in it, and repeat the process until the codebase is a mess and nothing makes sense anymore. Afterwards, you’ll reflect on your coding process and realize how much of a mess you made.
Failure is inevitable at the beginning, but the more you fail and learn from your mistakes, the fewer engineering mistakes you’ll make in the future. When starting out, work on as many personal projects as you can. Create whatever interests you: a game, a tool, a website — anything! As you write your code, try to organize it. Imagine your friend is going to read your code and you don’t want him/her to get a headache figuring out how it works. Rewrite code in a clearer manner when it becomes confusing. Add plenty of comments, use helper functions, and give your variables descriptive names. This gets you started on the path to writing clean code.
The more times you write sloppy code and learn from your mistakes, the more your code organization improves. Being able to write organized code is an essential concept for doing well in coursework, internships, and full-time jobs. Get a head start by working through many personal projects before college. There’s much more to the software engineering process, but learning to produce organized code is sufficient for your pre-college years and we’ll cover advanced concepts in later chapters.
Make sure you allocate sufficient time in your pre-college years to develop your programming, problem solving, and engineering skills. Add computer science into your daily routine and stick to it. Strive to solve one Leetcode problem a day or spend two hours every evening on your personal project. In your years before college, you have free time in the afternoons, evenings, weekends, and summer vacations to grow and get ahead of your future peers; take full advantage of your free time because this luxury disappears once college starts.