Ask HN: How do you go from being an average software developer to a great one?

11 points by ValleyOfTheMtns ↗ HN
Practice, practice, practice of course is part of it, but that can only take you so far if you keep making the same mistakes you don't realise you're making.

What else can one do to improve their skills in programming? What are some key resources that everyone in this field should be exposed to?

Things like this are a great source of concepts: http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book

But what are some ways to improve the practical skills of programming, to efficiently and effectively put together the nuts and bolts of software?

14 comments

[ 5.0 ms ] story [ 41.1 ms ] thread
In one sense you can't, but in another you can. It is like asking how can I go from being an average 100m runner to being as fast as Usain Bolt. You basically can't, however, you can get a lot better and be faster than 99% of people. Rather than worrying about being a great developer worry about being the best you can. If it turns out that this is still not great then oh well, but at least you can't blame yourself for not trying.
Please do not compare yourself to other people, famous top developers. There may be a pace and limit to grow for every of us, set by nature, background etc. It will not motivate you, moreover you don't know the price those people paid for being exceptional. Try to compare yourself today with yourself yesterday. Learn, build something. Apply the idea of deliberate practice - choose projects, jobs that are close to your limit, those that will make you struggle and learn more. Try to work with smarter people, pick their knowledge, good habits.
> but that can only take you so far if you keep making the same mistakes you don't realise you're making.

Dunning-Kruger effect comes to mind. If you are confident enough you dismiss the possibility of being wrong and more importantly, the value of seeking alternative solutions to problems you may solve commonly.

So always be open to the fact that however you solve a problem, it can always be done better, and try to make time to improve on your approach. Sometimes you will find a better way, sometimes you won't.

> What else can one do to improve their skills in programming?

Explore different programming languages and programming paradigms. Don't ever hesitate to step outside your comfort zone. Adopt the view that programming languages are a toolbox, some performing one task better than the other, rather than each being general purpose / one size fits all.

> Explore different programming languages and programming paradigms.

Funny you should mention that. I just started the Learn You a Haskell series. My first exposure to a purely functional language. Before that I've only had little bits of exposure to things like Java, C, C++, and more recently a whole bunch of Python.

Hang around with really smart developers. The quantity & quality of your learning is directly proportional to the number of smart programmers you've got around you.

This is a gaurenteed way of getting from good to great. This works even when you don't make a conscious effort to learn.

The question is how will you get around smart people. Well, you might go join a company where you believe smart people are. You might want to contribute to interesting open source projects. You might just barge into your local tech meetup and say Hi. Whatever it is, make sure you are surrounded with smart people. It has always worked and will.

My process: keep a bug journal. If I hit the same bug I hit three months ago and go through the same research to fix it, then I know I am not progressing. Ideally through this process I will learn what it is that I don't know and then learn it.
Work with people smarter than you. If you're the smartest, move on. The people to the side of me are a better resource than Stack Overflow etc. put together and I owe a great deal to them.
For start, have a look at programmer competency matrix: http://sijinjoseph.com/programmer-competency-matrix/

If you don't have access to "smarter" peers as others have said, reading source code of successful open source projects may also be helpful.

A very interesting link - I've been looking for something like that. Thanks for sharing!

Turns out, I'm somewhere between "n^2" and "n" skillwise. Encouraging, but there's still some optimization to do ;-)

It's very easy. By being a boring developer! You get boring by not leaving things up to chance, but by having a strict set of process and guidelines you follow.

What exactly is a great software developer? For the sake of this discussion, let's say a great software developer is one that knows how to finish a project. Have the finished project working "correctly". Have the finished project is a decent shape where future maintenance and understandability is reasonable easy.

1) How do you finish a project? By understanding that you live in a world of constraint, you have a limited amount of time, knowledge, money, etc. So you must place a limit on the features/scope of the project. You must understand what you are trying to build, what are the least more important amount of features that will deliver value and work on those. Folks usually call that building an MVP. Being a good listener, able to empathize with your users helps a lot here.

2) How do you know that your finished project works "correctly" You get feedback from your userbase as you develop, you have Unit tests. You abstract the problem in a way that is so easy to reason about logically. You have a strict acceptance of what it means to work correctly.

3) How do you make sure that your project is easy to maintain and understand? You follow good software engineering development guidelines. You name things well, you organize your code/source file correctly. Your code is self documenting. You use the correct tools for the job. You avoid "clever/shorthand/magic" code. You anticipate how your code will change in the future and code in such a way that it is malleable.

This means you have a strict process/checklist that you live and die by. You will feel almost like a robot more than an artist. This is "boring." But I personally this is what separates an average software developer to a great one.

To know the right tool, and process, means you have to constantly study. Have a well balanced approach to the SE field, don't just study programming languages and frameworks, study design, study the business side of things, study your tools.

There's a Tshirt that you'll see around gyms: "Lift heavy shit."
Attempt the impossible, often.
According to the way the vast majority of companies conduct job interviews it's easy: memorize every data structure and every algorithm and practice them every day. Don't be creative, be a drone that loves rote-rehearsal and memorizes textbooks.
On the technical side of things learning a different, not-so-mainstream programming paradigm (like functional or declarative) will broaden your perspective and allow you to tackle problems differently (pretty much as learning a foreign language also gives you insight into another culture).

In general I'd say that working with other developers is the best way to improve your skills. Ideally, some of those developers would be more experienced than you (so you can learn from them), and some of them would be less experienced so you can teach them (because teaching and communicating about code leads to a better understanding for the teacher as well).

If your environment doesn't reflect this ideal you might consider contributing to a larger open source project.

What sets apart great developers from average ones isn't technical knowledge or programming skills but communication skills and an understanding of user requirements. Most software development really is about communicating and properly understanding requirements.

Learning about design and business can also make you a better developer because it'll provide you with a more comprehensive view of the things you're creating.