On Mastering Programming

After having written a long reply to the linkedin group on the subject: ‘What does the term, “Master Programmer”, evoke in you?’ and loosing it due to non-masterful use of a simple tool, the web browser, I decided that it was an interesting enough subject to start again but to blog it.

The Michael Fuhrman suggested that a master programmer would have a set of attributes that would characterize him as being a master programmer, those attributes being:

  • Technically Articulate
  • Teaching
  • Creative, Inspirational and Motivational
  • Decision Making Process
  • Problem Understanding
  • Skills Problem Solving
  • Skills Systems Analysis
  • Project Management
  • Team Building Skills
  • Enterprise Coding Standards
  • Scalable Application Design
  • Object Oriented Programming
  • FrameWorks
  • Design Guides
  • Pair
  • Coding Unit Testing

I agree with this list of skills with the exclusion of the Object Oriented Programming, despite the fact I am a Object Oriented bigot, I recognize that using object oriented paradigm is not mandatory and there are great programmers around that adhere to different paradigms.

There was an argument about mastery being a title given by others establishing a relation of teacher and student. But the meaning of the word as defined in the dictionary, or the modern dictionary at least, the all knowing Google:

mas-ter-y
ˈmast(ə)rē/
noun: mastery
1. comprehensive knowledge or skill in a subject oraccomplishment.

The idea of a master being a teacher, I think, comes from the guild system were an apprentice would have to find a master craftsman to teach him the craft and he would eventually become a journeyman and then, maybe, a master himself.

But this very system required that the person aspiring to mastership would earn a certain minimum sum of money, thus proving the exercise of the craft, and the production of a masterpiece to be judged by the guild masters. Thus, even then, the mastery was something that is acquired by achievement of skill and not a relation to a student.

Although the right to have student was reserved to a
master, and this makes sense since you have to really know something to teach it.

So we move to a more interesting objection: the impossibility of mastery in programing due to the fact that programing is an ever changing field and that is
impossible to really learn it, there was even an assertion that on other fields it is assumed that it takes 10 years, probably the 10k hours of practice rule, to become a master, but in programming a person with 10 years of experience would become obsolete and even a liability.

In my opinion, there is a fundamental error here, the assumption that a master programmer is someone that have mastered a single language or technology. This
is, after all, an ever changing field, so the ability to cope with change must be something included in the skill set of a master programmer, in fact “hackers”
are respected in the basis of theirs ability to hack and learn, that is to cut something into pieces and understand it.

Indeed, something you see in great programmers is not only great knowledge but willingness and skill in searching for even more knowledge. In truth, you can see it in any master of any field, not in fake masters but in those capable of holding people in awe, they are humble and they recognize there is always something new to learn and any source of knowledge is valid.

That is why masters learn from theirs students, they keep an open and watchful mind. A long time ago someone in Sun Java forums cited a research that showed
that humble people always out perform arrogant people, the theory is that the humble is always trying to improve while the arrogant knowing little thinks he knows it all and so he stops learning.

Besides, anyone that has lived the evolution Java in the web, for example, the rise of Servlets and how they were unruly to produce the view side, the creation of the JSP to facilitate the writing of pages, the subsequent troubles with business code embedded in them, then the emergence of the pattern using Servlets to execute logic and then dispatch to simpler JSPs to render the result, and
then Struts to handle the tedious boilerplate code of parsing request values and creating an indirection level to navigation has a much better grasp and
understanding of why we have all the buzzwords of today, what are the problems related to not following certain practices and the advantages of doing than someone just jumping in the fray.

The same goes to about anything in the field, someone that has experienced many languages and have written code in assembler, basic, C, COBOL, etc. has a better sense of what is good, what is bad, what works what becomes spaghetti than someone that is just learning programming now and thinks that Ruby is much better than Java because a hello word in it is shorter.

Some things in the field are ever changing, but those things are only the crust, languages are mostly syntax sugar, and like learning human languages once you
start learning new languages, each language becomes easier and you start to see the correlation among them.

Some other things are much more permanent, research skill, design patterns and other patterns in general, logic, inter-personal skills, problem solving,
abstraction, communication, etc. Those things carry from one language or technology to another and a person that has applied this skills for 10k hours and have them ingrained will write better code no matter the language, will be able to notice struggle in a novice and be able to help him because he understands people better and understands the problem and the nature of the struggle better.

This person will have a better gut feeling about code smells and will have a seemingly preternatural skill to debug, will have a larger palette of tools to
solve a problem, will be better able and have a more comprehensive vocabulary to communicate a problem and a solution.

And most important of all in programming, this person will be better equipped to research, will be more effective in formulating the right questions to solve a problem at hand. Will know how better google for, read documentation, hack the code.

As masters of others fields a master programmer will be able to draw knowledge from other fields to programming for his understanding of the subject is such that he is able to see the essence of the things, much like Musashi has said in Go Rin No Sho, just like a master tennis player will find relation in how you swing a racket and how you swing a sword or how the force is generated in the
hips just like kicks and punches in martial arts.

In Chinese, Kung Fu it is not the name of a martial art, the word to martial art is Wushu, kung fu refers to something you have learned through effort and time and often you can see in kung fu movies people totally unrelated to martial arts performing in fights because they can extrapolate that which they know well into other fields.

They have achieved the understanding of the Do, in Musashi terms.

A master programmer, like martial arts masters will also know well his environment and will have it set up properly to his advantage and will know to use the right tools for the job, he will also have the physical skills, typing
so fast and using shortcuts so effectively that a novice watching him work will have difficulty in understanding what is happening and it will look like arcane magic done by hand gestures.

He will design an interface in an IDE making things pop into existence one minute and in the following one, will drop to command line and set a server through ssh no sweat.

Well, that is what I think a master of programming would be.

May the code be with you.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s