I think you're an above average developer working at a below average company. This could be the root of all your problems. Nothing is more frustrating than working with peers you know aren't carrying their weight.
Do you want to be an engineering leader? This is what you are, regardless of your official title at your company. Engineering leaders are judged by how much better they make everyone else. You may hear the term force multiplier used. Say you are really a 10x engineer, how much more effective are you if you could improve the efficiency of 350 developers by 10%? Mentor, teach, help establish culture, make systemic changes to help your peers become more effective.
Regardless, I think you're a bad fit for your current company and its culture. And yes, many of us have worked in environments, like a startup, where we knew we were critical to success. Fail to deliver and a funding round wouldn't go through and people would lose their jobs. It's stressful, but I hope you're adequately compensated.
I worked for a famous Japanese imaging corporation for almost 27 years. The pay was meh, the corporate overhead and B. S. was damn near unbearable.
But I worked as a peer with some of the finest engineers and scientists in the world, on a daily basis, and we respected each other (but often also wanted to strangle each other).
I was seldom the smartest person in the room (and I’m smarter than the average bear). It was humbling, challenging, and exciting.
I became a manager, and hated it. I was a very good manager, but spent my nights and weekends, coding.
Since leaving that company, I went straight back to coding, and I’m not as good as I was.
I’m way better.
I don’t really care whether or not I’m better than anyone else, but I find that I can usually meet any challenges thrown my way[0].
It seems that I picked up some good habits, along the way.
These days, most folks in the industry don’t want to have anything to do with me. I’m radioactive. It only took a short time to figure out that no one wants Pops on their team. I won’t go where I’m not wanted.
I’m extremely fortunate, in that I can support myself without earning a salary. I sought out people that want to help others, and have been working with them, for free.
It’s working for me. I’m not lonely at all, and I’m pretty motivated by the work.
The pivot I have been debating is to become a Lead Development Manager with the express purpose of enabling everyone else, removing obstacles, creating better processes etc.
My problem is that I love code much more than talking to people all day. I have been mentoring Jr Devs for a while now in an official capacity which helps.
I like the idea of "make systemic changes to help your peers become more effective". So that's something I will have to think about.
I accept you're a gifted coder, and that you're better than your peers. Good, then do exactly that.
Being good at mentoring people is only vaguely correlated with being good at code. IMHO, the main factor that will make you good at something is caring about it, and if you don't want to talk to people you'll waste your skills.
There is someone out there who would love to talk to people, worry about their development, figure out how to best use your skills and so forth. Let them do it.
sounds like a good time to work on a harder problem :) OP is crushing it on their product. Given the OPs description, we can also infer that the OP works somewhere that commits correlate with output well.
A few interesting questions that come to mind.
1 - Does OP feel like they are doing the same things over and over again?
2 - Does OP want to work with better/more skilled engineers?
3 - Is OP setting the technical direction? Do they want to?
Being the top coder by commits in a group of 350 is a super power, however many "Hard" software problems are resistant to code throughput as a fix. There are extremely difficult software problems that take years to produce the ~1k line solution.
For a non “Valley” perspective, your work situation sounds fine TBH. You are already the defacto dev lead (making it official could mean meetings).
Hobbies, sports, instruments, hell even a book club. Get social outside of work. Treat it the same as you’ve been treating your career (dig in and get good). You’ll find you make friends outside of work, but often at work too, as you may have hobbies in common with others at your job.
This will naturally lead to a good work balance, because you may end up wanting to clock out early to get back to your hobby. You’re in a great negotiating position to reduce your hours when that happens.
OTOH, OP is invaluable to his current company. If he's being paid well and manages some balance, this could be a healthier environment than a mega corporation. If you want to balance life and work, small or medium companies are the best, specially with the clout he has.
I moved from a role similar to what you're describing (spent 7 years there) into a role where I'm the least senior person on the project. And I'm having a great time.
It's always possible to find people who are so much ahead of you that you'll need to put effort into just following the conversation with them. And when you do, they're your peers and you're proud to be a 0.9x developer alongside them.
Maybe you can write software to help make others more efficient, by empowering them to do more by themselves. Give people superpowers they don’t have at other orgs. Things coming to mind:
- Code editor plugins (or web or mobile apps) tailored to your org‘s workflows
- Language changes in case your org is using an OSS lang
- Libraries for often-used functionality
- DSLs that let your org‘s PMs encode behavior themselves
- Small utility apps (web or mobile) that facilitate more effective communication
- Dev tools for your stack, eg if you don’t have hot reloading yet, that’s a huge enabler
- Test data generators
- You mentioned that you setup automation. Take it a level further and let other devs create scripts by preparing an environment (maybe an IDE) for that
Be careful with the kind of tools that increase abstraction in the code base itself. It can easily tip into a situation where it will have to be all ripped out when the OP leaves the company. Or worse, remains as a cargoculted mystery.
There are no hard and fast rules, but stuff that increases the productivity of other in a (to them) non-mystical way would be best.
It's a judgement call, some of these in the list above made me pause, but the red flags will be specific to each workplace.
The keys is to know what others will understand, and that is a super-power in itself.
Maybe consider a Staff Engineer type role at an established and well-respected firm? Still mostly IC if you can land the right role, I think, but more focused on the meta stuff that enabled the whole team like tools and automation. Would love input from others as I've not actually worked in such a role before.
This is the same attitude I see on Reddit. Just because someone is a top performer at a no name enterprise corp dev shop doesn’t translate to tech companies and no offense is intended. I spent my entire career until I was 46 two years ago at no name enterprise dev shops.
I suspect they are feeling stressed because they're the main goto person on the product, and with enough random bobble heads running around trying to commit sacrilege on your codebase it quickly becomes a problem of control to maintain the quality you've so strongly instilled vs allowing the product to progress.
Their best path to get out of this bind I'd say is to slowly try to make themselves redundant on that product, choose a victim dev to be your successor and gradually disengage. Possibly a new product or project will be started and then they're free to get involved in that instead.
Also learn how to interview new candidates and get involved at that level, getting good (even better than you) coworkers is a great way to influence the whole company culture and make your work life much more pleasant.
To be fair, OP's speed of progress involved aptitude and diligence, even if you discard smarts. It's true that when you work five years at a code base, you probably become an authority in it because at some point it is yours too, but I've known developers who would never achieve that state.
That being said, tech megacorps are stressful environments, and OP looks like he has his plate full just accepting that he's become the de-facto lead developer. OP built his own niche market, why not dial it back a bit from eleven and learn to enjoy it?
Just move to a more intense company, or internal group, or a startup. I'm not familiar with how good you are, or your company, but I can almost guarantee there is a lot of stuff out there much more intense than the current place. And you can totally remain an IC if that's what you like.
Having been at times a manager and other times and IC, there are some great opportunities in each role, and it really depends on your organization.
If you haven't read it, "Staff Engineer" outlines some of the ways more experienced engineers continue to grow and provide value without becoming managers. I'd say the first half of it is worth a read to see if it sparks anything for you.
I will say that it gets lonelier as you go along either track. Reach out to peers if you have any. If not, try to reach out to folks outside of engineering.
Honestly, your impact will be greater if you become a development lead.
I know this because I've watched it happen many times, not because I'm one. I've had lead developers report to me and good ones can really have a great impact. The tooling, procedures, technical debt, etc. All will be positively impacted by someone like you.
This is also a common theme in a lot of "Platform Engineering" style roles (but not all of them, because it's an overloaded term). The output of your actual code is systems to empower others, and paving the "clean path". Support and education is also a very common piece of success.
From where you're coming from, I think, your next steps would be thinking "who should work on this" vs. "I'll pick this up because I can do it quickly."
If you're not enabling your team to take over your job, you're doing it wrong. And by a comment I saw elsewhere, the tendency to control things is natural, but you should resist that - it's the only way you can scale.
If your organization doesn't have that kind of individual contributor leveling, that would be a good conversation to have. Or if your team isn't big enough, maybe its time to look for a new challenge.
There will be a learning curve and a mindset shift, but it's really the only way that you truly become a force multiplier.
Soon, your commits will go down, but your reviews will go up.
Later, your reviews will go down, but your strategy/design/planning docs/conversations will go up. Your job is designing for the 1-3yr future (or more but rare) and across the organization.
Get involved in the hiring process. You should be able to screen candidates well and if the company really is full of sub-par developers (doubt it but maybe) you will bring that up a bit. If you need tips on interviewing shoot me an email (same ID at g mail) it's easy for a good engineer once you know what to look for and how.
BTW that's not isolation you're feeling. It's responsibility, respect, and frustration. You didn't ask for the first two, you earned them.
Note that in my experience, heuristics for spotting good engineers tend not to work unless you yourself are a good engineer. You don'tnecessarily have to be the same kind of good, though that's obviously the least effort, and tends to overemphasize other points of similarity that are conflated with the "goodness".
Specialists and Generalists tend not to respect each other, for example. Folks with CS degrees and autodidacts likewise (though both can have impostor syndrome comparing themselves to the other).
There are also three personality types (or cultural types) suited to different maturity stages of the system being worked on (which also implies different processes, BTW): Pioneers, Settlers, and Town Planners[0][1]. Many businesses tend to collect one or two of the three types. Pioneers+Settlers is viable, as is Settlers+Town Planners. Orgs that only have Pioneers+Town Planners tend to have interesting pilot programs that never get successfully rolled out.
If you do that, you may never write another line of code again (especially in a large organization.)
I like mentorship, helping people figure stuff out, giving technical advice etc. I don't like going to zoom meetings all day, which is what "leadership" in today's modern world has become.
> I think you're an above average developer working at a below average company.
This. I'd conjecture that this has led to OP becoming overconfident.
I also think that OP should not be a manager. If one dev is doing 70% of the work then that's either bad hiring practices or micromanagement where other team members are not trusted to deliver complex projects.
Re: your second paragraph, what does that have to do with OPs ability (regardless of appropriateness to the firm, his career arch, or the story) to perform as a manager. He/she might be great, normal, or terrible. How can you tell apriori from what they wrote?
OP realizes they do a lot of work, and OP realizes they’re single point of failure/authority at the company. But what steps have OP taken to start decentralizing to mitigate those risks?
Someone with the management sense would’ve already started thinking and implementing that and not continue to code moar.
> But what steps have OP taken to start decentralizing to mitigate those risks?
You don't know they haven't already starting thinking/implementing ways to address those risks. And... it may also be that there's not enough political power to make changes substantive enough to address the systemic risk. OP mentioned 300+ developers on a team - that's a large place. There may simply not be the ability to wield enough influence to make real change to reduce this sort of risk across the board.
Documenting your own stuff, coming up with some better ways to share knowledge, pairing, etc - that can help reduce some localized risk, but you don't know that they've not done this.
You’re correct, I don’t know they haven’t tried to mitigate the risks.
But post also points to being lonely of sorts and a sense of dispair. As your last paragraph describes, if OP pair programs, does some mentoring, etc, why would they feel lonely and post on the internet instead of chatting it through with the people at the company?
If so many people are coming to him/her for things, they def have some implicit power. Not knowing how to constructively use that power also lead to my support of the “don’t be a manager” post (yet). If OP figures out how to scale themself out, then by all means…
I have no idea if I’d be a good manager. But I don’t think this is a fair connection to make. I’m currently in a similar situation of being the built it all does it all go to designer programmer. And I have desperately tried multiple ways to make this not be the case. But if the company doesn’t support your efforts to do so, does it prove I’d make a bad manager, or that that company I work for has some shortcomings?
This. I always had a rule: if I wasn’t learning at a company I either need to switch teams or change companies. It means I outgrew my position. I’ve continually felt challenged as a result with a side effect of lots of types of companies and teams in my background.
- so much so that users are emailing us to complain.
Normally we'd ban such an account as a spammer, but you've posted about plenty of other things and seem like an obviously legit user, so I thought I'd ask instead.
Or he just bangs out a ton of crappy code in the name of "pragmatism", while everyone else has to clean up after him and thus takes longer. I've seen this many times.
Eh, that is exactly what I don't want. Pretending I am this amazingly productive developer and my code is just trash.
I just checked. In 2021, only two defects were created against my specific code changes. If I had to home into a weakness of mine is that sometimes I solve today's problem well, but don't think extensively about how tomorrow's problem in that space might look like.
The struggle is between creating simple solutions vs over-engineering for future proofing. I'm pretty sure I'm biased towards simple solutions.
> The struggle is between creating simple solutions vs over-engineering for future proofing. I'm pretty sure I'm biased towards simple solutions.
I want to encourage you to keep learning about your own biases here but to continue to have that bias as much as possible.
I like the term "throw away code" here but I think another way to say it would be that most of the code I write is like a jig for woodworking. I don't need it at the end of the day, it looks like shit, and holds up the real Things while I figure out how those things actually work.
Sometimes in code though, I find, that the jig _is good enough for now_ and it's super easy to replace the three that break instead of all 20 I needed to build it.
Have you thought about, or are you already involved in interviewing new developers for the company?
It sounds like you might already have a nose for what makes a good dev (i.e. somebody who holds the same values as you) It's a great way to influence the company culture, and get good co-workers, which can also de-stress you as you now have fellow travelers whom you can trust with tasks.
It's also fun, sometimes humbling but always interesting!
It's not about behavioural defects. It's that the _code_ is trash. It is unmaintainable and slows down all future changes, exactly because the person who wrote it didn't take the time to think about the future or even good architecture in the present. Every time I touch their code I have to almost redo their work because:
- It's impossible to understand what is going on (For example when people load huge json or sql files into a single test and you don't know what scenarios it covers because they are too lazy to write dedicated minimal test cases. Another common offense is a not well-defined data model that gets mutated everywhere in dynamic languages like Python or JavaScript where you never know what shape an object has or where it comes from)
- Their code allows so little extensibility that following the same "pragmatism" as they did and just hacking it in would exponentially increase the complexity
- There are no abstraction boundaries which almost surely means insufficient test coverage (which I have to amend before I can even start with my own work so that I don't introduce regressions) or the tests are coupled so closely to implementation details that any change necessary for my own work will require me to rewrite all the existing tests
You are fast because you pawn off your design work to whoever comes after you. Of course you have fewer defects: your colleagues have to put in more time to maintain the same level of correctness or else risk introducing bugs. That's the cost of bad maintainability. It's well known that changing existing code is harder than writing new code, double so if it is not written with care. Someone has to be the janitor to keep the cruft from accumulating and if it's not you, then everyone else has to pick up your slack. Ideally, every person in the team would continually clean up and always leave a code base better than they found it.
Lastly, I want to say that there is very important difference between simple and easy and simple doesn't come for free.
Do you know OP or have you seen their code? If not, you're making a lot of assumptions about them based on what they've said that are about as uncharitable as possible, to the point where it kind of seems like you have an axe to grind against OP.
I'm speculating here but I think that you have some major hurt and pain in your past and something OP said is triggering the memory(ies). There definitely are (many) people in the dev world that do what you're accusing OP of doing, so I'm guessing you've been heavily burned by that (as have I). I actually moved industries to get away from that. In my case it was the Java (especially "enterprise" java) culture/ecosystem/etc, and things got a lot better for me when I wrote off my deep investment in Java and pivoted to C++ and Ruby. I would definitely advise to move around early and often, both company and tech stack. Try out startup life if you've been in big corp, or vice versa. IME startup life is a lot more prone to the "ship it fast" pressure that results in terribly unmaintainable code, so a big corp where you can work on a core product (core enough that it gets plenty of investment and appreciation but not enough that it's the number one money maker, otherwise the Eye of Sauron will be omnipresent and encouraging bad practices). Life is way too short to be miserable at work, especially in a field like ours where hold a ton of the cards.
It sounds like you have personal experience in this. I hear you. From what I have observed through code reviews that I, or others, have looked at that doesn't happen with my code unless there is a very fundamental shift. Even then I try to keep my inputs and outputs clean so that pieces can be removed if need be. Of course I am not always as successful as I would like to be.
Now my first 2-4 years, that happened a lot, and I am not going to claim that I was fast. I was slow and either the code review would point something out that I would literary have to start from scratch or the next person that touched it would have to. This was actually the driver for me to focus more on simplicity. I basically discovered a direct correlation between complexity and how bad my code was.
To this day, if I catch myself doing something overtly complex it's a sign that my solution to the current problem is inadequate.
Ironically, my response would be the same if my code was trash. So I won't be able to convince you regardless.
I am confused why you are just taking the least charitable assumption based off OP's short post, and writing these long screeds just taking it as given that your assumptions are true.
My personal assumption is that anyone who thinks of themselves as a “10x developer” using the criteria he is using, probably isn’t. He only has 5 years of industry experience and I’m assuming at only one or two companies.
I have worked with 10x developers. They exist. Not only are they more productive than most developers, their code is also more bug free than most developers. Get over it.
Seen the same thing happen with devs that proud themself to write “simple” code. Sure, every individual script they write is simple in itself, but in the end you have thousands of them that don’t compose or reuse at all, with lots of implicit dependencies and assumptions between them. Leaving the rest of the team slowed down, trying to make sense of it, careful not to add even more to the existing mess, while mr “pragmatic” keeps adding even more copy-paste.
Basically the total complexity becomes bigger than the sum of its parts.
What you bring up is a common and concerning scenario. It would be better received without the accusatory tone, until you know more about actual situation. There are many good and fast developers that don’t apply to this concern.
Honestly, I have no need for validation. I've just started to feel angst and figured if there is a place where I can get good advice, even if it hurts, it would be HN.
From that perspective I have gotten enough good input to make this thread worth it to me.
Do you want to be an engineering leader? This is what you are, regardless of your official title at your company. Engineering leaders are judged by how much better they make everyone else. You may hear the term force multiplier used. Say you are really a 10x engineer, how much more effective are you if you could improve the efficiency of 350 developers by 10%? Mentor, teach, help establish culture, make systemic changes to help your peers become more effective.
Regardless, I think you're a bad fit for your current company and its culture. And yes, many of us have worked in environments, like a startup, where we knew we were critical to success. Fail to deliver and a funding round wouldn't go through and people would lose their jobs. It's stressful, but I hope you're adequately compensated.