I was down there recently on a helicopter-based expedition and they set up a forward base of operations with a few days of emergency rations in case of unexpected weather that prevents you from returning to ship. I asked them what happens if the blizzard lasts more than a couple of days. Someone somewhere has a recipe book for penguins.
As best I can tell we've never sold the same product twice. Product roadmap is "whatever the last person I spoke to asked for." And tech debt maintaining a grab bag of 5,000 almost-but-not-quite-entirely-production-grade "must have" features that the customers rarely if ever use despite claiming that not having it was a deal breaker, is, well, debty.
The best decision I ever made was moving from a company that acted on the whims of whomever the sales team spoke to last, to a company that had a strong product vision and was happy to say no to their customers on occasion.
It's a lot less exhausting when you're not changing priorities every quarter.
You also avoid the soul crushing experience of working really hard, crunching to get a feature out, only to realise your time was given away free to land a deal. Sometimes a deal that fell through anyway.
This is one of the things I try to suss out when I interview somewhere. Do you have a product team (or at least someone in leadership) with a stable requirements vision, or do you just haphazardly develop based on whoever your sales team last talked to. Having a stable roadmap is an absolute requirement for me. I may not agree with the roadmap or priorities, but I'd rather have them than not have them.
I've worked in both types of companies, and the ones where sales dictated what we worked on this week were universally awful.
Another thing to be wary of is a product where there are a small number of customers, maybe even just one, who contribute the vast majority of the revenue. Because then, even with a good product vision, it's going to be very hard to say "no" to what they ask for.
Even if you weed out the willy nilly stuff, you will bump into Enterprise users that are actually correct.
They will mention something you know you should have added but always wrote off as "bloat" or "not really really really needed". Those things start happening more and more the moment you are doing $100K plus deals.
Are you talking about structural fundamentals or product features?
Because I agree about the fundamentals, the things enterprises tend to care about:
- SSO / SAML / auth integrations
- ISO Certifications
- Regular Pen tests
- Localisation support
- APIs ( that they'll never use )
- Bulk operations
- Self-hosting ( or at least isolated / non-shared application cloud hosting )
Get these and similar right and it's the difference between landing enterprise or not.
But if you're talking about features specific to a product, or custom products for a platform, that's a very different thing, and that's where the great distraction can come in. That's where you'll end up developing features that go unused, and it's these which aren't so consistent across customers.
Imagine you make washing machines and get a request for:
" This Washing machine must have a pre-set button for a 57deg 38.5 minute wash. Without that, I couldn't consider this machine ".
You try to argue that you let users define their own pre-sets, and that they can set up their own pre-set for that cycle. But you're denied by the person in sales who insists that they need exactly that as a first-class button on the front of the machine.
That's the level of petty that some large customers will try. In some way, it can be seen as a good sign that they've engaged with your product, but sometimes you wonder if it's just a trial balloon for seeing if you'll put up with the unreasonable.
You missed some universal ones that are both necessary, and a total pain:
- Teams & Fine-grained Permissions
- Audit logging
- SOC 2/3 compliance
- Data wiping / retention / data policy management
- Reporting
- Cookie law crap (GDPR & CCPA)
- Myriad forms of custom product tiers & billing arrangements
I'd put these above several of the items on your list, and in my mind, they fit into the category of "things a developer calls 'bloat', that are actually necessary for enterprise sales".
It wasn't an exhaustive list, it was to articulate the difference between structural features, which all of those are, and product features, which are specific to your product.
Yeah, I don't really mean it as a criticism -- my list is stuff that I think is incredibly painful to build, ends up taking >80% of dev time, is messy/spidery, and which I've spent a lot of my life explaining the necessity of to (typically junior) engineers.
In short, this is the kind of stuff that I think fits the parent comment's categorization: it drives enterprise sales, engineers hate building it, and it never really ends because the maintenance and detailed feature requirements change with almost every contract.
On top of that, you have to get messaging right. Here’s an example from consumer:
I’m looking for a TV. I buy after careful research, so there’s a 90+% chance I’ll end up with the TV I have in mind before walking into the store.
One device we frequently use (Linux) doesn’t send the “switch to me” hdmi signal when we start using it, so the “switch input” button on the remote is crucial.
The front runner has a One Button (TM) remote. “What fresh hell hast thou wrought?”, I ask.
On page 1, the manual says to change inputs you need to press the gear button, navigate through the settings menu to “inputs”, and then find the right input from there.
Ok, so do I get the crappier panel to avoid the settings menu every time I turn on the TV, or not?
Thankfully, page 10 has a picture of the remote, and it has a quick change input button, so that’s OK.
On top of that, I want the TV to be a dumb TV.
There’s no mention of this in the quickstart guide, but it has “Basic Mode” that which is that, except that calling something “Basic” is right up there with most four letter insults with kids these days.
As a bonus, after reading the manual, I also honestly can’t tell if it’s possible to have four hdmi inputs and also variable volume audio out at the same time.
If you’re going to produce differentiating features (or your competitors are differentiating you via enshuttification) you need to make that clear pre-purchase.
In enterprise it’s at least 10x harder to get this stuff right because you probably don’t use the product on a regular basis, and also, there are many more features.
What a lot of these HN programmers seem to miss, is it's not about what you or your application provides. It's about what your competition is willing to provide. If you don't have much competition then that's great, but the moment your 100k-10m paying user starts testing the other software your C-levels and sales people are going to have the programmers locked out of the building the moment they say they won't write a feature.
Depending on the company's product (and this is a wide range), somewhere between employee 10 and employee 100, the founder needs to decide "Am I CEO of the company? Or CEO of the product?" (As in, that "and" needs to become an "or").
I don’t mind this as long as the sales team and management allow the correct amount of time to build it in a maintainable way.
The reality is I only get paid because of those deals, and the post deal tech-debt sprint never happens.
So the work has to get done and if sales doesn’t give time for it to be done properly then in 3-6 months velocity will drop and the sales pipeline will dry up.
Any company that can’t understand that is not a long term company I want to work at.
HN is largely a US ivory tower forum, lot of good discussions happen here - but many folks are coming from the costal endless “VC” money mindset where company revenue is not much a consideration because they just move on to the next high paying gig when the money dries up.
It really depends on the industry. In a narrow vertical market with only a limited number of large customers, the vendors pretty much have to roll over and do whatever the customers demand regardless of product vision. Give the customers what they want or else they'll find a more pliable competitor. The power dynamics are different in more horizontal markets.
If the customer has people on the other end that knows about their processes and cares, you can push back.
We landed our largest customer by gar a few years back, and we pushed back hard. However we had good arguments why, and explained why changing their workflow would be much better or offered some other approach to solve the problem that didn't involve a new bespoke and brittle feature.
On the other side were a team that knew the processes well and understood our arguments.
After they went live, the management thanked us for helping them improve their organization.
On the other hand there have been cases where decisions is made by leaders so high up they have no idea what's going on by those that need the tool, and aren't interested in spending time or effort on it. Not much you can do then.
edit: Though sometimes they learn. We've had a few customers who we said no to since their wishes were not really feasible, and who selected others and failed, and failed again, before finally ending up with us, on our terms.
Oh my god you just perfectly described the frustration of working in enterprise SaaS. It’s been fun in some ways but the constant churn of almost-but-not-entirely-production-grade software is soul crushing. We celebrate and reward speed to market and lack of process in a way that feels unhealthy and unrewarding.
I’ve worked at consumer facing companies but also other enterprise SaaS and have to say I’ve never seen it done like this before. Just ruthless pursuit of features over polish, craft, etc.
Can your customer switch to another product, yes or no. If no, then polish won't happen.
Do customers actually value 'real' polish and not just a slick looking UI? If no, then real polish doesn't matter.
As a software writer you'll get your ass kicked into the ground by another company that writes catchy features and nice looking interfaces 9 times out of 10. So few actual customers know out to measure 'polish' that it's almost a non consideration.
> It is possible to create threads by using the OS syscalls bypassing completely the requirement of pthead. (Un)fortunately, I couldn’t find any popular libraries that implement the functionality by using the syscall interface instead of relying on pthread.
I have tried and failed to do this for a C++ program because the amount of C++ runtime static init/shutdown stuff you would need to deal with isn't practical to implement yourself.
CORE only works on kernels that support BTF. This post introduces one workaround which is to generate BTF data for kernels without it. That's still only half the problem though. You also need to write your eBPF program so every kernel verifier passes it, even though every kernel's eBPF verifier has different bugs, capabilities, and complexity limits. I maintain a large eBPF program that supports 4.14 through 6.14. We implemented our own version of CORE before CORE really existed. In reality, it's a lot more work than "compile once run everywhere."
Yeah same, we maintain some eBPF probes spanning 4.11 to latest kernel, and holy hell, it's really bad. The worst offender being some old RedHat kernels with half-baked backports of the eBPF features containing a bunch of weird bugs or features that aren't perfectly in line with what's used in mainline...
Here's a fun bug we recently had: we had to ban substractions in our program (replacing them with an __asm__ macro) because of a bug in linux kernel 5.7.0 to 5.10.10, which had the (indirect) impact of not properly tracking the valid min/max values in the verifier[0]. The worst part is, it didn't cause the verifier to reject our program outright - instead, it used that information to optimize out some branches it thought were never reachable, making for some really wonky to debug situation where the program was running an impossible control-flow[1], resulting in it returning garbage to user-space.
All this to say, CORE is really only half the problem. Supporting every kernel in existance is still a huge effort. Still worth it compared to the alternative of writing a linux kernel driver though!
Kernels without BTF data are ancient at this point. BTF was added in 4.18, that was in 2018. 2018! If you're running a kernel older than that, you don't need BPF, you need a whole new operating system.
Yes, each kernel version might have different features between then and now. You have to pick a minimum supported version and write against that.
Many, many distributions didn't embed the BTF information until fairly recently. OpenSUSE did it in 15.4, released in 2023. At $WORK, we have many customers running on distros that didn't have embedded BTF - such as RHEL7 (yes, they pay for extended maintenance).
I really wish customers would update to a newer distro, but I also understand why they don't. So it's up to me to adapt.
> You have to pick a minimum supported version and write against that.
What we end up doing is progressively enabling features based on what's available in the kernel. Every eBPF we write is compiled multiple times with a couple of different flags to enable/disable certain features. It works decently well, and allows using the most capable datastructure/helpers based on the kernel version.
We've got customers who complained when we bumped some critical dependencies and our software suddenly didn't work on Windows 2008 R2 servers any more... in 2025.
As someone who studied physics and electronics for many years, I still appreciate an article like this for reminding me how profoundly weird science is. Working day to day with the equations and practical applications of electricity gives you a false sense of confidence that we actually have any fucking clue what’s going on.
GitHub pissed me off recently by giving us a one month reminder of our renewal, but having required two months notice to reduce our number of seats. As a result, we are ending up paying for twice as many seats as we currently need.
reply