One of the big things I see in software development is the difference between a programmer, and a software professional. Things like communication and estimation are always high on my list, which fall into the bigger category of “working with others”.
Historically, good engineers get that way by starting off solo. There’s a lot of alone time (much as with learning a musical instrument) where you have to try and fail in order to learn. You’re building something that’s in your own head — it’s your idea, you know where your priorities are, you know what the end result needs to be.
Then you start building software for someone else. You can’t just get a rough idea of what they want, and then build it by slapping together your own assumptions of what’s right and wrong. Things have to work in a very specific and precise way, there’s not always a “close enough” to hide under. The only way to make that happen is via communication, estimating, and following through on commitments (either by delivery, or by revision).
And naturally, Allspaw has written about this before.
These are the kind of things we emphasize at Cloudspace which make us a different kind of agency. Our process puts the engineers as close to the client as possible. For all the emphasis on technology, it’s about the people, dummy.
Bonus link for the techies: Ilya on anomaly detection. Relevant because monitoring is a part of being a software professional — you can’t fix what you don’t know is broken.