While just about anyone, at almost any age or IQ level, can learn the concepts of writing code, to become an employable, professional software developer with any hope of long-term success, a person needs:
- Logical thinking skills.
- Excellent problem-solving skills.
- A methodical approach to solving problems.
- A passion for software development.
- A willingness and ability to keep learning new things (e.g., languages, paradigms, design patterns, libraries, frameworks, data structures, algorithms, etc.) throughout their entire career. The learning never ever stops in this business. If you stop learning, you will fall behind and limit your opportunities.
- Excellent written and oral communication skills. From writing documentation or code comments to providing feedback in code reviews to making presentations to defending your design decisions, communication is key in this business.
- Patience. You need a lot of this. The list of people and situations that will try your patience is too long to even begin to list here.
- Persistence. You need a lot of this, especially after you’ve been chasing a difficult bug for many hours or days.
- Attention to even the most minute detail. One binary digit (bit) can have a huge effect on how something works or doesn’t work.
- Attention to quality.
- A willingness and ability to dive in and learn about the domain you’re writing code for, to gain a better understanding of client/user needs, terminology, concepts, etc. For example, if you’re programming financial systems, you need to learn about financial concepts. If you’re developing statistical software, you need to dig in and learn about statistics. If you’re developing simulations, you might need to roll up your sleeves and learn about astrophysics, string theory, ecological systems, etc. If you’re writing network software, you need to learn about networking. If you’re writing software to drive industrial chemical processes, you need to learn about the chemicals and processes you’re working with. (See this answer for an example.) Device drivers require learning about hardware devices. Process control software might require learning about chemical reactions. The list goes on and on.
(One of the many things I enjoy about software development is all the other areas I’ve had a chance to learn about over the decades, in addition to the typical computer science and software engineering arenas.)
- Compassion and empathy for the next developer who needs to read/maintain your code.
- Compassion and empathy for the users of the software you’re developing.
- The ability to read and interpret technical information quickly, and apply it to the task at hand (e.g., hardware datasheets, algorithm descriptions, best practices, etc.).
This is not an exhaustive list, but it gives you a general idea of the attributes you need for long-term success in software development.
Obviously, not everyone has all of these attributes. Although some can be learned/acquired, some are more fundamental to the personality and life experience of the individual.
Just as not everyone can become a professional brain surgeon, astronaut, soldier, aeronautical engineer, nurse, teacher, firefighter, lawyer, concert pianist, rock star, actor, cinematographer, carpenter, plumber, architect, sculptor, rocket scientist, pilot, etc., not everyone can be a professional software developer.
That said, I strongly believe in people — of all walks of life — having the opportunity to learn new skills, improve themselves, change careers, make themselves more employable, and go after their dreams.
In addition to being a software developer, I have taught software engineering and computer science courses to many aspiring software developers, across many ages, races, economic backgrounds, religions, previous careers, etc. Some have gone on to success in this field. Others have used the opportunity to discover that software development was not for them. A software development career is not for everyone. But, all should have the opportunity to learn and decide for themselves.