Software Engineering for Parents
Is your son or daughter a software engineer and you have no idea what they do? And every time you ask, they start speaking in what sounds like a foreign language? Then this article is for you!
Let's start by defining what an engineer does. Engineers solve problems by designing, building, and maintaining things. Designing is the process of planning how you are going to solve a problem. Building is the process of actually making the thing that solves the problem. And maintaining is the process of making sure the thing you built continues to solve the problem.
One of the oldest types of engineers is called a "civil engineer", they are the engineers that help make roads, buildings, railways, sewer systems, and just about everything else that society uses to function. Suppose a civil engineer is tasked with solving the problem of getting people from one island to another. To solve this problem, the civil engineer builds a bridge. But before they build the bridge, they need to design it. Is the bridge a pedestrian bridge or a road bridge? If it's a road bridge, how many lanes should it have? In the design phase, the civil engineer defines what they need to build and how they are going to build it. Once the design is complete, the civil engineer works with various contractors to build the bridge. But the work is not done when the bridge is complete, the civil engineer needs to ensure that the bridge continues to be safe for long after its built. They do this by performing regular safety checks on the bridge, repairing it if any issues arise. This process is known as maintenance.
Traditional engineers, like the civil engineer mentioned above, design, build, and maintain things that exist in the physical world. You can see, touch, and feel the things these engineers build. Software engineers, on the other hand, write code, which does not exist in the physical world. The code written by software engineers is like the words written by a novelist. Words themselves are useless. It's not until a human "reads" these words and interprets their meaning, that value is extracted. This value could be entertainment if the words tell a story, or informational if the words teach the reader something new. Similarly, code is "read" by computers, who interpret it as a sequence of instructions. These instructions tell the computer how to do something. The value of code is created when we use it to tell a computer how to solve a problem. Software engineering is the discipline of instructing computers to solve problems.
Code is a language that computers can understand. Software engineers write code into files on a computer using a text-editor, think "Microsoft word for code". The files containing the code are like the pages of a book. A collection of these files is called a codebase. A codebase is like a book that tells a computer how to solve a problem. For example, part of the WhatsApp codebase instructs your phone on how to send and receive text messages. Software engineers are essentially collaborative authors of books that tell computers how to solve problems. The term "software" refers to everything involved in telling a computer how to solve a problem.
Software engineers design, build, and maintain software. Software design is done by writing design documents. Design documents answer the "why", "how", and "what" of the problem you are solving. The why defines the problem and why it matters, the how defines the requirements of a solution, and the what is the plan for building the solution.
Software is built by writing code. The process of writing code is called "programming", and makes up a large portion of a software engineer's job. An even larger portion however, is spent reading code. This is because most software engineers work on large codebases written by a bunch of other software engineers. And oftentimes, the original authors of the codebase no longer work at the same company. To make changes to the codebase, software engineers need to understand it, or at least the part that they are changing. This is why they spend so much time reading code that others have written. Software engineers also read the new code of their peers, in a process called "code review". During this process, the engineer ensures the code they are reviewing does what it's supposed to do and is easy to understand. They often give feedback to the author of the code on how it could be improved. This process is similar to having someone proof-read your writing and provide feedback. Good code is similar to good writing, it's clear, concise, and easy to understand.
The work does not end after the code is written. Software engineers must constantly update their code to keep up with the requests of their users. For example, if a new emoji is released, the WhatsApp engineers need to update their code to include that new emoji. This is the biggest difference between software and traditional branches of engineering. A bridge may last for over 100 years, software on the other-hand can become outdated in months. Just think of the difference between your first cell-phone and the phone you have now. Your first cell-phone had 3 major features:
- Make phone calls
- Send text messages
- And take crappy photos
Your phone today has Netflix, Facetime, Google Maps, Uber, the list goes on... All of this change has happened in a very short amount of time and requires software engineers like your son or daughter to constantly write and rewrite code, even after the original problem is solved.
So what does the day-to-day of a software engineer look like? Software engineers generally work in teams of 5-8 people. They start their day by having a quick meeting with their teammates called a "standup", in which every member of the team shares what they did the day before, what they are currently doing, and if they need help with anything. After their stand-up meeting, they spend the rest of their day working on the tasks assigned to them. Software engineers work in 1-2 week intervals called "sprints" in which they get as many tasks done as possible. At the end of the sprint, the list of tasks for the entire team is reprioritized, and each member of the team is assigned new tasks for the next sprint. This process is repeated over and over again.
And that's about it. If you take away only one thing from this article, let it be this: "Software engineers tell computers how to solve problems." If you're still lost, you can at least pretend to know what your child does by saying one of the following to them:
- How's your sprint going?
- Do much code review today?
- I hope your code is cleaner than your room.