Ask HN: As a programmer, how do you know if you're a good one or not?

182 points by dvnguyen ↗ HN
I always want to be a better version of myself, but it's unclear how to quantify my quality. In sporting, there're many stats about athletes to look at. In academia, you can look at some indirect indexes about your research quality. But as a programmer at work, I often receive feedbacks from 1 or 2 persons at most. It's easy to think that I'm good enough, when the truth may be not.

So, as a programmer, how do you quantify or estimate how good you are?

Thank you,

100 comments

[ 2.7 ms ] story [ 155 ms ] thread
Do you do any of the following things?

Start a project by "hitting the ground running" and writing code. Fail to write documentation unless under external pressure. Deeply aware of the powerful and superior features of your favorite languages. Have a considered view that long term systems maintenance irrelevant to most software design. Frequently roll performance optimizations in to your code.

If so, you are probably a bad programmer.

I agree on the other points. Can you elaborate on how "Deeply aware of the powerful and superior features of your favorite languages" makes one a bad programmer?

Not trying to be sardonic, just want to know how to improve my programming skills.

It is generally accepted that "right tool for the job" is a desirable philosophy.
If you are "Deeply aware of the powerful and superior features of your favorite languages", then you probably are too deeply caught up in language fanboy-ism to actually understand the merits and disadvantages of your favorite languages compared to the alternatives. (You're probably also being a jerk to people who aren't fans of your languages.)

They're tools. They're not rock bands. Don't get caught up in fanboy-ism.

1. read others code. think. ask questions. why and how certain code is written in certain way.

2. Read more code.

3. Write more code.

4. If your code which you wrote few years back looks bad to you, then you are on right path.

5. How much you understand the core concepts. New languages and frameworks are more of an glitter.

6. You want to be better version of yourself, then your progess is your stats you need look at. How many books did you read year on year? How much code you read year on year ? How much code you wrote ? How much fun you had :)

7. Adding, if you can think of the future maintainer of your code in mind and code, then you are lot better than many programmers out there in business.

8. Try to be a clean code enthusiast.

> 4. If your code which you wrote few years back looks bad to you, then you are on right path.

What if the recent stuff looks bad too? :)

Then why are you writing it?
if you able to differentiate this is bad from good, that by itself is a progress :)
Because you have a working, but ugly, solution to a problem and can't figure out a solution that does look good. Or because it's a trade-off: the thing you think would be better requires more work than you think the feature is worth. Maybe you want to tractor to make it more reusable, but decide it is unlikely to be reused, so not worth the effort.
Then you're normal?
Easy, I know I'm a bad one
If you know that, then you might be a pretty good one...
It comes back to:

"The only true wisdom is knowing that you know nothing"

Problem is - hubris is generally considered a virtue.

The more experience I get, the more I realize that I'm pretty average.
I just purchased a coffee mug that says “World’s Okayest Developer” so I’m right there with you.

In all seriousness, though: I’ve learned that it’s better to just accept that sometimes you’ll do really good or exceptional work, sometimes you’ll do awful work, and most of the time you’ll do work that’s pretty good and gets the job done but isn’t perfect.

I consider myself okayest because I can fix the stuff I break or improve something I did months ago. Believe it or not, a lot of people I have worked with can’t.
Every once in a while you need a signal flare, but most of the time what’s required is a lightbulb.
I knew I wasn't very good when I worked as a programmer. I based that on watching others, and how often I could figure out problems without asking for help. I could see I was waaaaaayyy behind even the newest people around me. That was a long time ago, I'm still in IT, but not a coder now. I do ok with the basics still, but I ask for help all the time.
Does my code still make sense to me 6 months later?

Did I introduce new bugs?

Are people using my building blocks to add features or working around them/ redoing them?

These are not good metrics. I have researched this and it seems there is no good way to measure coding improvement except subjective measurements.

Depends on how you measure it, if you gave me a programming test that measured how much i knew and if i knew the intricacies of a language and memorised the manual, while also testing me on computer science questions that only get talked about in universities, then i'd probably perform poorly.

However, i'm a get shit done developer, while i've been doing this 14 years and know my area very well, i dont know it nearly as well as someone who has rigorously studied it and has been doing it for only 3-5 years. What i can do is deliver, and thats whats valuable to businesses.

So, is "good" an academic measurement or a business one? Its all context.

If you can manage to stay interested in what you're doing, you're going to learn and improve over time.

If you lose the passion, and get bored with what you do, you're not going to care, and that's a worse fate than even staying still skill-wise. It's a very common fate for those who have to work at this 8 (or likely more) hours a day, nearly every day of the week for years or decades.

So I'd just try to keep the flame alive, focus on always doing what you genuinely enjoy, and not sweat the rest.

How do you define "good" and "quality"? This is the difficulty in measuring skill or productivity in this kind of work. Is it the number of uncaught bugs that have been released? How well what you produced matches with what the askers (product mgrs, customers, etc.) asked for? How much test coverage you have?

As others have suggested, it's useful to look at code that you wrote 3, 6, 12 months ago and ask yourself: do I understand this? Could I write it better now? What would I do differently now? You might try keeping track of these reflections in a journal.

If someone pays you a lot of money to program and are happy with the results.
That might mean you are a good negotiator and salesman.
I put in the work. I once heard a very good fencer say that the way they keep calm during competitions is to tell themselves that they've put in the hours of training and the blood, sweat and tears necessary to win. I spend hours of my days writing code, reading about how to become a better programmer, constantly analyzing my work and finding ways to improve. I'm not going to spend my time worrying about whether I'm a good programmer. I will be a good programmer.
Hours of deliberate practice is said to be the deciding factor in how good you are. Or at least, we can't be good without it. So yes, counting the hours we spent writing and analyzing code gives us an idea of how good we might be as programmers.
This is a very complicated thing to answer concisely, but I'll take a stab at it from a product development perspective.

You know you're a good programmer if the things you build "just work." It should be near impossible to find flaws in your solutions. This is actually rare. Most developers I've worked with will declare something "done" well before all of the flaws have been worked out.

> It should be near impossible to find flaws in your solutions.

The number of open issues in most OSS repos would make me hold my tongue before saying something so farfetched.

You know you're a good programmer if the things you build "just work."

How do you quantify, "just works?" For a large enough project, perfection, or even just getting pretty close to it, ends up being pretty expensive.

It should be near impossible to find flaws in your solutions.

I had a boss who declared he could find a bug in any page of code, so long as you let him lawyer the specs in great enough detail. Granted, we were working in a pretty complex domain, but as far as I could see, he was always right about that.

As Matt Easton keeps saying: "Context!"

Maybe the company you're working for finds it much more valuable to do lots of iterations so they can tinker with the product and keep refining it. In that case, it might be even better than "perfection" if the things you build mostly work, but that you can respond to change and bugfix requests quickly. (Without introducing regressions.)

I've used, worked on, and depended on an enormous amount of software and I have literally never seen such a thing.
If people are explaining stuff to you all the time, you're the dumbest guy in the room.

If you're explaining stuff to people, you're the smartest guy in the room, and you should find a place to work where you're the dumbest guy in the room.

My favorite definition of a “good” programmer is someone who ships! Done is better than perfect. Knowing what compromises to make in order to ship without creating a future nightmare.
Yeah I agree with this, finding balance between risk and productivity. Although doing something beautiful is the exception.
Oh my gosh, no. That might be a "good" software developer, but I'd probably think not on that, too.

I've had to follow behind such programmers who wrote their code with the primary goal of getting done as fast as possible never expecting to have to come back to it. It's literally the worst code that exists.

Usually they no longer work at the same place they created such code, because later they were asked to maintain it. That's why I got the job. Usually we start over.

The majority of software developers are payed to ship product to a deadline. It should meet the requirements of your customers and be thoroughly tested. There are always trade offs but the biggest impediment to shipping is the procrastinator or the perfectionist.

If you miss deadlines then you are failing at your job.

"...the biggest impediment to shipping is the procrastinator or the perfectionist."

I don't necessarily think that it's the "biggest" but I'll agree it's certainly one of the problems. I think I'd put "unclear specifications" as the biggest problem.

I've seen a lot of code delivered on time to meet the deadline that clearly was not ready but was delivered anyway. I've never the temerity to say, "I told you so," but I thought it. There's a balance to be had. Sometimes the deadline and the customer requirements and future maintainability cannot all be satisfied. Something has to give.

> Knowing what compromises to make in order to ship without creating a future nightmare.

Sounds like they were bad at that part

Try leetcode the hard ones
I find as I get more experience I realize my limitations as a programmer so I can predict much further out where I'll run into trouble. It usually ends up being avoiding bad architectural choices, avoiding bad abstractions, avoiding introducing bugs into code that works. It's easy to spot a bad programmer, I find that a lot of the time a good programmer will be known for their faults in other areas (ie. Bad communicator) but people take their skill for granted. And then there's the rare programmer who can solve things that others can't understand. There's way more bad programmers than star ones, but my guess is a lot of people here fall into the good not great category unless their track record is exceptional. A lot of people try and fail early, much like companies, so if you've been in the game for a while it's a good indication.
Programming is an open ended non competitive (generally) activity. I don't think there is any meaning in trying to quantify "goodness" and in fact might blind you to possibilities.

So, for myself, the thing I pay attention to is my ease of expressing the things I want to create. I also pay attention to my ability to produce things with certain "qualities" correctness, simplicity, and how modular and composable my code is. There is no objective measure of those things and my understanding of those things constantly expands. I learn these things through by my own experience and looking at what other people are doing and having in depth discussions about programming ( and outside of programming ).

So I have no idea how good I am, but I have confidence in what things I can create and confidence in my ability to learn more.

This can only be answered with context.

Someone may or may not be a good programmer depending on a whole bunch of factors, the project being built, their familiarity with the codebase, familiarity with the technologies used, how happy they feel in their job, how happy in their personal life, if they really like the project they are working on, whether they get time/space to concentrate. It goes on and on.

There's no answer to "is person X a good programmer" within context and even then it's purely subjective.

You're asking the wrong question. You should be asking "Am I an efficient or effective programmer?"

  Do I get things in on time / under budget?
  Do I avoid common programming pitfalls?
  Do I solve more problems than I create?
  Do I see simple solutions to complex problems?
  Can I refactor terrible code to more easily maintained code?
  Can I avoid terribly written code in the first place?
  Can I effectively communicate with people in order to get the answers I need without wasting their time with needless questions?
Then you know you're effective when:

  You're asked for help often.
  You're the go to person by the boss.
  You're often asked for your opinion for engineering decisions.
  Your opinion holds weight with others.
This is the correct answer
No, it just means your boss likes you.
Disagree, I was the not in the "in crowd" with my boss at a previous location and yet I was the person (as suggested) in regards to everything backend related.
> You're asked for help often.

Could also mean you write unreadable code and, by extension, unmaintainable code.

> You're the go to person by the boss.

Could also mean you write unreadable code.

> Could also mean you write unreadable code and, by extension, unmaintainable code.

In this situation, I think the context is when a colleague is asking for help with their own code/writing a new feature and wants input from someone well-versed.

I agree, this is the situation in which OP has considered.

However, depending on the stage of the project, getting asked for help may be a red flag for me.

If it occurs too often, it can mean the following: - incompetent co-workers - someone did a terrible job documenting - modules, packages, functions, etc. do not provide a good abstraction layer for the task(s) they perform

... and as in everything, don't trust your own instinct on this; work closely with others to get a true sense of where you stand.
"Am I an affective programmer?"

    Does my code make people feel good?
    Does it automate some user task?
    Does it make some user task easier?
    Does it amplify users' powers?
    Does it create value, by my definition of "valuable"?
Of course, these are outcomes/benefits, not the technical role of programming within an organization. But apt if you see yourself, fellow programmers and company members as "users" also.

> I read a study that measured the efficiency of locomotion for various species on the planet. The condor used the least energy to move a kilometer. And, humans came in with a rather unimpressive showing, about a third of the way down the list. It was not too proud a showing for the crown of creation. So, that didn’t look so good. But, then somebody at Scientific American had the insight to test the efficiency of locomotion for a man on a bicycle. And, a man on a bicycle, a human on a bicycle, blew the condor away, completely off the top of the charts. https://www.brainpickings.org/2011/12/21/steve-jobs-bicycle-... https://youtube.com/watch?v=0lvMgMrNDlg

> ... There need be no real danger of it ever becoming a drudge, for any processes that are quite mechanical may be turned over to the machine itself. https://wikiquote.org/wiki/Alan_Turing

Wow, this is such an eye opener. I have always considered myself an ok programmer, but always struggling with trying to be effective.

Your four points on effectiveness happen to me on a daily basis, but I tend to see them as annoyances, mind you, I rarely refuse to help and advice. This gives a whole new light and meaning to all those interruptions.

Developers can often be "force-multipliers" even if they don't see it themselves. Yes there's the 10x developer that can get 10x done than the average person.

But there's also the 10x dev that can help others be 10x more effective. Those types see a problem, and write an insanely useful tool.

Also, welcome to thinking like a manager.

Aside from the first question (may first 2 questions), the top questions are arguably more qualitative than quantitative.

> Do I solve more problems than I create?

Who judges what constitutes a problem? How do you know when you've created a problem?

> Do I see simple solutions to complex problems?

Define 'simple'.

> Can I refactor terrible code to more easily maintained code?

Define 'terrible'. How does one know what code is more easily maintained?

> Can I avoid terribly written code in the first place?

See above.

> Can I effectively communicate with people in order to get the answers I need without wasting their time with needless questions?

What constitutes "effective" communication? What are "needless" questions?

I generally agree with the questions, but I would imagine most programmers could read them and think, "I must be pretty effective."

> Aside from the first question (may first 2 questions), the top questions are arguably more qualitative than quantitative.

What's wrong with that?

OP specifically asked for quantitative metrics.

> So, as a programmer, how do you quantify or estimate how good you are?

And I said he was asking the wrong question.
The problem with measuring effective is that it is quite subjective. Politics can skew those results.
That's a skill like any other. If you're conspicuously bad at politics it can make you ineffective - you or your work will be sidelined or abandoned.
One of my gotos has been 'Can I avoid writing code in the first place?'

Zero code has zero bugs, and zero maintenance cost.

A great programmer is like a peaceful master samurai, he first tries all other options before resorting to violence (code) he may also reduce violence (code) where ever he goes ...
You're compensated better than your peers, and there's no extenuating circumstances surrounding that.
Somewhere I read a measure of intelligence is: the ability to achieve your objectives efficiently. You could say the same about coding. Are you achieving your coding objectives efficiently?
> But as a programmer at work, I often receive feedbacks from 1 or 2 persons at most

Oof, yeah, that's rough. It's hard to say something conclusive with little data, and most of the data is likely biased (yourself). I'd recommend finding opportunities to work with other devs. Open source is a good path forward.

Otherwise, estimating your performance is super hard. Are you right more often than you're wrong? When you're wrong, do you consistently fix your flaws? Are you learning? Are you contributing more and more business value? These are all very opaque questions, and even if you answer all of them you're likely to have gaps.

Get more data!

If your employer is happy with your performance then you are probably "good enough" as you say.

However if you truly do always want to be improving your ability as a software engineer, then you are in luck, this field is so vast and deep that you can easily spend more than a lifetime improving! Finding out how and measuring it is another matter.

When you maintain a piece of code, that only you have written, for a couple of years, and making changes to it is as easy as the first day, then you're a good programmer.

If every change to the code feels like adding another twist to the maze, then you're not a good programmer.