I've worked with a lot of developers, many good, some great, and a few exceptional. Developers that shine all share similar traits and those traits are often not directly related to code.
Exceptional Ability to Learn New Skills Quickly
Self-learning is an integral skill for all developers. Developers need to keep up with the ever-changing landscape just to stay relevant with new technologies being introduced at an increasing rate. Great developers master the skill of self-learning, they are embedded in online communities and intuitively know where to look for new information and understand how to most effectively use the tools available to them.
Exceptional developers typically don't just learn because their jobs demand it, often they learn purely because it drives them; discovering new techniques and applying them to your own projects can be really rewarding.
Learning new techniques, approaches, and methodologies, helps build a web of knowledge which you can call on to solve problems in the future. The more knowledge you have to pull from the more effective you'll be able to solve new or even old challenges.
If you're looking to improve your skills I recommend learning a new language or even just a new framework or methodology using the languages you already know. Learning new languages and frameworks is a really great way of improving your skills because it explodes your world view. Often communities will have best practices that are specific to a framework that leaves you packed in a box, while this isn't necessarily bad it's always good to have more tools available.
Wide Range of Knowledge
Development can be intimidating, there's a lot to learn, I'm probably biased but I think this is especially true for web development. If you want to become really valuable it's important that you step outside your comfort zone as often as you can. Learning more about http, dev-ops, scripting, memory allocation, database performance, etc. are all areas that don't necessarily make you a better Ruby on Rails developer but will definitely make you a more valuable employee or contractor. In the years I've been a developer I have seen a shift from highly specialized frontend, backend, dev-ops developers to much more generalized developers. Full-stack was a buzz word for a while for good reason, a lot of start-ups and small established companies need developers that can switch roles a lot. Being able to do many tasks is really cost effective, especially so for early-stage-startups and agencies as they need the flexibility.
Having a wide range of knowledge can also give you a much better understanding on the full system you're working with which gives you an advantage when it comes to planning and debugging. You'll be able to identify potential weaknesses and strength in the systems you are using and will be able to choose the right strategy more easily. You will also get hunches on the source of a bug when you know the system inside out.
One thing that has helped me gain a wider knowledge base is to look into and even contribute to open source code. Understanding your dependencies is a great way to broaden your skillset, you'll see what tools your dependencies use and often you'll find shims and workarounds for the systems they run on too.
Communication In All Forms
A major key area that a lot of developers struggle with is communication skills. It's important that a developer can communicate on a variety of levels. Your message needs to be delivered in the right format. If I'm talking to a client I'm not going to give them low level insights into the logic for a feature, that's not what they need, they need a high level overview at most. Often they won't even need that, they just need some designs to look at so you can talk them through what happens when a user clicks on pay now. When talking through that same feature with the project manager I might go into more detail, and also discuss potential blockers and challenges. Further still, if I talk to a developer I will go into technical detail on how the feature is implemented.
Communication isn't just about presenting information for different levels of understanding either though. You also need to remember to be professional. I value professionalism a lot, I think it's key to building strong relationships with your clients, it's not about putting up a smoke screen, you need to be transparent while also maintaining a level of professionalism that keeps the conversation focused and framed in a production direction. Professionalism in conversation helps build a framework for effective communication, work flows, and delivery.
Communication isn't an easy thing to develop, I had to learn the hard way through years of freelancing, I didn't have a team of people to guide me. There are plenty of blogs discussing techniques to improve your communication skills so I would recommend you do some googling if you're interested. There are things I still struggle with, for example not talking slow enough, especially when discussing technical problems. Technical problems take time to digest so it's important to give the listener time to process the information and ask questions before you move to the next sentence.
Also remember that a lot of communication is not speech but instead listening, watching, and otherwise being aware of your audience.
Big Picture And Small Picture Thinker
If you can master this art you'll be ahead of a lot of people. It's not easy to think about the big and the small picture, especially not at the same time. By definition it's context switching but it's also switching into a context that a lot of developers rarely need to consider.
What do I mean by big picture and small picture? It's actually not this black and white, there's no real line between what is the small or big picture. There's big pictures in the small picture and small pictures in the big picture. What I really mean is looking at a problem or feature from different perspectives. Typically as developers we only really look at the small picture; how should I implement this feature? Maybe a little larger; how does this logic fit into the application as a whole? The real big pictures are questions like:
Is this feature really valuable to the customers? Is it cost effective to build a full CMS when we really only want to switch out the hero image each month? Should we really build this ourselves when we can pay this 3rd party service?
It might seem like you don't really need to do this as a developer but in practice you'll find that being the developer often means you are more knowledgeable than your client in areas other than programming. Your clients might not know the answers to these questions and if you care about delivering the best solution for you client's needs then it's a really valuable and appreciated skill to possess.
I've found that people who freelanced or ran their own products typically are much better at thinking this way because they've been forced to practice. When it's your livelihood on the line it forces a clarity, however, you can definitely improve in this area just by being conscious to think about it when discussing challenges. Ask your clients the 5 whys (not necessarily 5 but just dig a bit deeper to really understand their reasoning) and see if you can help uncover alternative solutions that they may not have found.
Ability To Critique And Be Critiqued Well
One of the most valuable things you can do for your own improvement is to actively seek criticism for your code and approaches. You need to be able to take the things people will say about your code. Often other developers will say things that feel mean, even when they have the best intentions. Our egos can be fragile but you can learn to break out of this mindset. If things feel harsh remember to step back and remember everyones code sucks at some point. In fact, your old code sucks, go read it. Everyone's does because it's much harder to read code than to write it. Over your career you'll have many occasions where you see "subpar" code and wonder who would write that only to find it was you. Shock horror!
One of the best ways to thicken your skin is to give other developers feedback and try to word it in a friendly constructive way yourself. You'll realize that it's not easy. This realization can help you to frame feedback on your own work in a more positive way.
Team Player
Learning to work well with others is a skill that can be cultivated. Programmers nearly always work in teams. Great team members aren't just there to code, they are actively contributing to the success of the team as a whole. They are looking for issues within the workflow, ways to improve communication, and ways to increase productivity.
It's important to cultivate a relationship within a team, as a team member it's also your responsibility to contribute towards becoming an effective group. Companies can help this process by introducing team events and encouraging team celebrations, however, there are other things you can do too.
Sharing knowledge with team members is a great way to build relationships and also drives productivity.
Helping other team members not only releases them from their problem, it also gives you an opportunity to explore code that you might not have seen before. You teammate will have already internalized the code and will therefore be able to give you the rundown quickly. This gives you a unique opportunity to gain insight into code while not needing to spend hours building the mental map yourself.
Where to Work To Improve Your Own Skillset?
I believe there are a few great routes to becoming an excellent programmer. One route is to become a freelancer, this will rapidly improve your soft skills, especially your client facing skills. In my opinion a better route is to join a great development agency. Places like OOZOU are great for absorbing information while also having freedom and guidance to practice other skills. With the right company you'll be able to accept as much responsibility as you like and will be able to give you a lot of room to grow into areas that might otherwise be inaccessible for you. This isn't intended to be an advert but I can highly recommend OOZOU, why not check out our careers page to see how you can fit in?