What makes a good developer?
I asked this question over on HN but I thought I would ask it here as well.
A little context. I'm currently a junior in a middle of the road state university studying for a degree in software engineering. I have been doing a lot of reading - whether it be comments on Reddit, articles, etc - and it appears that there is an abundance of junior developers looking to enter the job market, but very few "good developers".
My question is, what is it that sets someone apart as a good developer? I know this question is very vague but it's also very vague whenever I see it used.
Thank you for your time.
EDIT: I plan on going through and reading all of your input and responding! Thank you so much for your time. Unfortunately, I am stuck finishing up last minute school work. Can't wait to dig into this.
Communication. Whether written or verbal, most every big error is due to poor communication. Customer to Developer. Developer to Customer. Developer to Developer. Etc. Be explicit. Be detailed. Don't make assumptions about the other's knowledge or understanding, verify. Get someone to read a document you write to find sources of misunderstanding. Get written agreement that your document is accurate (but understand that it means nothing, you'll still have to make changes.)
Along with communication, I would argue curiosity and passion. I think it's good to have a drive to learn more and have fun. It's way more fun to work with people that have fun or that like what they are doing. When you start, you don't know everything, but then you work with other people, they show you what they learn and you show them what you learn. That makes everyone grow and become better.
This likely is not the audience for this speach, but here we go anyways. Software development is not magic. It's just like anything else; it's something you learn how to do and then apply a lot of hard work.
Imposter syndrome is really common in this field. And if you look at what kind of projects new programmers come up with, it's pretty easy to see why; most often they use a bunch of frameworks and purpose-built libraries with just a little bit of glue holding it together. But here's the thing; everyone's first projects are like this. In the dawn of personal computing, new programmers would write their own versions of common utilities that do such extremely simple tasks they couldn't get anyone else to use them. So know this; if you wrote any program and it does everything you intended it to do, then you are a software developer.
With that being said, the most important thing for any software developer is the same thing needed for any profession; motivation. It is the one thing absolutely required. If you give up after your compiler throws up an error, you can't be a developer. It's as simple as that.
I'll even go one step further; you need an internal motivation. There is only so much work you can muster over things like raises and recognition, but knowing you will finish this project because you have pride in your work can take you all the way.
Something I can appreciate now, having worked for 10 years, that I couldn't when I was in your shoes, is how bad most people are at interviewing others. It really is a skill and a lot of the people you'll sit an interview room with aren't good at it. You could get yourself a job purely by actively answering more interesting questions than the ones they are asking. And if they are so fickle that they fight you on this, then know that is a person too stubborn to work with / who recognize good sense when they hear it.
Preamble out of the way, way makes a good programmer?
Those are really the three skills that matter. Everything else can be taught, but those three things you have to possess yourself to be of any value. So, on to the programming interview. A favorite question of mine is "Write a function which returns a count of all quoted strings in a block of input." I care about exactly one thing when I ask this question: Do you build a state machine; yes or no. If you build a state machine and don't realize it, you're a marginal programmer. If you build a state machine and know it, you're a good programmer. If you don't even build a state machine, or anything that can become a state machine, you're hopeless and I won't hire you.
The rest of the programming interview, outside of that one question, will be me figuring out how you react to feedback, how you handle stress (everyone is stressed in coding interviews, even me; regardless of whether I'm the interviewer or the interviewee), how you talk about your code (do you understand what you are doing and why, or do you just spout smart sounding BS?), etc. I'm more interested in what you can be taught to do and how hard that will be rather than what you are right this second.
As for curiosity and general interest: if you give me a programmer whose hobbies are golf and gardening, and another whose interests are writing their own neural nets just to understand how they work, I'll be far more interested in the neural net guy unless the golf guy just happens to simulate something about his golf game or automates watering his plants with an Arduino or similar item. The person I am the least interested in is the person who leaves work and doesn't want to touch a computer. This person may be a fine employee, but they'll never be an exceptional one. The base interest just isn't there. They are doing something they have to do, not something they want to do.
Neural Networks and AI are things you should 100% study. Understand how they work, do something with them. For example, write something that can identify all fish in a collection of photos, or something like that, and write as much yourself as possible, rather than re-using frameworks, so that you can say you understand how it works, rather than just manage to bolt it all together.