
Software is not limited by physics, like buildings are. It is limited by imagination, by design, by organization. In short, it is limited by properties of people, not by properties of the world.
“We have met the enemy, and he is us.”
Ralph Johnson
Software design often looks like a black art. Some people are really good at it while others create complicated messes. The discipline is young (a few decades) and the products are infinitely malleable. Given a particular program to write — theoretically (as proved by Alan Turing) — there are infinite ways to do it.
For the programmer, design is an essential prerequisite to understand and organize complexity in the system. From high-level design to low-level details, you are always figuring out where to place a particular piece of state (data) or a functionality. Your goal is to have clarity, the right semantics and conceptual integrity.
Often, programmers start from an understanding of a particular programming language and its abstractions and proceeed with the design and coding. However, when you’re trying to do something new — not run of the mill — you often need to choose the language based on your intended system and its nature. You can’t start from a language, you have to start with a design. You might end up creating a new language (c, c++ and go come to mind).
What we need is a highly congruent conceptual abstraction that helps us position state and functionality across the system. The conjecture here is that we can do this very successfully by conceptualizing a given system as one of Collaborative Distributed Intelligence (CDI).
We explore how this applies to software design from very fundamental elements to language abstractions. It helps to think of this as an exercise in language design focusing on semantics. The end result is that you will be able to utilize an existing programming language better as well as design your computing elements — data, functions, classes and modules with accuracy, stability and endurance.
Libary design is language design.
Bjarne Stroustrup
What you do when you create a program is essentially creating a new language to express your problem space and your solution space. With a good grasp of your context and a coherent bird’s eye view, you will be able to organize the intelligence in your systems much better.