The things I like
1. Software architecture
I have written an on-line book on how to properly organise code here
If you are a software developer, you would have heard the expression "loose coupling and high cohesion". It was first coined by the great thinker, Larry Constantine, as the guiding principle for code organisation.
Well it turns out that to this day, there is a misconception about what coupling means in this expression. Minimizing coupling is generally thought to be about minimizing dependencies. It is not. Minimizing coupling is about understanding the internals of one module without knowledge of the internals of other modules. Larry Constantine wrote "The key question is: How much of one module must be known in order to understand another module?". He uses the word key, because it is key to low complexity, low bug rates, and spending less time understanding code during maintenance.
A further misconception is that it is quite possible to have zero coupling. It just requires good abstractions. For example, when you use a squareroot function, you need know nothing about the internals of how squareroot is calculated. You only need to know about the abstraction, squareroot, a concept that is thousands of years old. When an application is written to run on Windows, its code need know nothing about the intricacies inside windows. That’s because of the quality of these abstractions. There are still dependencies. In fact we want more of these dependencies because then we are reusing our abstractions. Charles Kreuger pointed out that abstraction and reuse go hand in hand, so the more we reuse our abstractions, the better abstractions they are.
It turns out there are good and bad dependencies. Good dependencies, those on good abstractions, are very very good. All other dependencies, such as to facilitate communications between peer modules, or direct associations between peer classes, are very very bad. The thing is, you can easily write code using only good dependencies. This simple realization leads to a code structure which I call abstraction layered architecture. The exploration of this architecture is the subject of the on-line book: https://www.abstractionlayeredarchitecture.com