The world of software has a spectrum of skills and people upon which the industry is built. This spectrum ranges on one side with programming and on the other side with software architecture. This essay briefly describes the jobs and roles that people play on that spectrum and some of the skills required for each.
Programmers are entry level. The duties and responsibilities of Programmers are writing code on individual modules based on a given set of requirements and specifications and fixing defects. They should be engaged in learning. They need to learn at least one new language each year. Programmers should learn to apply good coding practices, design patterns, and ensuring their code meets all requirements given and adhere to good coding standards. They should make their code as readable and maintainable as possible. They have a limited set of tools that they should be actively developing into a repertoire of languages necessary to gain a varied background. A lot of Programmers liken themselves to artists. This is an accurate parallel because a Programmer will have a hard time duplicating their creations with a high degree of safety. In terms of a city plan, Programmers can be likened to a drywall hanger doing construction on a single room.
Software Development is more difficult than merely implementing software requirements that Programmers are used to doing. The Software Developer uses tools from a wide array of skills to solve problems in moderately complex software systems. Websites, web applications, phone apps, and web services are examples of the kinds of things Software Developers build. Software Developers have gained competency with the artistic aspect of software development and they are aware there is a scientific aspect. They are like a stone mason who uses a hammer and chisel to craft their work. Each piece they create is its own work of art that fits into a larger system of stoneworks. In terms of a city plan, Software Developers are the people who are constructing high rise buildings.
Software Engineering is a lifelong discipline. While Software Development is still on the artistic end of the spectrum, Software Engineering is on the scientific end. Engineering principles are applied to the art in order to ensure a measure of software safety, predictability, scalability, and reuse. Software Engineers can reliably use software systems to build and integrate extremely complex systems. Software Engineers have a deep background in a vast network of languages, hardware platforms, and engineering techniques. They apply their knowledge in creative ways to design and build other complex software platforms. In terms of a city plan, Software Engineers ensure the buildings on the city blocks all have the electrical, plumbing, fire safety, and other safety codes they need for people to inhabit them. They make sure their buildings are reliable, safe, and are as efficient as possible.
Software Architecture is concerned with the big picture of extremely large and complex software systems. They create the vision for the strategic roadmap of where they want the system to be. They employ Software Engineers the way a military general uses Colonels to marshal their troops to achieve tactical and strategic mission objectives. The vision of the Software Architect is in terms of years. Their designs and plans account for every possible use and outcome of the systems they envision. They are the masters of software creation. Software Architects are the ones who are laying out the city. They design the city infrastructure, the roads, rail lines, city light systems. They make sure there are enough parks and parking in the right places, etc.
Each role has its purpose. There is no one role that is more important than the other. However, there is typically a career progression from Programmer to Architect, but that is not to say every Programmer will become an Architect. Most of us will stop at the Software Development stage and decide to become outstanding application developers. Few Developers ever gain proficiency with the fundamental engineering principles that allow them to continue their career progression. Those of us who do go on to be Engineers are the ones who build the frameworks that are used to construct the applications that the rest of the world is familiar with. Every Facebook has, at its core, a framework which an engineer has designed and constructed to allow for seemingly infinite capacity. This is my Software Tao.