Software Engineering is inherently complex, atleast to the software developers. This is because the purpose of software engineering is always always more than just technical – to solve some real world problem. That is why it is very important to realise the problem that the software is attempting to solve.
Just like in the real world, there can be more than one answer to a question, there can be more than one ways of solving a problem in software engineering, especially after so many man-years in the software industry have produced multiple technologies and programming languages that fit the bill.
Andrei Alexandrescu says in his book – Modern C++ Design – “Software engineering, maybe more than any other engineering discipline, exhibits a rich multiplicity. You can do the same thing in many correct ways, and there are infinite nuances between right and the wrong.”
Not only because multiple solutions exist, but identification of multiple solutions is important to qualify one of them as the best. This concept of multiple solutions applies right through the software development lifecycle – from the macro of architecture to the micro of individual line of code.
Lateral Thinking is a problem solving approach that tells you to think in multiple directions.
“You cannot dig a hole in a different place by digging the same hole deeper”. This means that trying harder in the same direction may not be as useful as changing direction. Effort in the same direction (approach) will not necessarily succeed.
Edward De Bono, who invented this term, says that Lateral Thinking is for changing concepts and perceptions. It asks you to change your point of view and then think about the problem. Lateral Thinking applies to all the walks of life, and a lot to Software Engineering.
By definition, Lateral Thinking makes you think about the same thing from different points of view, all of them being right in their own way. In this process, a software engineer can discover factors that had not been considered earlier. The factor can be one of the requirements, one of the stakeholders or a business constraint. Sometimes such thinking can change the composition of all these factors and change their priorities, affecting definition of the problem sometimes. Lateral Thinking puts focus on the problem so much, that we automatically distinguish the problem from its solutions, i.e., distinguish what from how.
When the system is being designed, Lateral Thinking can help build relations between the different modules involved. In case of Object Oriented Programming (OOP) it can help in designing different objects and communication between them. Thinking from different perspectives also helps gain an abstract understanding of the problem, or the generic definition of the problem that we had discussed in Adaptive Programming.
As Andrei Alexandrescu says, “The design of a software system is a choice of solutions out of a combinatorial solution space.”
Lateral Thinking can provide this combinatorial solution space. The choice of the right solution then depends on all the different factors, sometimes the budget is more dominant, sometimes the deadlines overrules everything else, or sometimes it is simply the skillset available. The subject of choice of the right solution deserves its own space of discussion.
In a nutshell, Lateral Thinking allows you to think in multiple ways, from multiple directions – including non-traditional ones, enabling out of the box thinking to create innovative and effective solutions.
Copyright Abhijit Nadgouda.