Anyone who builds software knows how hard it is. I'm referring not to the initial building of software—that's the easy part. What's hard is actually keeping software afloat and healthy for long periods of time, while making it work for millions of people with thousands of different environments.
I've recently been trying to debug a certain race condition that has been driving me absolutely mad. Doing so has lead me into a mysterious world which I thought I knew like my own name; after all, it made perfect sense while I was building it. In trying to track down this issue, I've encountered areas of code that question my sanity. But, this is code, and we constantly transcend ourselves with every passing look-over. It's how we get better. And—not to worry; just fix and deploy with seamless OTA updates.
Hardware, on the other hand? Now that looks tough. I know very little of the hardware world. Here it seems you battle constantly not with a user's machine environment, but with non-negotiable physics. And if, after spending millions or billions of dollars, you find there's a defect, you can't just deploy a hotfix. You now have millions of complicated devices that will need human servicing in order to repair.
However hard software is, I can only imagine hardware is 100x more difficult.
And if you're like Apple who builds some of the most complex pieces of hardware and software, then god speed. Your date with entropy awaits.