If you were to ask someone why they didn’t want to be a computer scientist, their most likely answer probably would be: “I just don’t want to spend my life coding.” While coding is certainly a component of the life of many computer scientists, there are many who do not even touch code. I would even argue that the allure of studying computer science has nothing to do with coding at all.
Students today want to be exposed to skills that will allow them to adapt to a rapidly-changing world. Skills such as questioning, collaboration, and independent thinking will never become outdated. Thankfully, computer science is a natural environment to learn these valuable, indispensable skills...
The main goal of any code written is to solve problems. While these problems may scale in difficulty and complexity, such as landing a space shuttle on Mars or solving an integral, each task begins firstly with understanding the problem, brainstorming solutions, and deciding on the most efficient solution to execute. Before the student even begins to write up the solution in a programming language, they must first design a solution consisting of consecutive rules required to reach their end goal. Some of these steps may require additional dependencies or pose unreasonable constraints. When the student is required to deliberate all the intricacies necessary for designing an algorithm, they become more detailed-oriented and competent. These are critical skills for approaching any dilemma! In all areas of life, it's best to have the skills to think carefully about a problem, to consider plausible ways to solve it, and to execute the best idea given the constraints at hand. Computer scientists thus find themselves being natural problem solvers in their everyday lives.
Dynamic Programming is an algorithmic technique for solving a given problem by breaking it down into simper subproblems, utilizing the fact that the optimal solution to a problem depends upon the optimal solution to its subproblems.
Finding solutions to a problem can seem daunting, or even over-whelming. For example, if we want a space shuttle on Mars, then all we have to do is build a space shuttle, hire astronauts and have them fly the shuttle to Mars...right? Many times, the solution is not straightforward, and therefore each step in our algorithm needs to be treated as its own mini-problem to be dissected and assessed.
Using our running Mars example, one subproblem is having trained astronauts on hand. Before we even get to Mars, our astronauts must be trained to acquire samples on Mars, fly the shuttle, carry out scientific experiments on the planet, and handle any emergencies that may occur. Now, we can take any one of these tasks and break it down even further: in order to fly the shuttle, the astronauts must be trained in aviation, so we would need to acquire experts in the field to train them. With the concept of dynamic programming, we would break down this task even further until the first step is entirely doable. We would repeat this process for all the others tasks necessary for our mission.
Similarly, in life, it is easy to feel overwhelmed by all we must get done in order to finish a class, receive a promotion, or reach a goal. However, if we lean on dynamic programming and create sub-problems, sub-tasks, and sub-goals, achieving our overall mission can seem a lot more doable.
We can see through our dynamic programming example that solving a problem involves countless moving parts requiring varying skillsets. The people who train the astronauts have very different skills than the people designing the space shuttle. Each role is equally important and vital to reaching a solution. A project always benefits from having multiple eyes on it so as to recognize hidden errors or elusive patterns, and to contribute to the diversity of ideas and skillsets . The best projects are thus often collaborative in nature, requiring cohesive teamwork to get to the best solution.
With regards to programming, a multi-step project often requires multiple teams working on website design, databases, research, and model execution. Team members benefit one another by engaging with each other, learning new techniques or completely new skills in the process. Collaboration is essential to a well-functioning product.
Programming can be incredibly time-consuming. Projects often span weeks, months, and even years with many new iterations or additions along the way. Hours can be spent debugging even the simplest of programs! Luckily, this experience develops patience and perseverance to tackle any adversaries in life that do not offer instant gratification.
Now that I’ve shared some of the benefits of being computer scientist, I hope this encourages you to enroll in your first computer science course or try your first computer science project!