Coding can certainly be fun, but it can also be frustrating, perplexing, and mind bending. The world of memes just wouldn't be the same without those that express so well the feelings of a software engineer and computer programmer :)
A large part of being a software engineer or developer involves figuring things out: trying, testing, applying a technique from somewhere else and just coding and seeing if it works.
There is also a large part of engineering that has to do with problem solving. Structured problem solving is one of the most vital skills you can learn as a software engineer and developer.
Problems You'll Face
During the Qwasar program, you will encounter different types of problems. Our program is largely project-based and problem-based learning, so we give you a problem and you have to solve it, very similar to those math word problems we had in high school.
Part of your learning will be how to approach and tackle each problem, especially as the software that you have to build becomes more difficult and more complex. Problem-based learning is not just about learning the hard skills or the technical skills; it's also about the process of how to approach and solve a problem.
Sometimes, you will feel completely stuck, and this can be quite frustrating. Perhaps you're stuck in what to do, where to go next, or how to actually code what you have in your head. Part of learning problem-solving skills is to know how to get yourself unstuck by identifying your new problem, breaking it down, and taking a structured approach to it. Not being structured means things get messy, and messiness can mean going in circles, not feeling productive, or taking forever to get anywhere.
Everything about the program is designed to develop your problem solving skills. There are 3 major things that help with problem solving that we strongly encourage you to think about as you go through the program this summer:
Mathematical thinking, believe it or not, is not about maths and numbers. It's about:
- breaking down tasks into smaller components
- identifying similar tasks that map help
- identifying appropriate knowledge and skills
- identifying assumptions,
- selecting an appropriate strategy
- considering alternative approaches
- looking for patterns or connections
- and generating examples.
Mathematical thinking, as the name suggests is a way of thinking about a problem. It helps you to structure the problem, to think through each element that's a part of the problem, to consider other options, and to consider similar problems as a means for finding possible solutions or alternatives.
Each time you come across a new project or find yourself stuck, consider turning the above list into a set of questions and asking them to yourself. Creating this habit will help you to deal with bigger, more complex software projects or debugging challenges later on.
We've heard of some technical interviews where interviewees are asked to rebulid Netflix. Sound overwhelming? If you're sharp on mathematical thinking, you'll be able to get very far in a short space of time. The point of the question is really to see how you think, not whether you can recode Netflix in 45 minutes.
Mathematical thinking is strongly complemented by Scientific Thinking, a set of reasoning processes including induction, deduction, experimental design, causal reasoning, concept formation, hypothesis testing, and more. Most of you probably remember high school science class and doing small experiments: you had a hypothesis, you had to design an experiment, collect data, and make some conclusions.
The reasoning processes behind these experiments apply to software engineering and how to approach a problem. Perhaps you're having trouble identifying assumptions: what better way to debunk or identify them by creating a hypothesis and running a test!
Or, let's think in the other direction for a moment. Perhaps you have a bug and the software you've built is not doing what it should do. Scientific thinking can help you to reason to identifying the bug: it's reasonable to say that somewhere, there is a piece of code that is causing the bug. A computer doesn't grow a mind of its own and start changing your software, so we should be looking at the pieces of code that could be causing the bug. What pieces of code could and could not be causing the bug? Does asking this question narrow down the lines of code where the bug could be? How could I further eliminate parts of my code as not being the culprit for causing the bug?
Taking a thoughtful, structured approach makes debugging and problem-solving more efficient (and less frustrating).
The third element to problem solving, and an element that is fundamental to software engineering, is logic. Logic is the ability to identify structure, reasoning, relationships (or lack of) among facts, and seeing things in a particular order, as well as identifying skips or jumps, thus uncovering assumptions.
So much of software is built on if...then... statements, which are examples of fairly pure logic. Logic can be a useful tool in identifying where there are gaps or jumps between two or more elements, be that structure, reasoning, if then statements, or relationships among variables and functions. Good engineers are also very good at logic.
Logic is the natural complement to both mathematical and scientific thinking, and it's something that you we encourage you to develop and fuel as you go through our program.
You're Responsible for Your Work and Learning
Part of the joys and challenges of our program is that you're responsible for your work and learning. If you finally get your code to work or finally understood pointers, it's a great feeling because you put in the time and effort. The other side of the code is when things are challenging or you feel stuck, it's up to you to apply these problem solving approaches and to help yourself and help others develop their mathematical and scientific thinking and logic.
On a more global note, problem-solving skills are immensely useful in everyday life! When you're responsible for yourself, your living situation, your finances, or what you'll eat next, you'll be amazed at how even basic problem-solving skills can make life a little bit easier to handle.