It seems obvious that the field of programming is an endeavor and not
 a destination to be reached. The technology and best practices are 
always changing, sometimes at an alarming pace, and keeping up with that
 rate of advancement requires a constant commitment to personal 
development. That means that good programmers are always learning, yet I
 read internet discussions all the time that attempt to separate novice 
programmers from experienced ones and argue in favor of one or the 
other.
The advocates for the novice programmer appeal 
to the need for training, mentoring, and standards to help the novice 
programmer become productive, protect the team from mistakes the novice 
would make, and generally expedite the process of getting the novice to 
an expert level. The advocates for the experienced programmer argue that
 such measures waste the expert programmer's time with endless 
distractions and stifle their creativity with rigid coding guidelines. 
The novice programmers complain that the experts are aloof and won't 
give them the time of day, while the experienced programmers claim that 
the novices don't care about learning the best way of doing things or 
are incapable of comprehending their advanced code. Therefore, teams 
should be made up of only the best programmers to be successful.
Certainly,
 I'm oversimplifying the ongoing argument here, but this is the general 
form that I see it take, time and again. I see a lot of validity to both
 sides of this argument, especially when considering that everyone has 
their own perspective coming into the debate, and their points are 
certainly true for their own experience. It seems to me that they are 
all right, and at the same time they are all wrong, because the 
framework of the argument is wrong.
The major flaw 
comes from assuming that programmers can be categorized as either novice
 or experienced and that there should be any tension between them. In 
reality, programmer skill is a continuum, and there is no definite point
 when someone transitions from a novice to an expert or to any 
intermediate skill levels that you could come up with. We all started 
out as novice programmers at one time, and now we are all at different 
points on our learning path.
New programmers are 
entering the field every year as people take their first programming 
class or discover a book or online tutorial that introduces them to 
programming. That will still be true in 10, 20, or 30 years from now, 
and we need these new programmers because at least some of them will 
become tomorrow's great programmers. They won't be able to write great 
code to begin with, and some of them never will. But unless they write a
 lot of code, they will never learn how to write good code. Some of that
 code will likely make it into your code base, and yes, you will have to
 maintain it. That is part of your job as a more experienced programmer.
Another
 part of your job is to help teach other programmers. You may not feel 
like an expert programmer capable of bestowing your knowledge on others,
 but unless you are a beginner, you likely know some aspect of 
programming fairly well. If you are an expert, it is likely in specific 
areas, and you know of other areas that you'd like to work on. You're an
 expert and a novice at the same time. You should do what you can to 
spread the knowledge you have so that others can benefit from your 
expertise, and hopefully, you will benefit from others with expertise in
 areas where you are weak.
There
 is an additional benefit to teaching, and that is that while you are 
teaching, you are also learning. Having to explain something so that 
another programmer understands it will deepen your own understanding of 
the subject in a way that reading about it or having it explained to you
 or even doing it yourself will not achieve. Teaching something forces 
you to organize the topic in your own mind more fully and solidify 
concepts that you may have only superficially learned before.
Take
 a simple example, like how to choose when to use a for loop or a while 
loop. You may have been choosing one or the other in different coding 
contexts for years without thinking much about it. You know how they 
both work, and you can use them fluently. As soon as you have to explain
 to someone else why you would use each of them in different contexts, I
 guarantee that you will learn something new because you are forced to 
examine their pros and cons, their structure, and their idioms in ways that you probably haven't thought about before.
Earlier
 I mentioned standards, and I think standards are a big point of 
contention for a lot of programmers. Some think they are necessary 
because standards will protect the code base from novice programmers 
that don't know what they're doing, and maybe those programmers will 
learn something about good programming by following standards, assuming they actually read and internalize them. Others 
hate standards because they feel that coding standards are draconian. They feel that standards condone coding without thinking and
 stifle the creativity of more experienced programmers so that they 
can't write the best code as the situation warrants. Do you see the 
inconsistency here? How can standards promote good programming but at 
the same time prevent good programming?
The problem is 
that most coding standards are created under the assumption that a few 
experienced programmers can codify their knowledge, impose it on novice 
programmers, and expect good code as a result. There's that false 
dichotomy of novice and expert programmers again. It is true that new 
programmers need to learn and understand good programming practices 
before potentially abusing more complex language features. Basically, we need to 
learn the rules before we can break them. How can we encourage that 
practice without prohibiting experienced programmers from using 
complex features in elegant ways because they are potentially dangerous 
in the wrong hands?
Then there is the related concern 
that novice programmers won't be able to understand code that uses more complex language features, so they should be restricted for that 
reason as well. That line of thinking ignores the fact that programmers 
can and likely will learn these features with time, and the more they 
are exposed to them, the faster that learning is likely to happen. A 
better way of implementing coding standards would be to make them as 
lightweight as possible with the emphasis on things like good naming 
conventions and unit testing. Then encourage a culture of asking 
questions and mentoring through practices like code reviews to help speed up the process of disseminating 
knowledge and improving everyone's programming skills.
For
 every programmer, there is a beginning, but there shouldn't be an end. 
There is no point you can reach where you know everything you need to 
know. Programming is a dynamic field, and there is always something new 
to learn. We are all at different points on that endless endeavor. We have the responsibility to learning when our skills are lacking and to teach others when the opportunity arises. The next time 
you're working with novices and their code, remember that you were a novice once, too. You could learn something - by teaching them.
No comments:
Post a Comment