Lost In Translation
One of the hardest part in software development is communication. I don’t mean network communication, but person-to-person communication. This is one reason why it’s so convenient to work alone on your pet projects: you don’t have to communicate at all.
Every time you communicate, there is noise in the signal. Because both parties have different backgrounds, you lose part of the message whenever you talk to somebody else. In general, the more similar the backgounds (e.g. two programmers talking to each other), the smaller the error rate.
It is extremely important to realize this, especially when talking to people outside of your occupation. On of the best examples I’ve seen was by Sam Aaron. A few years ago, he showed me a DSL he implemented in Ruby to encode his clients’ logic. In true DSL fashion, his language exactly described their problem domain, and his program exactly specified the way he solved their problems.
Together with the client, Sam sat down and looked at the code. The client wasn’t able to program at all, but was able to read what Sam wrote. Together, they did some pair-programming to fix the logical errors that got lost during communication. This is a prime example of domain specific languages, and one of the best examples of clear communication in software I’ve seen so far.