How do you become a great programmer? Do you learn from going to school and listening to someone lecture on COBOL? Maybe you improve by reading books by experts on certain subjects or memorize the entire contents of Martin Fowler's design patterns novels. Perhaps you just code, making mistakes are learning. To look at learning to be a great programmer you first have to take a look at what programming means.
Some believe programming is a science, with well-defined rules that if properly followed always give you the same outcome. Some believe programming is engineering, practical application of some kind of pure science such as math. I personally feel programming is a craft. That word often makes people blink a few times, especially those steeped in logic. Craftsmanship means applying specialized knowledge with skill in a practical manner.
Usually when I start mentioning programming as a craft, people are up in arms shouting “crafts should have intrinsic value.” No, you're thinking of art. Although some could argue particular programs are art that is not usually the case. The craftsman is in love with his medium, rather like an artist, but believes that form and function must be balanced to maximize the profit and usefulness from delivered value.
True craftsmanship, true skill over a medium, is generally learned through the tried and true manner of a skilled craftsman passing on their knowledge to an apprentice. Mentorship is in my opinion the single best way to become a great programmer. Mentorship is a process that takes raw potential and pairs that person with other people who can train them and shape their potential into something useful and great.
I am a programmer today because there were people in my life who took the time and energy to provide mentorship. First my father and brother helped introduce me into the world of programming and were there for support and also for kicking me in the rear and telling me to “do it myself”. There were other mentors who helped me push outside my limits into other programming languages, mentors who encouraged me to begin speaking and writing. Along the way I learned another truth.
Mentoring does not only help the apprentice, it helps out the mentor as well. Passing on your skills to another can help you in more ways than you can imagine. The partnership can increase the network of people that both mentor and apprentice have access to. The intrinsic good feelings generated from knowing you helped someone. And above all your apprentice provides fresh eyes and a new perspective on what you have already done.
But it's hard to meet new people. So hard in fact there are hundreds of dating sites and social networks and other websites devoted to doing nothing more than helping match people up. It can be as hard to find someone to mentor you as it is to find someone to marry you, after all mentorship is a relationship.
From that need phpmentoring was born. I had started doing a talk at some conferences on mentoring in general, how it works for me, how to deal with it in open source, how to do mentoring in a business or organization. And after the talk I had lots of questions with the primary one being “how do I find a mentor”. Meeting new people is hard enough, but meeting new people who have a specific skill you want to learn who are willing to teach it to you?
I created an irc channel on freenode and named it phpmentoring – simply because most of the conferences I speak at are PHP centric. A quick shout out on twitter and there were 30 people in the channel. There was most definitely a need for a place for people to meet up. Using resources on github for wiki and site hosting, irc for general discussions the idea for phpmentoring grew rapidly from some friends on twitter to an active website, wiki, repositories with information resources, and a “PHP dating service” to help match up people who want to mentor others, or be mentored.
I'm continuing my work with mentoring – speaking at conferences about the importance of mentoring, telling people about phpmentoring (and mentoring in general) and doing my part with my own mentors and apprentices. I'm also involved in other open source projects including php-gtk, winapi for php, and many others. In my “day job” I've had the privilege of working on a very diverse set of projects from internal manufacturing tools, to performance monitoring clients, to Wikipedia.
At the end of the day, I don't work because I have to, I work because I want to, because I need to improve the technology that people use every day. The tools and techniques used today won't be the ones used 20 years from now, so I don't believe in holy wars over languages, operating systems, or coding standards.
Balancing pragmatism and idealism in code is something I practice on a daily basis, and I wish more people would learn to find that balance, or at least take the effort to look for that balance.
I believe that everything I gain from contributing to the Open Source community I need to give back, to pass on what I've been given. That will take me a lifetime.