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.
This is my first clue that you're not nearly a bad as you think. The biggest obstacle to becoming a good programmer is hating to program. Many people nowadays want to get into software because they can make money. There's nothing wrong with this, but if you really don't enjoy programming it's going to be more painful than it's worth. The fact that you like it is a good sign.
I saw in the comments that you've been doing this for a year or two. Programming takes a long time to get good at.
I recommend reading Peter Norvig's classic essay "Teach yourself programming in 10 years" https://norvig.com/21-days.html
It takes two years of programming to really break out of the beginner stage in my experience. I define this period as the period where you have to think much more about writing code than about the problem. The means that you really can't do much software development in the true sense because just getting programmings to run and run consistently take a lot of mental effort.
Years 3-5 are the intermediate stage where you can solve most common problems without having to think about programming too much, but programming itself is still a source of friction when it comes to completely projects. At this stage you begin to think more about how to structure larger and larger projects, learning some clever techniques, and understanding some of the more specialized techniques in your language of choice.
Expertise happens when you don't have to think about programming any more and are exclusively concerned with larger design problems. This is the point where you can reasonably write a program and, barring a few typos, will run on the first try.
Don't stress too much about being a great developer, just keep coding and you will improve.
But if you don't like it, you have other options! There's a lot of jobs out there that you might like more, and will benefit a ton from you having a background in engineering. You now have a superpower... you know enough about engineering to be dangerous!
For example – sales, CSMs or support teams for technical products will love you, because you can debug and figure things out – and your job will still involve more talking to customers than code. Look at solutions architect jobs, too.
Same goes for marketing. Most companies would kill for someone who does marketing but with a background in engineering who can do the work of setting up tracking/funnels/etc, rather than bugging engineering teams.
DevOps is a place where the hacker mentality will go a long way. There's not many "languages" you need to know deeply; but rather be really good at figuring things out and understanding how everything works together.
The list goes on! (EDIT: check the replies for more ideas!)
Recognize how powerful circumstances always are.
There are things you can do to improve or feel better. It needs to be deliberate and you need to care enough to put extra effort into it and manage your training as you would do a project.
Lots of talks on youtube can provide pointers and inspiration. But it's hard to get the chance to put it to use. A hobby project would provide that opportunity, but it need to be something you really want to do and something that will provide you some value.
As for failing whiteboards/screens, I have counterexamples: two of the smartest and understated people I know do fairly badly at these, and a person who was brilliant at these turned out to be quite unproductive. While the whiteboard/screen is the gateway for a lot of companies, there are still more that don't use such antiquated and lazy filters and are also very satisfying places to work.
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.
Then one teacher gave me an assignment and I looked at it and could not make headway. Then he told me: take your time. This should take you 2 hours or so.
That single instruction changed everything. I just stared at it and worked on it and stared at it and 30 minutes later I had figured it out.
Then the professor approached me to let me know that I should maybe consider go into theoretical comp sci as my major.
I have met math geniuses and I am not in their ranks. As Bezos once said in an interview, their brains are different.
However, it is worth pointing out: just give it more time. You don't have to see progress right away. If you set up a website or are doing some data science, you should expect little issues that will eat your time. This may be as trivial as simple as your python library is 2.7 vs 3.x or you have to load in C++ compilers and the error message is obscure etc.
The worst part is this drudge work is front loaded: before you start your app you have to pay these dues. Then once it is up and running you can experiment and you find a lot of progress being made.
This simple truism hurts newbies who don't see progress right away.
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.
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.
Specifically, confidence levels decline the more experienced and knowledgeable you become.
Eventually you start talking in generalities, what should or should not happen instead of absolute outcomes. You'll start using words like "probably" quite often.
You'll find yourself paralyzed by indecision. What's the best way to do X? What if I need to change Y? What would my peers think about this code? Golly, that will be a lot of work, maybe I shouldn't start that project...
This is all normal, and I'd say it means you're becoming experienced enough to understand what you don't understand. When you're green... you'd just go forth guns ablaze regardless.
The reality is, every good programmer thinks they are awful, and every awful programmer thinks they are amazing 10X developers. Be wary of overconfident programmers.
Welcome to the club :)
> I have basically no CS knowledge
Lots of people have this knowledge, and it comes into play rarely enough that asking for help when you need it won't put a huge burden on your coworkers.
> my solution is more likely to be a complete mess
Think of yourself as a writer. Don't publish first drafts. Don't give people estimates based on when you can finish a first draft. If you can tell it's bad, you can fix it.
> I can recall my last interview tripping up on questions about very basic OOP concepts, which you'd think I'd have internalized now
Don't feel ashamed of that. What people consider "basic OOP concepts" is strongly driven by the language they use as their reference for OOP and even their style in that language. Javascript and Java have very different OO fundamentals. Learn what good code looks like in the language you're using, learn why, and practice.
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?
But you asked a more general "what to do" I think/interpret; can you edit your post as to what other skills or interest or career background or experience you may have?
If you are a generalist techie with surface understanding of large number of technologies, and willing to explore that more / dig into things, there are "architect"-type roles you'd potentially be good at (and an even larger you'd be terrible at of course; the title covers a huge breadth of scope).
Are you good with people, communication, customers? Do you understand business needs? A manager who at least understands technical aspects can be invaluable. Yes, management is a tricky word in the world of technology and on HN, but I still believe that experience with dozens of bad managers is all the more reason to try to be a good one :)
Sales, advanced support, etc are all also options.
System administration of some kind may also be for you; fwiw I've been a "PeopleSoft Administrator" (PeopleSoft being an ERP like SAP, JD Edwards, Oracle eBusiness, etc) for 15 years (not one anymore but I'm still in similar space), and my breadth of skills was an advantage - a bit of DBA, a bit of sysadmin, a bit of middleware, a bit of scripting and programming, a bit of architecture, a bit of business and functional understanding, a bit of operational awareness, and tremendous curiosity and willingness to research and "figure it out" - that cross-section of curious understanding made me well respected and sought after in that particular niche, and there are hundreds out there like it.
I think important question that only you can answer but you haven't given one in your question is: do you want to stay a developer, or are you willing to explore other options close to or further away from that?
My point is: I hope some advice acknowledge that maybe OP is correct about his real skills.
Can you get things done in the one or two languages that you can write? If yes, that's already something. Forget OOP, forget whiteboarding questions - if at the end of the day you can build something even if you write sphagetti code it's _something_. I'm of course not encouraging writing unreadable code and I'm in no way saying that OOP is not required-knowledge, but if you can (somehow) get things done you are sufficiently intelligent. The rest is all a matter of putting in some effort (writing clean code takes some practice)
> and there's no way in hell I'd make it past a phone screen for your average whiteboarding company
One of my friends has never (AFAIK) passed a whiteboarding interview. Regardless, if I start a company, I'd pick him over everyone else I've ever worked with - not because he's the greatest engineer ever, but because I like working with him. He loves what he's doing and he get things done, and engages in interesting conversations. Leetcode skillz (IMHO) are so overrated.
> 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.
Most people I know are day programmers - they'll do what you ask them to do, but they'll never do something for the fun of it. This does not make them worse programmers, but I'm inclined to think that given enough time, people who do things for fun tend to get way better than people who just see it as a job. You got to love the process and not just the results.
Also, if you are feeling terrible because you tend to get harsh comments during code reviews, I'd whole-heartedly recommend detaching yourself from the code you write. Now that I look back, a lot of the code review comments I got were annoying nitpicks rather than genuine design/code critique.
I get classes are for loser. But seriously, If you have to force yourself to take/self study one class for the rest of your life nothing, and I mean _nothin_, will make you a better developer than a proper course on programming languages. These sorts of classes always seem to be wasted on people just learning how to program.
They really should be thought to developer that have been at it for a while. Experience primes one to really put that information to use.
I am not suggesting one of those "flavor of the week" language and move on to the next language survey courses. Find a class where you are forced to:
Write the algebraic laws for your underlying data type and turn them into code
Know the difference between structural and generative recursion
S-expression
Structure vs syntax
HOFs and Currying
Functional vs Imperative
OO through the lens of the Curry-Howard relation
Has you write some parts of a programming language or prove important things about a language
Don't survey. Who care if you "one time kind of wrote some Scala?" Get intimate with the nuts and bolts of language theory and have it guide your choice when you write software.
But once I hit my 30s, I realised that actually what I enjoyed was finding a problem and solving it. Programming was part of the solution, design was another part. I'd been doing all the different parts, but just labelled myself a full-stack developer because I thought I had to fit into a bucket somehow.
That lead me to thinking about what actually I want to focus on, and I came to the conclusion that product (management, design, etc.) is actually what I enjoy. Programming, design, marketing, and the like, are the tools I use to make products. I don't necessarily "love" any of the tools, and I'm certainly not the best at any of them, but I have a broad knowledge of all of them, and that alone had helped me in so many ways that I hadn't realised before.
So perhaps you need to do something similar? You say you get interested in problems — that's a great start! While you might not be able to come up with the best technical solution yourself, you could be the person that's needed to research the problem, and to motivate and steer others towards the solution.
Also, having that broad knowledge of the surface of many topics is also a great advantage. I'm often the person my friends will come to when they're looking for a tech solution that they haven't found. The chance is that I've heard of something that I can point them towards, even if it's not something I would want to work with myself.
Essentially, even though you feel you're not good enough at programming, it seems like you have talents that are big strengths in slightly different areas.
There are domains where you really have to be a crackerjack engineer, but most jobs just need you to know how to push and pull things out of datastores, make network requests, map data structures, and maybe render the results on a web page.
Technical job interviewers loves to grill candidates on reversing binary trees, or obscure programming language trivia -- but the job itself will be building a CRUD app.
So what should you do? If you enjoy programming, I'd say stick with it. Not everyone needs to be working on ground breaking cryptography or compiler optimizations. Sounds like you just need to find a tech stack and problem space where you can feel comfortable working on it.
I went from working at a large company to writing software for a startup and had the unlearn a lot of these concepts. Since you don't care for these concepts anyways, you'll probably be a better prototype engineer than I ever was. Also, look at related fields that require scientific programming using tools such as matlab as they also (mostly) focus more on getting the solution working rather than how it works.
1) OOP concepts don't mean everything.
2) Forcing Whiteboard interviews is bad. Some people prefer writing code (on computers) to think. Some people prefer whiteboards.
Please dont write yourself off because of these things.
> 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.
This is a good skill set to have and build on. If you care about code quality or improving your skills, try to find people who can mentor you in those directions.
The only devs I've known who I thought were legitimately bad were the ones who thought they weren't. The devs who couldn't accept that their code was overly complicated, because in that moment they had no problem reading it. Or who would come out of the end of a project without any ability or desire to think about why or how the project went wrong.
Some devs dig deep into the language and libraries, some don't. There's need for both kinds of devs out there, even if there isn't at your company. Some devs know every design pattern out there, some don't. I often prefer the devs who don't -- my goal is to quickly build software that is easy to debug and easy to add on to, and people seem to usually get caught up in putting whatever type of factory where a factory shouldn't be and...
Really, though, we all suck. I've got senior devs from Amazon and Microsoft who don't know or care about dependency management or how to write integration tests or... whatever.
What do you want to be good at? Intentionally pick a thing. Not "programming" but do you want to be the best at debugging your team's software? Do you want to know all the gotchas and tricks of your team's language & framework(s)? Do you want to own a particular bit of your company's business logic? Pick a small thing you want to be the best at, figure out what that actually means, and then master that thing. Even if "that thing" is just being able to quickly add simple, not-awful-to-maintain features. Grade yourself on that, not every single thing you might see some particular other developer do better at than you.
The nontechnical folks have titles like Account Exec, Sales Development, Inside Sales, Regional Manager. These are the "people people" in sales. Extroverted, greater social skills. Your classic salesperson.
But software is technical, and often gets sold to technical folks. At some point in the sales cycle, a company's sales team needs to talk "brass tacks" and show what the software can do. This means technical presentations, demos, pilot projects. It will be more at infrastructure companies like, say Snowflake, and less at SaaS companies like Salesforce.
For these technical jobs, you need to have sales engineers. You don't need to be a great developer. Instead, you need to enjoy learning technology on your own, and able to "geek out" with fellow geeks. Given your work as a hobbyist, it seems like you definitely have the first attribute.
Hope this helps.
Also:
> 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.
Okay, so depending on the question, I'd probably have the same problem. It's hard when someone asks a question like "what are all the uses of static in C++?" It's just not the way a programmer thinks about it, or at least, not how I do. It's a tool, and when I see that word I know what it means, but I can't just rattle it off my head.
So let's say one of the "basic" OOP concept was about multiple inheritance, which is basic in that it's easy to implement (and screw up), but given all the problems, I'd never implement something that way personally if there was any way around it. So I'm not familiar with all the ways vtables and inheritance might work, or which function gets called. I'd probably just say "I'd run the code and look at the output"
Internalizing knowledge is hard. It's more of an instinct I feel than something that is necessarily easy to explain that you know to someone else.
Also, a lot of people are great at interviewing and shit at getting work done. Interviewing has nothing at all to do with work. (which is why hiring is broken)
> 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.
This I think is the first rung for any solution for me. Get it working. Prove it's possible and that you have something that will work, not just "might work" or "hope it works". Then you can refine it. Look at things like names, lines of code, repeating yourself, etc. I've seen a lot of code that looks great but doesn't work. Messy code is sometimes the outcome of a messy problem!
Also let me just close by the fact that at least you have self-awareness of your issues, which is required on fixing them (even if it's just a psychological issue). Many devs write terrible code and think they are gods. I'd rather have someone I could teach.
My advice is focus on the skills you're good at, the ones that bring you joy and the ones that other value. Make sure you keep challenging yourself and getting better at whatever it is that you do. Also keep yourself curious about the world and the people living in it. Things will will eventually work out just fine.
You could take some computer science classes, then you'd get some CS knowledge.
You seem to do a lot of retrospectives right now. That is probably a necessary skill to be a good developer. You are questioning your solutions, looking at other developers' works, understanding that they are doing a better job. I can only say congratulations to you about that.
Do not focus too much on the technology or in what you know at the moment about the technology.
As a first step, you must answer if you want to be a better developer in a specific language or a better professional in one particular industry.
Technologies are too many nowadays, focus only on something you like, even if you know nothing about it at the moment.
The key is not what you have been until today. The only thing that matters is what you want to do.
I would still fail a programming interview.
You say four things about why you're bad:
am not even really that great with the "practical" stuff despite having been at it for so long
I must stress the 'surface level' part
can recall my last interview tripping up on questions about very basic OOP
although my solution is more likely to be a complete mess
The first seems relevant, but too vague to get much of a grip on. The second seems of dubious relevance--it can be useful to know about a lot of technologies, but it's neither necessary or sufficient. The third is about interviews. That may hurt you in a practical way (and is something you can practice!), but doesn't actually bear on whether you're a good programmer. The fourth is relevant, and actionable. But why do you think your solutions are messes, and what have you done about it?Supposing that you do really have a problem, you have to decide what your real issues are. Then you have to identify ways to work on them.
Ideally, you'd find someone you trust who can work with you, who knows something about coaching people, and can give you an accurate assessment.
P.S. All this assumes that you have a problem. I don't think we can assume that. It also assumes you want to stick with programming. But that's not a requirement. There are plenty of good comments about how you could switch fields and be happier. There's no shame in doing that, if you decide it's your best course of action.
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.
Any if you can't find mentoring at your current position, try some books. My first mentors were Andrew Hunt (The Pragmatic Programmer) and Martin Fowler. Start with them, or find your own.
Code mindfully, go deep to understand every little detail of the code you write or read. Ask questions. A lot. Don't stop at the first draft. Don't stop a the first pass of questions.
Keep at it for a while. That one day you'll wake up with the feeling that the code you write yesterday was good. And hell if it's not a beautiful day to make it even better!
Get some CS background if you feel you miss it. https://teachyourselfcs.com/ gets one Hacker News every now and then.
Work on architecture/design. Try to understand design patterns for example. Be critical. Try to understand architectural decisions of the code you read.
Don't understimate the efficiency that comes with really being fluent with a language but do not give fluency too much credit either.
This is a lifetime journey. Improve step by step, little by little, every day. But improve mindfully. Get a direction. Get learning goals.
It's not a "try harder" it's juste question of better orienting the energy maybe.
That's my 2cents.
Good luck, I'm sur you can get, better you just need guidance.
This career is so subjective it hurts. There are no right solutions, only okay solutions. There are also so many different types of programmers. It's okay to be the hackish type. That type drives value to customers while unearthing complexity so that the system can be rebuilt around that complexity... To further my point about "types", there is going to be a whole subclass of dev that will read what I just said and think "No, you must find complexity before writing code!". Usually this type has pulsating veins in their forehead. Guess what? We need them too...
On surface level knowledge - this is the most powerful thing ever if utilized properly. Once you know enough high level concepts you can organize them into a plan and dive deep on them. There is no use in knowing everything deeply. Strive to learn depth only when it's required.
On beating yourself up - Stop. It's not helping you. Find the value in what you do and how you do it, and then go deeper on that. You'll create yourself a niche. A good manager will see it, and you'll quickly start getting passed around a company so you can go do that thing you do.
Citation needed.
1. Imposter syndrome, a large portion of developers have it and this could be you. Chances are if you have a job and continue to ship code to prod you are at least partially suffering from imposter syndrome.
2. Overwhelmed by the wide variety of skills, being a software engineer in a professional environment requires way more than coding skills. You need to be adequate with GIT, Programming Languages, Unit Testing, Various Frameworks, CI, Deployments, Team Dynamics, and more. If you are only able to write code every day will feel like a big struggle to get anything done. Identifying which area is giving you the most trouble and doing focused learning will help you.
3. Lack of methodology in learning, a lot of people rely on their feelings to help decide what to do next. For some people that means learning a bit of this and a bit of that but never learning enough to be productive. Having a plan for what you need to learn and the order you want to learn it in can be tremendously helpful for growing your career.
4. Lack of methodology in coding, most coding jobs have similar steps when solving day to day problems. Making your self a checklist of steps can be very helpful for taking the stress and guesswork out of your day. For instance, step 1 pick up a ticket and understand the requirements. Step 2 pull from the git repo and run all tests. Step 3 Right down a development plan. Step 4 write code. step 5 write unit tests. step 6 submit a pull request. These steps will probably look different for each project and developer but help to ease the tension of figuring out what's next.
I'm sure there are more things specific to your situation but don't give up and keep working towards your goals.
But, that aside, if you just want out of daily programming, you can... - move into a BA or product owner role. Your technical background will serve you well as you interface with R&D teams (and communicate their concerns back up to senior leadership)
- Sales. Same as above, but requires a certain personality.
- MBA or some other graduate program. Could help you break out of tech completely. Or, move into some other tech-related role.
If you want to stay in programming, the best bet is to just stay in programming. I wouldn't worry about flubbing a few interviews, not all companies do ridiculous white-boards. And not all expect everybody to be the equivalent of a semi-genius from Stanford. There are aplenty of programming jobs where you can solve interesting business problems with more ordinary technology (vs solving interesting technical problems and building new tech stacks or whatever).
First, you might be wrong. You may be fine, and just need to back to fundamentals. This is very common in many complex fields. I have gone through multiple rounds of taking stuff back to beginning level. I'm doing it all over again right now in programming. I highly, highly, highly recommend reading "How To Design Programs". Putting time in to truly and deeply master the very basics as well as you can is the road to mastery in anything complex, and it's never too late to do this.
Second, you may not be totally wrong, you may be slightly off target on how you like to think best! There are a lot of people out there who like computing and programming, but discover that really, they are better off as someone in a related field, or that they like a different kind of coding. In my experience, the best low-level coders are often terrible architects (very high level software design), because they can't imagine being wrong! Also, some people naturally gravitate for whatever reason to sysadmin/dev-ops style stuff, or security testing, or embedded electronics. Or perhaps you have better than average ability to understand how people make software and would be an excellent development manager.
So my advice is to take a two-pronged approach:
A) Go back to fundamentals and learn new languages, both high and low level.
B) Experiment with related areas and see if one of them makes you say "ah damn this is what I should have been doing".
And C) give yourself like a good year or two to figure this out. It'll take some time.
Salesforce and Marketing Cloud were projects that I was asked to integrate and I hated them, I just don't enjoy the dumbed down way that they work compared to being able to express things in Python or SQL. Maybe something like that would suit you. There will be plenty to learn but it won't require as much of the creative part of coming up with solutions that more normal programming requires.
In fact I bet a huge chunk of developers would be happy to have someone on the team that doesn't mind the grunt work style tasks that require some knowledge of programming but aren't actually very intellectually challenging.
You probably aren't as bad as you think. Most jobs are maintaining crappy old code rather than writing from scratch, where you spend most of the day reading through code, to change a line or two to fix a bug.
That can only get you so far, of course, since a lot of things take time to "discover" on your own, but as a starting point, I found it works wonders. This might be controversial, but in general, I think that desire to get things done is more powerful and useful than a desire to do things right. Obviously you can't go too far in "get this out the door" because you will make decisions or design things without taking into account the future sometimes, but that's something you can dial back over time as you gain experience.
The second question is more of an assessment of yourself. Do you possess any of (there’s a lot of overlap here) tenacity, persistence, gumption, chutzpah, drive? If so, is it enough to keep you engaged in solving a problem until you succeed? If not, find something else.
If you can clear those obstacles, then you need only choose something to focus on and run it down to the end. Then you have that in your tool belt. You might have to start with running down how to triage the best thing to learn next. But if you stay engaged in the process and never give up (seeking recreation or sleeping on it isn’t giving up) you will become great.
Anyway, I acknowledge it is easy for me to be cut and dry in how I see your challenges. I just never gave up. Here’s an example, it took me like 3 weeks in high school to understand what an array is and how it works. We were given one week and my fellow students cleared it on time. Very frustrating, but I persevered.
Your one example is interviewing and OOP. This is a specific skill that you could practice: by reading, perhaps some memorization of terms, or even trying a side project with an intentionality of implementing in an OO way.
What are other things that you would like to be able to do, but feel that you are unable to? That can serve as a starting point for things to learn.
Bear in mind that there is no clear definition of a good or terrible programmer. The good ones are perhaps fast, or have deep knowledge of systems, or have wide knowledge of many types of technologies, or can write very fast code, or have a lot of expertise in an industry, or none or all of the above.
A good programmer is characterized by a set of skills that make them effective in the role of building things that are valuable to users. So the exercise is to try and identify those skills, and from there you could find ways to develop them.
I've taken a deliberate approach to try to learn "bite sized" bits and then write it up like I am writing a blog-post or a training page or something with a bunch of "copy-pasteable" examples. Even if I am not going to show it to anyone else, I at least have my own reference material I can quickly jump back to to refresh my memory. Try to use something accessible from work/home/mobile etc - perhaps github or a personal wiki or something. I have a few nicely structured and interlinked things now that I like to refer back to from time to time when I forget the details of stuff I've had to go learn.
I think this is the "if you cant explain it simply, then you don't understand it" quote thing coming true. You need to learn it well enough to write it up. And then the process of writing up helps cement it in memory. And even if you forget, you have your own notes you can quickly flip up and re-read to remind yourself.
So e.g. you could start small with "basic OO concepts" write-up with a bunch of examples. For example I recently did this for HTTP CORS request and JavaScript modules. Now you've learnt it enough to write it down, and written your own personal learning material (that I find is way better than other people's since it is yours and your brain seems to prefer that IME) that you can go back and look at over and over.
The coolest bit I like about this approach is every time you come across the stuff you've gone out of your way to learn and write up when doing your job, you get a small little dopamine hit: "I know this. I've got this written down."
First, start a memorization program. This means Anki, really. Start putting in the basic OOP concepts you've forgotten that you feel you should know. Then put in more as you learn it.
Second, start reading up books on interview questions and (a) practicing them and (b) shoving facts to memorize (complexity of algorithms, basic implementation notes for common data structures) into anki.
Third, you need a project that stretches your skillset and lets you work deeply with areas that you need development on. That's either a low-priority side project at work or something at home.
What you're describing is exactly what's normal for engineers I've met who didn't get a formal degree. Nothing that can't be fixed with a bit of studying and practice. Honestly.
If this all fails, you can always play MIT open courseware at 1.5x.
To become better and not "terrible", it takes persistence and continuous improvement - same as any other skill like playing a musical instrument. Keep writing code, paying attention to what's good and what feels messy. Keep learning new patterns and tricks, ways of organization.
What helps me the most are role models: find people whose works you admire, read their books, articles, the code they write. Find examples of software you'd consider excellent, and study what makes it good. Spending time with the best quality material, you'll become more familiar and fluent, to be able to produce works of similar quality and excellence.
You're saying you're not sure what to do about it, but from your post it sounds obvious to me that a next step would be to spend some time learning about CS, practicing coding/maintainability, and such?
I'd also add that not every developer needs to know every single aspect of CS, all the theory behind it, or even be an excellent coder. There are different areas in developing and you might find one that motivates you without needing a lot of any of the specific areas you mentioned.
I'm self-taught as well and my degree didn't do a great job of introducing concepts that are common place in CS degrees (and hence job interview hazing rituals). It took a long time of me feeling bad about what I didn't know to actually go out and learn about these things. Turns out most aren't nearly as scary or complex as you'd think. As with a lot of academic topics simple concepts are dressed up in domain specific terminology.
Also don't knock breadth of knowledge, lots of very useful prods to problems come from having a wide set of things to draw on. Sure it might be finished by a specialist but they didn't make that leap.
And if none of that is true for you, you are good enough to be here as evidenced by being here. Enjoy it for what it is.
If your solutions are bad, read a book on Lisp (that wasn't intended to be a pun, even if On Lisp was a good book and would fit the bill).
If you're not planning on leaving the OOP space, read a Smalltalk manual. It'll probably stick more, and I've never read a Smalltalk manual that was worse than contemporary books on OOP.
Knowledge is a problem that can be solved programmatically: profile where your bottlenecks are, then read until you understand the topics.
It doesn't sound like you've had any formal education (from the hobbyist comment), which actually means your situation is pretty hopeful. There's a lot of low-hanging fruit for people without formal education to grab that can sometimes even double their abilities. Grabbing a book on algorithms would probably do you a world of good.
Pick a programming language you feel the most familiar with and then focus on learning it. If there's a framework or set of established best practices you can follow, try to stick with that and build some applications with that.
It's easy for us to get excited about working with new software and cool technologies, but that works against us when we're skill building. I couldn't count the number of times my mentors had to set me back on track when I was a younger developer, because I was off chasing something new.
Learning a lot about a bunch of technologies is useful, but you should make sure you spend some time getting familiar with one or two stacks in particular and forcing yourself to build skills there.
My opinion is that you need to take a serious look in the mirror and ask yourself why you're not where you want to be at and if you want to get better. If you do, start with something small. You say you have no CS knowledge, so start there. Take an online course or find a syllabus from a CS course and buy the textbook. Don't worry about how long it takes you to grok it. Just work on it consistently and keep looking in the mirror and being honest with yourself.
If you end up not wanting to put the work in that's fine as well, move on to something that interests you (CS related or not). Good luck!
You don’t seem to lack the critical thinking skills that are the hallmark trait of a good developer. The most objective criteria you can ever pull from is, regardless of the messiness or efficiency of the solution, whether you’re able to solve problems. If I asked you to do some work, and you could do it in any amount of time, that is the most difficult milestone many fail to achieve — And it seems that bar is more than met with you.
Perhaps you are worried with the quality of your solutions. I’d argue that in many situations, it comes down to domain knowledge. That is something you will naturally gain as you continue to code and read about CS theory, and especially so if you keep exposing yourself to new things out in the wild or at work. Brilliance is often witnessed or measured by the application of domain knowledge, but the genuine underlying brilliance comes from your ability to recognize patterns and having the discipline to see things through to a working solution.
You’ll almost always find yourself with company that can work faster or slower than you and be different shades of brilliant, because our brains gravitate towards different things when we hear about a problem. It is not easily compared, and when forced it easily becomes unfair and unproductive.
If you had to leave this post with anything, it’s this: don’t you dare judge your programming abilities by the typical big tech interview. They are created in a way that tries to gauge your critical thinking skills, and sometimes that is executed quite well, but more often it requires arcane domain knowledge that demands deliberate and specific attention you would be unlikely to give and come across otherwise. It is a specific process that is related to our daily work, but do not get it confused with the actual work we do. Many incredible programmers are rejected because they haven’t nailed the interview domain — that’s okay and can still be consistent with being a good developer. It’s a different isolated problem you can focus on.
we start doing it, get better, and then stop getting better. and that's it.
if i had to do it again and actually get better?
man, tough.
i would guess by 'better' we actually mean 'faster'. we could talk about quality/bugs/big-O/etc. but that's boring.
i know some of these will be off the table for various reasons, and not saying i would do them myself, but i would consider:
* ask better devs how to get better/faster. -- including shadowing them for an hour or two once a week -- this also includes learning how to use a debugger properly/etc. or anything else that you don't _have_ to know to be a dev * take a formal comp sci class. to me, the main goal of doing any kind of certification/class is to boost your self-confidence. of course you'll learn, but having confidence is important so you can dwell in a hopeful/contented present -- i.e. your coding won't be distracted. * learn LISP * _really_ learn the languages/tech you're working with. instead of being 'just' a hacker, take some amount of time each week to go deeper. * switch to a non-coding position :)
I may be wrong here but my impression from this comment is that you _want_ to improve, have a sense of where you can improve, but you have not found an improvement plan that works for you.
I can relate to the frustration of seemingly not being able to move the needle for your skills. One thing that has helped me over the years is adopting more effective learning strategies.
I highly recommend the books "A Mind for Numbers" by barbara oakley and "5 elements of effective thinking" (don't remember the authors) for some ideas on how to deepen your knowledge (so that you don't just feel like you possess purely surface level knowledge).
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).
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.
Separate from that - it sounds like you need to decide whether this is really something you want to do professionally. Technology is a vast field, so even if you decide you don't feel good about being a software developer / programmer, that's not to say there isn't a place for you.
Finally, I'm reading between the lines that you are primarily self-taught. Perhaps what's really needed for you to reach a level of comfort is simply more education?
1) I've known several great programmers who didn't have formal education and that definitely exacerbated their impostor syndrome. Try to be easy on yourself; as others have said here, it takes time to build up your skillsets and it's super easy to compare yourself with someone who seems to know more.
2) Maybe you aren't on the team that could help you grow the most. It sounds like you can hammer out code that does the thing you want to do. Going beyond that is about judgement and patterns and processes and experiences. The right team can really help you grow those skills. Does your team do code review? Do they do pair programming [0]? Maybe some sort of mentor relationship would be helpful?
3) I generally find solutions are easier to understand when I've personally struggled with the problem they are trying to solve. Look at code for problems you are familiar with and try to figure out what patterns/OOP concepts are being used in the solution. When you can wrap your mind around the problem, you can learn more from solutions.
4) Do you have an interest in the people/product side of software development? If so, you could try to move into a neighboring field. I've got a notion that a strong technical background would make it easier for product/project managers to do their jobs.
5) You don't have to be the best; most of us aren't :) if you enjoy the work you are doing and your employer and team approves of your work, then maybe you shouldn't stress about it? Work to improve your skills for the fun of it :)
6) Maybe pick a single language and focus on getting great at it. Preferably one that enables you to work on a passion project. All else being equal, Javascript is probably one of the best good to haves.
[0] - I've been programming for more than half of my life and I've only come to really appreciate pair programming in the last year. As a way of sharing knowledge, it may be the best approach.
Good luck!
About CompSci, it might get a bit dry at times. Seduce yourself into it, watch some Computerphile YouTube videos instead of a textbook. Then when you get the interest bug, search for what you are interested in. Try to keep it fun.
Once you built stamina, TAOC and SICP.
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.
What you need now is a chance to apply this. Get a thing you know roughly about and make it your job. You will pick on it more quickly than most people would think. Use that time to do it properly. The things you will learn from this will help knowing how to do it properly in all the other wide things.
Key here is to get a mentor that will help guide you, show you how to do it properly, and show you how to judge what is and isn't proper. That experience usually widely translates.
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.
Many tech interviews are BS. You cross that bridge when you need to.
Also, there's a pandemic at hand, and that has an associated emotional cost that is not often accounted for. IME, it amplifies whatever fears you have.
Perhaps you've forgotten why you like to write software. Figuring that out might open a path forward.
But it depends on what you want. There are plenty of tech paths from where you are that don't require hard cs knowledge. You can lean into the people side, building teams. You can focus on wiring up big systems with flowcharts. Or you can imagine this a speedbump and keep going in the direction you know.
All kidding aside, it takes ten years to stop being awful. If you look at code you wrote a year ago and think it looks bad, that's a good sign. On the other hand, if you look at code you wrote a year ago and it seems about as reasonable as code you write today, maybe you're right. If you love tech, there's always devops, and if you're in the same boat there, you can try project management, or become an expert in some niche field. Or maybe tech's not for you. That's ok!
The key to becoming a "good" programmer is basically just continuing to do it and to ask yourself "why did I design this like this" every now and then.
I've been at it for like ten years now, and every two or so years I'll have an "aha" moment where something clicks.
So?
There is a wide spectrum of talent out there and you don't have to be in the top 1%, 10%, 50%, etc to be useful and successful.
My go to weed out question is 'write a function that, given a list of numbers, returns the min, max, median, and mean'. If you can do that, you'd have gotten an interview with me because I encountered so few who could just do that. People who had 'senior' titles at companies for years.
I don't mean study really hard, just learn any small new thing and over time you'll improve.
There's no rush and it's ok to be average. The fact that you say the "alternatives seem dreadful" means you are probably in the right career!
This is real talent. Don't underestimate it. Others can code like a superhero, but sound like a meathead when you talk to them (me often).
It might be helpful if you could share a few more details about your situation:
- Do you need to stick with programming in order to make enough money to survive and/or provide for your dependents?
- Is your current job at risk because of your programming skill level?
- Are there any other marketable skills you have outside of programming?
The most important skill in engineering is an honest ego-less judgment. If you can admit that what you come up with is might not be good, at least you're leaving yourself open to seeking help and advice, incorporating suggestions, and dropping your flawed approach as soon as you find a better one.
If possible try to focus on a single language. Build a lot of different little things to cover the breadth of the language. Find a job where you only need to contribute in that language. When you become proficient at that language (this can take years!), then you can pick up other languages much easier, and you should feel more confident in your knowledge.
I mean, why do you want to program? What do you get out of it? Which kinds of problems interest you?
One advice that I will give to you to become better is read. Read a lot of code from seasoned programmers, existing open source applications. You will understand patterns on how to approach problems. Talk to people about your design, build some opinions of your own (but dont hold onto them)
I will be happy to mentor if you want. Ping me on my twitter @namagg
> 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.
In what way is this a bad thing, and how specifically are your solutions "a complete mess?"
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.
The only reason I did well whiteboarding is that I spent months doing codewars.com bullshit to prepare for white boarding.
That's how people do well in these interviews- they game the system and optimize for the interview, not the job.
No, but seriously, you don't need to be a rock star dev. to succeed in the world of tech. Usually, it's when you're good enough in skill A, and good enough in skill B, and combine those, that you get some interesting opportunities.
If you like coding, just keep doing it.
You will struggle at some things, be better at others, be a total ignorant in others. That's fine, it's part of any complex job.
You can decide to expand your area of knowledge too. You feel you don't know basic OOP concepts then work on that.
That said, you could also pursue engineering adjacent paths. Things like project/product management, QA engineering, sales engineering, etc.
Do you think this impedes you in your career?
Do you feel bad about not being good enough at work?
Are you unable to follow pursuits which interest you?
Or do you just want to be better and smarter?
If the answer is "over half an hour a day", then maybe you need more focus (like just focusing on your strongest language/industry and dropping the others) or a more structured learning approach.
Stay humble! Stay curious! Keep going.
Also, who are you to judge that you're not good enough? As long as you are employed or employable that does in fact mean you're good enough.
Is there a single ladder ?
1. Get some perspective, and a community
It's important to have a realistic assessment of one's skills and goals, strengths and weaknesses. Especially important about things that one thinks one is "terrible" at, or that one thinks one is "great" at.
There are a lot of lenses through which to see one's own capabilities, and it is not uncommon for a person to be a consensus of one about themselves. Others may think a terrible person is great, and vice versa.
It's important to have conversations with other folks about these issues, to understand where one stands. If one does not have such a local trusted "community" in which to have these conversations, that is the most important thing to try to develop. How to do so is its own huge topic.
2. Get an assessment of safety/vulnerability
In the near term, being sufficiently skilled and ergonomic to a job is important, for obvious reasons. If there are specific concerns- which to be clear are more about "ergonomics" and nuanced compatibility, than some intrinsic binary good/bad system- that's an important conversation to have with deciders at the employer.
How to have these conversations is another big topic all on its own.
3. Get an understanding of the landscape
Developer isn't the only job in the world. It's not even the only good job.
Think of "developer" as a "translator" job- operating on a "border" translating from one community of humans to another of very quick but exceptionally stupid beings. There are many, many, many other "translator" jobs, both more and less "technical" than developer and more and less "domain specific" (whatever industry the job is in). If one is uncomfortable in one kind of translation role, there are many other kinds, many other trajectories.
OP mentions having wide knowledge of other "tech" topics- I would advise thinking about that as a skill and think of it from a "translator" perspective. What community does the person with those skills translate from, and who do they translate to, and what domains would they work in.
There's much more, but those are my top level thoughts:
1. Get some perspective and a community.
2. Get a sense of safety/vulnerability.
3. Get some understanding of the landscape.
The world is a BIG BIG place. Lots of things to do, ways to help and engage.
Best wishes.
I frequently observe that so many developers are experts, but they are experts in the way that my children are experts. They talk a big game to hear the sound of their own voice: Dunning-Kruger https://en.m.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effec...
This is evidenced on HN right now where the top thread on the front page is a security anti-theory with many clueless comments full of conjecture not based on any form of experienced security practice. Information security jobs require certification and education while software jobs only require passing an interview. That said it’s easy for any software developer to believe themselves to be a security expert when in reality actual security experts won’t have anything to do with them.
Worse still is that since this is all vapor with ego and self worth riding on it people quickly become hostile on any discussions of the subject. That completely brazen emotional insecurity isn’t something common to actual qualified professionals.
Finally, others will surely tell you if you're a horrible software engineer. If you're getting constructive feedback from peers you consider superior to yourself, that's a sign they see something positive in you (why would they invest in you otherwise).
TLDR; Classic imposter syndrome
EDIT: Unless you've purposely misspelled your handle here, please, please, please make sure your spelling is correct in your software. It drives me nuts to search on a term I know should be in the code and fail to find it because of a transposition or homophone error!
1. Focus. Acknowledge that you have surface level familiarity in many things, but that nobody can or should go deep in everything. Pick a language you're using professionally, and focus on that. If you don't currently have a job, try to pick something with broad applicability like Python or Golang. Also eliminate distractions: email popups, SMS, facebook, HN/reddit, Slack, all must go while you focus.
2. Study. Now that you have a language you want to build expertise on, study it methodically. Start an Anki[1] deck for it (and run through reviews daily) -- this is your tool to "try smarter". Get a set of beginner books from the library/amazon. Run through a codecademy or similar online course series. Make new Anki cards as you go. When you've finished a book, start working on the easiest online problems you can find online. Sort Leetcode[2] by acceptance rate -- many make the mistake of trying them in order, or by difficulty tag, and get frustrated when they hit a stumbling block. Learn from their failures. Once you solve a problem, review how others solved it and try to understand their code: did they use arrays or objects? did they use recursion? obscure syntax you need to look up? Which code base is cleaner, and easier to read?
3. Pace yourself. This is a marathon not a sprint. Improvement will be slow, and it will not feel good. If you have a job, I'd limit myself to 1 hour a day on professional improvement. If you're searching for work, I'd still limit myself to 4h daily. I try to spend about 10 minutes a day on Anki, just to retain what I've learned. People spend 4 years of their life on this stuff, after all.
4. Advanced study. As you advance beyond the material in step 2, look for conference talks at your level. Read through the official documentation. Start browsing StackOverflow or similar for your language tag[3]. Keep making Anki cards and reviewing them. Maybe pick up a CS textbook to shore up theoretical shortcomings and study 10 pages a day (textbooks tend to be denser reads than other reading material, so again, pace yourself.). Start with freshman undergrad stuff like Data Structures -- nearly universal in application and immediately useful. Or since you feel anxious about it, a book on OOP.
[1]: https://ankiweb.net/about [2]: https://leetcode.com [3]: Little known secret: the most viewed questions aren't the ones with the most votes, they're the ones that novices google the most. Top viewed question is like 'how to quit vim,' but those people don't vote up the question or answer. Unfortunately, SO doesn't make it easy to find the most viewed questions, presumably because cream skimming their 100 most viewed pages is an existential threat.