You try to divide your program into independent "modules" to manage the complexity of understanding it. But that can not fully solve the problem because what the program does is caused by interaction of its components.
There is no single component that would or could be "The Interaction". Each component must do its part to interact with others. In doing so it must assume something about those other parts. This makes it difficult to change any part of the program, changing it can break the assumptions other parts make about it.
Software Engineering is about trying to devise ways to divide programs into minimally dependent parts, and also to divide the problem of creating programs into multiple more or less independent parts, and making it easy to understand what those parts are, and what are their dependencies, the interactions between them. That's a mouthful, right? But that just indicates what a big task it is.
In the end that can not be done as well as we'd like because each part must interact with others, it must encode assumptions about other parts to be able to interact with them.
In this way Software Engineering is like other engineering disciplines. We're trying to make programs stronger, less likely to collapse like house of cards, cheaper, faster, easier to maintain, adapt and reuse for different purposes.. There is no ultimate solution to this, only better solutions to be discovered. No Sorcerer's Stone. No mythical Silver Bullet to kill the "Beast of Interactions". But there is progress I believe, as we gain a better understanding of what Software Engineering is, what it can and cannot do.
© 2016 Panu Viljamaa. All rights reserved