What distinguishes great programmers from good ones? Itâs a question Iâve been wrestling with since I began learning to program.
Iâve written previously about the skills and knowledge great programmers have. Now Iâm looking at the traits they possess. They seem to do things differently than the rest, and the results show.
This blog post focuses on two traits that have surfaced from my study of great programmers whom Iâve paired with, read about, and researched. There areâwithout a doubtâtwo commonalities among them: be consistent and be persistent.
Fortunately, we can develop and incorporate these two important traits into our own work as programmers.
1. Be Consistent
Programming isnât something great programmers do once in a while. Nor is it something they do nine-to-five during the week.
Rather, they have a regular cadence for improving their knowledge and skills on their own time: before or after work and on the weekends.
One programmer I know spends the first two hours each dayâsix days per weekâon personal learning projects or problems. Itâs time spent on topics he wants to learn or skills he wants to refine. He gets his personal programming in before work starts and obligations of daily life begin.
Itâs not to say that theyâre programming around the clock. Theyâre like the rest of us and have other commitments and interests. But theyâre consistent: great programmers make getting better a habit.
Whatâs Your Programming Mileage?
The question is: how can you be consistent? Itâs something a lot of us struggle to achieve. The solution, Iâve found, is twofold.
First, identify the number of hours you can realistically program each week. This number is your weekly âprogramming mileage.â
As a former long-distance runner, I had a certain number of miles I ran each week. This was my weekly running mileage. Now I have my programming mileage: this is the number of hours I spend each week programming.
Most people neglect this step. They jump straight into the project they want to complete or the topic they want to learn, without considering where the time will come from. They go full-board, pulling all-nighters or sixteen-hour days.
Thereâs a problem with this approach: itâs not sustainable for the long-term. Sharpening your skills as a programmer isnât something you do for an intense week or two. Instead itâs something youâve got to work at consistently for the long-term.
Thatâs why itâs important to determine your programming mileage. To do so, consider using a time log for a few days to see where you spend your time. Take a piece of paper and write down everything you do each day and the amount of time you do it, including the five-minute social media or email checks.
Now itâs easier to find pockets of available time and areas where you can cut. Maybe you can:
* Outsource some of the chores you do around the house.
* Cut out some TV time each night.
* Get up an hour earlier before your day job begins.
Once you determine your programming mileage, you can create a training plan. Itâs the second part Iâve found for making consistency a reality.
A Programming Training Plan
My first attempt at programming and my first half-marathon have something in common: both lacked training plans and the outcomes were dismal.
But thereâs something else. In both cases, after such poor results, I added a training plan and stuck with it. And when you do, the results take care of themselves.
A training plan is one of the most effective ways to be consistent and ultimately achieve goals. Thatâs because all of the details are determined in advance; you just have to implement it every single day.
My running training plans detailed the number of miles I needed to run each day and how fast I needed to run them. Now I create programming training plans that serve the same purpose: they tell me what I need to do each day.
At the end of the day, I open up Evernote on my computer and type out a schedule for the following day. So on Tuesday evening, I create a schedule for Wednesday.
Hereâs an example:
6:30am-8:30am - Program
- Review Python Anki flashcard deck for 20 minutes
- Complete âWord Cloud Dataâ problem
I follow this process for my entire work day: denoting the amount of time I'll spend on a task and what I want to complete during that time.
I also create a monthly training plan. In it I include three things I want to build, learn, or complete in the month ahead.
I used to create quarterly plans. But I found that too much could change over the course of three months. A monthly plan is enough time to make significant strides, yet short enough to keep to momentum going strong.
Plus, a monthly plan gives my daily training plans meaning. Youâve got something concrete to shoot for. âI must show up today and learn JavaScript. I need it to meet my monthly goal: complete âxâ project.â A monthly goal gives your daily training meaning.
2. Be persistent
The second trait great programmers have is persistence. Theyâll work through the layers of the problem and get the solution.
That seems to be the secret. The great programmers Iâve studied have the uncanny ability to break problems down and uncover the layers of a problem or an ambiguous situation. In short, they have a problem-solving system.
Itâs a lot easier to be persistent when youâre working on something thatâs manageable.
A Problem-Solving System
I hit a wall early on when I began learning to program.
I never learned how to problem-solve in school. When given a problem set in math class I just dove in at full-speed, which is what I did when I started to program. No plan. No system. No time to think. No breaking things down. Unsurprisingly, in both cases, I was spinning my wheels unnecessarily and constantly hitting roadblocks.
Now I have a problem-solving system that helps me break a problem down to uncover the layers.
For example, the first step in my problem-solving process is understanding the problem statement. âOkay, I just need to figure out what the question is asking,â I tell myself when I pull up a new problem and havenât the slightest idea of where to begin. Itâs the first manageable step when solving a problem.
Once I figure that out, I focus on the next manageable stepâand only that step.
- Understanding the given inputs and expected outputs are manageable.
- Identifying edge cases are manageable.
- Writing pseudocode is manageable.
- Solving a simplified version of the problem is manageable.
You get the idea. The steps may not be easy, but theyâre manageable.
Working through a tough problem is how we get better. It also builds confidence. Once we tackle one hard problem weâre ready for more.
It starts, however, by breaking the task into small parts and working through each part one at a time. When you do, preserving through a difficult problem becomes very doable.
Itâs an Attitude
On the road to becoming better programmers, thereâs something else we ought to consider: attitude. Great programmers have a refreshing attitude toward challenges and ambiguity.
This point was made clear to me when I asked a senior developer a few questions about a problem I was stuck on. I was stumped and frustrated. The developer was puzzled, too, initially.
However, his response shocked me. âWow, thatâs a great problem,â he said. His interest was piqued, as he dove into the details.
It's not to say that great programmers don't get stuck, too. They do. The difference is attitude. The lesson I learned that day was this: great programmers are excitedânot fearfulâto venture into the unknown. They're realize they're bound to learn something new as they uncover the layers of a problem.
We can learn a lot by studying programmers better than ourselves. I sure have. But ultimately the onus is on us: to show up each day and take action.
Programmer and writer: amymhaddad.com | programmerspyramid.com | I tweet about programming, learning, and productivity @amymhaddad
Originally published on amymhaddad.com.