A personal story about 10× development
nibblestew.blogspot.com
nibblestew.blogspot.com
The project I got transferred to was the thing of nightmares.
Not deterred, I hacked into it a shitty solution and shipped it very fast. I shipped it so fast that suddenly I had everyone's attention. And I shipped another thing super fast and got more attention. One day, I said "this needs to go", and everybody listened, architects and directors alike. 6 months later, most of the code was replaced by my code or something originating from it. Every projects and features delivered on time with great appreciation of the clients.
You have to make it like software development is not a problem at all in the eye of your client and never never go behind the line where this is not true. The day software development is a problem, you lose. You must deliver software like you're delivering a book from amazon, no matter what. Because then, you got credit to make things better, which creates a positive loop. In that particular instance, I used some rushed victories to get more credits to make things clean later on. The guys who say they can make things clean but never ship and never win any battle against a deadline are just funny anyway.
To be honest, I took some fights in my career. I was fighting some dudes in every project. But don't fool yourself: if you're not really capable of making things better, then fighting is useless, just improve. You win the fights because the managers are on your side and you get them on your side by making software development not a problem at all.
edited
He couldn't get things released quickly because he couldn't even get the program compilied without serious effort involved.
As a manager, I'm more inclined to trust someone who's delivered results even in challenging codebases. It's human.
"trust someone who's delivered results even in challenging codebases"
Yes but comparing a guy's productivity when he is demonstrating how difficult the environment is to make progress is poor management. He has already shown the results in previous project.And moved the burden of maintenance to someone else? If so, this is one of the things people are complaining about 10x dev on twitter. You may look good, but the team / dept / company is worse off, and someone else has to clean up.
I agree design by committee can produce awful results - and I said nothing about a single person doing a design as being an issue.
My last project I released still had about 20 TODOs in the code. I launched it, it got great reviews, everyone loved it, then I got a new project and they deprioritized the "cleanup" phase. I suspect the edge-cases are just getting handled manually - no one cares and I'm still a hero.
The people/team handling it manually probably care
The alternative to shipping something that works good enough, on time often isn’t to ship something perfect on time but to not ship on time or even worse, -at all.
That would be even worse for the people/team supposed to use the product.
Please justify that.
I did some software, a not too complex chunk of work for a midlands (UK) retailer in 1999. It dealt with a couple of million pounds of retail orders that year. Not so big but not trivial either. It was still in use in 2015, and quite possibly is today (although the boss told me they re-used it for a rather different purpose by their sales reps).
It was very reliable because I fought to keep it simple, and tested it brutally (eg. the core part took 5 days to write but got 3 weeks testing, founding only 2 errors, but it was 2 errors fewer).
If it was crap it would have been junked so I'll claim that the end quality contributes to its life.
High reliability tends to stick around. I think lex/yacc started in the 70s and is still around today in the form of its spiritual successors flex/bison. Ancient but still grinding along.
' In a 2008 interview, Johnson reflected that "the contribution Yacc made to the spread of Unix and C is what I'm proudest of" ' (https://en.wikipedia.org/wiki/Yacc)
If you ship crap its lifetime is intrinsically much shortened. That's my thesis anyway.
Not everything needs 90% test coverage and more comments than code to be good. And not everything with 90% test coverage and more comments than code is any good at all.
BUT - when someone else new comes along to look at it, the 90% code coverage, and comments helps them immensely - they can get up to speed to fix whatever bug has appeared a lot quicker.
Code that doesn't do the job is worthless, no matter how testable and well-designed it is.
Of course you can debate whether this is a management (scheduling, resource, PM) problem or a developer (competence, architecture, tool choice) problem - most likely some of both.
But whoever is responsible, it's still a non-solution.
The real world is much sloppier than any book will ever tell you.
> is about the development cost vs maintenance cost
Absolutely true.
> how the latter beats the former
If you're believing that equivocally ((I don't think you personally are btw) then I don't think you're reading the advice the book is giving you correctly.
A shitty technical solution that gets to market quicker often (not always) can make the company more money in the long run. There is no "one right answer" here, it's all about judgement. 100+ tech DD's and counting...I've seen the whole spectrum. I've seen a $40M revenue (38% EBITDA) tech company built using a FileMaker-like tech stack (all WYSIWYG). And yes, I'm serious.
Now, if they hadn't gotten the credibility (due to the short term fix for thing they wrote broke sooner than expected), or they gained a lot more credibility and moved in the company, or out of it, the broken thing would still be there, and someone would have inherited it, and had to refactor / relearn / replace it.
One of the points about 10x devs that people are pushing back on is this - do the thing to a minimum spec, drop it on the floor, and get kudos for it, while the rest of the devs run around picking up the pieces.
If you read on:
> > One day, I said "this needs to go", and everybody listened, architects and directors alike.
The OP hacked a shitty solution to make people listen to him. Once people started listening to him, he found it easier to persuade them to let him improve things.
Sometimes the burden of maintenance is the price you have to pay go get an operational/production system early on and enables you to let other requirements emerge earlier.
You might focus on the "burden of maintenance", and also assume that you're saving time by taking the long route to production, but letting requirements emerge early on in the project is also a significant time saver as it enables the project to avoid committing the mistake of investing time developing a goldplated solution that will have to be thrown out.
You need to accept the fact that the "burden of maintenance" is always there and it will always be there, whether you invest years rolling your goldplated solution or just dash to production with a quick and dirty solution. You don't get rid of that burden by aiming for an academically pristine implementation that takes ages to deliver. Requirements do change, and do so continuously. Heck, designing stuff for a scale that will never be required is also a major problem. So, why would anyone be concerned with having to spend 120% of the time developing a solution if that path enables you to get up and running in 20% of the time?
This particular story provides an important refinement to this point. Success isn't always possible. Delivering "no matter what" is part of what engenders trust, but an even more important component is being ahead of the ball.
If your manager comes to you saying "you're not matching expectations", whatever explanation you might have will be read as an excuse. If you proactively tell your manager "hey, this framework seems hellish, we might face some problems", you're leading the discussion in how to recover from a bad situation — You redefine "success" early enough in the game that you can actually deliver it. Knowing how to have this conversation (and the self-reflection necessary to understand you need to have it) is one of the most important parts of a "true" 10x engineer.
The problem if you think about it is that you will tell him just that every time you see him. In other words, how do you show that you know how to make a good framework other than by beating deadlines? Beat deadlines, again and again, and then you will be granted the right the make a framework yourself. One that. among other things, actually beat deadlines.
Crucially, each lever only goes so far — you (usually) can't adjust expectations to the point where you're expected to do zero work, and you can't deliver on impossibly demanding expectations solely by working extra hard.
While you're absolutely right that the "keep shipping" lever is very important, the article provides an example of where you need to pull the other lever early.
I've had MANY frank conversations with both product and engineering leadership about the current state of the world. The VP of engineering is onboard and understands the pain of what we're going through. Product is a bit harder to convince, but just as important -- probably more important. They understand that my team is having to spend 20%+ of our time just bringing the code into this decade, because I set that expectation early and reinforce it often.
I argued AGAINST a from-scratch rewrite because I knew it would never be ok to stop shipping. But I have been able to convince them that slowing down now will let us move faster later.
If you are taking responsibility to maintain it for 15 years, feel free to go on. Otherwise, please step down and let professionals do their work.
I personally know one engineer that after a decade of being the 10x rockstar shit navigator finally got the opportunity to create a codebase from scratch. They'd been dreaming of doing such a thing for years and had the design all planned out. It was to be the shiny new product for the company.
One day the people upstairs finally gave their blessing. The ninja worked alone, making all the decisions, with full support of upper management. The result was a great big steaming pile of shit that nearly sunk the company. After a short period of mental health problems the ninja was promoted to shogun and the company hired a new shit navigator.
In football (soccer) it's easy to observe that good players can be good in totally different ways and/or situations. And it's also easy to observe players who were once thought of as good or bad can totally change either way when they change teams. It's a shame engineering performance can't be as easily observed.
The other main point is that while I'm doing this thing that gained cred and leeway, at the time I'm just trying to do the right thing in the eyes of people who have to deal with it first hand over the long term including maintainers of the software. At no point dud I think if I do this and look good I'll have the points to fix my mess later or any sort of gaming strategy at all.
I understand your point, which basically boils down to the axiom of managing expectations. But sacrificing professionalism is not something that should be accepted as normal, let alone celebrated as clever. It’s the oldest trick in the book.
So I'll give a short and sweet argument: read John Carmack's biography and code (both in detail), then feel free to argue that he's not a 1000x engineer, and/or that he's the only one in the engineering world with such capacity.
¹: I agree, though, that "10x" is a profoundly misguided label
It's more about what a "10X" is. If someone comes up with "10X developers use black background and their x key is more worn out than the e key," I think it's not unreasonable to question that.
Also the question of whether someone who's able to spit out great code really fast but is incapable of testing, documenting, or architecting something is indeed "10X".
So the question is not "do outliers exist?" but "what qualities do outliers exhibit?"
* their design is poor
* they didn't take the time to document it
* they don't take the time to explain, mentor and in general communicate with others
This is a way more common situation than the one you're describing (John Carmack)
FWIW i remember reading that Carmack didn't really document nor explain his code and all people who bought id's engines got was a single day to ask questions about it to him and that was it.
On the other hand for the vast majority of its life, id was a very small studio (IIRC the entire team who made Doom 3 was just 21 people - this includes programmers, artists, designers, etc) so chances are if someone wanted something they'd just ask him directly. I also remember a comment about programmers at id not having meetings and decisions were taken in informal discussions.
An amazing engineer who is also an extremely strong team player is less likely to be that noticeable because the contrast between them and the people around them tends to disappear in those situations.
10x engineers are just a phenomenon where an outlier exists in a standard team. IN reality it's quite rare - all those 10xers are employed by Google working in teams of 10x engineers all looking like a 1x engineer. It's only when a 10x engineer stumbles into a 1x team you suddenly see this effect.
What's the industry median? Does anyone know? People who hire keep reporting that a lot of candidates can barely pass fizzbuzz. 10X compared to that probably isn't that unusual.
Just to mention one dimension of it: There are many self-deprecating jokes about how 1x programmers use StackOverflow all day. I'd argue that it's actually the opposite: good Google-Fu alone can make you a 10x engineer! Many developers in continental Europe or Asia still struggle with English. They'll get stuck tinkering around for a day when the solution is result #1 on Google.
I think the reason is the number of times a developer interviews is reciprocal of his talent. Great developers don't have to interview often. Anyone who has worked with them will vouch for them and they pass most of their coding interviews. Really shitty developers have to interview 100 times before they get a job. So you interview 100x more shitty developers than great ones.
* This description is to illustrate a point. I know there are plenty of great developers who interview terribly and shitty ones who interview well, but on average good developers interview better than bad ones.
Whereas, everything I have observed suggests that engineering skills are taught, and only taught. At one time, John Carmack couldn't code like John Carmack.
With the right training, guidance and mentoring, with the right team to collaborate and build with, and with the space and motivation to deeply consider how to solve problems in a useful, pragmatic and productive way, almost anyone can be a 10x engineer.
Oh no, it seems like a hyper-modern-C++ developer lead the project and transformed the code into template-metaprogramming madness... (inferred by the absurdly long compile times) Deep condolences to all the people who worked on the project.
Please not I'm not saying those books are bad, just blindly apply stuff because you think it is cool and fancy is probably not good leadership.
Or most code generators in general. If you are using a code generator to bring features from other languages to C then just use those other languages.
Maybe I'm wrong?
C doesn't allow for much overengineering and most C projects tend to be simple (well, they tend to be libraries that do mostly one thing) but if someone really wants to overengineer a C project they can put the worst C++ architecture astronauts to shame since as C doesn't allow for much by itself they need to work outside of it (hence generators) and there are no limits to what you can do outside of C.
Serious question: how do these people make it past intermediate level? Luck, no major catastrophes/bugs, putting in 14 hour days, all of the above?
Maybe things are different in data science, but I was kind of the data science equivalent of this at one point in my life. It left me with nothing but bad blood between myself and former colleagues and employers.
For instance, dev teams of 20+ where one person is the absolute backbone of the team and churning out features faster than the rest of the team put together.
I’ve seen maybe 5 instances of this across hundreds of teams I’ve worked with (I was a developer turned consultant so have a lot of data). They are rare beasts but 10x devs absolutely exist.
1. the person had been there the longest, and had the most context on the code base.
2. There was very little docs on the code base, so new people had to go to them.
3. This person would just do the feature instead of helping the other person implement the feature, and ensure their position as "top feature churner"
If these are true, they may be 10x of the others on the team, but they are holding the team back by not dropping themselves to 4x and lifting up the other team members to 2x.
Development - team sport. You could put Messi on my company's 5 a side lunch time team, and we still wouldn't win the champions league, and the skill of the others on the team would atrophy, and they would become over reliant on a single person. Not a great thing for a team.
A true "10x" engineer raises up the team by 10x by doing the things a lot of devs hate doing - docs, mentoring, guidance (without taking over someone's feature), and knowledge sharing. Not shipping :all-the-things: on their own.
One of my assertions is that Messi hasn't proven himself to be a GOAT until he's been great somewhere else. It's easy* to perform at a high level when the entire team is built around you as at Barcelona. In non-Messi-specific environments (ie Argentina national team), he just doesn't perform as well.
Whereas Ronaldo, on the other hand, has done it in several distinct environments and elevated the teams he's been in (which I guess makes him a "true" 10x player?)
The original 10x term was about productivity (and namely, lines of code that is pretty much bunk).
For me is always about what is a 1x developer. If we consider them a professional developer that does their tasks (somewhat) on time, documented, and with minimal bugs, which I would consider the baseline for what I would call a professional developer, I have a strong opinion you won't find 10x developers compared to this.
On the other hand, if a 1x developer is a person that can't create a simple algorithm(fizzbuzz), copy pasts code from every possible source, including his own code from file A to file B, etc etc, then sure, 10x developers are there, but this is because we set the bar too low.
That is gate-keeping, a person who could replace a team is 10x no matter if he is super helpful to slower developers or not. Of course you'd prefer to work with the guy who makes you look better instead of the guy who makes you look bad, but both are still 10x. However a person who just wants some development work done would prefer to work with a single 10x over trying to organize a whole team, a single guy will be more agile and much easier to communicate with while trying to get 10 persons to pull in the same direction is a monumental task. In that environment it doesn't matter if the dev can help slower devs or not, all that matters is that he can communicate with stake holders and users about requirements.
Development is a team sport, yes, but it is a team sport where some people can act as a whole team on their own.
Lol wut? The entire 10x meme is gatekeeping, this is about including more people than Rockstar DevOps SRE Ninjas.
> a person who could replace a team
Doesn't exist.
> However a person who just wants some development work done would prefer to work with a single 10x over trying to organize a whole team, a single guy will be more agile and much easier to communicate with...
A person "who just wants development work done" may well prefer a single developer, but it is not sustainable in the long run. That one 10x dev needs vacation, family/friends, sick leave, and career progression at some point.
> Development is a team sport, yes, but it is a team sport where some people can act as a whole team on their own.
Nope, not for any product that will last longer than a year, is anyway complex, or has more than one timezones worth of usage.
However in an environment where you are writing solid libraries which are not meant to break or change much and therefore wont need much maintenance the requirements are very different. Then it is better to have an extremely good team build a good solution once and then ship it and then mostly leave it alone.
Writing solid libraries is useful everywhere, since it can make work easier for the rest of the organization and such. Forcing people to only hire replaceable cogs and ignoring that some developers can be vastly more productive is therefore counter productive, even in organizations which mostly need replaceable cogs.
I have worked in many problem spaces, and what I have said stands for all of them.
> I agree that 10x engineers can't fill that role since you can't get a steady supply of them.
10x engineers definitely can, just not Lone Ranger style mavericks that poison teams, or "replace teams"
> Then it is better to have an extremely good team build a good solution
I 100% agree. key work in that sentence is team
> However in an environment where you are writing solid libraries which are not meant to break or change much and therefore wont need much maintenance the requirements are very different. Then it is better to have an extremely good team build a good solution once and then ship it and then mostly leave it alone.
Very little code these days is write, compile and ship once. Compilers, runtimes, interpreters, base libraries, kernels, OSes, CPUs, and tooling all change. Unless you are deploying to a main frame that is slated to run for the next 40 years, all of these changes require updates to code, and that isn't even accounting for security issues (how many companies do you think were frantically trying to recompile programs with retpoline mitigations? How many "run once" pieces of software had to be recompiled with updated OpenSSL after Heartbleed?)
> ignoring that some developers can be vastly more productive is therefore counter productive,
So is discounting the harm they can cause, or the opportunity cost of them not lifting up their teammates.
I work in a larger team, but I always solve problems alone. When others have failed to solve something important they give it to me, and I always solve it quicker than them putting a team of staff-engineers on it would. Often my solutions are good enough that they make the whole team pivot in a different direction since it solves many problems for the wider organization. I often design new architectures in doing so, build frameworks etc which others then use.
Note that I am relatively new on the team, so it is not that I designed things which others don't understand. Instead I came in, started fixing a lot of shit and my responsibilities just grew. The most senior engineers on the level of senior directors noticed that I could fix a lot of things others couldn't so I get tasked with solving large problems which are blocking a lot of other efforts. Almost always it involves cleaning up bad architecture and implementing something which allows us to solve more problems. There is no point in pairing me with others, I can't teach them to work like me. However I can teach them to work with the code I wrote, but not to actually solve problems like me.
Would you say that having me on the team is bad? Am I toxic? I think I wouldn't fit into a lot of teams, but I still think that I can help a lot. If I weren't here they would need to put teams of people to achieve the same or worse results as me, or the work simply wouldn't have been done.
Without knowing you, or your team, I can't know. I have worked with people like this before, (and done it myself on a few teams), and it is a mixed bag.
> There is no point in pairing me with others, I can't teach them to work like me. However I can teach them to work with the code I wrote, but not to actually solve problems like me.
Again, I don't know your team, but I would doubt there is no-one on your team you can teach. Pairing is not what I was talking - I personally really dislike it, and it doesn't suit me either. Designing a solution, and helping teammate(s) through implementation of the designs is valuable in this context, and helps lift up other team members.
> If I weren't here they would need to put teams of people to achieve the same or worse results as me, or the work simply wouldn't have been done.
No one is a perfect engineer - the solution you design might not have been produced, but this team existed before you joined, and most likely will after you leave, and it produced solutions.
> Note that I am relatively new on the team ..
This is a key point - I have done things before that were great solutions / libraries that others could use, so I didn't sink much time into docs / comments in the code. No one would need to change the library, just the config and stuff calling it. Which was true for about 2.5 years, at which point we needed to update what should have been something minor. cue me spending a week trying to understand my own code, after someone else tried and gave up. Time is the real judge of how much impact someone has on a team, and which direction it is in.
> Again, I don't know your team, but I would doubt there is no-one on your team you can teach.
What would I teach them? I can go into an unknown codebase in a new domain and solve problems quicker and cleaner than the team who wrote the code. There is no secret knowledge I posses, no bag of tricks I apply, I just see the code, figure out what happens and solve it. If I could reliably teach that to people then I could become the richest man on earth.
My skills are good enough to reach a decent position as an IC, nothing to brag about really, but they aren't worthless either.
I would trust that a DE in GOOG knows how to leverage their team in the most efficient / useful way.
My point isn't that very smart / productive engineers don't exist (they definitely do), but that the meme of the dev in the corner who sits in the dark, and spews out golden code, without talking to anyone else on the team is actively harmful for our industry, especially in the smaller startup R&D teams that the current batch of publicity about them comes from.
- Be good (and fast) at Googling things.
- Know your foundations, deeply. Don't memorize design patterns and algorithms: instead, learn how to arrive at them organically and how to analyse and understand them.
- Avoid overengineering like the plague and stop seeking perfection. I've seen lots of teams of "1x" engineers fail because they're too worried about peer approval, so they end up trying too hard to arrive at the "perfect" solution. And then business changes its mind and they have to rearchitect everything.
- Accept that business people will change their minds and design your software around it. The world doesn't revolve around your precious codebase. If the higher ups want to change something, you have to do it. Your codebase should have been malleable enough for a 180 degree pivot.
- Stop chasing unicorns. Yeah, maybe Vim will give you that extra 10% edge you need, but if you're comfortable with Atom, why change?
- Keep it simple, don't be clever. Only use the subset of the programming language that is free of "gotchas". What's the output of `[].push(1)` in ES6? Who gives a shit? Keep that stuff out of your code.
- Learn to evaluate if using an external dependency is actually faster than writing something from scratch or just copying some code. Sometimes it isn't, and people miss out on having simpler code, simpler interfaces AND learning new stuff because of that. Of course, you're not going to do that with a crypto
- Avoid things that might slow you down. The CI taking 30 minutes to run or the compilation taking 10 minutes are a sign that you're doing something very wrong and too complicated.
--
As for practical recommendations:
- A single integration test is better than multiple disconnected unit tests that have the same coverage. It allows you to change your code without changing the tests.
- Avoid transitive dependencies in your classes/functions by using simple Dependency Injection. Just pass those dependencies as a parameter or whatever. This will help you have units of code that are more testable, more flexible and don't require maintenance. Also you don't need those mock-in
- Make code simpler to read and to debug. Avoid reflection, metaprogramming and stuff like that. Don't do things that require magic.
This is a lot of extra work, but it meant that I always had an extremely strong foundation to stand on. When I know something I really know it, and having learned this way since early school I have spent a really long time doing it so it covers quite a lot.
Also when you learn this way you don't forget, so it just compounds. There is no way a person who "cheated" by implementing for example algorithms and data structures without deriving things themselves can compete. They have spent their entire lives learning how to apply things without understanding, they would have to redo all of that to catch up.
When you know things this well then being much faster than others is not very hard. Also creating original solutions is not something scary or time consuming, it is something you've done throughout your entire life.
Anyhow, I am not sure if others can learn this way, I just know it works for me. I've tried teaching others to do it, but it didn't work that well. It might be that it was too late, I just naturally learned mathematics this way from early school so I already knew how to think about algorithms before I even started programming. I mean, calculating things by hand or in your head are the original algorithms so if you can confidently alter those as you wish then you already know the basics of programming.
A 10x engineer is just a workhorse who happens to know enough of everything to be truly useful wherever. I like to call them "glue engineers" instead because it's a little more friendly to the team setting. They do exist, though.
If someone is a Usain Bolt of software development though, they probably are someone who should be guided into, or are in, a senior engineering role. Glue Engineers / Smokejumpers / problem solvers are different, and useful, but when companies become over reliant on them it is an issue. And no matter how productive they are, they should be held to the same standards as other engineers.
It's hard to argue against excellent programmers, statistically they must exist. All this work identifying them and the qualities is a bit silly when it's hard to even define the term.
A runner is doing everything you'd be doing running, but more, and can achieve far greater speeds that you ever can.
I agree that it's weird, and to me it's also a delusion.
As a delusion, though, it also has a function. Most of the people will never meet outliers in their field, and this will protect their self-esteem with the thought that the outliers don't exist, can't exist or that those skills can be reached with enough effort.
If the connection success was disconnected from identity, then there would be no need for this delusion, since admitting that somebody could be immensely better in a certain field wouldn't hurt self-esteem.
I also have seen that. And, when that person leaves is another one from the group that took the role. Because you can have so many roosters in a flock.
It is so important to be able to lead as to let other lead you. Too many people, especially managers, does not understands potential. They see the result without taking into account any context.
Can be even bad. In one team, there was this guy that was more productive than the rest. He was an asshole. Everything has to be done his way, so, it was clear why he was the fastest one. Without him the team will have been faster and the product delivered earlier. But, the manager only was comparing outputs and the asshole that did not let the rest of the team work had higher output.
So, yes, there is people that are 10x. But, they are the ones that share knowledge, that put the team needs above her owns. It is that person that everybody wants to work with. And usually has little to do with personal output and more with improvements in the overall team performance.
Too many times I have worked with self-proclaimed 10x that are just making other people lives miserable and are surrounded with people that is new because his previous colleagues have left the company.
So, you are right. I just wanted to make clear what, at least for me, it means to be a 10x developer.
I don't know - I've been the developer that produced more than the rest of the team combined, but it's important to stay grounded. An arrogant developer is going to be resented or even hated, regardless of productivity.
I also feel it's important to mentor other team members if you are more skilled in some areas - someone who shares the fruits of their knowledge and experience is more valuable to the rest of the team.
In my personal experience, the author's anecdote rings very true. At my first and last corporate job, I was handed a thick af HP laptop that could barely be used anywhere but in the cube, a hideous screen, 30 min build times, and a java stack that made testing/understanding the existing YUI (JS) codebase a brutal activity. It took almost my entire first 6 month contract to just get minimally productive, and that's without accounting for meeting interruptions. Another frontend fella was hired on shortly after me, and we worked together to test and get productive with this codebase which was great, until a month later the manager who popped his head in every so often to check that things were running to his measure, decided to shake things up and dismantle all the teams, re-positioning them on different projects for no apparent reason. My colleague and I were split up, me on the new project that he had been prepping for through requirements gathering and UX stuff. Starting from square one, on a team whose members had barely met, in a different part of the codebase that I'd never touched, and with a 2 month arbitrary deadline, all while everyone was moving from SVN to git, and the feedback loop on a frontend change (locally) being 5 - 10 minutes. Shocker, the project failed, I was fired, and much like the author, I wanted to get the fuck out of the industry.
Edit: I think it's important to note sometimes the nature of what you're working on or the company you're doing it for can be extremely constrained. That in and of itself isn't unsurmountable. But when the expectations, compensation, budget, and measure of output aren't balanced, or if the constraint is poor management that don't understand or care about the people they're managing, then it's just a tire fire.
When you realized the codebase was a mess and that it would take you forever to reach productivity, did you reach out to the manager and explain the situation? Did you push back on splitting up the teams, and explain why splitting the teams would be a bad idea? Etc.
Unless a manager is truly incompetent, in my experience they usually listen to technical people when they speak up on these kinds of topics.
- He explained to the manager that a simple Hello World took a lot of time bla bla bla. The manager already knew this, that was his "achievement". He also took it personally as most people do, because when you tell him that something was bad, indirectly, you criticized his work (and so him) in the last years maybe.
- The author tried to explain rationally the situation. The manager didn't want to hear it because he was already desperate. The manager knew that the end was close. A desperate man does not think rationally. All you can say is that you will fix it and then proceed as normal. They just want to hear that everything will be good even if you know it will not be. You are his psychologist/priest now.
- The project had to failed. When you as a developer are in a situation when management is bad you should not do your best to save the project. The badly managed projects and companies must fail in order for the sane ones to survive. If you save a bad project/company you are the reason why there are some many bad jobs everywhere. Also this is the reason there is so much burnout in this industry.
One would hope that the author didn't spend several weeks in silent frustration!
"Hey, all this template stuff is cool but it's going to take me a long time to sort through and understand. I'm going to need to ask a lot of questions about functions and logic. It would also be helpful if you could throw together some kind of quick and dirty documentation for X, Y, and Z classes which I already know are going to be important and it will be much faster and easier for you to write that (15 min) than for me to reverse engineer your thinking (15 hours)."
So far everyone I have met with traits like - produces working feature/code faster than anyone else - delivers stable massive projects on time - can carry a whole team through fire and hell - praised to produce masterpiece*
Are the same people everytime who are just - good at playing office politics - are excellent at cutting major corners - knows when their project will fall apart and leaves before - are in league with upper management, so can't callout
I have yet to met a real developer who when left team/project/job didn't leave a massive trail of destruction but up until they were present everything was a-ok-top.
May be someday I aspire to meet one, but so far, most pseudo 10x are just people knowing how to play right politics and hide the skeletons really well :(
One part of that is they all seem to err on the side of less code (including dependencies) over quicker implementations. The other part is a few times I've shot them a piece of code and they've come back with something simpler that I've overlooked. I.e they seem to have good fundamentals, good algorithm knowledge, good understanding of the language etc.
It makes sense to me, because I think this is the only vector you can 10x somebody in. You can't generally 10x somebody early in a greenfield project because everyone is smashing out work. You can't 10x somebody in a hellish project like in the OP because everyone is struggling with the same cruft. The only way you can really 10x somebody over a big sample size is by keeping every project you work on simpler for longer.
So that's what I look for when I'm looking for 10x devs. I might be completely wrong but it's the best indicator I've found yet.
I don't really buy into the idea of attributing "x speed" to a developer, the idea is trying to oversimplify what is really a function of experience in- and the complexity of current task
Consider yourself lucky. The ones where this doesn’t happen with are the ones that simply don’t contribute and are somehow allowed to linger with the team. When they leave it’s usually a boost to the teams productivity overall.
Definitely, I feel myself as a 10x developer that days working with my normal 1x speed.
I hope they only allowed GET?
There are indeed a lot of factors involved and a good environment/stack/management can result in a lot of productivity from the team or at least multiple individuals. There are probably a handful of people in your city who could even do good work with spaghetti stacks and chaotic management.
But if your software requires a Spaghetti-Wizard, you're in deep doo-doo when he/she leaves because Spaghetti-Wizards are rare and hard to identify up front. It's a safer bet to clean up your organization and processes by listening to multiple people and not getting caught up in hype. Non-friends give you the most useful advice. If you gravitate toward people who only tell you what you want to hear, you'll have a biased perspective.
Another thing, sometimes a given stack or org is just not a good fit for you. People think in different ways. The author perhaps should have looked around and if other devs were doing fine with the odd stack, just say, "for some reason I find this particular stack confusing and difficult." Be honest and don't bash the architect if it's only you struggling.
So when I started my consulting company I thought about marketing it as something like "Spaghetti-Wizard". Similar to the "we buy ugly houses" but "we work on ugly code. never surrender. never rewrite.". Couldn't think of proper way to find clients though, so with one exception mostly been working on greenfield projects or as an expert on Oil and Gas IOT systems.
First: let’s just replace that with “much more productive than average” developer. 10x is a silly statement, a bit like saying someone is a 10x footballer etc.
It’s correct to say these people get a lot more done than others. They often have admirable traits, such as great focus or enthusiasm for their job. They’re dedicated and will work long hours to get things done. Great for a CEO or investor to have. On solo projects, they’re exactly the man for the job. And startups usually begin as solo projects.
The reason there’s such a backlash on Twitter is that there is a huge cost to the rest of a software engineering team when working with such a colleague. Every instance I’ve seen of this situation has a common factor: as others joined the team, the MPTA developer monopolised the codebase. They won’t delegate, and preferred to spend time coding rather than helping others do their job.
And here’s the thing: The productivity gap is mostly a function of this dynamic
Try to take ownership of something, and the MPTA dev will use the time in the evening to rewrite your code in their style. They are extremely opinionated (though often correct) and unwilling to delegate and bring in ideas from others. Make a mistake (inevitably as you pick up the codebase) and the MPTA will roll their eyes at the CEO and replace your code. Working in a team is not about who writes more code, it’s about how to work together to move the company forward. And a happy team building a large product will always outperform a MPTA developer by long-term measures.
With no documentation, strong communication, team ethic, and delegation, employing a MPTA is unsustainable in the long term. If you’re a VC or early stage startup you probably don’t care about that. But most developers are in teams in bigger companies, and perpetuating the 10x myth makes their lives worse, and makes them look bad.
Moving on from the idea that a 10x developer is good for a sustainable development effort is a significant step in the maturation of software engineering as a field. They have their place and can be an incredible asset, but great software engineering is about teamwork and communication.
A 10x developer is 10x compared to his peers under the same conditions. Comparing across project conditions like this is talking about a different concept.
That you can hire someone tomorrow that would have 10x the output of the average hire. Basically that such people exist.
Cross team productivity, and inter team dynamics are very interesting topics, perhaps more interesting, but this label for this topic is pretty clearly defined.
We had a story to build a relatively simple go web server and deploy it to kubernetes one of my teammates got it, and basically got no where with it for a couple of days so I thought I’d get it started for him.
I got a basic hello world server set up and deployed along with a ‘ko’ setup so he could do hot rebuilds and deploys with a keypress.
I sent him the git repo and instructions for how to get it working.
While I was waiting for him to get it working, I was kind of in a groove so I kept adding features from the story.
By the time he got it compiled (with me coming over and just walking him through everything because he couldn’t follow the same docs I used to get started), it was already 90% finished.
If I had waited for him, he’d still be working on it for another 2 weeks at least.
It’s not that I’m a genius or he’s an idiot, he’s just fairly new on the team and I built our whole stack from scratch more or less and know it like the back of my hand.
You know have another capable engineer. That's real 10x.
Your solution of just doing it by yourself is a short term boost.
And then you hand it to someone else, and it gets done.
There are some problems that are just really hard, and some folks just aren’t cut out for those problems.
Problems like "Make X take less than Y time to run" or "Reduce binary size to Z" or "Design a fault tolerant system accomplishing Q" etc are often impossible for most to solve since they simple don't have enough foundations and intuition to solve them. You'd have to spend years drilling fundamentals to get people to that level if they are even capable of gaining the same intuition, most developers never gain those skills no matter how many years of experience they get.
There's also the set of problems that are best learned at universities. Normally, one doesn't have time for a developer to catch up on their missing compilers or cryptography class (this is particularly a problem since perhaps a quarter of programmers have CS degrees, and a quarter of them went to a decent program). If I were asked to debug a clock skew problem on a particular VHDL design, it would take me a long time to learn enough to even approach the problem.
As to a solution to what the author asked: "What could have been done". I think the way to handle that situation is to approach the manager with a solution. Tell them, if you give me A, B and C I will be productive, I do not have these now and they are causing me pain. To do this one has to have self-awareness and experience in what they need for a productive environment. one also has to be vocal and willing to fight for it.
But it is very common that a developer can fix a problem or build something 10x or even 100 times faster than others. Simply because they know the project, the language, understand the problem already, have experienced that problem before.
I have many anecdotes where I was stuck on something for hours and a colleague solved it in 10 minutes. But I have also counter anecdotes where 2 colleagues were stuck a whole day trying to solve a problem while I was out of the office and the next day I solved it in less than 5 minutes. The multiplication factor of that is insane, but it really happened.
- Have all the boilerplate code almost memorized. By that I mean things like parsing a simple file, opening a display, etc..
- Know the relevant techniques, and train. For example, if you are doing a coding competition, dynamic programming algorithms are a classic. If pretty pictures are your goal, fractals and raytracing are a good start. Neither is likely to be of much use for you in the real world.
What coding challenges don't require is the ability to think long term. That code is likely to be thrown away after the challenge is completed. Managing complexity is maybe the most important part of real world programming, and for technical reasons you have very little of it in coding challenges.
As for Bisqwit's videos, they are awesome, and he certainly is very talented. I actually learned a lot from him. However, all his videos are about toy projects, not building complex applications. BTW, I think this is the reason he is a bus driver. He doesn't enjoy coding in a professional setting, because it is a different kind of work.
There is also the Stakhanov question about how to attribute the work of supporting and being supported by others, and how this can be used for propaganda.
When I hire new people, I hammer clean code and TDD. I am not dogmatic about it, I just know from experience that maintainable code makes for a more enjoyable experience for everyone on the team.
He doesn't play well with others and usually he'll just do stuff his own way without telling anyone.
He's usually right and he's usually more effective than his sidekicks.
Some villains need Batman, but after a while he can work on more pressing issues and the sidekicks can handle the weaker villains.
The Batman comparison is a great example, because the criticisms of the 10x developer match exactly the problems with batman.
Same result: no tests, no docs, no design, no code review
And when a (let's call it 10x) developer steps in and produces just a very good design or implementation, it still adds a lot of value, to the project or to the team's productivity, even without tests or documentation.
(In that sense, the 10x label is a misnomer: exceptional developers aren't faster at typing, they produce something that the others wouldn't produce in any amount of time, and that something often increases everybody else's productivity).
My latest encounter was an insurer who spend a lot of money on building a system by a hip team who started with node/mongo/react and a few months ago insisted on switching the frontend to Svelte because ‘React is not current tech’ (I am not joking here). No tests, bare minimal docs, bad design (every change takes forever and some changes are deemed impossible) but it works, makes money, client is happy. It took however over 2 years (not cheap guys either; Dutch, 120+euro/hr people) to finish while my beer napkin estimate is 6 months and that would include tests and docs. Easier because there already is a system so that is not fair but the idea that companies are living in some HN nirvana where they pay programmers to implement non business stuff (tests, docs etc) is just not realistic. And the people who do it are not ‘10x’ even then.
If I would say 6 months to rewrite (if that was on the table) inc tests and docs, the client will say; how much without those then?
Why should the client have to worry about tests or developer documentation? I would not be trying to get it as a line item on the invoice.
Keeping the code base in a state that makes it fast and cheap to add future features is just a professional duty. Decide how to best achieve that on a project by project basis and bake it into your estimates.
Some projects the client just wants the absolute cheapest implementation though and i am completely fine ripping out the need for continual re-factoring or keeping the test suites in good shape IF i've explained the down side to the client first.
So yes, it's my professional duty, but my 'competition' doesn't do it and is therefor cheaper. I don't do much of that work anymore as I now do a lot more own products with my company where I can do it, but if I 'bake it into the estimates' we will come out most expensive. So for us it's line items, and if you, after we explain everything, do not want that, we will remove or not take the contract (depending on the terms).
Also, just because someone has good performance doesn't mean he's an insufferable idiot. In fact, those kinds of snarky replies about 10x devs here are way more toxic than anything claimed by them.
One of those 10x was truly someone who was worth 10 developers (at least!) given that not only was he capable of holding the entire business in his head, but he could also mentor and bring people together. At crunchtime he could also shield the rest of the team by churning out features at triple speed while still keeping them in a mostly maintainable fashion. He brought the best out in everyone.
The other 10x was a silo of knowledge, was terrible at mentoring and wrote code which was neither readable nor high quality. That said, he was unmatched in his ability to ship and solve problems in distal regions of the codebase. In my evaluation of him, although he was 10x more productive than everyone else, I can't help but wonder how much less productive everyone was around him (and the team was larger than 10!).
So tl;dr YMMV. They definitely exist, when they work right then probably can set up systems/organizations that can scale around them and generate tonnes of value. When they're egotistical/insecure vampires, their global value will be questionable but they will definitely look good relative to everyone else!
I think moral of the story is don't hire assholes...
It's just so difficult to do anything without something completely unrelated breaking.
Enough that I have considered simply leaving.
Without any snarkiness implied, I suspect not being on twitter anymore lately has spared me a few hours in this case.
Maybe 10x programmers (I'm not one) don't have time to talk about 10x programmers.
“But even more important than technical issues are things that promote healthy team dynamics. These include things like blameless postmortems, openness to ideas from everyone, permission to try new things even if they may fail, stern weeding out of jerk behaviour and, ultimately, trust.”
It’s just so important.
Some people are more productive than others; it happens. Some people are toxic and destroy entire teams. It doesn't make sense to lump all different kinds of "developers we don't like" into the category of "10x" because that's not what that is. There's another comment in this thread suggesting a change to "more productive than average," which is a term I could get behind. You can't measure productivity to multiply it by any number, so please just stop.
--
I have been involved in seemingly simple projects that never seemed to end (and a lot did not or shipped with significant debt) and on other complex/novel projects (with many unknowns) which went really really smoothly and shipped on time.
Successes are oft attributed to a 10x developer or a high performing individuals contributors. But, then I've seen the same 10x devs go to 0.1x and 0.1x to 10x and back.
My anecdotal observations on what sets successes apart from the fails are:
- A well defined problem: Well defined to the extent that this intends to solve X. It can easily solve y,z,a and b, but it will not and is out of scope/not expected to be delivered.
- PMs with domain knowledge: An external aide who can step in and guide when asked, or if the visibility reduces. But understands the problem and technologies involved (task masters need not apply). No PM is often better too. Also the PM here is more like a sponsor, only steps in when asked, to recover failure.
- Smaller teams: Structured like a cross-functional pod. For complex projects a senior dev, a not as senior a dev and a designer work well. A lone wolf + a designer works. A junior dev with high degree of domain expertise on the problem + a part time designer works too. No designer necessary if there isn't a front end.
- Hard code reviews: Starts with a good convention that's documented, a style guide for programmers. Some languages have this baked in. This happens at the very end in the testing/cleanup phase.
- Let the teams write out the task, then group these in to scopes. A PM or person with more knowledge outside the pod might be tapped in to help sub-divide scopes.
- Let the team on their authority cut down on scope if it helps ship on time, with fewer unknowns, without changing what we were trying to solve.
- No extensions: The project is done or its done.
- Finished early? Free time to NOT write code. Usable as the team sees fit.
A few other nuances, one could argue that this makes for good and consistent 1x dev. It definitely makes for a 10x team.
aside: read a great book that summarized a lot of the successes as a plan they use in there team. Its an easy 60-80 minute read (I'm a slow reader). Highly recommend it if any of this resonates, high recommend if it doesn't and you want more ammo for a flame war. https://basecamp.com/shapeup
Or do competent managers even exist? Or we just assume that they usually aren't and we will have to work around them?
So many developers I see are overweight, drink alcohol often, play video games until 2AM and then sleep 5 hours, no exercise at all, bad diet, porn addiction.
By having such a bad lifestyle they are really low energy and tend to go into "autopilot" which of course translates to worse output at the job.
* Understand that super productive people likely do things that aren't the popular way of doing things. If the super productive way of doing things were the most popular way of doing things then everybody would be more productive. Be critical about why a productive person intentionally does something in defiance of popularity.
* Become comfortable reading code. Frameworks, unit tests, processes, and tools are not there to make sense of the code for you. You cannot be a 10x developer if you are intimidated by reading code or expect something else to do it for you.
* Learn to organize to the scope model before adopting any other convention. This will reduce the amount of code in a given application. In many cases it will also greatly increase code performance. In JavaScript OOP concepts and inheritance are conventions that can be avoided, but not scope. Scope is always present and not hidden behind a code convention that can be avoided. Don't be afraid to nest functions and try to declare references as locally as possible and share where necessary as this greatly increases maintenance speed.
* Write original code. In JavaScript invented here syndrome is exceedingly common. In many cases it is faster to write original code for a given problem and in many cases that original code will execute orders of magnitude faster than misunderstood dependencies downloaded from NPM. If writing code is intimidating you will always be less productive. If you want to write clean maintainable code solve a given problem as directly as possible and then later, after clearing your mind, refactor the code to achieve simplicity. Simplicity almost always takes extra effort, but reduces maintenance time down the road.
* Master the DOM. The DOM is still the ultimate backbone that glues all things together in the browser. The DOM is not some strange React fiction. It is a language agnostic standard. Learn the standard DOM methods and node relationships. The DOM methods execute thousands of times faster than query selectors and faster to maintain for code where sections of the page are in flux. https://dom.spec.whatwg.org/
* Become comfortable with callbacks. Node is callback driven. If you cannot figure out callbacks or passing by reference your code will be a struggle to write and look like spaghetti.
* Learn to write your own tools. It is nice to increase your own performance because you have learned to automate part of your daily tasks or parts of your job away. This isn't something that comes naturally and it does take practice to become efficient write quick tools on the fly that doesn't burn up all your time.
* Take ownership of test automation. Some developers want to test everything because people have told them testing is somehow important but have never learned what is important about testing. Tests are a form of debt that. Test what your application claims to do opposed to what it literally says. Test features, options, and output. Test that collisions of features do not produce unexpected results. If you are confused about what to test ask for guidance from your QA team. Ensure your tests automation executes as quickly as possible so that it isn't a swamp holding back the productivity of your team. Slow test automation is worse than unnecessary unit tests.
* Most importantly accept that you are fallible and that you are probably wrong more than you are right. Learn to appreciate negative feedback and criticism as gifts of guidance. If you drink your own Cool-Aid believe you are too good for improvement you aren't improving. The soft-skills are perhaps the most important part of becoming more productive.
Other industries have people who are clearly Superstars. Why would they not hold true for development?
Considering the project folded it might also have been a sign of bigger issues with management there.
"It was managed by an architecture astronaut that, as one is wont to do, rewrote existing mature libraries as header only template libraries that were buggy and untested (one could even say untestable)."
I'd like here to quote this:
https://blogs.msdn.microsoft.com/ricom/2007/02/08/performanc...
"Which of the following is more likely the culprit of this crisis that has your boss in a panic:
1) A developer failed to code a good algorithm in some module and now a very smart person must come along and replace that module with something much better.
2) The project has far too many layers of abstraction and all that nice readable code turns out to be worthless crap that never had any hope of meeting the goals much less being worth maintaining over time."
"Of 27 responses at this writing
8 didn't specify #1 or #2 at all or were balanced
4 went clearly for #1
15 went clearly for #2"
I've had my own experiences of #2 on different occasions (I work for decades already).
There is a real problem of making unnecessary and long-term bad abstractions, and there is a lot of such often in the code using Boost, as an example.
NB I'm saying that things Rust aren't 'better' than C++ - just that initially all new project in a new language have a positive bias (as do new projects) and that time will tell how big the advantage really is.
But I'm a consultant and I often have to deal with - to me - new MLOC piles of C++ code. These code bases are of course almost always non-trivial and my first approach is most of the time - If I am permitted - to analyze the include structure and to optimize it. Removing headers, pimpl, basic things. Only then would I even begin, to explore particular problems. Side effect is an intermediate 500 feet view, that develops along the way.
Many developers are too hasty, taking too narrow an approach.
I recall working in my first jobs terminal room and one of the engineers came in to login to AUWE ICL - and shaking her head after seeing 38 jobs in the queue in front of hers
You can also sometimes make templates slow by programming horrors like iteration through repeated template instantiation. There's an old joke about those sorts of problems. "Doctor, it hurts when I do this," says the patient. The doctor replies, "then don't do that."
Many people say that templates in C++ is a zero-cost feature, but it slows down compile times so much up to the point that you can't call it "zero-cost". I think it's just another tradeoff that C++ developers have to make - between generic code, performant code, and fast-to-compile code.