These ten things help me to get the most productivity out of myself as a programmer, and I would bet that most of these things also apply to almost every single programmer.
If you are my boss, colleague, head of R&D, CTO, head of HR, CEO, or anyone who is working with me or want me to work for you, these 10 things should be in order to maximize my productivity.
I like to think that my productivity decays exponentially every time when one of these things cannot be fulfilled. When three or more of these things are not true, my productivity drops to the level of an average programmer
These are not in any particular order, because they are all really important and productivity cannot be accurately measured.
1. New or interesting technology
Every time I get a chance to work with new or interesting technology, I want to learn as much as possible about the technology as quickly as possible. Like many other developers, learning new things really motivates me. When working with a really interesting technology, programming does not feel like work at all. Simply put, I am really productive, when I don’t feel like that I am working.
Example : Once upon a time I got a chance to port a software for Sony PSP. There was nothing special in the software that was being ported, but the whole concept of making software for Sony PSP was so awesome that my productivity went through the roof.
2. Something to prove
I usually get some extra motivation, if I feel like I have something to prove. This might happen, when someone has underestimated me or I have heard that someone doesn’t think that our team has the necessary skills to get something done. I want to prove people wrong, and rub it in their face, and that gives me a huge boost in productivity.
Example : I wanted to prove that I actually know something about algorithms, so I made it to the TopCoder Open 2008 finals and placed 2nd in the competition.
3. Enough sleep
This is really important, because my brain does not work at full capacity, if I haven’t slept enough. I usually need to sleep at least eight hours to operate at full speed. If I have to get up early and go to some stupid meeting, I know the rest of the day will be a waste, because no matter how many energy drinks I consume, my productivity will not be at a high level.
4. No interruptions
Most people have heard of the flow, but not very many software companies enable programmers to get into the flow. I strongly believe that every programmer should have a room with a door. Most companies are not run by programmers and they have no idea what kind of negative effect noisy working environment has on productivity.
Before any agile zealots start bashing me that there must be constant communication inside the team, I agree that communication is crucial to the success of software projects, but good communication does not mean noisy offices and constant interruptions. There is a way to communicate and still get into the flow.
When I need to get things done, I usually hang around at the office after all the 9 to 5 geezers have gone home. It’s kind of sad that in most companies you have to work different hours to actually be productive.
5. No context switches
Even if the context switch is small, getting back into the flow might be impossible. In many companies most things are urgent and need someone’s immediate attention. This creates a situation where context switches are accepted and even expected, but this destroys the programmer’s productivity.
If you need to get things done, you cannot work on multiple completely different things at the same time and maximize your productivity. Organizations should understand that programming is not a clerical activity and it cannot be continued immediately with the same pace as it had before the context switch.
Meetings are the biggest productivity killers for programmers. One meeting in the morning and one in the afternoon, and I guarantee that most programmers get nothing done on those days. Most meetings, not all, are already a huge waste of time. Too many people get together without a clear agenda and no moderation, and usually nothing good comes out, in addition to killing the productivity.
6. No estimations
This is a bit controversial issue, but I am speaking from my own experience, and I have noticed that most programmers are more productive when there are no estimations for their tasks. This might not apply to everyone, but there is something common in programmers’ mind that slows them down when their tasks have estimates.
One obvious thing is that, when the task takes less time than the estimate, programmer might polish it until the estimated time has been reached. The programmer might also think that he has done something wrong, if he finishes early, and might refactor the code with all kinds of design patterns to make it look more professional.
I am not saying that no one should ever estimate anything, but estimation is always a guessing game at best, and programmers do not move from task to task at full speed when estimates are followed like bible.
7. Free reign
If I have the last word on all the design matters, I will be more productive, because I can’t spend my time complaining and whining about decisions made by others. I have to believe in the decisions I have made, and show that the design supports implementing features at a rapid pace.
This does not mean that I am dictator and never listen to anyone. It only means that I don’t want anyone to step over me and force me to do things I don’t like. If that happens, my productivity might take a dip, because I cannot work at full speed at something I don’t believe in.
It might sound like that I am a little princess and cannot work with other people, but that’s not true. I like to work with other people, as you will learn. All I am saying is that, if I am involved in making design decisions, I will be more productive as a coder.
8. Good available libraries
This is something that some programmers don’t like to do; they like to write everything from scratch themselves. I, on the other hand, like to leverage as much existing technology as possible. However, I don’t spend my days trying to find pieces of code that would do the work for me. Only in situations where it absolutely makes the most sense to use an existing library, I will use it.
I like to have good building blocks available, so I can build my software on top of those. If I have to implement most of the building blocks myself, my productivity won’t be as good, because it will take longer to get the job done.
In some situations the only reasonable way to get the job done, is to write everything from scratch. Fortunately, those situations are not that common anymore, because there is so much good software out there.
My personal favorite at the moment : Lua
9. No unnecessary bureaucracy
Bureaucratic things can get in the way of achieving maximum productivity. Organizations might be in such a bad shape that programmers cannot do their jobs properly, because they have to waste a lot of their time doing things that must be done before they can actually write any code.
Bureaucracy is also a motivation killer, which will easily drop the productivity to zero. If an organization makes programmers jump through loops and holes, they are not going to be very productive.
10. Brilliant coworkers
If you have someone really smart to bounce ideas with, you will come up with solutions that are better and take less time to implement. In the best situation, there is a little bit of competition, and it will push the productivity to higher levels, because not many people want to be to be outperformed by others. There is also a risk, if the competition takes over, the quality might suffer, because the software was done too quickly. Coworkers should actually push each others to write high quality code.
The opposite will result in a loss of productivity. If you have no one to share ideas with or you have to baby-sit other programmers, there is no way that productivity will reach its full potential. The best situation is when there is always someone a bit smarter and more experienced than you, so that you can always learn new things and push yourself to your limits.