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. In this world, you'd be battling 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 fate with entropy awaits.
Higher than usual failure rate in my Twitter feed this year; three nonworking front cameras, two non-working touchscreens. Bleeding edge. https://t.co/O2UxezFx9Y
— Steve T-S (@stroughtonsmith) November 4, 2017
I try to write frequently on the topic of building a business as a developer, and other random musings. You can follow along on Twitter.
Top comments (8)
Being a hardware guy myself, it can be difficult. But after years and years of experience I've found it best to take a step back and look at the hardware in use and how the end user is using it. From there its easier to decipher problems. Debugging comes easier as the years grow longer.
Software...software is hard. At least to me. I've found that, like you seem to of found out, its a different logic used in its operations and functions.
Good article.
I guess I'm also referring to the business aspect of it. With software, if you screw up, it can be costly, but seemingly not as costly as a hardware screw up. Do you find this to be the case?
Where I work at, we do not follow any CD or CI structure due to federal requirements. The only main time we might have major problems on hardware would be during the initial facilitation/installation. As with anything, there are always hiccups.
Afterwards its just standard up keep and maintenance.
I worked as a software guy at a hardware company for 17 years. It's maddening and oddly comforting at the same time.
To me, hardware is a mindset: Design freezes, start-of-production dates, supply-chains to wrangle. Probably the most impressive thing to me about Apple is how well they can ramp production and supply-chain year after year after year.
The maddening part about it from the software perspective is: Software is "free." More specifically, software costs nothing to change and has no incremental unit cost. When you have a whole organization that revolves around hardware, this means there is only one rule:
When you can fix it in Software or Hardware, you ALWAYS fix it in software.
Example: My old company had an I/O chip that had a logic bug where it would sometimes drop or reorder data coming off the bus. Someone found a software workaround (wrap the payload with some parity-checks) and you'd better believe that we shipped devices with that bug for years until the paid-for supply of I/O chips was exhausted.
To a software guy, that's maddening. Fix the bug. The an electrical engineer, that's just a regular Tuesday. :)
It's not as hard as it seems.
I'm doing it all, hardware, drivers, system services, userspace.
With hardware, you have very fix constraints what you can do. Connect the dots, and it should work. Miss a thing, and nothing works. Almost everything can be seen as a module; most stuff comes to you as an eval kit that you can fit (somehow) to your current hardware. Thats where you test if it does what is promised, and learn quite early what's missing.
We regularly go through 3-4 hardware stages, with only minor modifications. Most common mistake is mixed up connections (swapped RX/TX lines, confusing connertor pin count), and very seldom you have quirks that you find late in the process.
The complexity is much less than software, because it can't grow additional features over time, as software does. If it wasn't there in the design, you have a hard time adding it later. So you have to test every feature early on, and are fixed to these decisions.
Interesting! It looks a lot harder, but you're right: physics may be scary (to me at least), but it is extremely dependable.
Machine environments on the other hand..
I guess Google (Android), Microsoft and the Linux community have much more problems with complexity than Apple does. The variety of hardware supported by the operating systems they have to care about is really impressive. Therefore I would say software can be as hard as hardware, maybe even harder. Funny sentence btw! ;-)
That's a good point!