Low-level is easy (2008)
yosefk.com
yosefk.com
The most arduous task for me as an engineer is the endless hotfixing of high level code many tech companies engage in, never taking the time to rewrite and solidify the code as business needs are always evolving. They call this "agile" these days (no relation to the actual agile practices).
This isn't my experience. Companies producing hardware or devices tend to think hardware-first. Any firmware or software that needs to be developed is often over-trivialised. The way management sees it is that driver/firmware development eats into profits, so it needs to be done quickly. "It's just software". I'd like to hear what stories other people have.
This was my experience. I worked as a firmware developer for a company producing computer hardware. The attitude of management was “the product is perfect then firmware breaks it”. Never mind that the thing didn’t work without firmware.
The concrete result was that it was impossible to get support from hardware teams. You would chase some weird bug for weeks, be ghosted by your supposed hardware support contact. Then finally chase the guy out to his car at 6:00 pm and find out, “oh yeah, we changed the address of that register, guess we forgot to update the software interface doc. I’ll update the errata tomorrow.” (obviously he never did).
I wish there was less over-generalised "Oh, these other guys, they've got it easy, unlike us!".
From my time in embedded, I've gathered some rather different experiences. Deadline are often tight, and as software integration and testing are by necessity the last step in the development process, it's always the software guys who're left holding the bag if anything goes wrong at the earlier stages of the project. The overall deadline must be kept, after all.
So when the hardware guys slip on their deadline (for whatever reason, it doesn't have to be their fault), it's of course up to the software guys to make up for the delay. How hard can a bit of embedded software be, after all? So you're left writing lot's of stuff on the dry, as without access to the hardware, you have no way to test everything in advance.
Then there's the cases where bugs in the layout or docs are only found after you insist forcefully that either the documentation or the hardware itself must be at fault (after hours of futilely hunting for a nonexistent software bug).
So, no, embedded is not necessarily as easy as some people like to make it out. As with most everything, it's very much a case of "it depends".
Lots of developers stays on that higher level, they don't even try to do things that can't be done at that level.
The second I work on something higher level, I am normally talking about work. With work, I am forced into whatever tooling the rest of the team uses. As there are serious deadlines, frameworks come into play to leverage someone else's code as much as possible and reduce how much needs to be done. Higher level stuff also means at least 3 APIs are normally involved (our own, a database/storage API, an OS), but this number can grow if we end up using a service of some sort. There are also multiple arenas. Client, server, and usually also service. There is also the interaction of the team involved, which adds complexity. Debugging takes significantly longer, and it isn't just the OS, the frameworks, and all of that jazz. More code does mean more bugs, but the biggest time sink in debugging is that it isn't all my own code. I don't know it quite as well as I do my hobby stuff. I think this is all rather natural honestly.
Endless bickering about which metric goes on which page and whether we're correctly capturing the concern of the month was driving me nuts. I don't miss it.
> Remember how I told low-level programming was easy? It is, fundamentally, but there's this other angle from which it's quite a filthy endeavor.
yeah, because most of the time there isn't even a spec to follow or it changes so often you might as well update your code based on which new errors you get
In either case, in low-level code and low-high-level code, the number of ideas one deals with is many fewer than in the higher levels of the stack. At the end of the day, computers are really fancy calculators, and the ontology at that level of the stack only consists of a handful of things. A consequence of it is that one reuses the same handful of ideas in myriad different ways. It's part of what makes the lower levels of the stack both fun, and monotonous at the same time for me anyway.
I cannot say whether low-level software or low-high-level software is easier than higher level code. One deals with fewer ideas, but the picky details matter a lot more. Hence why e.g. systems languages generally do not have the abstraction power that higher level languages do, but they allow you to directly manipulate data. With the higher levels, there's an explosion of ideas (far more different problem domains and business domains to consider up there) but one gets to take advantage of good abstractions and good infrastructure to help. I do find that the difficult/time spent per LOC ratio is a lot higher with low-high-level code than high-level code, but low-high-level code is also a tiny fraction of the entire ecosystem. One side benefit of experience in the low-high-level region in particular is that I have yet to run into a software system where having a sense of how that stuff works wasn't hugely beneficial. Since there are relatively few ideas that turn up everywhere in computer software, grokking them has a massive power to weight ratio for working with the higher levels of the stack, especially when debugging and stuff. At least I have yet to find time spent down there to be time wasted.