When I first started as a software developer, I remember looking enviously at my peers, amazed at how quickly they could grasp difficult concepts and eloquently solve problems in hours that would take me weeks. I imagined that their knowledge and expertise was a function of some innate genius that I did not, and never would possess.

It turns out, I could not have been more wrong.

Sure, some of the developers I worked with were blindingly intelligent and to this day astound me with their abilities. However, after years of diligent effort, countless questions, and more trips to Google than I care to count, I found myself able to keep up with those same people who had wowed and intimidated me years before.

What I discovered along my own journey, and subsequently by watching the growth of many other bright people, was that with enough effort, the right mindset, and the willingness and patience to learn, anyone can grow into highly competent developer.

Of course, that doesn’t mean it will be easy. Many bright young programmers never live up to their potential and continue to make the same mistakes year after year. Not because they aren’t smart enough but because they haven’t established the habits necessary to learn from their mistakes and develop their skills.

The following seven habits are intended to help junior developers become more effective and avoid the traps that many others have fallen into.

1. Learn VoraciouslyNothing is more key to your success than the ability to learn, and learn quickly. As a developer, you’ll be tasked with learning on a daily basis. Like a shark who must swim or perish, you too must continue to gain knowledge or otherwise lose relevance. Don’t be afraid to take the time to dig in and understand your domain thoroughly. Read books on coding, follow tutorials, watch videos, and spend your time gobbling up information.

Even after years of learning, I still start each project by reviewing books, tutorials, and documentation for technologies I know I’ll be using. It’s amazing how many times a day spent reading has resulted in weeks (or even months) of increased efficiency.

2. Ask Great QuestionsWhen I was starting out, my daily routine was fairly simple. Start asking questions to one of the senior developers, then the next, then the next, and finally move back to the first one. I’d repeat this glorious cycle, day after day, until finally I found my ability to accomplish my tasks unassisted had greatly improved. I might have gone a little overboard with my questions, (sorry!) but after spending a little time being stuck on a problem, getting help is without a doubt the fastest way to learn.

Don’t be afraid to ask questions. I’ve yet to work with a good programmer who wouldn’t happily take the time to explain a new concept or pair on a gnarly bug.

It’s also worth mentioning that upping your Google-foo will pay off a million times over.

3. Clean Code MattersA good developer cares about the quality of their code. Learn to follow the conventions of the codebase, practice clear naming practices, document the why, and use a code linter. If you want to get really crazy, do like one Presence developer and stack all of your colons.

Start obsessing about the quality, readability, and documentation of your code now and your coworkers (and future self) will thank you.

4. Fail Often — Fail WellDevelopment is as much about failure as it is success. You’ll face bugs that take days, architectures that don’t work, systems that don’t scale, and ideas that never catch on. The fact is, you’re going to fail… a lot. It’s cool, we all do. I’m convinced the pain threshold of a good developer is vastly greater than the rest of society. Don’t let annoying bugs, badly documented code, or failed attempts overwhelm you. We’ve all been there.

It’s not important that you succeed on your first go, just that you learn from your mistakes and keep on trying.

5. Tackle Bite-size ProblemsOne of the big mistakes I see a lot of new developers make is taking on too much at once. Just like you wouldn’t eat a whole cake in one big bite, you also shouldn’t attempt to solve all of the problems in the first version your code. Whenever a good developer is faced with a big challenging problem, they should choose the smallest bit they can prove to work and just solve that. Once that’s done, move on to the next chunk and the next after that. Finally, with each part provably solved, you can mold all of the pieces of code into one beautiful whole.

6. Build ThingsBuild things constantly. It’s not enough to just do what you’re tasked with at work. Being really good at development requires passion. You shouldn’t spend all of your time programming. However, building things outside of work will set you apart, allow you to explore new technologies and ideas, and it can be a lot of fun. The best programmers I know have side projects they are passionate about.

If you want a cool project to get started with, consider building something that solves a personal problem you have. It doesn’t have to be marketable or used by lots of people to be valuable. As long as you’re excited about it, it’s worth while. Another approach is to find an open source project you like and start contributing code. Many of these projects have started marking certain tasks specifically for new contributors.

7. Soft Skills MatterAs with all other areas, being good with people will make you a better and more successful developer. Building products is a team sport and your ability to communicate and get along with product people, designers, and other developers is key to the success of your project. Investing in better communication skills is just as important as investing in your programming skills.

Practice your social skills by participating in meetups, giving a talk on a technology you like, organizing an event, or just generally being social.

The path of a junior developer is not an easy one but it is highly rewarding. There is light at the end of that tunnel. Nobody starts out great at something but with enough time, energy, and focus, I’m certain you will succeed.