As a software architect, how do you make a problem easy to solve? In the software engineering world this comes up a lot. There are always hard problems that will bring things to a screeching halt. Picture this: you are in charge of a brand new project. Your goal is to choose the right technology, the right practices and, the right workflow to make that project a success. You know this project will be encountering problems over time. The correct perspective can make all the difference. As architects we have a very powerful tool to help us: abstraction. Lets take a look at abstraction and how important it is for software development.
Abstraction is defined as
the quality of dealing with ideas rather than events. Something that is abstract is not something that you can hold, work with or see. Its also not something that can come back and have any direct effects. Its just an idea that we can reason about and manipulate with our minds.
This is a very powerful tool because our minds are incredibly adept at reasoning about ideas. By disconnecting the idea and the event we can come up with very novel realizations about them. We need to free our minds to think about the idea.
Once you start working with ideas rather than direct problems, it is then possible to build up degrees of abstraction. These are different levels of thinking about something. For example think of a car. What are the kinds of problems that a car can have? It can break down, it can be too hot or too cold, it can run out of gas. Now, move up a level and think about roads and city planning. Roads have lots of cars, so the car is still there. However, are the problems of the car still a concern in city planning? No, there are new problems to solve at this level. The city planning degree of abstraction sits above the car mechanics degree of abstraction. You can only solve problems at the correct degree of abstraction.
Getting to the correct degree of abstraction is something crucial in problem solving. If you don’t have the right perspective on problems, then you will either have too much or too little information at hand. What is key is finding a way to build these different levels and recognizing when it is time to approach a problem from a different degree.
In software development we deal with abstraction all the time. Our tool for dealing with and expressing abstraction is called code. However the code itself is not where the abstraction lies. Just like how words in a book let the author tell ideas, code is a way for programmers to shape and express our problems. It is the tool that we have for taking problems, turning them into something abstract, and then reasoning about them. We communicate through it.
The amazing thing about being able to use code this way is that it not only is a way of communicating our abstract ideas to ourselves and each other. We can use diagrams and words to do that communication as well. Code is special because it also is a way to communicate some form of these ideas to the machines that we are working with. We can take our tool for dealing with the abstract and use it directly as a solution.
Remember that solving a problem requires looking at it from the correct degree of abstraction. Is it possible to run out of these degrees? Sometimes it becomes impossible to go further. Now you are forced to limit your reasoning to the limited area that you can work with. This is when really difficult tasks creep in. This is when you will get stuck.
When solving problems we often think about our tools. We always have different sets of tools that comes together. Our code that makes the software, slack and email for communication, Skype for meetings, PowerPoint for presentations, Excel for accounting, Jira for planning and Confluence for documentation. These are all great tools but what if I have a problem that goes between even two of them? Often the limits of problem solving are not in the tools themselves but the barriers between them. If you want to make problems easier, pick tools that you can build into a degree of abstraction. Find a way to build reasoning and code that pulls it all together for your specific need.
Think about the problems that you have to solve on a day to day basis. Where do your degrees of abstraction start and where do they end? Is there something stopping you from looking further up or further down? Getting past these barriers and, helping others get past them as well, will be key to your success.