To master software development you must know many things more important than writing code. To get it right, with optimal efficiency, you
must be good at identifying the best solution to your customer’s needs. You must be good at choosing technologies to use to create the solution. You must be good at implementing those technologies. You must be good at identifying what is most important and valuable to work on at every moment. You must know when to take the time to learn a new skill or new tool instead of using skills and tools you already have mastered. You
must know how to set customer expectations about the features and the delivery schedule so that will not be surprised at any point or get less than they desired. You must know how to communicate with clients the estimated cost and value of alternative solutions so the client can make the decisions. You must know how to estimate closely the cost and benefits of different alternative approaches to a solution. You must write code that is easy to maintain. You must be sure your code works as designed, desired, and that it meets requirements. You must write code that performs well, is free of major defects, is free of security holes, and follows industry standards and government regulations. Your solution must be easy
for your customer to deploy, understand, and use. You must master all these things to master software development. And then, you have
only mastered software development when you are the only person on the team.
When you are a member of a team, or a leader of a team, you must master many more things. You must understand how to evaluate alternative architectures and guide the team to selecting an acceptable one. You must know how to evaluate the mood of team members and address emotional issues. You must know when and how to allow sub-optimal code to enter the solution in order to reduce the stress and anxiety of a team member, or because a team member does not have the skills to complete the code in an optimal fashion in the desired time frame, or because you don’t want to spend the many hours trying to explain why one design is better than the other, or because you need to bring a team member up to speed on certain technologies. You must know how to help the team identify what is most important to work on. You must know how to help team members evaluate their own skills and know when to ask for assistance. You must know how to motivate and lead team members to take ownership of the code and to write quality code. You must know how to help team members prioritize the work to be done and prioritize features to optimize the work flow process.
Do you get the drift? To master software development, you must be exceptionally lucky.