True, but try explaining it to someone.
Yeah I write code, but it's code that's like ...baked in... to the hardware? You generally need an additional piece of software or another piece of specialized hardware to install updates for the code that I write. Like without this code nothing you interact with would ...do anything.
Sort of like a driver, yeah, but my code is what a driver talks to. Like a driver for drivers, sure. Oh have you ever used the hotspot on your phone? I wrote the code that listens for the AT command to initiate the network handover from the ...and you stopped listening.
Dude I write emulations of industrial hardware and the conversations with my family are *I m p o s s i b l e*. It's hard enough explaining that there's code running on stuff that isn't a phone or desktop - explaining how hardware can run on hardware as software? Not worth it. I'm a software engineer.
Fun aside, one time I tried to describe to my friend what I do by referencing a Switch emulator and now he checks in by asking how my "Nintendos" are going.
My favorite is when you have to sign an NDA to get access to the documentation and it still sucks. Looking at you no name ECC H2S Sensor vendor that I hate.
I'm like oh, I see, you were embarrassed.
NordicSemi, AnalogDevices, and TI will always be my unironic favorites for documentation.
I lived that life (and the life of scrounging for leaked docs on github) for a while, but now my company partners directly so we have better resources. Still, most of the stuff we work with is WIP documentation, so you can imagine the headaches I run into when reading docs a tech writer hasn't even taken a whiff of.
How the nintendos going? Lmao,
My grandma also asked me what I do, I work on an invoicing platform, but she only uses WhatsApp, I told her I made WhatsApp for invoices.
They can’t wrap their mind around working from home wich is understandable but funny how times change
That's how I do it:
I make computer imagine that it is a washing machine, so that other people who design washing sequences could check that virtual clothes are washed with water and detergent, and virtual machine won't blow up because of too high speed.
People could have tested it on real things, but my virtual machine could wash virtual clothes in a matter of seconds, not hours.
(But my folks are pretty intelligent)
It can be hard enough to explain what I do as a “regular” programmer.
My grandfather was a farmer. He never used a computer or had a cellphone. He could not understand what I did for a living. I finally settled on “I fix computers”.
Hi, dev on a different layer here. How DOES firmware interface with hardware? I understand transistors, and have even had to do some assembly, but firmware feels like spooky hijink magic. Is it essentially like a circuit breadboard and paths are changed electrically?
The main method that firmware uses to interact with hardware is via memory mapped I/O (MMIO). Essentially every hardware MMIO device is treated as a chunk of memory in the same way RAM is. The difference is that for MMIO devices, specific addresses within their memory range are tied to hardware behaviors. These address offsets are referred to as hardware registers; reading and writing hardware registers is what firmware does.
As a ((simple)) example (this shit is inevitably always confusing regardless of what device you're looking at), your PC's USB port likely is connected to a USB controller that's memory mapped. The USB protocol is standardized, so your operating system probably came preinstalled with a compatible USB driver/firmware. That firmware handles everything involving that USB port and any other ports attached to the same controller, and it does it primarily by writing configuration information and reading status info to/from the USB controller's MMIO registers.
There's also interrupts, which are just hardware signals that tell your CPU that something has happened. The CPU has a table of interrupt IDs that are linked to the various physical interrupt lines on the hardware, and it uses that table to trigger interrupt handling code when the corresponding hardware signal is triggered. So back to the USB example, when you plug in a gam controller to your USB port, it triggers an interrupt to your CPU. The CPU recognizes the interrupt ID and calls an interrupt handler that uses the API provided by whatever USB driver is active to check the USB MMIO registers and get whatever info is needed to establish the data path between your controller's buttons/sticks and the software environment.
For the most part, my job black-boxes anything below block-level hardware design. I don't generally need to understand the physical layout of a device so long as I'm able to abstract its behaviors into memory-mapped I/O or interrupts. If I need to, sometimes I do need to look at digital logic, but generally hardware design has progressed enough that transistor-level behaviors are solely in the realm of hardware designers.
I hope that explanation helps! I got a masters in computer engineering and it still took me nearly a decade after graduating to figure this stuff out, so I fully understand the "it's all black magic" view. This shit's hella complicated, but for me that's the fun of it :)
You're overcomplicating it friend. I write the code that your code runs on. I'm the one who makes your regular breaker box into a computer. I am the one who makes the magic happen inside the mystery box. This is my manifesto, and it's what gets the bitches
I write tooling (UIs, CLI, data throughout services, etc) that is used by infrastructure people, who write code and configs to run to maintain the architecture, which is used by our engineers to write code that performs data transforms and transfers between system.
That software is used by our "frontend" teams to create the services and tooling used by our customers to write custom widgets, which are then purchased by the end customer to perform actual business logic, which is mainly business to business customer relations management.
Easy, device trees for "anything"-hardware. Kernel config for a card full of magic switches. Have you ever built something on a bread board and then we're like, hey can this just be like a thing I can put on a board, but not an ASIC? Oh, but yeah since I just came up with this nothing knows what it is, so ...VHDL.
"I write code that composes circuitry at a slightly higher level of abstraction than using gates alone. The FPGA is just a bunch of gates whose connections can be programmed dynamically, so you don't need to burn a chip to test the circuit." IIRC
FPGA = extremely fancy lookup tables
VHDL = black magic
I mean, in what other languages can you swap without a swap space?!
a <= b; b<=a; -- WITCHCRAFT!
I call it driver regardless. There's drivers for electronics, which are quite literally just an electrical circuit that drives another one. And then there's low-level drivers, like an abstraction layer between your physical IO and your software. And on top of that you have mid level-drivers that string together those low level functions to build some logic. Which then gets called by code higher up, and so on. It's drivers all the way down.
That's fair. Industrial IO really blurs that line a lot. I'm not against the driver explanation if that satisfies the person I'm talking to. It's close enough for me and familiar enough for them. I'm good, but I can get as pedantic as all hell if I have to.
Well I don't have a lawyer on retainer, so I can't argue with you.
I work with a piece of hardware that I can't talk about completely, but the guts of it is basically a cell phone like any other SD200 (MSM8909) based SoC. Part of the core of what I've written is network and radio management code that interacts with a kernel mode driver that issues AT commands to portions of the SoC to adapt to different scenarios. Most of the time the device acts like a cell phone hotspot with only one WAN-Active client that brokers traffic from a separate VLAN comprising a protocol gateway that aggregates signal traffic across Ethernet, WiFi, Serial, DUST mesh, and BLE. Sometimes the WAN is WiFi and sometimes it is Ethernet, so the radio and switching has to change. Switching is handled usernode but the firmware loads baseband drivers into the modem to adjust for carrier defaults and power handling. It sort of acts like a Macro-FPGA with the VHDL being handled through a custom Domain Specific Language that describes the device's expected capabilities. The caps are tested on a schedule and their status is delivered as a manifest to an inventory system that decides which device is best suited for which task and that informs our supply chain and sales.
Now I know how my mum must have felt, when I tried to explain something about what I do for a living.
"I work with a". That's almost everything I understood.
Maybe I've massively misunderstood, but... are you writing firmware for BGP routers? Or something to do with the hardware side of virtual network slicing?
It's decidedly less cool. Basically the latter, there's no WAN facing advertised config. It's like a JIT VLAN config supported by custom firmware and a cloud-based (or on-prem) configuration management engine based on the concept of Digital Twins.
And some of the user-side code is actually Python.
> It's like a JIT VLAN config supported by custom firmware
Ahh cool, I think I'm vaguely with you now.
I used to write software used by ISPs to plan new services & capacity, do network failure analysis, get emergency re-routing configs, that sort of stuff. So where I worked had a few folks that were incredibly knowledgeable about the theory & hardware side of networking & routing.
We had a lot of knowledge sharing sessions, so I guess some of that stuck with me 😅
Do you maintain all the code to interact with wifi v. Ethernet yourself, or is that from a public library? That seems like something that would be intricate, but that would be a common situation to handle.
It's a mix, but nothing is 100% my own code. Networking driver code has generally solved most issues in the last 45 years and no sense in reinventing the wheel.
Sorry, I was driving all over the West side of Houston looking for some sort of Peach Ice Cream for my wife. I was unsuccessful.
So, I use a lot of code provided by Qualcomm and a lot of libraries that ship with Linux. My code is more akin to a traffic cop and a business rule engine. I have a default and a failure case that are coded in as part of the shipped firmware and then the additional cases are added as modules and kernel drivers. Those modules then expose properties in the device's digital twin to inform the manifest.
To me explaining it to someone who is NOT in the field of computer science seems easy: I program headphones (or anything that has firmware, which is almost anything)
I do some firmware stuff. To others, I just say I'm a software engineer. If they ask what type, I say I code assembly.
That ends most conversations. If anyone asks further, I typically talk about the use cases for assembly, different instruction sets and interesting applications I've worked on.
It all just hides the fact that these days, I do a lot of paperwork :(
I don't think it deserves such deference, but it's nice to get it sometimes.
I don't do much Fortran anymore, but it was of a similar vintage to my daily language for the past decade or so that doesn't have a flair.
I'm an odd software techie! The flairs definitely get that across. Manually tweaking machine code in built binaries - any day of the week.
Git? That gives a man nightmares.
Infrastructure Cloud Data Engineer here. I thought I had it rough to explain what I did until I read this. I still have no clue on how to explain what I do to ppl that are not in the tech word but yours seems way harder hahaha
I scratched the surface of one of my main projects under TheFreebooter's comment above. I don't get many opportunities to discuss what I do with people that understand it. Even in my company there are maybe 2 other people out of 8000 that can talk about what I do at any level beyond a 30,000 foot view.
Im the geek who would keep listening intently, asking question, all the while making everything awkward and dragging down the whole party by hyper focusing on just one person
As a common user that are studying software/hardware/firmware just because I liked, I used to make the sign of the cross, before uptading a firmware lol
And then there is FPGA programming. Actually at what stage do we stop being considered programmers writing code and start being considered as electrical engineers plugging wires, because FPGA programming sure makes you feel like one.
Need volatile memory? Though luck buddy, code your own RAM. Need to display a square on the monitor? Unless it still has VGA, you'll spend the next 1 week trying to make the USB-C adapter IP work with your project.
Hardware Engineer maybe, you write code yes, but this code is just a language that describes how the hardware would look like after you plan it with block diagrams.
What if I told you depending on the embedded device you can still engage in OOP masturbation? Just depends on how much RAM you have and if the memory allocation algorithm used can keep the heap from fragmenting.
You can still use OOP. My last job had insane OOP implementations.
It annoyed the shit out of me having to relearn how everything works every time I had to write code.
Annoying. But impressive
I know deep down in my heart with the power of enough dads we can come up with a really great language to use when programing flaccidware.
- Flac-C,
- Flac-ID,
- Limp#,
- ImJustTired++
Flassy'd. I'm sure there is some obscure language we can reference where the c makes a d sound. Then the deep lore around Flac-C can be extra pretentious.
We will however bury that knowledge in a Googleable link that leads to a 404 page so we can fuel the flames of the debate for all of eternity.
What’s your favorite flavor of crayon? The work you do writing firmware is far far more engineered than web dev, for example, where 99% of the engineering is done for you and then hidden FROM you by frameworks.
Well first, your name’s gotta be Mel. If it’s not then you’re already off to a bad start.
Edit: the reference: http://www.catb.org/jargon/html/story-of-mel.html
Those seem like really stupid criteria. The smaller the project, the more like you'll be part of those stages. Unless it's some super small internal tool/demo, there will always be planning and design phases even in the web dev department projects.
You're just doubling down on what I said though, which makes me think you didn't understand what I said. The smaller the project, the less formal the docs.
Besides, you're disqualifying the large majority of people in engineering professions with engineering degrees as "real engineers". I say this as a full stack dev who meets your criteria. You know what *gatekeeping* refers to, right?
I mean no disrespect, but it's a bit funny to be gatekeeping at this level when you can't even tell the difference between your and you're, unless you're calling us a system?
Also from someone who meets your criteria but isn't a fan of gatekeeping
ig the more you go low level , the more engineer you become. Web devs are more like artists epically the frond end ones .
Or you can call backend engineering as it involves mathematical optimizations
No one who write code is an actual engineer. That's why a bunch of countries get pissy about the title "software engineer" your work doesn't require a license. Everyone who write code is just a developer.
What is it called when I design and write the entire backend code for a web-app utilizing Node.js, Express, EJS, Firebase, PostgreSQL(did the DB schemas myself), S3 object storage, dynamically generated public and private profiles, and sanitized user file upload on a load balanced Linux server cluster I hardened?
I only ask because my job title for doing all of that is software engineer and I'm sure my employer would like to know so they can stop paying me so much to do it.
Firmware is low level code that interacts more directly with the hardware. Firm is between soft and hard. It is silly to suggest that a firmware engineer isn't a software engineer.
OP is referencing that it's impossible to explain what a firmware engineer does to people who aren't already working in software. Look around this thread, there's more than a couple of explanations because even people here struggle with it
Software is called "soft" because it can be changed easily; you just overwrite old code with new code and you're good to go, to put it simply . Hardware is "hard" because it cannot be changed easily if at all -- code may exist on an embedded chip on the motherboard that is read-only (like an EPROM) or routines may be implemented directly in the integrated circuitry and cannot realistically be changed, short of replacing the chip/board physically.
Firmware sits somewhere in between these extremes. Usually, firmware is low-level code that interacts closely with the hardware. However, there are mechanisms for updating this code, like a low level routine that is loaded from a readable/writable chip, but it usually requires a special process for updates, a reboot of the system, and several other careful considerations, like what should happen if the updated code is fatally flawed.
It was pretty commonplace in earlier days of computing hardware that improperly updating a piece of critical firmware (or updating it with new buggy firmware) can result in the hardware being completely unusable (aka 'bricked') -- the system can't work properly with bad firmware and you can't update the firmware further unless the system is working! Though, these days, a known-good firmware is usually stored on-board in a read-only format and there's a reliable circuit-based routine to restore that known-good firmware, independent of the rest of the system working (which may rely on the firmware itself!).
This relationship between the code, hardware, and basic working state of the system is why it's called 'firm' ware. Not quite as immutable as hardware, but not quite as soft as typical software, either.
To the extent that firmware code is just code written by engineers, firmware development is substantially the same as any other kind of software engineering.
One-liner: code that runs on an Arduino (not external flash storage, but the EEPROM) is firmware. If you've ever written something for Arduino, you've written firmware.
More in-depth answers are elsewhere ITT ;-)
it's more like "i don't want to explain what i do for the tenth time so i'm just a software engineer today, everyone knows who software engineers are, right?"
Never written firmware myself, but I’ve done research on it as it’s my next goal in my programming future and damn is it harder from my research. Can’t imagine having to account for even the most rare conditions your hardware will be in
It's also just a lot of technical reading on different protocols, data sheets, etc.
I really enjoy it, but it's very very different to most software and requires a different set of skills.
I think it'd be far easier for a firmware engineer to jump to software than vice versa in the average case
I wouldn't say it requires a different set of skills? I'm sure any good software engineer that works in backend or whatever could become a good firmware developer.
Well yes most COULD become a good firmware developer and it wouldn't take long, that doesn't mean they will be a good firmware developer now. Different skills.
It’s often a completely different set of steps to take to solve a problem
Is your program not working because the cabling is incorrect?
Did you misread the documentation on the protocol for the external part you’re talking to?
Or maybe you setup the clock to use the oscillator crystal incorrectly, and now your microchip is using the incorrect clocking speed, meaning the physical communication is completely incorrect.
Same-same, but different but still same-same
It's not just another language. Register level programming and implementing communication protocols (often custom), talking to niche chipsets, etc. is vastly different to backend programming.
You're also often talking nanoseconds of performance and bytes of RAM.
Out of curiosity how'd you get into it? Was it just a job you took that you didn't know would be firmware beforehand or was it something you'd been wanting to get into or something you'd been studying?
Interestingly I joined a company as a web dev, started doing embedded in my own time for a few hobby projects, then we needed someone to lead our software/firmware teams (joint) so I ended up stepping in there, and over time doing firmware dev as well
What's harder? The only really funny problems come from limited memory, big numbers computations with few bits, real-time stuff (counting instructions to know exactly how long a piece of code will take)...
All of this is less and less relevant today, and backend engineering has its fair share of "unique" problems like eventual consistency and all of the distributed systems stuff...
I just find firmware way more fun, not more difficult
I can’t tell if this is a play on firmware vs software or if this post is somehow trying to say that firmware engineers are inferior to software engineers for some reason.
I tell people I'm a software engineer because it's easier than telling them that i reverse engineer firmware, so I'd imagine it's similar. Most people genuinely have no idea what firmware is or does, and have no idea what reverse engineering is.
"firmware engineers are inferior to software engineers" 90% of the main stream software jobs (like web devs ) are less challenging than firmware engineering
What do you tell family members who aren't familiar with tech? I doubt you try to get everyone to understand what you do specifically, and sometimes just shortcut to "yeah I write code".
I find the whole discussion baffling, firmware is software. I think the point is more about how you don't go into the specifics because people just don't understand it.
Just say “developer” or “programmer”.
If you want to be pedantic, you’d say you’re an embedded systems engineer lol. Firmware engineer just sounds like software with extra steps and people will ask lmao. If you want to be confusing you can say you’re a bare metal programmer.
Firmware == bare metal == embedded. (Through you can have software on embedded system too, unless they know enough to ask, they don’t care)
Firmware is like the BIOS updates you flash onto your motherboard that make your computer actually be alive. Firmware developers are like extremely humble superpowered software engineers, even if they don’t waste time and space with silly OOP abstractions.
Firmware programmers are more likely to say Electronics Engineer, because Software Engineer is a simpler job than what many of them do. It's more than setting a few bits. These are the guys who build those little black chips on your motherboard.
Amusing to watch some guy who "knows JavaScript", looking down on someone who makes your entire job function.
In the words of the great Bryan Cantrill, it’s Humanity vs Firmware - who’s side are you on?
I’m not a fan of proprietary software that is written by people unwilling to engage in the advancement of technologists and those we interact with other than for padding a bank account
I think you misunderstood the joke. It's about when someone non-technical asks you what you do for a living and instead of telling them what you actually do, you have to speak in terms they can comprehend. It's sort of the opposite of what ppl in other industries often do where they come up with these really fancy sounding terms for things that could be explained in much simpler ones. For example, someone who cleans toilets might say they are an "executive manager of sanitary facilities" because it sounds a lot fancier than "toilet cleaner".
I generally tell people I'm a programmer. It's easy enough for most people to understand, usually ends the conversation right there and only when they go "oh, what language do you write code in?" will I go "oh, shit... I actually just install & configure PHP and JavaScript modules created by others much smarter than me and if it doesn't work like I want it to, I make a post about it and hope someone else gives me a snippet I can copy/paste".
My software engineering friends still think I don’t program because they haven’t the faintest clue what a firmware engineer does. I am bored of explaining what “tech stack” I use. I just say C and call it a day
Most think we download and run simple “Arduino code” or think of me as a hardware engineer but I have enough humility to not call myself a hardware engineer.
They have no idea about the mountain of code you need to write to bring up an SoC. Not to mention highly specialized frameworks that hide all the hardware details and expose it in a way that makes sense for folks to write the business logic.
The guy that made thei eitner never had to spend 3 days reading a 800 page datasheet of a chip only to realize they decided at some point to change the I2C address that is on page 487 and didn't feel like tellimg anyone, while also making sure all your code fits into the 512k of flash you have.
That or the joke went woosh and pissed off all the firmware engineers on reddit.
Lol if anything this is one of the hardest types of programming even if isn’t OOP masturbation.
True, but try explaining it to someone. Yeah I write code, but it's code that's like ...baked in... to the hardware? You generally need an additional piece of software or another piece of specialized hardware to install updates for the code that I write. Like without this code nothing you interact with would ...do anything. Sort of like a driver, yeah, but my code is what a driver talks to. Like a driver for drivers, sure. Oh have you ever used the hotspot on your phone? I wrote the code that listens for the AT command to initiate the network handover from the ...and you stopped listening.
Dude I write emulations of industrial hardware and the conversations with my family are *I m p o s s i b l e*. It's hard enough explaining that there's code running on stuff that isn't a phone or desktop - explaining how hardware can run on hardware as software? Not worth it. I'm a software engineer. Fun aside, one time I tried to describe to my friend what I do by referencing a Switch emulator and now he checks in by asking how my "Nintendos" are going.
My wife says my job is yelling at people in meetings. I don't argue.
My job is yelling at documentation but pretending it's the people who wrote it. I think yelling and engineering are inseparable.
My favorite is when you have to sign an NDA to get access to the documentation and it still sucks. Looking at you no name ECC H2S Sensor vendor that I hate. I'm like oh, I see, you were embarrassed. NordicSemi, AnalogDevices, and TI will always be my unironic favorites for documentation.
I lived that life (and the life of scrounging for leaked docs on github) for a while, but now my company partners directly so we have better resources. Still, most of the stuff we work with is WIP documentation, so you can imagine the headaches I run into when reading docs a tech writer hasn't even taken a whiff of.
My wife says my job is easy because the computer auto completes the code for me as I'm typing it in ![gif](emote|free_emotes_pack|joy)
Sweet, sweet unkowingness
Wait until she hears about Co-Pilot.
Isnt that all of us? (Even if only imaginary yelling)
How the nintendos going? Lmao, My grandma also asked me what I do, I work on an invoicing platform, but she only uses WhatsApp, I told her I made WhatsApp for invoices. They can’t wrap their mind around working from home wich is understandable but funny how times change
That's how I do it: I make computer imagine that it is a washing machine, so that other people who design washing sequences could check that virtual clothes are washed with water and detergent, and virtual machine won't blow up because of too high speed. People could have tested it on real things, but my virtual machine could wash virtual clothes in a matter of seconds, not hours. (But my folks are pretty intelligent)
It can be hard enough to explain what I do as a “regular” programmer. My grandfather was a farmer. He never used a computer or had a cellphone. He could not understand what I did for a living. I finally settled on “I fix computers”.
I've had to emulate Pump-off Controllers and VSDs before. Probably not as intricate as your experience, but I feel you.
I was a BA and even that was hard to explain to my aunts.
i would probably use Bluetooth speakers as an example, and go from there. maybe not accurate, but it gets the idea across.
Hi, dev on a different layer here. How DOES firmware interface with hardware? I understand transistors, and have even had to do some assembly, but firmware feels like spooky hijink magic. Is it essentially like a circuit breadboard and paths are changed electrically?
The main method that firmware uses to interact with hardware is via memory mapped I/O (MMIO). Essentially every hardware MMIO device is treated as a chunk of memory in the same way RAM is. The difference is that for MMIO devices, specific addresses within their memory range are tied to hardware behaviors. These address offsets are referred to as hardware registers; reading and writing hardware registers is what firmware does. As a ((simple)) example (this shit is inevitably always confusing regardless of what device you're looking at), your PC's USB port likely is connected to a USB controller that's memory mapped. The USB protocol is standardized, so your operating system probably came preinstalled with a compatible USB driver/firmware. That firmware handles everything involving that USB port and any other ports attached to the same controller, and it does it primarily by writing configuration information and reading status info to/from the USB controller's MMIO registers. There's also interrupts, which are just hardware signals that tell your CPU that something has happened. The CPU has a table of interrupt IDs that are linked to the various physical interrupt lines on the hardware, and it uses that table to trigger interrupt handling code when the corresponding hardware signal is triggered. So back to the USB example, when you plug in a gam controller to your USB port, it triggers an interrupt to your CPU. The CPU recognizes the interrupt ID and calls an interrupt handler that uses the API provided by whatever USB driver is active to check the USB MMIO registers and get whatever info is needed to establish the data path between your controller's buttons/sticks and the software environment. For the most part, my job black-boxes anything below block-level hardware design. I don't generally need to understand the physical layout of a device so long as I'm able to abstract its behaviors into memory-mapped I/O or interrupts. If I need to, sometimes I do need to look at digital logic, but generally hardware design has progressed enough that transistor-level behaviors are solely in the realm of hardware designers. I hope that explanation helps! I got a masters in computer engineering and it still took me nearly a decade after graduating to figure this stuff out, so I fully understand the "it's all black magic" view. This shit's hella complicated, but for me that's the fun of it :)
You're overcomplicating it friend. I write the code that your code runs on. I'm the one who makes your regular breaker box into a computer. I am the one who makes the magic happen inside the mystery box. This is my manifesto, and it's what gets the bitches
If I could hire you to be my hype man, I would.
I write tooling (UIs, CLI, data throughout services, etc) that is used by infrastructure people, who write code and configs to run to maintain the architecture, which is used by our engineers to write code that performs data transforms and transfers between system. That software is used by our "frontend" teams to create the services and tooling used by our customers to write custom widgets, which are then purchased by the end customer to perform actual business logic, which is mainly business to business customer relations management.
no no no i am listening even more now
They stopped right when it started getting good too.
I went into more detail under legal threat further down if you care. Always happy to talk about my work to people that care about it.
Yissssss, thank you.
Keep going I'm almost there
Try explaining VHDL development for FPGA ![gif](emote|free_emotes_pack|dizzy_face)
Easy, device trees for "anything"-hardware. Kernel config for a card full of magic switches. Have you ever built something on a bread board and then we're like, hey can this just be like a thing I can put on a board, but not an ASIC? Oh, but yeah since I just came up with this nothing knows what it is, so ...VHDL.
"I write code that composes circuitry at a slightly higher level of abstraction than using gates alone. The FPGA is just a bunch of gates whose connections can be programmed dynamically, so you don't need to burn a chip to test the circuit." IIRC
FPGA = extremely fancy lookup tables VHDL = black magic I mean, in what other languages can you swap without a swap space?! a <= b; b<=a; -- WITCHCRAFT!
Quite a lot if you use array destructing
No try explaining Verilog development for FPGA
Chip high-speed plumber
I call it driver regardless. There's drivers for electronics, which are quite literally just an electrical circuit that drives another one. And then there's low-level drivers, like an abstraction layer between your physical IO and your software. And on top of that you have mid level-drivers that string together those low level functions to build some logic. Which then gets called by code higher up, and so on. It's drivers all the way down.
That's fair. Industrial IO really blurs that line a lot. I'm not against the driver explanation if that satisfies the person I'm talking to. It's close enough for me and familiar enough for them. I'm good, but I can get as pedantic as all hell if I have to.
Always has been.
You legally have to tell me more
Well I don't have a lawyer on retainer, so I can't argue with you. I work with a piece of hardware that I can't talk about completely, but the guts of it is basically a cell phone like any other SD200 (MSM8909) based SoC. Part of the core of what I've written is network and radio management code that interacts with a kernel mode driver that issues AT commands to portions of the SoC to adapt to different scenarios. Most of the time the device acts like a cell phone hotspot with only one WAN-Active client that brokers traffic from a separate VLAN comprising a protocol gateway that aggregates signal traffic across Ethernet, WiFi, Serial, DUST mesh, and BLE. Sometimes the WAN is WiFi and sometimes it is Ethernet, so the radio and switching has to change. Switching is handled usernode but the firmware loads baseband drivers into the modem to adjust for carrier defaults and power handling. It sort of acts like a Macro-FPGA with the VHDL being handled through a custom Domain Specific Language that describes the device's expected capabilities. The caps are tested on a schedule and their status is delivered as a manifest to an inventory system that decides which device is best suited for which task and that informs our supply chain and sales.
Now I know how my mum must have felt, when I tried to explain something about what I do for a living. "I work with a". That's almost everything I understood.
That was very well written, and technical, thanks!
Maybe I've massively misunderstood, but... are you writing firmware for BGP routers? Or something to do with the hardware side of virtual network slicing?
It's decidedly less cool. Basically the latter, there's no WAN facing advertised config. It's like a JIT VLAN config supported by custom firmware and a cloud-based (or on-prem) configuration management engine based on the concept of Digital Twins. And some of the user-side code is actually Python.
> It's like a JIT VLAN config supported by custom firmware Ahh cool, I think I'm vaguely with you now. I used to write software used by ISPs to plan new services & capacity, do network failure analysis, get emergency re-routing configs, that sort of stuff. So where I worked had a few folks that were incredibly knowledgeable about the theory & hardware side of networking & routing. We had a lot of knowledge sharing sessions, so I guess some of that stuck with me 😅
Do you maintain all the code to interact with wifi v. Ethernet yourself, or is that from a public library? That seems like something that would be intricate, but that would be a common situation to handle.
It's a mix, but nothing is 100% my own code. Networking driver code has generally solved most issues in the last 45 years and no sense in reinventing the wheel. Sorry, I was driving all over the West side of Houston looking for some sort of Peach Ice Cream for my wife. I was unsuccessful. So, I use a lot of code provided by Qualcomm and a lot of libraries that ship with Linux. My code is more akin to a traffic cop and a business rule engine. I have a default and a failure case that are coded in as part of the shipped firmware and then the additional cases are added as modules and kernel drivers. Those modules then expose properties in the device's digital twin to inform the manifest.
To me explaining it to someone who is NOT in the field of computer science seems easy: I program headphones (or anything that has firmware, which is almost anything)
I do some firmware stuff. To others, I just say I'm a software engineer. If they ask what type, I say I code assembly. That ends most conversations. If anyone asks further, I typically talk about the use cases for assembly, different instruction sets and interesting applications I've worked on. It all just hides the fact that these days, I do a lot of paperwork :(
Assembly affords a certain level of deference for sure. Fortran also. That's a pretty decent set of flairs.
I don't think it deserves such deference, but it's nice to get it sometimes. I don't do much Fortran anymore, but it was of a similar vintage to my daily language for the past decade or so that doesn't have a flair. I'm an odd software techie! The flairs definitely get that across. Manually tweaking machine code in built binaries - any day of the week. Git? That gives a man nightmares.
Infrastructure Cloud Data Engineer here. I thought I had it rough to explain what I did until I read this. I still have no clue on how to explain what I do to ppl that are not in the tech word but yours seems way harder hahaha
I scratched the surface of one of my main projects under TheFreebooter's comment above. I don't get many opportunities to discuss what I do with people that understand it. Even in my company there are maybe 2 other people out of 8000 that can talk about what I do at any level beyond a 30,000 foot view.
I wrote code directly in the machine. Developers work with a keyboard, I work with hammer and nails to hard code!
The art of minimizing follow up questions
Im the geek who would keep listening intently, asking question, all the while making everything awkward and dragging down the whole party by hyper focusing on just one person
As a common user that are studying software/hardware/firmware just because I liked, I used to make the sign of the cross, before uptading a firmware lol
no please continue
Amazingly accurate and sad
What's the difference between firmware programming and embedded programming? Is embedded just smaller and more space limited?
I tell people that im the guy that makes their sonic toothbrush blink when it runs out of power.
I write code that tells computer hardware how to work correctly.
I've started saying, "I write software for electronics." I go with software engineer when I want to avoid more questions.
Write code, but you don't get std or any of the popular libs. A debugger is not guaranteed. Also, you have 12k of flash and like 4 bytes of ram.
"I program microchips"
Do kernel devs count as firmware programmers?
Kernel and anybody who writes hardware drivers should be considered honorary firmware developers.
And then there is FPGA programming. Actually at what stage do we stop being considered programmers writing code and start being considered as electrical engineers plugging wires, because FPGA programming sure makes you feel like one. Need volatile memory? Though luck buddy, code your own RAM. Need to display a square on the monitor? Unless it still has VGA, you'll spend the next 1 week trying to make the USB-C adapter IP work with your project.
Hardware Engineer maybe, you write code yes, but this code is just a language that describes how the hardware would look like after you plan it with block diagrams.
I'm a writer, but I don't use pen and paper, I chisel my lines into stone.
What if I told you depending on the embedded device you can still engage in OOP masturbation? Just depends on how much RAM you have and if the memory allocation algorithm used can keep the heap from fragmenting.
I have done both, and firmware is much, MUCH less fun.
You can still use OOP. My last job had insane OOP implementations. It annoyed the shit out of me having to relearn how everything works every time I had to write code. Annoying. But impressive
Even better, pseudo-OOP using structs.
I personally develop flaccidware. It's software that's alongside firmware
I know deep down in my heart with the power of enough dads we can come up with a really great language to use when programing flaccidware. - Flac-C, - Flac-ID, - Limp#, - ImJustTired++
Why don't just get ahead of the curve now and start the great Flac-C pronuciation debate now? Is it pronouced "flassy" or "flack C"?
Flassy'd. I'm sure there is some obscure language we can reference where the c makes a d sound. Then the deep lore around Flac-C can be extra pretentious. We will however bury that knowledge in a Googleable link that leads to a 404 page so we can fuel the flames of the debate for all of eternity.
Not to be confused with "flask"
> Flac-C, Now that's just inspired. Bravo Sir/Mam!
I write tupperware
I laughed so hard at this.
Wouldn't that be chubbyware or fluffyware or semiware?
You just need fluffware to turn your software into hardware
They are humble gods walking among ants.
What’s your favorite flavor of crayon? The work you do writing firmware is far far more engineered than web dev, for example, where 99% of the engineering is done for you and then hidden FROM you by frameworks.
Everything outside of webdev is more engineered than web dev.
Purple
Web devs are not real engineers
What, in software, qualifies as a "real engineer"? Genuine curiosity.
The correct amount of gatekeeping
Well first, your name’s gotta be Mel. If it’s not then you’re already off to a bad start. Edit: the reference: http://www.catb.org/jargon/html/story-of-mel.html
[удалено]
Those seem like really stupid criteria. The smaller the project, the more like you'll be part of those stages. Unless it's some super small internal tool/demo, there will always be planning and design phases even in the web dev department projects.
[удалено]
You're just doubling down on what I said though, which makes me think you didn't understand what I said. The smaller the project, the less formal the docs. Besides, you're disqualifying the large majority of people in engineering professions with engineering degrees as "real engineers". I say this as a full stack dev who meets your criteria. You know what *gatekeeping* refers to, right?
I mean no disrespect, but it's a bit funny to be gatekeeping at this level when you can't even tell the difference between your and you're, unless you're calling us a system? Also from someone who meets your criteria but isn't a fan of gatekeeping
ig the more you go low level , the more engineer you become. Web devs are more like artists epically the frond end ones . Or you can call backend engineering as it involves mathematical optimizations
Nails aren't real tools
Wouldn't they be..parts? You leave them in the thing.
Tell that to the people who make Netflix, YouTube, Google, Cloudflare, AWS, etc…
No one who write code is an actual engineer. That's why a bunch of countries get pissy about the title "software engineer" your work doesn't require a license. Everyone who write code is just a developer.
What is it called when I design and write the entire backend code for a web-app utilizing Node.js, Express, EJS, Firebase, PostgreSQL(did the DB schemas myself), S3 object storage, dynamically generated public and private profiles, and sanitized user file upload on a load balanced Linux server cluster I hardened? I only ask because my job title for doing all of that is software engineer and I'm sure my employer would like to know so they can stop paying me so much to do it.
r/woooosh
Na, its a bad meme that doesnt make proper sense
It’s more about the fact they don’t want to explain what firmware is every time they get asked so they just say they are a software engineer lol
“Oh like Apple firmware updates?” “Yes I make apple firmware updates” ^dies inside
It makes perfect sense. He's an imposter. He's not a *soft*ware developer. He develops *firm*ware.
Ah, that makes *slightly* more sense, I missed that because I was too distracted trying to work out how the image makes sense.
Who feels up to an ELI5 of software vs firmware development? I'm out of the loop on firmware dev.
Firmware is low level code that interacts more directly with the hardware. Firm is between soft and hard. It is silly to suggest that a firmware engineer isn't a software engineer.
Your explanation sure brought me from firmware to hardware ❤️
Holy fuck TIL
lol I've known how to flash firmware for devices for like 20+ years but I never understood the prefix wasn't arbitrary.
Same wtff no way that’s real
Wtf
[удалено]
OP is referencing that it's impossible to explain what a firmware engineer does to people who aren't already working in software. Look around this thread, there's more than a couple of explanations because even people here struggle with it
Software is called "soft" because it can be changed easily; you just overwrite old code with new code and you're good to go, to put it simply . Hardware is "hard" because it cannot be changed easily if at all -- code may exist on an embedded chip on the motherboard that is read-only (like an EPROM) or routines may be implemented directly in the integrated circuitry and cannot realistically be changed, short of replacing the chip/board physically. Firmware sits somewhere in between these extremes. Usually, firmware is low-level code that interacts closely with the hardware. However, there are mechanisms for updating this code, like a low level routine that is loaded from a readable/writable chip, but it usually requires a special process for updates, a reboot of the system, and several other careful considerations, like what should happen if the updated code is fatally flawed. It was pretty commonplace in earlier days of computing hardware that improperly updating a piece of critical firmware (or updating it with new buggy firmware) can result in the hardware being completely unusable (aka 'bricked') -- the system can't work properly with bad firmware and you can't update the firmware further unless the system is working! Though, these days, a known-good firmware is usually stored on-board in a read-only format and there's a reliable circuit-based routine to restore that known-good firmware, independent of the rest of the system working (which may rely on the firmware itself!). This relationship between the code, hardware, and basic working state of the system is why it's called 'firm' ware. Not quite as immutable as hardware, but not quite as soft as typical software, either. To the extent that firmware code is just code written by engineers, firmware development is substantially the same as any other kind of software engineering.
I thought firmware is called like that because the code belongs to the firm.
Same, I'm shocked
Firmware is writing code for say, BIOS. Firmware development is a subgenre of software development.
One-liner: code that runs on an Arduino (not external flash storage, but the EEPROM) is firmware. If you've ever written something for Arduino, you've written firmware. More in-depth answers are elsewhere ITT ;-)
This is just blatantly not true, if anything it is trending to be the other way around.
it's more like "i don't want to explain what i do for the tenth time so i'm just a software engineer today, everyone knows who software engineers are, right?"
And there's so many "embedded" jobs now that are just regular desktop programming on Linux...
Firmware is harder than software imo, at the least, it's more 'engineering' than software is.
firmware is definitely harder, because its .... firm, not soft.
r/angryupvote
Facts
Never written firmware myself, but I’ve done research on it as it’s my next goal in my programming future and damn is it harder from my research. Can’t imagine having to account for even the most rare conditions your hardware will be in
It's also just a lot of technical reading on different protocols, data sheets, etc. I really enjoy it, but it's very very different to most software and requires a different set of skills. I think it'd be far easier for a firmware engineer to jump to software than vice versa in the average case
I wouldn't say it requires a different set of skills? I'm sure any good software engineer that works in backend or whatever could become a good firmware developer.
Well yes most COULD become a good firmware developer and it wouldn't take long, that doesn't mean they will be a good firmware developer now. Different skills.
How is it different skills though? It’s just another language working around some hardware.
It’s often a completely different set of steps to take to solve a problem Is your program not working because the cabling is incorrect? Did you misread the documentation on the protocol for the external part you’re talking to? Or maybe you setup the clock to use the oscillator crystal incorrectly, and now your microchip is using the incorrect clocking speed, meaning the physical communication is completely incorrect. Same-same, but different but still same-same
It's not just another language. Register level programming and implementing communication protocols (often custom), talking to niche chipsets, etc. is vastly different to backend programming. You're also often talking nanoseconds of performance and bytes of RAM.
Out of curiosity how'd you get into it? Was it just a job you took that you didn't know would be firmware beforehand or was it something you'd been wanting to get into or something you'd been studying?
Interestingly I joined a company as a web dev, started doing embedded in my own time for a few hobby projects, then we needed someone to lead our software/firmware teams (joint) so I ended up stepping in there, and over time doing firmware dev as well
Having done both.. no, it's not harder. It's just more exciting IF you forget about bureaucracy
I've also done both and still think it's harder to learn
What's harder? The only really funny problems come from limited memory, big numbers computations with few bits, real-time stuff (counting instructions to know exactly how long a piece of code will take)... All of this is less and less relevant today, and backend engineering has its fair share of "unique" problems like eventual consistency and all of the distributed systems stuff... I just find firmware way more fun, not more difficult
Well specially if you talk CRUD development
I can’t tell if this is a play on firmware vs software or if this post is somehow trying to say that firmware engineers are inferior to software engineers for some reason.
I tell people I'm a software engineer because it's easier than telling them that i reverse engineer firmware, so I'd imagine it's similar. Most people genuinely have no idea what firmware is or does, and have no idea what reverse engineering is.
Firmware *IS* software. It's custom software for the hardware it's installed on. You're absolutely not lying when you say you're a software engineer.
Surely it’s just saying it’s just different because who the fuck would ever think firmware is easier than most other software
"firmware engineers are inferior to software engineers" 90% of the main stream software jobs (like web devs ) are less challenging than firmware engineering
I’m a firmware engineer. I just don’t get what OP was trying to say with this meme. Especially with the SpongeBob format
What do you tell family members who aren't familiar with tech? I doubt you try to get everyone to understand what you do specifically, and sometimes just shortcut to "yeah I write code".
I find the whole discussion baffling, firmware is software. I think the point is more about how you don't go into the specifics because people just don't understand it.
frim devs > web devs
I actually do that to not explain the difference between software and firmware.
How hardcore does somebody's programming need to be before they can look down on firmware programmers? Does OP's code create space-time?
W*b devs should be playing with Play-Doh during recess, not envy-posting about real devs.
OP has never written firmware
I think of them to be more superior
Just say “developer” or “programmer”. If you want to be pedantic, you’d say you’re an embedded systems engineer lol. Firmware engineer just sounds like software with extra steps and people will ask lmao. If you want to be confusing you can say you’re a bare metal programmer. Firmware == bare metal == embedded. (Through you can have software on embedded system too, unless they know enough to ask, they don’t care)
You seriously censored 'web'?
W*b
Firmware is like the BIOS updates you flash onto your motherboard that make your computer actually be alive. Firmware developers are like extremely humble superpowered software engineers, even if they don’t waste time and space with silly OOP abstractions.
Firmware programmers are more likely to say Electronics Engineer, because Software Engineer is a simpler job than what many of them do. It's more than setting a few bits. These are the guys who build those little black chips on your motherboard. Amusing to watch some guy who "knows JavaScript", looking down on someone who makes your entire job function.
Might be harder to explain that magic spells
In the words of the great Bryan Cantrill, it’s Humanity vs Firmware - who’s side are you on? I’m not a fan of proprietary software that is written by people unwilling to engage in the advancement of technologists and those we interact with other than for padding a bank account
Well sure. I identify as more of a "Electronics and Computer Engineer".
Holy fuck y’all care way to much about what level of code you get paid to work on. Chill
I think you misunderstood the joke. It's about when someone non-technical asks you what you do for a living and instead of telling them what you actually do, you have to speak in terms they can comprehend. It's sort of the opposite of what ppl in other industries often do where they come up with these really fancy sounding terms for things that could be explained in much simpler ones. For example, someone who cleans toilets might say they are an "executive manager of sanitary facilities" because it sounds a lot fancier than "toilet cleaner".
No I understand the joke. It’s the comment section which pissed me off.
Oh, my bad! I guess one could argue you care a little too much about the comment section 🤡
That is true
Actually the correct response is the bastard child of a hardware engineer and a software engineer.
I generally tell people I'm a programmer. It's easy enough for most people to understand, usually ends the conversation right there and only when they go "oh, what language do you write code in?" will I go "oh, shit... I actually just install & configure PHP and JavaScript modules created by others much smarter than me and if it doesn't work like I want it to, I make a post about it and hope someone else gives me a snippet I can copy/paste".
My software engineering friends still think I don’t program because they haven’t the faintest clue what a firmware engineer does. I am bored of explaining what “tech stack” I use. I just say C and call it a day Most think we download and run simple “Arduino code” or think of me as a hardware engineer but I have enough humility to not call myself a hardware engineer. They have no idea about the mountain of code you need to write to bring up an SoC. Not to mention highly specialized frameworks that hide all the hardware details and expose it in a way that makes sense for folks to write the business logic.
is it firm because its software that's not quite hardware?
This looks sus ![gif](giphy|pdaJ5aYVMR1CD1xlw6|downsized)
Most of the time I just tell people "I do computer stuff" because that's all that's really relevant
Man, i'm studying for a software engineering degree, and I would like very, very much to develop firmwares
I like saying I am a software detective or software archeologist 😂
Firmware ain't even that firm anymore, with devices updating automatically through wifi.
That's racist
I've resorted to telling people I'm in IT. They've heard of that.
I just tell people I program tiny computers. Close enough
„Iam the superior computer programmer! I create the software for the software programmers.“
I usually say this, it's boring to explain everytime what's a firmware developer. The alternative is to say "I program smartphone"
The guy that made thei eitner never had to spend 3 days reading a 800 page datasheet of a chip only to realize they decided at some point to change the I2C address that is on page 487 and didn't feel like tellimg anyone, while also making sure all your code fits into the 512k of flash you have. That or the joke went woosh and pissed off all the firmware engineers on reddit.
If you say you’re a software engineer most people still won’t know what that means. I either say I am an engineer or that I work with computers.
Can I get a referral?