Which is why I'm not arguing that this is the (or that there is a) One True Way to structure C sources. However, I have found this old-school approach to be very nice and workable on a recent project of mine; none of the FUD against it is proving to be a generalization. (FWIF, I have much more experience with the "every header is guarded, and includes what it needs" approach.) Anyway, in real engineering, there is more global awareness of changes to a design. Maybe software is the way it is because everyone expects not to be distracted with irrelevant details such as "how the hell does this thing actually work as a coherent whole". In electronics, you would never get away with bullshit like "I'm just going to throw a little sub-circuit into this schematic and not care about anything else, since the impedances obviously are such that it has no impact". (Let someone else worry about board area and layout, noise and crosstalk issues, emission, added power consumption and heat dissipation, etc). It's not easy enough for some people that we can just type our product from a keyboard and have a toolchain convert it into the final running image. It additionally has to be possible to make changes without knowing a whole lot of pesky context. Because our time is so expensive, and all. Maybe this is why companies sometimes spend hundreds of thousands developing some beautifully functioning working for a device, and then it goes to hell because the task of making drivers was given to some yahoos as an afterthought, and the end product is a flop that blue-screens everyone's PC.