Subgoals: We have cups ready to be filled. We have enough ground coffee. The coffee maker is full of water. We have a filter filled with ground coffee. This subgoal requires subgoal 2 to be completed. The filter full of coffee is inside the coffee maker. This subgoal requires 4 to be completed.
The coffee maker is brewing the coffee; requires 3 and 5 to be done. The coffee maker is done brewing; requires 6 to be done, and enough time to have passed. We have cups filled with coffee; requires 7 and 1 to be done. The cream was added to two of the cups; requires 1 to be completed. Sugar was added to one of the cups with the cream, and one of the cups without cream; requires 1 and 9 to be completed.
The content of each cup is stirred and well mixed; requires 8, 9 and 10 to be completed. Boxes represent subgoals, and incoming arrows into each box represent requirements to be satisfied for the subgoal to be achievable: In the case of coffee making it is tempting to just write a list of tasks. Reordering Tasks Reordering the tasks with the intent of maximizing parallel execution saves time and eliminates one of the steps. The final list of tasks, in the optimal order, is: Fill the electric grinder with coffee beans, and start it.
While the grinder is doing its job, fill the coffee maker with water. When the grinder is done, put the ground coffee in the filter.
Put the filter in the coffee maker. Start the coffee maker. While the coffee is brewing, get four cups out of the cabinet.
Put cream in two coffee cups. Put sugar in one coffee cup without cream and in one with cream. Wait for the coffee to finish to brew. Pour coffee into each of the coffee cups. Abstracting Coffee Making In the coffee example, you might want to abstract the subgoals to account for any number N of people, instead of a fixed 4. Abstracting Some More At that point, you might realize that coffee is just another ingredient of a beverage, so why make it unique?
Over-Engineering Does your head hurt yet? Balance When do you stop abstracting? Share this: Tweet. Like this: Like Loading Comments A big thank to you.
Very helpful website! This is my 1 to go block. Great article. Once you have defined the problem, you are ready to dig deeper and start to determine what is causing it. You can use a fishbone diagram to help you perform a cause and effect analysis. If you consider the problem as a gap between where you are now and where you want to be, the causes of the problem are the obstacles that are preventing you from closing that gap immediately.
This level of analysis is important to make sure your solutions address the actual causes of the problem instead of the symptoms of the problem. If your solution fixes a symptom instead of an actual cause, the problem is likely to reoccur since it was never truly solved. Once the hard work of defining the problem and determining its causes has been completed, it's time to get creative and develop possible solutions to the problem. Two great problem solving methods you can use for coming up with solutions are brainstorming and mind mapping.
After you come up with several ideas that can solve the problem, one problem solving technique you can use to decide which one is the best solution to your problem is a simple trade-off analysis. Try something. This has two advantages. Try to find a middle ground, and get to results you can see within a relatively short amount of time. Often we do this by hand: load a web page and check that it contains all the elements we expect it to render.
Try replicating the conditions that led to a bug, and confirm that the bug no longer happens. Try using the feature we added in a few different ways and see what happens. Another way we do this is with automated tests. Adding a test that asserts a feature works as predicted or a bug no longer occurs helps prevent unexpected problems down the line. Test-driven development is an alternate approach that starts with this step rather than leaving it to the end.
Moreover, becoming an excellent problem-solver requires a lot of practice as well as experience; thus, you should be quite patient when it comes to this. Every large and complex task can be divided into smaller and more comfortable to do assignments. The ability to break work into smaller tasks is often natural to humans and an essential skill to help get most things or services done.
For instance, when preparing a meal, there is a process that one follows that comprises of more straightforward tasks placed in the right order, commonly known as a recipe. However, there is a difference between a practical everyday problem such as making a meal and a more complex one like software building, and it is that the steps for building software are rarely rehearsed.
For one to be able to list the tasks necessary to come up with a particular software requires experience. This is yet another crucial problem-solving skill when it comes to offering of software development services.
Once you have already listed the steps in solving a particular problem, they can be done one at a time in the order listed, but that would not be optimal. The art of parallel thinking helps one to be able to perform two complementing tasks at one time that can never collide. For instance, when making a cup of coffee, you could be waiting for water to boil as you fetch cups from your cabinet or rather, wait for the water to boil and bring the cups after.
Reordering the tasks listed with the intentions of maximizing parallel execution helps save on time and also helps improve our overall experience. It is important to note that the goals of a company or client who has asked you to develop software on their behalf can always change at any time which necessitates the redesigning your tasks and subgoals in the long run. Programmers are taught how to come up with solutions so that they do not have to be designed all over again from time to time.
They also learn how to abstract issues in ways that allow for a solution to resolve any group of problems that are similar to the original one. However, abstractions will only complicate the picture if you push them too far; thus, you should avoid over-abstracting. If you try to abstract every aspect, you may end up with a more complicated issue than there before.
Therefore, you need to balance, and you should only abstract in cases that you think will be required shortly and avoid trying to block future abstractions with some narrow decisions.
0コメント