programming

The Human Connection

Born to share

From the moment we are born to the moment we die we are wired to connect and share everything we do. It is our connections that give meaning to our lives and they shape how we think and what we are. Even before we are born we start learning language, we learn the sounds of the language and the accent of our parents.

We come out and we are sponges for language, babies keep on running those learning algorithms making out which sound are each phoneme in a given language, as we are told in this TED Talk of Dr. Patricia Kuhl.

Babies exposed to language in the first year learn at amazing pace the sounds of the language, but the most striking is that in two weeks a baby not previously exposed to a language catches up, if a person comes to talk to him in a new language, and here is something very intriguing: it must be a person, not a television, not a radio, there must be firing of social neurons in order for the learning to occur.

But this is not the only learning that is shaped by our social interactions as we can see in another inspiring talk, this time by Professor Sugata Mitra who stumbled upon a great discovery with his experiment Hole in the Wall where he leaves a computer exposed to the street and finds out that the poor children, who had no previous contact with computers and without external assistance, are able to teach themselves all sorts of things. He explores this idea further and reports again in his next talk in his finding he observes that there must be more than one child, they must interact, even at first being wrong and advising one another wrongly, they end up building knowledge.

The birth place of ideas

But the benefit of human interaction for learning does not end in adolescence, we carry on “sinergizing” with others to produce and create as Steven Johnson explores on his Where good ideas comes from, we are nodes in a great human network load balancing ideas and knowledge and the interactions that allow the ideas to make sex are the real geniuses of the human race.

Programming is comunicating

Enter programming, one can argue that human languages are messy and ambiguous, on the other hand computer languages are clear and precise, besides you just need to make the computer understand what is said. It is easier than with humans. Right?

Computer languages are just like human languages, there are many ways to achieve the same result in a given language, more in some than in others(Perl comes to mind), specially on those with a high level of abstraction. The abundance of bugs on every program just shows how hard is to really get the message through the computer thick mind.

Having the computer to understand your meaning is just half the story, for there is maintenance, making the computer understand is never enough, unless you produce throw away software, you have to write code in an way that the non-native speakers, us humans, understand clearly the concepts intended for the computers.

On top of that, those concepts are not just something you knew all along. They are new ideas to solve the problems of the system being written, the act of writing computer programs is not just a passive activity of writing down something well known. It is a creative, engaging, challenging processes of creating new knowledge and writing it to be understood by two completely different beings.

The connection solution

Thus we have in programming the full stack, from learning what is needed to be done, how to do it and pass the knowledge around. Programing does benefit fully from keeping our social neurons firing and interacting at which pair programing excels. It provides the needed social context for the act of programing to keep our brains going, working full steam.

Programing is not the mechanic act of typing code, for that we have IDEs, what slows down to a stop development is the lack of ideas, even worse: bad ideas that creep in and if left in the system cause all kinds of misunderstandings(A.K.A.:bugs) and troubles like the time taken to understand a piece of code to fix it that will accumulate cost along a project.

Pair programing, by satisfying our social cravings, as seeing in the prevalence of social networks, reduce time spent on them, for that need is supplied in the act of programing itself. Through positive peer pressure it keeps the quality of code high for no one likes to show bad coding style. It homogenizes knowledge among the team both from the application inner works as with technical knowledge and knowledge in general.

It also builds bounds among the team and sthrengtens confidence which make people work more motivated.

Conclusion

Pair programing makes the endeavor of programing more humane, rises the quality of the software produced and generates knowledge. It is a very powerfull tool that works in tandem with agile values and is too valuable to not be applied even outside agile environment.

Join Take Back Agile

Taking Agile Back

Recently with his post I Want Agile Back Tim Ottinger launched a movement of rescuing the agile movement and it’s values. I heartily agree with him that the state of agile is disheartening this days. Agile has being kidnapped by the very machine that it rose to stand against.

Agile is not fast

Agile does not mean fast, half-backed, ill thought of code. Agile means being able and ready to react soon to changes in the environment so that you do not spend time and energy producing something that has not value. The very idea birthing from the wish to produce quality.

Agile is human first

Agile is about recognizing that software is an human process and understanding and valuing humans in the process instead of hammering them down to bits into the process.

Agile is being honest

Even if it let income go, it is to be transparent and let the customer let the project go if it is not giving him value anymore. It is not about squeezing profit at the expense of everything else.

Agile is not about titles

Agile is not about being master, manager, boss, über developer, or any title of power or lack of it. It is about the power of collaboration with everyone being equally important to the success of the enterprise and contributing to the mix of skills without adding one more pretty initials to the business card.

Agile is about satisfaction

Satisfaction in working with others and having the feeling of the job well done. Satisfaction of the craftsman over a piece produced with mastery. Satisfaction of seeing the customer happy with value added through the software.

Join

If you believed the agile manifest and want to see a world where software is written thusly, join the movement to take agile back:
Google plus community
Google groups
Twitter@TakeBackAgile

— may the code be with you

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.