Yi HeinYi Hein

Low cohesion and high coupling in embryological development

In software architecture, good design means that our code should have high cohesion and low coupling. High cohesion meaning that parts of the machine that do similar functions should be grouped together, and this also reduces repeated and redundant code. Low coupling means that each part of the system should be able to operate mostly independent of each other. This means that each part of the system is modular, and it is easy to swap out one part of the system without breaking the rest of the system.

These are all good principles in software design. However, it is rather unfortunate to see that evolution has not followed these designs in human development.

For example, the bone morphogenetic protein (BMF) is involved in many different functions in the development of the human body. These functions are seemingly completely unrelated. The bone morphogenetic protein plays a role in the development of the skin from the ectoderm, involved in the morphogenesis of bone, and also involved in the development of the neuronal subtypes in the dorsal spinal cord. This is a clear example of low cohesion. The same protein is involved in the development of completely different systems. But it gets worse.

The bone morphogenic protein has different functions depending on the receptor it is acting on. For example, in neural development bone morphogenic protein is actually used to develop the neuronal subtypes in the dorsal half of the spinal cord. This is rather ironic because earlier in embryological development, bone morphogenic protein needs to be supressed for successful neurulation. The same protein has completely opposite functions depending on the receptor it is acting on. This one protein has caused the development of completely different systems to be tightly coupled together. Completely deviating from the good design principle of low coupling. One could imagine that the mutation on the bone morphogenic protein will cause complete chaos in the embryological development, resulting in multiple systems to fail to develop and hence resulting in the death of the embryo.

This insight raises further interesting questions. We recognise that evolution is essentially an optimization algorithm. We would expect that after the millions of years of evolution that systems the underlie embryological development would be sufficiently optimized for the best outcomes. How come then we see poor design practices in the development of the embryo? This that makes us question our initial assumptions. Perhaps our software design principles are not actually good after all, perhaps they actually lead to worser outcomes.

While there are inherent similarities with system and machine building between a software machine and a human machine, there might be inherent differences that might account for the difference in design practices between that of an embryo and software. For example, in software design, good separation of concerns often results in the creation of more classes and functions to better organise the code. Perhaps in software this creation of classes is cheap with little downside effects. However, this may not apply to embryological development. Perhaps creating a protein that serves one and only one function can be resource intensive and practically inefficient and therefore selected against during evolution. Perhaps the optimal strategy is to produce less different types of protein and maximise the use cases of each protein, resulting in great saving on the metabolic protein manufacturing pipeline. There are inherent manufacturing overheads in humans, whereas the manufacturing of virtual objects in software does not possess the same logistical inefficiencies. It would then be interesting to compare how design principles in a manufacturing of a product (a Tesla car for example) and how similar or different it is from the manufacture of human beings or the manufacturing of software objects and classes.

Or perhaps we are looking at the completely wrong area. Perhaps low cohesion and high coupling is not meant to result in minimising damage to the human body. Perhaps evolution optimises for an all-or-nothing approach to making human beings. Essentially, we only want a human being to be born if everything is working. This is because if a human being has some molecular defect and yet survives the embryological development process, it will serve as a greater liability to the human community in the resources required to maintain and sustain the life of the defective human being. Therefore, by ensuring that all embryos with any form of small defect will completely wreak havoc on the rest of the system, we can ensure that even the smallest defect will result in the failure of embryological development, hence increasing the chances that those that actually survive embryological development will have close to zero defects and therefore have a higher chance of survival and competing against other species. In a sense, by selecting out defective embryo, the human species are able to cut the losses at an early stage.

I would like to believe that is much to be learnt from understand the design practices that underlie the development of the human body. These designs practices have been optimised for millions and millions of years, far beyond the level of optimization modern software systems experience. It is therefore wise to learn and understand why we see the design practices that appears in human development. Evolution, by value of its immense power for optimization, is wise and therefore worth respecting and worth studying.