While training and mentoring Software Engineers in various disciplines, the question of which programming language is the best, or most valuable to master is periodically brought up. There are strong arguments made for one language over the other. Each language has consequences — some favorable consequences, others not so helpful. Languages have structure which fits one context better than another. However, there is one language skill above all others to master, which is vital for anyone desiring to be a Software Craftsman. And late in my career I realized it was revealed the first day of my first Computer Programmer course.
My academic achievements aren’t all that impressive: the foundation was an 18 month course in Computer Operations/Programming at a Vocational Technical Institute. Yet through the years, I found myself periodically noting some of the most advanced software development/delivery concepts were things taught me by three mainframe programmers who retired in the 80’s.
Day #1 of that course, the instructor wrote a set of simple commands on the board: stand, sit, step #, and turn left/right. The challenge to the class was to use those simple instructions to maneuver him through the classroom, to his office, sitting in his chair. He took each individuals clear instructions and executed them explicitly as written. You can imagine the results — far from what anyone expected. The instructions were clear, so what was the problem?
If you’ve ever used a computer and found yourself frustrated it didn’t do what you wanted, you can relate. We find ourselves thinking (and often saying aloud), “why won’t this thing do what I want — what I’m telling it to do?” My response (often to myself) is, “It did exactly what you told it to do, based on how it interpreted the words used, in the context provided.” It isn’t just the words used, it’s how the computer understands the words used, in the context in which the computer is. This is more than just syntax.
The same is true when communicating with one another person. How many times have you heard someone describe what they would like done, explicitly and clearly; performed the task with pride; only to find them confused and disappointed in what you delivered? (I find this often the case when doing “just what my wife wanted me to do”). After being corrected, you address the issues noted, only to find they are again confused and disappointed that you failed yet again to deliver as expected.
In some relationships, one misunderstanding could be disastrous. Even in a strong relationship repeated situations like this can result in great strain. When this occurs between individuals delivering software on which millions of individuals may rely, this can result in disaster.
In my opinion, the most valuable language skill for any Software Craftsman to master is — the ability to discern what another person means by what they say (and the corollary: how they understand what you say). Not just words, grammar or sentence structure — not even “what they say.” It is the ability to ask clarifying questions – even concerning the most clear and explicit statements – confirming to exact detail even how you plan to complete the requested task.
After doing this a few times you begin to recognize repeated words and phrases in context, and become better at truly speaking the language of the other individual. Clarification occurs less and less as you begin to communicate with that individual in their own “language.” It is what I suspect occurs when you learn a foreign language well, then visit a country were people speak that language fluently, and find yourself needing clarification often. Those who desire to truly understand individuals in that country find, after living among them and working through countless exchanges for clarification, thet begin to think (and dream) as those people do. They haven’t lost their ability to understand and communicate with people from their own country, nor do they find the need to consciously switch between one person’s language and the other — it just happens, subconsciously.
And that is how I find this skill to be when involved in software development/delivery. I find it most beneficial when on a new project, and the requested task is so explicit and clear I feel almost embarrassed to clarify further — thinking they may question my ability as a developer. However, I’ve found these exchanges do more than ensure I understanding clearly the requests made — a series of such exchanges often solidifies a relationship to the point that communication becomes a breeze, with fewer clarifications required. With fewer misunderstandings, impediments and rework, the experience for all involved is enhance — much as the individual living in a foreign country.
For some, just trying to formulate our own thoughts into words which others will understand clearly is difficult. We may find ourselves taking far longer than we like to ensure we’re understood. So the effort to focus more on gaining clarity, especially for things that already seem clear, may seem counterproductive. However, if you can reconcile yourself to this valuable language skill, work as hard at mastering it as you do your computer language skills, I am confident it will pay off in ways you couldn’t even imagine.