I’m in the process of recruiting a programmer for my team, during which, I started to ask myself, what are the definitive qualities required from a protocol programmer. You might say, anyone could be a protocol programmer, or you might say, anyone can learn to be a good protocol programmer, but let us assume, for the sake of discussion, that there are some personal qualities for a great protocol programmer. What are they? Let me offer my ideas:
- Attention to Details
A protocol programmer is all about the details: the edge cases, the race conditions, expecting things to be reversed, mixed up and altogether missing. Programming a protocol is not about covering 20% of the cases that happen 80% of the time, it’s about covering 100% of the cases.
- Quick Learner, Good Analyzer
Protocols are made out of documents, which refer to other documents, which in turn refer to more documents. If someone is to implement these, she should not only study all these documents, but she must also discern the essential from the unnecessary, follow references that are meaningful and abandon documents with little relevance.
- Outside View
This is especially important when designing multi-purpose products like protocol stacks: if your stack does too much, it will not be right for everyone and will probably sacrifice some of its flexibility, and if it does too little, the customer will feel like he has to do everything herself. Maybe another configuration value should be added to override some process. Maybe a callback should be raised to ask the application what to do. A good protocol programmer must always consider how his work affects the customer.
Great protocol programmers glance information transmitted over temporal distances – visions of events occurring in either the past (why did someone did this five years ago?) or future (how will this fit with an expansion five years from now?). This ability, to program now what will be used in the future, may be the most important one of all.
Do you have any other ideas? What are you looking for?