Not in this context. The term “10x programmer” comes from an observation that there is a factor of ten variation between the best and the worst programmers. So the worst programmers in this context are 1x, and 1/10th is meaningless. People hear “10x” and assume it’s ten times the average, but that’s not the case.
More information here: https://www.construx.com/blog/productivity-variations-among-...
It’s effectively the same thing, but from a different perspective.
I've had one employee on my team who ignored my instructions, ported a critical tool to a new execution environment, added 20 additional dependencies, and then pushed the broken mess onto GitHub. After sinking some days into trying to get anything useful out of the source code, we eventuality just deleted it.
If you're 10x of a negative impact then you just produce bugs faster.
And then don't get me started on marginal profit. Producing some value is a lot easier than producing marginal value that outweighs marginal costs. Now we're talking a smallish fraction of the code being written.
After reading that sentence, I thought to myself, "How long did I go from the start of my career before meeting someone of whom I genuinely thought, 'this person is so bad they should definitely be fired asap'?". In my case, I think the answer is somewhere around 20 years.
My takeaway from this is that at even with ~18 years of experience, my former self would probably not have appreciated the importance of this advice, as I had rarely or never encountered such a person thus far.
I didn’t believe that “negative value” engineers existed when I was working on the front lines alongside other good engineers. In reality, I was seeing the end result of competent management teams who effectively filtered out negative employees in the hiring process or quickly dealt with anyone who became problematic after being hired.
Being a negative value engineer isn’t just about writing bad code or being incompetent. Those things are trivially obvious in any technical interview. The reality is that negative value usually comes from behavioral issues. Engineers who are constantly sowing discord against the company or management can bring down entire teams. Engineers who create conflict and destroy morale are toxic for productivity and will drive away your best team members. Engineers who can’t ever ship anything on time because they can’t manage their own time or they have pathological perfectionist tendencies will sink your schedules. Ironically, negative value can often come from those with great technical chops who are unfortunately mired in personal issues.
Managers can compensate to some degree with intense attention and guidance for those individuals, but at what cost? Obviously managers should make an attempt to correct behavioral problems that are dragging the team down, but at some point you need to do the inevitable and replace the problematic employee with someone who can perform without the behavioral issues.
It’s not just a question of whether or not someone can write good code. It’s a question of whether or not the team and company are best served by keeping a troubled employee as opposed to reallocating that finite headcount to a new candidate.
Another underappreciated factor are mental health issues. The chances are high that you will run into people that have undiagnosed ADHD, OCD, Aspergers, autism, bipolar, anti-social disorder in software engineering, or even that you might have a mental health problem yourself without knowing it.
He was technically proficient but lacking in literally every single other ancillary skill for an engineer or a human being.
He could write complex code but it was overengineered and overcomplicated imposing a huge maintenance burden and making it brittle. His whole team was “Wow, he must be so smart!” but when asked on what basis he’d chosen the approach he’d taken instead of the naive solution he got rude and defensive. Nobody else on the team could maintain his code. (It wasn’t bad in isolation, just inappropriate in context.)
Presented with a problem to solve, he would not write something that made sense for the business, designing around requirements that did not match what a reasonable person would assume. When more explicit requirements were included, he complained he was being too restricted.
When presented with a problem to solve, he would not solve it in a way that made sense in the overall technical landscape (I need to serve some absurd number of requests, should I write the most efficient program possible but restrict it to a single instance, or write something less efficient that’s horizontally scalable?).
He was not interested in learning new things. When presented with different technologies, he instead began a solo rewrite of core company systems to ones he was more familiar with because “that’s what I’m more familiar with”. When it was explained that we’d moved away from those systems because of certain problems, he powered ahead with “Yeah, but that’s what I’m more familiar with.” When the foot was finally put down, the answer was “Fine, I’ll use the tech you use but if I have any problems I won’t fix it someone else will have to figure it out.”
He sat idle for weeks because one of our internal company tools was poorly documented that he needed it to do his job (no one thought to document it beyond the inline help because that had been sufficient thus far...). Seeing this tool used daily for two weeks, he did not try it, did not ask his teammates he saw using it, his supervisor, or anyone else for help. He checked the internal wiki and when he failed to find a clear explanation he just... did nothing. Until he got fed up with not knowing what he was doing and scheduled a meeting with the CTO, his supervisor, and ops to walk through every wiki page one-by-one and demonstrate that it was not documented on that page. That meeting was cut very short but probably still easily cost $600.
In every meeting everyone he dealt with walked away with a bad taste because he was rude and interrupted people constantly. He did not bring ideas on technical merit but instead “well I always...”. The biggest thing we emphasize with all our engineers is “data”. Decisions are based on data and documentation, not feelings and opinions. He pushed things through on sheer stubbornness and got upset when he ran up against people that refused to accept that.
His supervisor was not a strong, confident type and within about three days of being hired he’d steamrolled him and started completely overhauling how the team works causing deadlines to be missed as everyone on the team became confused about how to do their job.
And when all of these things were repeatedly discussed with him, explaining what the problem was, why it was a problem, and how we expected an employee to behave... he disagreed there was an issue and carried on as he was.
I did not do the hiring in this case, but I resolved the issue. For that team it was a brief couple week interlude where some guy showed up, wrote some “really smart” code and tried to do some other really smart stuff, then was gone before any of it really got implemented and life went on as usual.
Which is all to say I agree...
Awful engineers don’t have to be technically incompetent, there are a lot more skills involved to being an engineer than just writing code. And if you’re not actively opposed to it, a good manager can smooth over deficiencies in some areas so nobody ever notices.
And if you’ve never worked with an awful engineer, that’s likely a result of a lot of other systems doing their job. If you hired everyone that applied to our company you’d end up with mostly unqualified engineers... and a couple of drywallers. Every improvement past there came from a deliberate action by somebody.
But the line you quoted reminds me of a supposedly apocryphal story involving Dustin Hoffman staying up all night to play a scene where his character is exhausted, and Laurence Olivier asked him, “my dear boy, have you simply tried acting?”
Bad coders have a large blast radius on poorly managed teams. No amount of culling people will make up for a complete lack of leadership skills in the organization. If you are leading, some people will not like where you’re headed and find someplace else to be. Others will rise to the challenge.
My dear boy, have you simply tried managing?
Startups that have survived long enough to get a product to market, and have a reasonably sized small team, would represent a survivorship bias against having negative value engineers. At which point they will have grow to the point of rotting under the weight of large-corporate inefficiency before any additional negative value engineers would be able to infiltrate their ranks undetected.
Is that accidentally not hiring someone who would have been a good fit?
But I was gaining responsibility, including (informal at the time) leadership of this individual. And it was a liability to the team, and to me, and ultimately to the person in question. So I spoke up. I felt terrible about it, I feared alienating everyone, and I feared I was putting the person in financial and career risk. But I didn’t see a way to bring them up to even a standard where their presence wouldn’t be a net negative, and I knew I wasn’t up to the challenge of carrying that weight. So I did what was best for the team.
The person was ultimately let go. And they did ultimately find a role that was better suited to them. So all is well. In hindsight I don’t think I should have been so torn up about it. It actually sucks to be in over your head, knowing it or not, and it’s possible finding a more fitting role is a better place for growth into more challenging roles.
I’m not sure how to conclude this, I’m not sure if there’s even any value sharing it. But I guess for anyone reading who finds themselves in my position (newish, relatively ascendant, full of self doubt but certain that a peer is in the wrong role), I would recommend trusting your gut. And I would say that there’s a lot of room in tech for a lot of people at almost any skill level. Just not always on your team. And that’s okay. They’ll very likely be okay.
It seems you didn't alienate them in the end? When looking back?
Those categories aren't necessarily disjoint. There can be many aspects, many of which are described in the paper. But in my experience, one of the more pernicious combinations is the sincere belief that one already knows nearly everything worth knowing, coupled with a complete lack of curiosity (or perhaps it was merely utter laziness).
When that happens, a person stagnates. In the case I saw, a person with decades of experience was effectively performing only marginally better than someone who had just begun their career. The major difference being that a person who has just started is often well aware that they have a lot to learn. Or even if they're not, if they're curious then there's at least a good chance that they will figure that out in time.
Engineers that can't write simple code and always over engineer. Engineers that have no concept of encapsulation and use globals all over the place. Engineers that have no concept of perf. Engineers that can't ship and noodle the same piece of code for weeks that others would have finished and moved on in a 1/10th the time. Engineers that are all talk no work.
That last type sticks out where the engineer would basically walk around and stop at people's desks and talk their ears off but never actually finish any code. People complained. The boss said "they have a family so I don't want to fire them". I don't know how to answer that.
I've been trying to avoid that meta-evaluation spiral for years by semi-regularly checking with third parties to confirm that I'm generally the person I believe I am.
So far, so good.
Edit: Almost forgot: The whole point of this introspection is to point out that the self both is and isn't a decent guidepost for evaluating others.
A well intended, stand up person who can't code will have a negative impact because their team mates will have to carry their water.
A person with high technical chops who delivers great technical implementations but publicly berates people and has temper issues and throws their team mates under the bus in order to get ahead will also have a negative impact on the performance of the team as a whole.
If you worked in startups in the valley, there's usually a pretty decent high technical bar to hiring.
This is hard for many to grasp, but if you get the opportunity to lead enough teams it will become clear. And it makes sense, if you think about it. An individual who ended up owning a particular piece of a codebase will be incentivized to obfuscate and obscure their code in order to maintain full control over it. It's job security and furthermore if it's a valuable piece of the product then it can keep praise and rewards centered on you. We should also not be quick to blame the individual for perpetuating this, the right incentives need to be in place to reward both team progress and individual progress.
An organization can get surprisingly far with a huge number of bus-factors, and doing a learning-by-fire session whenever someone burns out and quits.
If the engineer who's a bus-factor on that project is willing to help others learn and recognizes tech debt but isn't given time to fix it, that points to organizational issues to me, not to any engineer being bad nor attempting to have job security.
Some managers see high bus factors as a sign of success: "we are a team of specialists: it's so much faster to give a problem to X than to have Y come up to speed on X's code base."
This, of course, sets X up for (invisible?) pressure not to take holidays or get sick. And because problems don't occur evenly across your code base, chances are that one of your devs gets far more bugs to fix than the others. And because the pressure at your org is to go fast, there WILL be bugs to fix. "Testing is too slow", etc.
But of course with 10 projects you will need at least 15 managers...
That's fair, but I've also seen an orthogonal effect happen maybe more often where an engineer structures code just naturally in a way that fits them well, but is poorly understood by others. Not due to the incentives of maintaining control or job security. But simply because the engineer wasn't talented at making good code for other humans, and there were very few incentives to write code good for other people, at least early on in the design.
- The area of code has a high ramp up, high risk, and few new work incentivizing ramping up on it.
- The curse of knowledge makes it hard for the person familiar with the code to know what is needed for others to understand it. Incentives are needed to encourage learning by others to force the maintainer to better understand how to explain things. This isn't a judgement on the person in their general inability to write code for humans nor is it about obfuscation.
I am living right now this situation where I am the maintainer of a large chunk of code, I would like to have at least a second pair of eyes looking on what I do, but the others are all busy with their own tasks and no one learn from the others.
This part at least, I agree with. Whenever I see code like this it is a symptom of a larger product development issue.
- unreasonable deadlines
- overpromising to external clients
- no coding standards (enforced by linter and code review)
- no automated testing
- no code review process
- using new languages/technologies without first gaining some experience about best practices
Early on, a startup definitely needs engineers that are going to work autonomously, cut corners as needed, not be a perfectionist, etc. The technical cofounder/CTO/team leader should still be setting up a culture of high quality code. Coding styles and some automated testing make it easier to move quickly and ramp up new team members or for old team members to circle back to old code.
That's part of it, but training people is also very difficult. If you know a system well it takes a day to add some feature, but it takes a few days of frustration to train someone else.
In some situations, that engineer has a very strong mental model of the business domain they're modelling in code. It's a model forged by years of experience in the domain.
The model has complexities, but they are generally a minimal set necessary necessary to span the domain.
At first sniff, new engineers might find the code overengineered. It's a Chesterston's Fence dilemma. Except, in this circumstance, you have the builder there to explain the fence, and IMO it's wrong to assume malfeasance (obfuscating for control), when there are other contributing factors.
IME, the way to resolve this ambiguity is paired programming and communication. After the 2nd or 3rd session, the mental model should prove to be transferable or not.
All that said, when you talk to really high-performing teams many of them will say that they value just continuing to get to work with that same set of individuals. It's a reward onto itself to get to work with people whom you really enjoy working with.
Second, applying the assumption they are obfusicating code to maintain control or ensure job security paints a lot of people with a very, very wide brush. If you asked why or spent time understanding why, then you'd get a lot closer to the truth of whatever the situation happens to be.
Third, Arthur Schopenhauer is attributed with the statement "Talent hits a target no one else can hit; Genius hits a target no one else can see." High performers tend to hit targets nobody else can see and that tends to be a very disorienting experience for all involved because systems end up behaiving in unexpected ways. Some people call it code obfusication, some people call it forcing people who are looking to break things to understand what they are doing before they do it; both are forms of organizational dysfunction which is pandemic in the industry.
Subtly demonizing these people as "inhuman", or as you are doing right now, painting them with a wide brush, illustrates one of the serious problems that high IQ and high performance staff face. Namely, they get scapegoated and harassed by groups of people.
At one org I found a bug causing 8 figures a year in inventory shrink caused by 2 lines of SQL Code that had been there for 10+ years; a contractor had come in, implimented a fix, and nobody had ever questioned it. Millions of dollars of inventory were being stolen by staff. Now imagine how disorienting that is to the entire end to end org. Believe you me, the c-suite wanted me gone after that and not because I wasn't doing a great job, but because I was fixing organizational issues that made them look bad and they wanted that stopped. They hired a high performer, encouraged it, and then when it got too bad for them, they got rid of them.
It is fully possible that some of these situations exist where there's a toxic, narcissistic fascade being sold to maximize profit. It happens. But I doubt that is the norm.
Is this an issue of organizational incentives? It's an issue with organizational structure, not recognizing people for who they are, and not aligining staff's interests because in this world we have this f'd up idea that we're just here to make money for shareholders or be the ATM machine for ownership. If running a company as pageantry makes them money, then they do not care.
This is why many high performers often create a niche money-making product that doesn't take up a lot of their time to get cash out of, then move on to working on other things that make them happy.
Why waste the effort if people don't care?
In my experience they're extraordinary people in many, many aspects. More than anyone has a right to.
Besides the god-like ability to solve problems, they were amazing mentors, and clear communicators focused on what's right for the team at the time.
They were universally liked and working with them makes you a better professional.
Software is a a team sport, successes is hard to come by on your own.
But in fact, there are people who are 10x developers and are great team players. And there are also people with great technical skills, who are completely toxic. And there are also people with mediocre technical skills who believe themselves to be gods, and for some reason management seems to believe them. All of these are real, and I have met them.
For good cooperation, both the 10x developer and the rest of the team need to be good team players. Because some people are unable to teach, but also some people are unable to learn. Some people are condescending to those with less experience, but also some people are hostile to those with more experience. If the team works well together, the 10x developer can set the project architecture right, teach other team members to follow some good principles, and then all together do seemingly miracles.
I don't know how many Jeff Deans and John Carmacks the OP would turn away in order to avoid a bad engineer on the team, but for me the answer is zero.
This article first puts up a straw man and then switches gears halfway into a different subject. See if you can spot it.
There is no exaggeration. Some people are just far more in tune with the mental models required to do good software work at both a micro and macro level, that any time I see someone trying to play it down I have to ask if these individuals have worked with one of these precocious talented folks.
I also sometimes struggle to understand why anyone would write an article like this. You obviously want to hire the best you can for the best price you can. Anything else is a silly coping mechanism that you can’t face with honesty.
I want to read an article that’s straightforward about how much good work 10x’ers can do and how influential they can be for rest of the team. But this isn’t an article anyone would bother writing because they’re too busy making money to have dick measuring competitions on an online news board.
Food for thought: The interpretation of a 10x engineer is not consistent. Putting my manager hat on, I ask: Can I replace 10 of my average engineers with this one person? The answer is never "yes".
That's because a team does more than just technical stuff. There's documentation, dealing with customers, bureaucratic stuff, etc. If you don't do these well, much of your brilliant engineering gains will go to waste. A brilliant engineer may be harder to replace than the average, but he/she is not a 10x engineer. Perhaps a 2x.