In Raymond's post today (Adding flags to APIs to work around driver bugs doesn't scale), Raymond wrote:
Perhaps it's just me, but I don't believe that workarounds for driver issues should become contractual. I would think that one of the goals of an operating system would be to smooth out these bumps and present a uniform programming model to applications. Applications have enough trouble dealing with their own bugs; you don't want them to have to deal with driver bugs, too.
My personal take on this is that the entire PURPOSE of an operating system is to smooth out the bumps and present a uniform programming model to applications. Applications don't need to know about the weird behavior of of the u765 floppy disk controller that only shows up when there are more than two floppy drives (I got a free 72 hour trip to France because of that particular issue). They shouldn't need to know that a certain models of network adapter will sometimes hand the OS a packet that is half filled with garbage. Applications shouldn't have to know the low-level commands needed to drive a printer.
IMHO, the ONLY reason for an operating system to exist is to hide the details of the hardware from the application. Everything else is sugar.
People forget what the world was like when they would buy a word processor and it would come with a list of the two dozen or so printers that were supported by the application. If you wanted to use the word processor but didn't own one of the listed printers, you were out-of-luck.
For those of you that are now going to say "Aha! Larry now thinks an OS shouldn't contain a web browser", that's not at all the case. An HTML renderer is a very high level special case of hiding the details of the hardware from the application. In the case of an HTML renderer, it's job is to provide a uniform interface that can be used to render HTML content to the screen, just like a printer driver provides a uniform interface that can be used to render content to a printer. Similarly an OS should contain a TCP/IP stack and network programming layer that allows for application authors to avoid understanding the icky details of interoperability (it's HARD to write a high quality TCP/IP stack, and application authors shouldn't have to).
But I still stand by my original assertion: The only reason for having an operating system is to hide the details of the hardware from the applications that run on the computer.
Btw: This is MY opinion. I want to repeat that. MY OPINION. Others undoubtedly feel otherwise.