I like to pretend I am a software engineer despite being enrolled in my university’s computer science program.
One of the many was I need to improve as a software engineering is to keep code with at the same level of abstraction. An example of a failure to maintain coherent abstraction would be to manipulate a linked list in the same function you manipulate a different list using proper accessors methods. Instead you should be using methods for both lists.
In libjtapi I am experimenting with not having header files. This will force me to treat the libjtapi call-stack like a Directed Acyclic Graph. The important part being the acyclic attribute. This means that a low level function cannot call a higher level function, this is enforced by the compiler. I thus have to think hard about which layer of abstraction I am coding in at any point in time.
Or at least that is the hypothesis, I’ll see how the code matures.