Ask HN: I'm a terrible developer, what now?

176 points by throghawayacct ↗ HN
I've been programming for a while purely as a hobbyist for many years and as a professional for less. I've come to realize I'm not very good at it and thats unlikely to change. I have basically no CS knowledge and am not even really that great with the "practical" stuff despite having been at it for so long. There's not a single language I'd consider myself good with, maybe one or two I can write and maybe one I'm ok with. I can read most code and I suppose consider myself well read when it comes to tech in general, in that I have very surface level familiarity with all sorts of things many most people have never heard of, although I must stress the "surface level" part. Its good for temporarily sounding smart or experienced, but most of that however is unfortunately useless. I can recall my last interview tripping up on questions about very basic OOP concepts, which you'd think I'd have internalized now and there's no way in hell I'd make it past a phone screen for your average whiteboarding company. I know many people much less experienced or even relatively new who are significantly better at this. I suppose that some people are simply more intelligent or at least more inclined to the proper skills than myslef, which isnt neccesarily good or bad, more of just a fact. I also suppose that I'm an ok "hacker" in that I can get very interested / fixated on certain problems, although my solution is more likely to be a complete mess.

Main problem is I'm not sure what quite to do about it. I'm not sure this is a "try harder" type solution, as I've been at it much too long for brute forcing to be realistic, but most of the alternatives seem dreadful. Not sure what options I have given my strengths and weaknesses.

259 comments

[ 3.0 ms ] story [ 283 ms ] thread
It sounds to me like you need to have a real discussion with your manager - this is what they're there for. Maybe their perception isn't as bleak. Maybe this is a case of imposter syndrome. Or maybe you really do need some improvements and they can help you with a development plan.

Not having deep knowledge on particular subjects, not knowing OOP, being a generalist - these are not signs of being "terrible". Everyone has blind spots. Some people work on font rendering or audio codecs their whole careers and don't know how to build a decent web app to save their lives. That's ok.

Seconded on the imposter syndrome point. I definitely have days in my life when my internal narrative sounds just like your post, but if I take a step back I'm much further along than at those low points.

Another issue is that it's entirely possible that your current role doesn't challenge you to learn or retain CS concepts nor deeper aspects of the practical tools you use. Many jobs can be done very well using the same shallow toolkit repeatedly. If that's the case, it's not really a question of your ability, but maybe you can start actively looking for projects to force yourself to start learning more.

I'm not sure I'd recommend highlighting your potential lack of competence to your manager.
Depends on their situation and environment. If they have a good manager who recognizes that "helping someone to grow" is better for both sides of the interaction than "drop 'em and take a risk on hiring someone else", and/or if they're in a situation where the engineer can accept the risk that their manager isn't that, it's certainly the best bet.

Employees are an investment. An employee who can take the initiative to flag-up areas that they could benefit from training is valuable.

Comments like these remind that while I miss the US personally, I don't at all miss it professionally. While things in my current country (Norway) err on the side of making it damned near impossible to fire someone, the upside is as a manager I can have very frank conversations with the people on my team about how they're performing. They don't live in any fear of this, they see it as a way to improve.
(comment deleted)
Being a generalist doesn't get you a job though. I'm in a similar position to OP and, while I can figure out a problem given enough time and motivation, I can't adequately answer most interview questions and I fail most coding interviews. I don't know if I use ES5 or ES6 or whatever and I don't know the difference between Java 7 and Java 8 (8 has lambda expressions or something?) and I don't see why I need a wealth of experience in the latter in order to maintain a Java application. Before every interview I have to look up the difference between an interface and an abstract class because, while my brain knows when to use which, I can't explain it in concrete terms and I don't know the difference between the two across different languages. I can't explain DI and I have no fucking clue what a FactoryFactoryBean is because I've never had the need to write one so how am I supposed to have this experience? I don't have enough time to dig into the particulars of a language or its compiler/vm/interpreter or microservice design patterns and I'm sick of having to be passionate about programming outside of work in order to even stay employable. All of the jobs I've ever had have been through friend connections and that well's starting to dry up with the pandemic and all. I'm sorry for the frustration dump, but I've truly grown to fucking hate this field. I'd just quit and be a bartender or something if I didn't have tuition debt to repay.
I feel the same way and it causes me to think about suicide all the time.
Oh man, that's heavy. I'm of the opinion that you have to enjoy what you do for work to have a decent quality of life.

If you don't enjoy it, find something else! If you hate it so much that it makes you suicidal, doubly so. I tried doing the "practical" money making thing, and it made me miserable. Programming is the thing I found later that brings me joy.

Find what brings you joy, and do it. Until you know what that is, explore. Hop on a bike and ride across the country. Move into the woods. Go volunteer in a developing country (some positions provide room and board, you just have to get there, but the pandemic does complicate things). Literally anything other than 1) what you are currently doing 2) suicide.

I have been there and I feel for you, truly. No matter how it feels, there are other options. Take care of yourself and hang in there. From someone that has been to the very bottom and made it back, it can get better.

How do you do all this with family obligations, reliance on health insurance, and little fallback cash in the bank? This is a good idea for someone struggling to figure out what they want to do in college but a lot of us millennials who can't hack it on the coast are still paying down debt and are anchored to our situations.
The short answer is you can't. The ability to fuck off because I hate my job has always been important to me, so I've always lived frugally, didn't have kids, never had an expensive wedding, etc. I have some cash in the bank and recently quit my dev job because it was also making me very mentally unhealthy.
>recently quit my dev job because it was also making me very mentally unhealthy.

What do you do now?

(comment deleted)
Sending you hugs
Think as in a passing thought of "fuck all of this why bother" , or Think think? The former I'd estimate 90% of people have from time to time. But if it's Think think you need to let some people close to you about this and look for some professional help, no point in suffering like this.
Hey, total stranger on the internet here - I have no qualifications to help someone with suicidal thoughts but I have been an engineering manager for a decade and I'm pretty decent at it. If you ever want to talk to someone about your career and don't feel comfortable opening up to your own manager about it, please reach out. Email is in my profile.
I couldn't figure your email out, but I messaged you on twitter
Hi! I've somehow been tagged by Twitter spam filters and am currently locked out of my account. You can email me at: kevin at kitemaker dot co
> Being a generalist doesn't get you a job though.

It probably doesn't get you an absurdly-high-paying FAANG job rewriting code someone else rewrote the year before, but I guarantee you any competent generalist in IT can get well-paying job without much trouble. There are a lot of places out there that can't afford to have a specialist in everything they do, but can afford the kind of person who is willing to tackle any problem put in front of them.

I don't know what to tell you man. I live in the South and I've interviewed at my fair share of IT cost centers. They tend to ask the same kinds of questions. The ones that don't end up paying $50k/yr for 60+ hour work weeks and treat their developers like dirt.
Ever interviewed for a position in a profit center? Small and medium sized consulting companies can pay well and tend to value their developers.
They're a lot more competitive too.
Hey, I think, what you need to do is go meta. Think about the way you think. If your brain know when to use an interface or an abstract class, then the next time when you make a decision like that, spare a few moments to think about why. You might not get an answer but you will get hints. If you do this enough times, you will understand why you decided to do what you did. Thus you will will what's the difference between an interface and an abstract class.

I hope what I said makes sense. Try not to feel frustrated. Frustration never helps.

> I've come to realize I'm not very good at it and thats unlikely to change.

Citation needed.

> I have basically no CS knowledge

You could take some computer science classes, then you'd get some CS knowledge.

Or even just watch some of the foundational class lectures available online for free.

If you haven't been through CS in school, watching MIT's CS50 classes will introduce you to a lot of basic concepts and language that you'll find helpful.

Nit. CS50 is Harvard (EdX). 6.001x is MIT's. But I agree. If someone hasn't studied computer science (but does have some programming knowledge), one of those is a good place to start.
Oops. You're right, it's Harvard, not MIT.

And hardly a nitpick. It verges on a fail. Sorry.

Imposer syndrome alert. First, wait till tomorrow, see if you feel the same way. From experience, you're probably just in a mood bad because of some difficult task. If you still feel the same way tomorrow, then my advice will be to just take a more deliberate approach to learning. Nobody holds on to details like "very basic OOP concepts" all the time. If you're in a funk because of an interview screw up, get over it. Interviewing is a job in itself. Take time to prepare (3 months at least) and see if you still feel the same way.
Mayvr. I've felt this on and off for maybe the past year or two alternating with short bouts of motivation
Imposter syndrome is not something that just goes away magically. People often feel it throughout their entire careers. Also right now everyone is under additional stress, so I wouldn't be surprised if this is exacerbated.

Also, you may want to get checked for ADD/ADHD if you find you can fixate on things, but have trouble focusing on broader tasks.

Be kinder to yourself, and at the same time try to design a plan that motivates you to learn more.

Usually, if you have impostor syndrome, a good cure is to learn something that is unique in your environment and makes you feel valuable. Or to build something on your own and see it finished and working.

> "alternating with short bouts of motivation"

I think you might have pinned it here. It may be that you are just fine as a developer but that you have burn out or some other mental health issue honestly. I don't mean that as a negative. I was burned out very badly a few years back and I felt exactly like you describe. It led to anxiety, depression, a lack of motivation, pain... nearly a mental breakdown.

I had been on a bit of anxiety medication for a while. I had a near breakdown (some would say a total breakdown). My doctor literally said "You need to go see a therapist. I mean it. You can either go on your own or I am locking you into the trunk of my car and taking you and you won't be let out until you talk to someone." (So, my doctor threatened to kidnap me, and thank goodness!) So I went and talk to a therapist. And talked. And talked so more. For months, then years. It has changed my life for the better. I am a better developer. I work better. I am a better husband and father. I FEEL better.

I really can't recommend highly enough that you take a look into your mental health. It will help a lot. So what now? Talk to a professional.

You're a couple years into developing and feel like an imposter? Welcome to the club!

Literally every programmer I know has been wracked by doubts and existential dread over their skills. I've mentored a lot of interns and I always stress how impostor syndrome is normal, everyone gets it, including everyone above them in their teams.

My history is more of the "programming wunderkid", been programming since I was 13 and (like many on this site) find reading HN and programming news relaxing and recreational. I say all of this to highlight the fact that I got impostor syndrome. It was particularly bad the first few years. Once you realize everyone feels this way it's liberating. In fact you can even use impostor syndrome for good; either by motivating your learning or by empathizing with others.

I'm constantly learning and growing, which means I still feel like an impostor in these new areas. I'm the Kubernetes expert for multiple startup and government projects, but I still feel like a beginner in out of his depth.

The way I see it, you have two options. You push your comfort zone, and get comfortable with being uncomfortable, or you stagnate. You either become a constant learner who always has a niggling impostor syndrome, or your knowledge becomes static.

Be like Socrates. "I know that I know nothing."

why do we always say it's "imposter syndrome". not everyone can have "imposter syndrome". some people are actually imposters
Most are not. If you bet on the capability of most people to be able to reach a reasonable goal, you're likely to be pleasantly surprised.
It's a pragmatic thing. Telling an imposter syndrome sufferer that they have imposter syndrome is more productive than telling an imposter they're an imposter. On the internet when you can't be sure which person you're talking to, it's better to give advice that could be helpful if it turns out to apply to the person you're talking to, than to share commentary that wouldn't be too helpful either way.
i think it's less pragmatic and more "nice". such as telling people they can be anything they want to be even if they are 5'2 and want to be in the NBA
This guy was 5'3" (though, granted, that's the record and a significant outlier): https://en.wikipedia.org/wiki/Muggsy_Bogues
Definitely made his mark and I can only imagine the feelings of imposter syndrome he had. Fun anecdote for those who aren't familiar: He's one of the players in Space Jam whose playing talent is stolen by the Monstars.
Programming ability is based on far fewer immutable characteristics and the pool of programmers is far less exclusive than that of the NBA, though.

I think it's more common that someone is simply not confident in their programming prowess and without that confidence may never achieve their goals. Knowing this, knowing that neither you nor I likely have the credentials or ability to prejudge someone's ability, and barring some obviously shady/impostor behavior like having bummed most of an assignment off of someone else and then asking for my help laundering it... you will almost always find me encouraging people to not feel like impostors and instead feel like programmers that are just early on in their careers.

I think such a default makes sense, and not even because it is "nice". Even pragmatically, people can often improve.

People can't improve if they lack self-knowledge and others are wiling to bullshit them.

"I've got skill gaps as a programmer, especially at broad-level architectural design" is a belief that a mentally healthy person can have.

"If I express concern about my skill level, people will just say that I'm delusional" is a belief that will mess somebody up, especially if it is repeatedly re-enforced by reality.

You're not replying to the comment I wrote and to the comment I was replying to.

There is no equivalence between "bullshitting people" and encouraging them to think of themselves as early on in their careers. There is no equivalence between encouraging someone to improve and ignoring someone's self-concerns about their skill level. There is no equivalence between someone currently lacking programming skill and someone being too short for the NBA.

In case I wasn't clear about it before, you shouldn't bullshit people who clearly aren't putting the work in or are having trouble getting to where they want to go. You should encourage them to think in a healthy way about their current progress and encourage them to find ways to get better and allocate the resources needed for their growth.

> There is no equivalence between someone currently lacking programming skill and someone being too short for the NBA.

Agreed.

> You should encourage them to think in a healthy way about their current progress and encourage them to find ways to get better and allocate the resources needed for their growth.

Agreed.

> There is no equivalence between encouraging someone to improve and ignoring someone's self-concerns about their skill level.

It depends crucially on the words you use to encourage them to improve. I've often found 'impostor syndrome' to be stymie clarity. I might be guilty of replying to a comment that isn't quite your words though. apologies for that.

Telling an imposter syndrome sufferer that they have impostor syndrome without any additional evidence is telling a pyrophobic that you won't sell them a fire alarm -- and that they shouldn't expect anyone else to.
People who are actually bad at what they do rarely realize it! I think that's the difference between an imposter and "imposter syndrome".
From the wikipedia page: In the field of psychology, the Dunning–Kruger effect is a cognitive bias in which people with low ability at a task overestimate their ability. It is related to the cognitive bias of illusory superiority and comes from the inability of people to recognize their lack of ability. Without the self-awareness of metacognition, people cannot objectively evaluate their competence or incompetence.
(comment deleted)
Imposter don't present themselves as such.
Because this guy doesn't seem like an imposter
Because actual imposters don't care.
I think the main issue with imposter syndrome is everyone realises they suck but don't realise so does everyone else. If you look at the majority of private code bases in the world, they'll look like crap. Even the stuff getting leaked out of the major companies look like crap. Even some of the offical open source stuff coming out of the major companies get pulled apart for valid reason.

Everyone feels like they suck at programming, because they do, it's ok, everyone else sucks too.

> If you look at the majority of private code bases in the world, they'll look like crap

I sometimes think that the first set of people working on most software are just trying to get it to work at all, with limited expertise and lots of duct tape. Then come some journeymen who have to add more things. And, well, when I am writing code it tends to look a lot like the stuff around it... things just get Progressively worse!

I am not a dev. I don't intentionally write bad code, but the code I write sometimes hits prod. I don't really know what "good" and "clean" really look like. Just "works" and "doesn't".

An imposter is: "a person who pretends to be someone else in order to deceive others, especially for fraudulent gain."

So if you're honestly questioning whether you are capable or not, then by definition you're not an imposter. Some people are actually imposters but they are not the ones openly asking for advice about it and asserting that they don't belong.

So is "fake it til you make it" fraudulent or good advice?
Telling someone to fake it, means you are telling him to lie. Telling someone he is probably too harsh on himself, is not telling him to lie or cheat.

So no, fake it till you make it, taken seriously, is not a good advice.

The phrase "fake it till you make it" is also bad programming. Variable names should be intention-revealing.
Things are not that simple. Many times I have encountered that people do not know that they know something, lack of confidence can undermine their abilities. By default they will say their perceived version of "truth" that they "do not know it" while in fact they do. In eyes of their boss lack of confidence can be perceived as reason for demotion or endless cycle of easy tasks that do not lead person to improve their skills and learn by doing. Fear of judgment can be parasailing.

Also, sometimes pressure forces person to learn something in a very short period. So, if you "fake it", but also put significant effort to quickly learn what is needed to succeed then it is not lie but a 'future promise' it would be lie only if you don't succeed.

Early in my career I faked it many times just to get those jobs. I dont have a degree so i did what I had to to survive. I didn't fake any documents or something like that, I just lied in interviews and lucky for me they didn't background check deep enough.

Now I don't have to lie about my education. I would like to think its because of my skills I developed over 16 years but it could also be the times changing.

Like many here I also enjoy hobby development projects. I also suffer from imposter syndrome probably because to some commenters' point, I am an actual imposter.

The impostors aren't (IMO) concerned with improving their skill level. They're normally just worried about what position they can hold on to, how much money they can make, or how to hide their incompetence.
Because the alternative is less likely/wrong - This is just the best you're going to get and you just have to accept it.

also TIL impostor and imposter are both correct spellings (even though I got dinged for the o spelling in middle school)

You're correct that not everyone will be able to / will want to every single job. "X is not for everyone" is true, where X could be programming, or managing, or sales, or teaching, etc. We all have a finite amount of time on this Earth and no one person can learn everything about everything - sooner or later you gotta decide what things you're actually going to do.

So when someone posts something like this, why is it good to talk about impostor syndrome? Because encouraging a growth mindset [0] leads to better results. Saying "Yep, you suck" isn't going to lead a person to try harder. Saying "Yep, it's natural to feel that way, everyone feels that way sometimes, and Science^TM confirms it (aka Imposter Syndrome)" allows people to step back, go easier on themselves, and focus on what they do have control over (time invested, quality of time, how they get help when they're stuck, etc, etc).

One point I'd like to make to the OP: Whether you go into professional programming or not I think that the skills, background, and experience that you're accumulating can pay off. Maybe you decide that you'd rather not program all day. Perhaps you can go into a technical & interpersonal job, like management, or developer relations, or program/project management, or Q+A, etc, etc. There's a lot of jobs in the tech field and having a background in programming will make it a lot easier to talk with programmers.

Good luck to you, whatever you choose.

--------- [0] https://www.psychologytoday.com/us/basics/growth-mindset

Because the question contains many common symptoms of a good programmer:

The author can easily read code from others, there is no implication of other people complaining about his code, and can program in several languages.

There are also stuff that commonly causes impostor syndrome up there:

Very general surface level knowledge, problems with interview questions, and difficulty on understanding "very basic OOP concepts".

The only thing pointing to a bad programmer is that "although my solution is more likely to be a complete mess", but it's thrown there without any context on problem difficulty, code size or environmental restrictions.

Any of the best programmers I have ever met could have written that same question if they got reasons to doubt themselves.

My guess is the real imposters probably don't even realize they're imposters. Think the Dunning–Kruger effect. Often the most insufferable developers also have big egos and no drive to learn.
Find one thing, one small dimension, that really interests you and do a deep dive. Let your interest become a thirst, completely master that.

From there everything else will naturally happen. The problem most people have in situations like this is too much shallow knowledge, which doesn’t lead to real stimulation of curiosity and creativity. Find something that fascinates you and go for that.

Alternately audit the MIT CS106b course for free online and see if the intro to CS stimulates you intellectually.

Second alternately change careers to something where you deal primarily with people (like sales or product) or where you spend time outside.

If coding isn't your strong suit but you're still passionate and knowledgeable about tech, maybe tech-evangelism or a PM role would appeal to you?
It sounds like you enjoy programming, and have managed to get a job doing it professionally. Maybe just try to enjoy it? You might not be the world's best programmer but why does that matter?
Sounds like you need a good dose of stoicism: Don't worry so much about how good you are or if you can get better. Just focus on what you can control, practice your programming and focus on areas which you enjoy. You'll get better with time.
Wow so many points to address.

First up, you wrote quite a bit but never expressed something super important - do you enjoy developing, do you feel happy doing it? Or is it just a job and a means to put food on the table?

Secondly, technology is a broad area and I actually knew plenty of developers who quit within 6 months and went into other tech areas (sales, project management, etc.).

Finally, I've been coding for decades and sometimes I feel crap about my own work too when I look at the quality of stuff that some others are able to produce. I'm at peace with that though, because I know my real skills lie elsewhere. That, and I'm happy doing what I do, I feel good about it and I figure if I keep trying I can only get better.

Check this hard against all our tendency to have "imposter syndrome". I've suffered from it in the past, and eventually I found my groove. Now I lead teams.

That said, you could also pursue engineering adjacent paths. Things like project/product management, QA engineering, sales engineering, etc.

I think you've realized you're not a Rockstar or 10X, not that you're terrible. Most people aren't Rockstars or 10X, and some question if those even exist.

Your best bet is to try to specialize in the tech within your professional space. If you're working for a company, work hard to understand the technology and codebase they are using. Try to learn best practices, and see how you can integrate them into the existing codebases. You'll maybe learn the patterns you feel you're lacking, and also learn that a lot of times stuff is not coded with best practices in mind. There is tons of production code hacked together and barely working, and in a lot of cases that doesn't matter, it only matters that it's technically working.

Management may be an option for you down the line if you're feeling you're still not confident coding is the right thing for you. I am sure people would love to have a manager that is at least relatively competent at reading code and tech literate.

Well, if you're not very good, or feel like you're not very good, get better.

How to get better?

Evaluate your strengths and weaknesses (ask a friend/manager who's willing to give critical advice).

Plan and practice, practice, practice.

It's a mental game, too. I find the sheer volume of knowledge out there to be overwhelming -- don't worry about this. Start where you are, and add, incrementally. Nobody goes from A to Z.

You got this. Ping me further if you want a mentor or accountability partner.

Have you looked into being a QA / Tester? Good ones are hard to find but you don’t need to be a great programmer even though you should absolutely try to automate most tasks thrown your way.
It's all about what you WANT to do. Most of us developers who have been in the game a long time have times where we have periods of doubt. Only you can know whether your doubts are real or not.

If you don't want to develop software there are many ways to use that experience. You could move into QA. If you can write, you could do technical documentation. If you can organize things well, maybe technical project management is up your alley.

There's lots of options, if you think about what your strengths are. You can use your development knowledge to make your other strengths into a great job. Or stick with development. Most of us aren't ____________ (insert rockstar developer you've read about in a blog, here).

Money though right? You might do well as a test engineer
Buy and read the books "Cracking the Coding Interview" and "Domain Driven Design". You'll feel better.
(comment deleted)
Sounds like me on a Tuesday:p. Several things: Are you trying to learn JavaScript deeply beyond hacking? if so, there is your problem, no one really knows that language. Maybe try different programming languages to see what clicks? Also remember that average mortals don’t know how to program or even how to open a text editor without getting terrified. Everyone has imposter syndrome. There will always be someone way better at programming than you. Don’t be so hard on your self.
I've met some terrible programmers who thought they were awesome.

I think most of us wrestle with imposter syndrome from time to time. It doesn't help that there's no grading system for programming, no professional body that will certify us, no systematic learning program that we can work our way through. CS degrees don't teach actual programming skills (seemingly as a point of pride). There is literally no external source of validation except comparing ourselves with our peers - which is always a source of misery if you're not a narcissist.

There are constantly stories from famous, objectively good, developers who failed technical interviews. As with all interviews, a lot of it depends on social skills rather than technical skills. Failing technical interviews doesn't mean anything.

But, let's assume you're right and you're a terrible programmer. What do you enjoy about programming? Usually our talents lie in the direction of the things we enjoy. "Software development" as a career incorporates a huge range of sub-careers, and there are advantages in non-IT careers for people who understand coding. Can you head in the direction of your interests?

Keep it simple stupid. Simple code is better than hard to understand code.

It's okay to just write code for the sake of writing, but keep in mind the idea that what if new requests comes thru; given the current state, can the code be changed easily?

Code organization is a work in progress. Can your code be easily/separately testable?

Being good at coding is subjective.

Sometimes, it may just be the tool (programming language) you are using. Try Ruby. Try Vue.js.

Eh, I've seen tons of terrible developers who still collect a pay check. If you acknowledge you need to improve you can't be the worst of the bunch.

It depends on what your goal is. Do you want to get better at creating software as a goal in itself? If so you might want to think about optimizing for lower pay check jobs at startups where you will get to work with talented engineers and do new and different things although be careful they actually have good engineers who can mentor. This could prove to be the most monetarily rewarding path over a 5 or 10 year time frame as well if you drastically increase your skills.

Do you just want to make money off of it? If so look for skills that are highly valued in job listings, maybe react.js right now, and spend a few months of your free time studying that one thing as much as you can and maybe build a test project like todo mvp. If you can do anything at all with react you can collect a paycheck somewhere.

Software has a lot of froth these days. You don't have to be incredible to get good outcomes in the industry.

"Eh, I've seen tons of terrible developers who still collect a pay check."

Terrible developer here. I can say the stress of never knowing when you might get fired and having job options is very stressful.

Keep your head up. The dysfunction of an individual business definitely does not mean you are a shhitty developer.
It does. Because of the disfunction, I am no longer feeling the drive to become an expert. Why become an expert if the company has thrown me away in the past (outsourced my job to contractors)...
Do you not have a senior developer at your company you can pair with as a mentor? This should be someone who you can look to for not just software skills, but career management skills.
I'm intermediate and have filled the role of senior dev and tech lead in the past (unofficially). My problem is that tech was a dead end (Neoxam and FileNet).

Now I'm stuck learning/relearning multiple languages (python, java) and stacks (ECS, lambda, Dynamo, S3, etc). I've been on this team for 6 months and have never used the same tech twice. For me, that makes it very hard to become an expert when there's no chance to use the same tech again - I need some repetition. I want to get to the point where I don't have to think about the stack or the semantics/features of the language and just focus on crearing a great solution. That's never going to happen here.

I also lack the drive anymore. I've been screwed over, passed over, and had my prior positions outsourced to contractors. I feel like why should I try hard if the company is just going to throw me away again.

Oh so it's not really about being a terrible developer. Your choice to stay, I suppose.
I'm not sure what you're saying.
Oops, that should read not having job options.
If you don't have a CS education or a lot of professional experience yet there's no logical reason to expect you just "know" things - even what is considered basic knowledge. It's okay to not know what you don't know, you just need to address that.

Seek education (either a CS course or the multiple online courses), seek the help of a mentor (someone at work? friend w/ more experience?) and keep working on getting more experience.

Don't think people are "born programmers" - the good people invariably sank a lot of time into it.