
Ask HN: How do you go from being an average software developer to a great one? - ValleyOfTheMtns
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&#x27;t realise you&#x27;re making.<p>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?<p>Things like this are a great source of concepts: http:&#x2F;&#x2F;programmer.97things.oreilly.com&#x2F;wiki&#x2F;index.php&#x2F;Contributions_Appearing_in_the_Book<p>But what are some ways to improve the practical skills of programming, to efficiently and effectively put together the nuts and bolts of software?
======
playing_colours
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.

------
danieltillett
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.

------
znt
For start, have a look at programmer competency matrix:
[http://sijinjoseph.com/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.

~~~
veddox
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 ;-)

------
BjoernKW
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.

------
dustinls
> 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.

~~~
ValleyOfTheMtns
> 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.

------
segmondy
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.

------
lewisjoe
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.

------
iqonik
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.

------
brobdingnagian
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.

------
pdiddy
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.

------
a3n
There's a Tshirt that you'll see around gyms: "Lift heavy shit."

------
gull
Attempt the impossible, often.

