When I first started as a developer I had a certain notion of what the job entailed. I had a clear vision of what would make a top developer.

My junior belief on important attributes for a developer:

Reasoning: I thought software ENGINEERING was a hard science with clear cut rules and logic. It was about knowing how computers work and creating the most efficient code to communicate with the computer. I knew that there was no escaping having to communicate with peers and management but I believed at the end of the day it would have no affect on my work as a developer. I also noted a small bit of creativity required for problem solving but it was more about the logical construction than the ideas.

My views were backed up with every job interview I went to because there was always a clear emphasis on math, logic, data structures and algorithms. All the other skills were not tested for or questioned.

As the years went by my perspective changed as I learnt what makes good code and how to provide business value.

What I now believe are important attributes for a developer:

Reasoning: Logic, knowledge and creativity are important attributes for problem solving but a developer does not actually spend much of their time solving problems. Most problems have already been solved to some degree, therefore google skills are more important to cover that. Secondly, most of the problems in a system are caused by developers and poor communication skills. I would say communication skills is 10X more important than I first anticipated. It could also be that because the logic aspects come easier to me, I perceive communication to more be important, but I dont think thats the case and heres why.

Requirement Gathering

const SteveJobs = "A lot of times, people don't know what they want until you show it to them." ;

The obvious reason for communication skills is to gather requirements from the client/business. It seemed like a simple task at first, I thought you just listen to what they want, then you build it. In reality collecting requirements is generally more complicated than that since often the client does not know 100% what they need and the developer has to build a clear picture from a fuzzy abstract explanation. Agile software development emphasises increased communication between the development team and the client to help mitigate the issue of having to gather requirements upfront. Regular customer collaboration leads to having to be able to respond to change, which requires good team collaboration and interactions.

Team collaboration

Another fairly obvious reason to have good communication skills is for team collaboration. Most developers work as part of a team and you probably do as well. Problem solving, design and implementation requires a team of developers to work together. If developers do not communicate they can easily code in different directions, slowing progress and introducing bugs. Agile software development methodologies like XP focus on increasing communication between the members of the development team, with things like standups, retrospectives, pair programming, etc. Having a team where everybody has a clear understanding of the goals and working in the same direction is priceless. You can have the most logical and knowledgeable team but if they are all pulling if different directions you get nowhere.

Code is communication

What do I mean by “code is communication”? It can be summed up by a few good quotes.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."

-Martin Fowler

This clearly demonstrates the difference between my junior mindset and now. With powerful computers and efficient optimizing compilers, developer’s do not have to be too concerned about micro optimization. We can write excessive amounts of variables, classes, and functions in order to make the code more readable for humans. Basically most of a skilled developers writing time is geared towards optimizing the code for humans to read.

"There are only two hard things in Computer Science: cache invalidation and naming things."

-Phil Karlton

Properly communicating intent is something which sounds easy but is often difficult to do.

"Clean code is simple and direct. Clean code reads like well-written prose. Clean code never obscures the designer’s intent but rather is full of crisp abstractions and straightforward lines of control."

-Grady Booch

When a developer writes code he should be writing in a manner which the next developer (maybe himself), can read it like a book.

"Code is like humor. When you have to explain it, it’s bad."

-Cory House

"You know you are working on clean code when each routine you read turns out to be pretty much what you expected."

-Ward Cunningham

Your code should not need comments and if you have to look at the code implementation to figure out what code does then the naming may be poor. All this importance on clear communication in your code comes down to the fact that in order for anyone to add features or maintain the code they have to read it, even while a developer is writing code he has to constantly read over it.

"Indeed, the ratio of time spent reading vs. writing is well over 10:1."

-Robert Martin

By communicating clearly with your code, you speed up current and future development.