Ask HN: When have you taken a decision in code outside your domain of expertise?
I'm writing a book about the role of software developers in the global economy.
One of the book's themes is that developers hold a strange kind of power: we get to make decisions in code that affect end-users but only other developers (and sometimes not even then) can really hold that code to account before it goes into production. Seemingly mundane decisions in code can have profound consequences.
I'm gathering stories from people who've had to take decisions like this and especially where it was in a domain for which they had no experience.
I'd love to hear from people on HN who have stories to share. I'm also interested in hearing from people who dispute that this is even a thing.
101 comments
[ 0.22 ms ] story [ 126 ms ] threadIt went as an unspoken, unquestionable assumption that telephony was the right model for data networking. - Van Jacobson
There are lots of "old and fundamental" ideas that are not good anymore, if they ever were. - Alan Kay (2016)
Living in the present: man, you're just out of it. - Alan Kay (2017)
... via http://github.com/globalcitizen/taoup
How do you avoid ending up in a Dunning Kruger situation?
Dunning Kruger, IMHO, is a straw man / false dichotomy. Sure, none of us are perfect, but if you disable your focus by worrying unhealthily about perception by others and where you line up, or if you are ultimately some sort of imposter, then you've missed the boat by definition. The old story of 99% perspiration, enough personability to acquire funding and at least reasonably effectively manage others, and the resulting chain of stubborn achievement will get you almost anywhere... just come up for breath now and then and check you're not failing versus any competition, and/or if you're going blue ocean/greenfield and having doubts make sure people you trust can reassure you you're not completely insane, or the financials are secure enough to justify an onward march.
Women get personally attacked and dismissed a lot while no one tells them "x needs to be done differently." They get inured to hearing everything "mansplained." They start tuning out the ugliness.
We don't have well developed good paradigms for how to do this effectively.
Like a foam strawberry which looks like it's edible and smells like it's edible. Enough to fool my one year old daughter.
Men mostly either coo at me or treat me like an idiot who desperately needs a heavy heap of Mansplaining.
I've been on HN nearly a decade. I appear to be the only openly female member to have ever spent time on the leader board.
I am endlessly mocked and belittled for pointing out how differently I get treated from the guys on the leader board. People go out of their way to make it clear that expecting this to be a professional networking opportunity that enhances my career and bottom line is point-and-laugh worthy, never mind the overwhelming evidence that participation here routinely enhances the careers and bank balances of countless men.
So that's the lens through which I view the Theranos debacle where the world imagined the company wasn't merely a billion dollar unicorn but, instead, valued it at ten billion and called it a dekacorn. Then, overnight, it's valuation dropped to zero.
I don't think the same scenario would have flown for so very long and gotten so crazy out of hand with a charismatic man as the front person.
I desperately want good constructive feedback and mostly can't get it. I'm quite confident that Holmes was largely starved of honest and factual feedback about life, the universe, the company and how business is done.
The most recent article I read indicated she shacked up with one of the investors. Her public narrative was that she was completely celibate out of single-minded devotion to the company.
I have never seen an article that really questioned that. The media has bent over backwards to be respectful of this known fraud.
I'm still waiting to hear that the real secret of her success was sleeping with multiple powerful men who then backed the company in exchange. I think the one other time I said that on HN, it was downvoted.
Sexual politics. Can't give the obvious answer about how a college drop out with no business experience managed to "fake it" so long without ever making good on any of those empty promises, even after it has come out that she moved in with some old guy who invested millions in her company.
The moral of this story is that if you're tasked to do something outside your expertise, you make it your expertise.
I don't think the OP is talking about learning some search engine, library or programming language. With 'outside of your expertise', he meant outside of programming.
Say you are writing some medical software that has to diagnose patient based on some inputs. You, as a programmer, are not a doctor and you can't "make" it your expertise within the time constraints of the project.
> Say you are writing some medical software that has to diagnose patient based on some inputs. You, as a programmer, are not a doctor and you can't "make" it your expertise within the time constraints of the project.
Either you need to partner with someone who knows the domain (a doctor) and discuss every detail with them, or you have lots of learning to do. :)
Right, so your answer from before wasn't correct.
And sure, if you give me 8 years I can do a medical study and make the expertise my own, but in reality there is not a single customer on the planet who is willing to wait 8 years and pay millions for some programmers to become medical professionals.
> Right, so your answer from before wasn't correct.
No, it's still correct. Regardless of whether you learn something on your own or consult with others, you still need to become an expert in the subject matter. Using outside guidance can help accelerate that process, but you still need to build that expertise yourself.
Yes you can, and in fact you must. Any programmer that has to write medical software needs to understand the underlying medicine at play. Sure, medical professionals can provide guidance, but you can't trust them blindly. You need to understand their rationales and assumptions, and to do that, you need to understand the underlying material. A programmer developing a heart monitor needs to have a good understanding of cardiology.
About 15 years ago I learned about cookies and their expiry date. At the time it was totally up to you as a developer if you wanted to have a login that lasted 10 minutes or three years. While relevant for security, it was just a number you had to define. So it didn't feel like a big thing.
When I learned about concepts like 'remember me' I was a bit surprised, as in my world it was just about increasing the number for the cookie lifetime. In most cases, that is not entirely true as the modern 'remember me' implementations are more complex (e.g. to support re-authentication for modification of data), but the core principle is still the same (using a long living cookie for authentication).
So what was just a simple number back then, became a complex topic with legal implications nowadays.
Real experts have nothing but questions about their own assumptions.
Questioning your own assumptions, I think, falls out of repeatedly learning that often things are not simple, and the experience making your own mistakes and getting burned: it teaches you when to proceed (you don't want the project to get bogged down with "analysis paralysis"), but with caution and the knowledge that you made an assumption. (Whereas a less experienced person might not realize they made the assumption at all.)
I would also point to the Impostor Syndrome[1] as a sort-of evidence of that, though it's certainly possible for someone to be an expert and not feel that way.
[1]: https://en.wikipedia.org/wiki/Impostor_syndrome
So you unilaterally implement something to handle that condition.
Especially in agile projects with tight deadlines and the idea of continual refactoring etc, rather than block further work on that feature while you wait for the product owner/business analysts/UX team/etc to come up with an answer and get back to you, you check-in your "best guess" implementation and move on, with a TODO or bug left open to revisit it.
A lot of the time (maybe 75%+ in my experience) the developer's instinct tends to hang around as the final solution, even if the developer is not an expert in the context of the users of the application they are writing (this is rare in my experience - generally developers are developers, and not likely to coincidentally be experts in the subject area of the application's use cases unless it is some niche areas - e.g. people writing software for surgery robots are probably also unlikely to be expert surgeons too I would imagine? Not impossible, but I'd want people to be an expert in surgery robot programming, or an expert in surgery and not a half-arsed kinda-ok-done-a-bit-before level of skill in either area!!)
This is one experience that sticks out because I was reprimanded. However, I’d say every project I’ve been on has been at least 10% of the the final project designed & implemented by engineers on the spot.
Beyond UI design decisions engineering can have a major impact on UX. Every single function can make-or-break the experience. That’s why we, as engineers, wield a lot of power.
Edit: I can see how the "and even take credit" part breaks down trust in a similar way. I still don't think further trust-destruction is a clever response. I would leave, call them out on the lie, or (if not in a position to risk unemployment by pissing off a superior) bite my tongue and try to rise through the ranks.
Other edit: typo.
[0]: https://news.ycombinator.com/item?id=19832774
FWIW, I view this more a failure of product management than anything. This should never have become an argument or adversarial interaction between engineering and design, and it's occurrence was to me a sign that things had procedurally failed quite a bit earlier. I'm happy I was able to save the project and get it to a successful launch (and certainly took the commensurate amount of credit), but I do wish some designers and product folks had more of a sense of awareness for how frequently this happens.
I've worked in different sorts of crossfunctional teams over the years at different companies in different industries- sometimes the other people are designers, or scientists, or people from other engineering disciplines who aren't down in the weeds like I am on the software side of things. Or sometimes they're the customers/clients/whatever, and are making specifications in a technical vacuum.
I think it's 100% pure human nature to always assume that one's own piece is the most complicated or meaningful part of a project, whereas other people's roles are more straightforward implementation details. I don't think it's from selfishness or conceit, rather it's plain old cognitive bias that we're all susceptible to. You know much more about all the stuff that needs to be done in your part of the system, and are painfully aware of the risks and challenges. You generally don't know nearly as much about the tasks other people are doing in other layers or fields, and from the outside looking in, it seems like everything is always more simple and straightforward than it actually is.
Even people like managers or designers who generally aren't concerned with minute technical details are susceptible to this type of cognitive bias. They play much more creative roles, in which they're literally deciding what the final thing is going to be, but with little or no guidance for how it should be done. That's up to the worker elves who have to assemble the component parts into the desired gizmo. Since the worker elves' reason for employment is assembling parts into gizmos, the people playing more purely creative roles always face a moral hazard of assuming that problems assembling their visions are due to failings of the worker elves themselves, rather than inherent weaknesses in the vision.
So how do you avoid those nonconstructive relationships? IMO/IME, you either need your specialists to have at least some intuition for what the other specialists do, or, failing that, you need to make sure that one group isn't politically empowered over any of the other ones. No one should be dictating terms to anyone else, everyone should have some ability to push back on things they disagree with, but at the same time if there's a clear consensus on something, one lone holdout can't stop the train. Pushing back on pusher-backers has to be possible too, when appropriate and necessary.
Unfortunately its VERY rare to meet that requirement for agile (multiple reasons).
For mission critical projects like the one you mention, I think, company should pay good money even to few surgeons to be available for the devs.
Problem often lies in management to understand that..
If you're not deciding on the sensible deadline, you're not self-managing your project, you're not doing agile.
As a result I ended up taking on the task of creating software infrastructure to support biology work and fill in these holes. This means I'm creating applications from the ground up, handling every aspect of it - front end, back end, authorization, calculation, storage, deployment, etc. I have zero training in any of these things, which is sometimes harrowing. I make the best choices I can, but ultimately I think I'm pretty hampered by my limited understanding of the available methods. I.e., I can write CSS, but I don't know how to write a grid layout engine using flex. I have read some Bruce Schneier books, but I don't know how to design or audit login protocols. I at some point learned how to use a relational database but don't know all the fancy new map/reduce type datastores that are available that might be more appropriate to my work. Etc.
I suspect that if you look in any domain outside of computing, you'll find people like me who are writing code by making things work without much specific training.
When I first switched to a mac from windows more than a decade ago, the instant-on feature was one of the most delightful experiences.
I have often wondered what the cost of not having that on Windows meant to the world - in lost productivity and green-house gas emissions.
Most often, people just won't be interested in the problem, and will ignore you, hoping you and the problem go away, at which point your default solution wins and is documented. But every now and then, it'll set alarm bells ringing up and down the chain of command, and THAT is why you bring it up.
Of course it's also important to get a feel for what kinds of issues should be brought up, and what issues should just be quietly solved. This skill is half-technical, half-political, and comes with experience.
As a pedant, it sometimes makes me uncomfortable to make these decisions "quietly".
While I wholeheartedly agree that this is an important skill for all developers, it begs the question: Why should the dev be responsible for deciding when an issue needs to be brought up? Why should the dev be making these quiet decisions, is this not evidence of incomplete requirements?
There should be protocol here instead of relying on the dev's subjective sense and opinion.
Generally speaking, I feel like this goes outside the bounds of the developer's responsibility. Not every dev has honed this skill; it could be dangerous. I would choose to err on the side of caution and apply your rule of thumb above in almost all situations.
But the reality is that we live in an imperfect world, where imperfect things can and do happen all the time, and we have to deal with them. You can't have a rule for everything; when you do, nothing can get done because the rule makers can't anticipate everything, and often get the things they DID think about wrong (rule making is remarkably similar to program design, with the same drawbacks and limitations).
So our imperfect world demands that we exercise our own judgment in deciding what to do. If you don't trust your developer's judgment, you shouldn't put them in charge of things that can cause a lot of damage. The alternative is a rule for everything, which is guaranteed to collapse under its own bureaucratic weight.
That's an important point that's too often missed. There's a cost to creating rules, maintaining them in a list of rules somewhere, and having people actually read the whole list and apply those rules to real situations, handling appeals processes when you discover something that the rules handle badly, etc. You need some rules, but the can't ultimately fix the need to trust people.
You are going to need this skill as a developer since you’ll end up using it every day.
If the requirements were a complete specification of what the program must do in every circumstance, you could directly compile them to create a working program. Requirements documents are not intended to specify everything—only enough that a competent person would get the important things right. Filling in the trivial details with reasonable behaviour is basically the programmer's job.
Yes! But there will never be a complete set of requirements — indeed if you think the requirements are complete, you spent too much time on them and you aren’t looking at the problem carefully enough.
There’s a balance between calling for more complete requirements and being able to work with less complete requirements. The more you can correctly choose to do the latter, the more you “hone this skill”, the more effective you can often be.
(As a bonus, when you do call for more complete requirements, in my experience people will be more open to doing that work. They know you wouldn’t ask if you didn’t “really need it”.)
And if you are good at operating outside your sandbox when you need to, you should get a gold star (and think about if you want to look for more responsibility). If you're not, your manager should try to baby-proof that corner.
This is also no different than every other job, ever.
If there were any protocol that requires discussion about every little thing you would never ship nor be productive.
So, companies relies on programmer's judgment on what to do when there is no clear resolution or something is not perfectly spelled out.
In these situations, certain 'core' parts of the code quickly become the only accurate spec. (Whether or not it's worth updating the spec docs is a management decision. But the test scripts will pass if the code is correct, and under sufficient time and money pressure etc..) Other developers then treat these 'core' parts of the code (usually some fairly high-level classes, but usually something more concrete than an interface) as the true documentation of the business requirements. If the company respects developers enough, this means that the developers that worked on those 'core' bits of code are also treated as domain experts in future business discussions.
On the purely technical side: sheesh, how much heat is generated by horrifyingly algorithmically inefficient or vastly I/O-wasteful or just redundant design (for instance religious/unnecessary use of immediate-mode GUI) -- stuff that quite possibly the IT managers don't care about at all (because of e.g. cheap horizontal scaling and inadequate measures of software project success)? The heat is bad for ecological reasons (locally at least), but also intrinsically (why are you destroying information, O Information Worker?? -- and again e.g. Toffoli gates fix this only locally). Based on code I've seen and, sadly, written (laziness, time pressure and all that) -- there must be many, many orders of magnitude of unnecessary heat/information-destruction happening because of purely technical decisions that on-the-ground developers (not even architects/designers, I mean the people that write the stuff that gets compiled/interpreted) make. @OP if you know some way of measuring this I'd love to hear more.
For the bigger decisions I would consult the sales person but I also made quite a few of the smaller decisions myself. It did turn out that some of the things that I had decided were not that much according to how the sales process actually would go in practice. In particular regarding maintenance contracts. For instance, my quotation wizard would allow a maintenance contract to start at any date while in practice they always start at the beginning of the month.
I'd say you made the right call; in my experience, a statement like "in practice they always start at the beginning of the month" is, in practice, quickly followed by "except when they don't".
Honestly if that is in an important product then there is a serious management problem.
Its also another reason why devs usually specialize in an industry eg healthcare, aeronautics, robotics.
Especially with new stuff often nobody in the organization has any expertise so it's common that the devs take a first cut at the problem.
Another common thing is that even if the devs ask for clarification they get none but the deadline still ticks so you just take your best guess.
Anytime a developer on my team had the power to deliver something without checks and balances, it's a red flag. We always determine the expected behavior before writing code and always check that behavior before delivery by at least one non-coder and usually more than one. A decision in code that affects the experience is always a bug and it usually gets noticed before anyone sees it.
So, I'm honestly not familiar with the situation you're describing.
This makes the problem different.. instead of a coder directly writing an IF-THEN sort of decision, intended outcomes of code behavior are controlled .. BUT if the game rules are such that deception or more often, exerting control over others, is profitable, then a very powerful system is being built to execute a morally-ill process.
There are many, many divergent cases, however this sequence is very much at the core of quite a lot of economically-driven programming IMO.
My last company was in ad tech, and our UI was for setting up ad campaigns. A big campaign consisted of 1 campaign, 30 line items, 900 tactics, and 2,000 creative assets. We offered managed service, meaning the account managers were in house and I could observe them work.
When you're working with quantities like this, every UI choice is hit by a multiplier equivalent to the campaign size.
My favorite was a request for table sorting. Makes sense, users want to sort 2,000 creative assets, and sorting is something every UI should have However, asking why they're sorting revealed that they were trying to identify "orphan creatives", assets which had no assigned tactic.
They'd open each creative in a new tab, and assign it a tactic. Also not a big deal, until you multiply that action by 2,000.
They'd also need to spot check the assets to ensure they weren't accidentally assigned to incorrect tactics, a feature that no one thought to request.
Ultimately, the request from our AMs and Product Management was: "Please add sorting to tables." What I ended up building took over a week, and took the shape of a nested folder browser that allowed bulk actions on multiple entries. All because of a sort request that was hiding an issue.
So what was the impact? We had lots of large campaigns, which could take up to two stressful days to set up. The new tool minimized errors and took at most an hour (thanks to some smart generator tools I added later on). We had 5 full time technical account managers who went from extremely stressed during Christmas to fairly calm. Errors decreased, resulting in better campaigns.
One thing remained, and that was the muscle memory senior account managers had developed for setting things up incrementally. I learned that when you build a tool people use for hours a day, every small task is important. The motions embed themselves in a user's brain. The mistakes or inefficiencies of a UI, seemingly insignificant during development, can become someone else's rote action, stressor, and even source of unhappiness.
I don't affect the global economy, but questioning a sort feature made five of my coworkers happier.