Computer Science is about problem solving. That is not to say that only
Computer Science is about problem solving. It would be hubris to think that Computer Science holds a monopoly on “problem solving.” Indeed, it would be hard to find any
discipline in which solving problems was not a substantial aspect or motivation if not integral. Instead, Computer Science is the study of computers and computation. It
involves studying and understanding computational processes and the development of algorithms and techniques and how they apply to problems.
Problem solving skills are not something that can be distilled down into a single step-by-step process. Each area and each problem comes with its own unique challenges and
considerations. General problem solving techniques can be identified, studied and taught, but problem solving skills are something that come with experience, hard work, and most
importantly, failure. Problem solving is part and parcel of the human experience.
That doesn’t mean we can’t identify techniques and strategies for approaching problems,
in particular problems that lend themselves to computational solutions. A prerequisite
to solving a problem is understanding it.
What is the problem? Who or what entities are involved in the problem? How do those entities interact with each other? What are the problems or deficiencies that need to be addressed? Answering these questions, we get an idea of where we are.Ultimately, what is desired in a solution? What are the objectives that need to be achieved? What would an ideal solution look like or what would it do? Who would use the solution and how would they use it? By answering these questions, we get an idea of
where we want to be. Once we know where we are and where we want to be, the problem solving process can begin: how do we get from point A to point B?
One of the first things a good engineer asks is: does a solution already exist? If a solution already exists, then the problem is already solved! Ideally the solution is an “off-the-shelf”
solution: something that already exists and which may have been designed for a different
purpose but that can be repurposed for our problem. However, there may be exceptions to this. The existing solution may be infeasible: it may be too resource intensive or expensive. It may be too difficult or too expensive to adapt to our problem. It may solve
most of our problem, but may not work in some corner cases. It may need to be heavily modified in order to work. Still, this basic question may save a lot of time and effort in
In a very broad sense, the problem solving process is one that involves
After one has a good understanding of a problem, they can start designing a solution. A design is simply a plan on the construction of a solution. A design “on paper” allows
you to see what the potential solution would look like before investing the resources in building it. It also allows you to identify possible impediments or problems that were not readily apparent. A design allows you to an opportunity to think through possible
alternative solutions and weigh the advantages and disadvantages of each. Designing a solution also allows you to understand the problem better. Design can involve gathering
requirements and developing use cases. How would an individual use the proposed solution? What features would they need or want?
Implementations can involve building prototype solutions to test the feasibility of the design. It can involve building individual components and integrating them together.
Testing involves finding, designing, and developing test cases: actual instances of the problem that can be used to test your solution. Ideally, the test case instance involves not only the “input” of the problem, but also the “output” of the problem: a feasible or optimal solution that is known to be correct via other means. Test cases allow us to test our solution to see if it gives correct and perhaps optimal solutions.
Refinement is a process by which we can redesign, reimplement and retest our solution.We may want to make the solution more efficient, cheaper, simpler or more elegant. We may find there are components that are redundant or unnecessary and try to eliminate them. We may find errors or bugs in our solution that fail to solve the problem for some
or many instances. We may have misinterpreted requirements or there may have been miscommunication,
misunderstanding or differing expectations in the solution between
the designers and stakeholders. Situations may change or requirements may have been
modified or new requirements created and the solution needs to be adapted. Each of these steps may need to be repeated many times until an ideal solution, or at least acceptable, solution is achieved. Yet another phase of problem solving is maintenance. The solution we create may need to be maintained in order to remain functional and stay relevant. Design flaws or bugs
may become apparent that were missed in previous phases. The solution may need to be
updated to adapt to new technology or requirements.In software design there are two general techniques for problem solving; top-down and
bottom-up design. A top-down design strategy approaches a problem by breaking it down into smaller and smaller problems until either a solution is obvious or trivial or a
preexisting solution (the aforementioned “off-the-shelf” solution) exists. The solutions to
the subproblems are combined and interact to solve the overall problem.