Then people realized, that was just not happening in the real world:
- Dual-channel interfaces would still fail (bad line card on the switch).
- Redundant Storage frames could suffer catastrophic outages.
- Datacenters with dozens of layers of redundancy could still fail due to fiber cuts, or faulty transformers.
- Unexpected crap happens, and you can never account for all of it.
So gradually, a movement began: virtualized computing and automated provisioning tools really gained traction and maturity. A shift towards more defensive programming emerged: we now don't trust the bottom layers to work. We plan ahead for them, we expect failure. Google, publishing their server specs and approach, really pushed this forward: people realized you could run serious infrastructure on mickey mouse hardware.
No longer is reliability needed at the component layer. We can move the responsibility much farther up the stack, and just added resources to cope.
I think many people (especially in the enterprise space, where change is slow, and tech is slow to adopt) have not adjusted for this change yet. They continue to buy uber-expensive server gear with redundant power supplies, mirrored disk (for redundancy, not performance reasons), ECC checking memory, and so on. They don't realize the $10,000 server they spent on a single server, could have bought three less redundant options that would have tripled their computing power. For the most part, they are right: you can't do these things until you fundamentally change your approach to software.