Ask HN: How do you go from being an average software developer to a great one?
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 ] threadDunning-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.
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.
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.
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.
Turns out, I'm somewhere between "n^2" and "n" skillwise. Encouraging, but there's still some optimization to do ;-)
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.
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.