During the last four years working as CTO, I had the pleasure of working with hundreds of highly talented developers. As time went by, I discovered that there are four types of developers which must be considered regarding individual career perspectives and assignment of functions.
Programming is what most developers do. They receive a feature requirement and do the coding. Usually, they stick to coding guidelines and work within an agile process framework. Programmers have different skill levels like junior, medium, or senior, and sometimes they’re full-stack or layer specialists. Programmers are the ones who do the real work and who have to deal with details which were not specified beforehand. Due to this they often become multidisciplinary domain experts.
A team lead is a programmer with leadership skills and a knack for process frameworks. Some team leads show their best performance working in small teams, where they create a trustworthy, reliable, and productive atmosphere. Others know how to organize a big team with hundreds of developers and complex structures. A good team lead isn’t necessarily the best programmer of the team, but I would always expect the team lead to do some coding, too. Hiring a team lead, I don’t merely expect theoretical knowledge of frameworks like Scrum or Kanban. I also expect real-life experience in agile software development and the ability to pragmatically and reasonably apply those parts of the respective framework which are best for the productivity of the team. I would never hire someone who is a strict Scrum evangelist and dogmatically tries to align the process with the methodology of the framework. In my opinion, the best team leads are the ones who steadily inspect and adapt the process in order to achieve the best results. In the end, it’s the team leads responsibility to continuously optimize the team’s productivity and to ensure their work satisfaction.
A lead developer is a senior programmer who engages with principles of object-oriented programming and design, e.g. the SOLID or Clean Code principles. Like a construction engineer, the lead developer pragmatically selects design patterns and defines coding guidelines. A lead developer often acts as a mentor by reviewing code and pairing up with less experienced developers. Every team which is doing nontrivial development should have at least one lead developer since this usually upgrades the performance of the whole team.
The architect oversees the whole picture. A developer in this position knows about the abstract business goals and translates them into architectural concepts. Unlike architects who design buildings, a software architect, in my opinion, should also do some coding. I personally would never hire someone who prefers to create UML diagrams in an ivory tower. This most of the time leads to quixotic designs which turn out to be useless for developers. An excellent architect embodies the skills of a lead developer paired with the ability to perceive the business aspects behind each line of code. Architects are very rare and they’re only needed for real challenging projects or the construction of frameworks. The best ones among them have a pragmatic view on architecture. They’re aware of the facts that the best results emerge from discussions with the team and that the design has to be created simultaneously with the development process.