My point is around the premise of keeping things simple. Putting layer upon layer of abstraction and code means inevitably you have less and less visibility and understanding of the system as a whole, and how it is likely to behave.
The belief that you could have such an "understanding of a system as a whole" is the archetypical engineering hubris. Yes, if you have 1000 LOC, then that may work. But (a) applications don't stay that tiny and (b) in many domains, such tiny applications don't even exist. Systems often grow so large and complex that no person could ever have an understanding of the whole system. Even with a small system, say tens of thousands of LOC, you won't have this understanding. Imagine now we have a big system with millions of LOC.
Many components are being contributed by third parties, people join the team, people leave team, etc etc -- no-one knows the "system" and no-one can know. Let's just accept the reality that systems are complex. We cannot talk their complexity away and deceive ourselves by thinking that we "keep it simple". No, we don't. We just add couplings, and couplings make systems *more* complex (you can also model that mathematically, if you are so inclined). Only if we are not familiar with software design techniques, we might find adding couplings simple and intuitive, but that's just because it's the only thing we know.
In the case of the scheduling stuff, the couplings are introduced because each and every task has to keep the timing of the whole system in mind in order not to destroy it. That is wrong on so many levels, I don't even know where to begin.
Once you're relying only on empirical results, and ignore the details of what's going on under the hood
If I opened the code for a USB driver, I could only understand it if I sat down for a year and digged deep into the USB specification. Of course, I cannot do that because I have a different job to do. So, I have to accept that I do not know the details and *nobody* knows, maybe not even the guys who wrote the driver because also their team consists of more than one person and the USB spec is huge.
And empirical results are a corner stone of software development, it's called testing.
you increase risk, you don't reduce it.
Well, the only thing I can do right now is tell you that I am talking about things that have been the basis of the IT and software industry since the 1990s (of course really only the fundamentals, many other things have changed since then). You don't increase risk but instead manage complexity. Managing complexity means to *reduce* risk. That doesn't mean that software always works. But if you did it differently, it would never work because it's too big to "just work".
I'd also say that this abstraction encourages people to use software outside of design criteria, because all to often not all use cases are specified.
I am not sure what you are referring to.
I am very sceptical when anyone states there's only one way to achieve something in all cases, discounting all other options,
What I say leaves much room for interpretation, I didn't give specifics. I'm leaving everything open. The only thing I don't want to see -- yes, I don't -- is code that looks as if the last 50 years of reason hadn't happened. And that is all too often the case when I look at embedded code. It's just a big hack with vicious couplings everywhere, no design, no architecture, sometimes they don't even care for formatting and readability. That cannot be good for anyone, especially not the users.
If you want something official, have a look into ISO 26262, for instance. They want you to use the methods that I am talking about. And not because they are "modern" but because they are important -- or at least could be if they were being used.