Programmer – Express thyself

I was in one of my pondering moods the other day and it struck me that software development has less to do with pure mathematical prowess or engineering skill (though having that is certainly a benefit) and more to do with expressing yourself. This is no coincidence – it is because programming software is nothing but an exercise of making ones wishes understood. Indulge me for a minute here while I put to you my thought process…

Ever since we invented a computer, we have been evolving ever more sophisticated ways of communicating with it. As the computer grew more powerful and capable of understanding more complex thoughts we moved from machine code, to assembly instructions to software languages. We have reached a place now that computers are capable of processing huge amounts of data and instructions, executing extremely complex instructions and passing information between each other as needed. In response to these capabilities computers have been programmed using ever larger programs to solve ever bigger problems.

Programming solutions to today’s problems have gone beyond the capabilities of a single individual. Most software projects today require teams of programmers working in concert. This has lead to an interesting dynamic – developing software in groups. Except, software development has moved beyond geography – the ephemeral nature of software makes it an ideal candidate to be developed in a virtual construct that transcends physical proximity. Almost every non-trivial software program developed today is a collaboration of individuals, many of whom are literally at opposite ends of the earth and may have never met face to face.

This leads to a big problem – software programming is a pretty creative and complex process. Add to that, the fact that your collaborators are probably sleeping while you are coding and vice-versa, pile on the disparities in culture and language and you can see why I am saying that software development is more about expressing oneself. One of the bonuses we have being programmers is that, despite all these differences, we are trying to talk to computers and computers have standard ways of communicating with people. So, it can be argued that as long as we all are coding in the same programming language, and we are using the same tools we should be fine. Unfortunately, coding is a only a part of a software project – requirements, design, marketing, users, clients, quality assurance, maintenance, provisioning, etc – all are factors to be considered. All these aspects may be handled by people who are not programmers but still need to know what is going on. Besides, coding itself is much more than simply writing code, it also involves commenting, code reviews, design decisions, trade-offs and alternative approaches, all of which need to be discussed and communicated.

Given all the interactions that I described above, it is no surprise that programmers spend a significant amount of their time talking and writing about the stuff that are doing and are planning to do. Given this dynamic, in my experience, I have noticed that, successful programmers have learnt to express themselves clearly and concisely. I have seen this so consistently, that I would even go so far as to state that, a programmer that cannot clearly articulate a problem either in writing or in conversation has either not understood the problem or is incapable of solving the problem.

Expressing a thought clearly and concisely is a skill that must be practiced. Personally, I am using this blog as much to exercise this skill as I am for anything else. I would encourage you, dear reader, to give thought to this as well. Spend a few minutes over your next email or your next requirements document, proof reading it and making sure you have conveyed you point clearly and succinctly. Reading is another great way to improve your communication skills – look for books outside your normal fare, look at newspaper articles – I have found them to be great sources, since journalist have specific windows of reader-attention and space to convey their points.

Well, until next time… Programmer – Express thyself !!

Advertisements

7 comments on “Programmer – Express thyself

  1. I would say that to begin to apply your engineering skills, you must understand the problem clearly, but that being able to articulate it definitely helps.

    Without communication, engineering skills are useless. Without engineering ability, communication skills are useless (as a programmer). I think that’s fairly self-evident.

    But I have seen cases where the ability to communicate (outward) is less important than the ability to solve problems. For example, when I was working for a test controls company, some of the programming interns would be given a very detailed, non-negotiable requirements document and told to get it done, then pretty much left to figure it out themselves after that. I, unfortunately, was one of these interns. :) That’s an extreme case, but illustrative, I think.

  2. My point is that in order to even begin applying your engineering skills on a problem – one must be able to articulate the problem clearly.

    This is essential for two reasons –
    1) It shows the person providing you with the problem to solve – your customer – that you have understood the problem completely. Often development starts with the customer and the developer having different ideas of what the problem is – like the blind men trying to describe an elephant after having touched different parts – this leads to misunderstanding and chaos.

    2) When you articulate the problem to someone you are forced to think of and list out all your assumptions and pre-conceptions regarding the problem. So when you articulate the problem you automatically become aware of the level of your understanding of the problem and you can get validation about whether your understanding is complete and if it isn’t you can go about getting further clarification.

  3. Well, if your point is as general as “to be a good programmer, you have to be able to communicate well,” then it’s pretty hard to disagree with that. Taken to the extreme, you can’t even type into the computer if you have zero ability to communicate. ;) I had thought your point was that creativity and the ability to express yourself are aways more important than engineering (i.e. problem-solving) ability when it comes to programming.

    I’m not saying that if you’re totally unable to communicate effectively, you can still be a good programmer. My point is that they’re both necessary, and in some cases the ability to be a good engineer is more important than creative talent (and vice-versa).

  4. I disagree Mike – creativity and ability to express oneself is not restricted to any particular form of programming.
    To take your example – if I were programming a component I would have to interact with the people designing the user interface – I would have to communicate to them in some form the interfaces that I am building or using…
    Whether this is in the form of a UML diagram or in the form of an interface definition – I still need to express in clear terms what I am going to do. Theoretically – it should be possible to use a diagram or the code itself to do this, but you would still need to be able to provide context and assumptions.
    In fact, given that I am dealing with other programmers I would argue the ability to express my point of view and back it up with clear logic is even more critical – if I am not to be dismissed out of hand :-)
    If I were a building a test suite – God help me if I cant make a clear case about how and why something does not work in the application I am testing- I would be eaten alive by irate developers :-)
    I submit that problem solving and algorithms are just the price of entry – a good programmer needs to be able to express himself or herself.

  5. I’d say it depends a lot on exactly what you’re programming, too. If you’re designing an application from the ground up, I’d definitely agree that creativity and the ability to express yourself are key. But not so much in cases where you’re programming a component, and your code never interfaces with the end user.

    For example, maybe you’re on a small team working on some testing equipment. Someone else is doing all of the user interface work — your job is just to make the program interface with the testing equipment, take realtime readings and feed the data out. Or maybe you’re programming/modifying a 3D graphics engine, image compression algorithm, or something else that doesn’t involve directly communicating with the end user.

    In the end, I think that being a good programmer requires a mix of skill solving problems through algorithms, as well as creativity and the ability to clearly communicate with the user. Different projects require different amounts of each, so unless you’re very specialized, you need to be good at all of them.

Comments are closed.