Full-stack obsession

Full-stack obsession

Stack overflow of cognitive load

Introduction

Nowadays it is very trend-ish to speak about full-stack development: companies look for developers with the knowledge of back-end, front-end, everything in the middle, and beyond that. According to the TechRepublic report for 2022, full-stack is the 2nd highest in-demand tech job. The main driver for this is to be able to operate and deliver features with the least amount of people who has the same set of skills and who are interchangeable, minimizing the bus factor. At first glance that makes sense, but there are some caveats.

What does this mean?

For most job offerings when mentioning full stack usually mean front-end and back-end skills. Apart from that, you could see setting up Kubernetes cluster, cloud-native development in AWS and Azure, and many more skills as nice to-haves: companies go wild about that and are very creative. You could have seen abbreviations like MEAN (MongoDB, Express.js, AngularJS, Node.js) or LAMP (Linux, Apache web server, MySQL, PHP) which are JavaScript and PHP tech stacks for application development. There is also Ruby on Rails, ASP.NET, and more.

Why do companies actually love full-stack developers?

When you just starting with a project or product you need some feasible results to show to your stakeholders. It could be a haste prototype, but you have to start with something. Having people with similar sets of skills increase their interchangeability and they can deliver something in less time. It could be not perfect from a technical perspective and longevity, perhaps even with dirty hacks, but it will work. This is a good thing for a start-up.

The danger zone here is when the project keeps going and the need for deep technical knowledge increases. Having only full-stack developers can play a bad joke. Something that was sufficient in the beginning fades away. What about deployment strategy, continuous integration, collaborative work tools, architecture, scalability, monitoring, domain knowledge, and other technical and non-technical concerns? As soon as the project is anything more complex than a business card website things get complicated.

Full-stack revisited

It is highly unlikely to demand from the hardware engineer knowledge on how to build decent UIs, from the DevOps engineer to design PCB and from the front-end developer to set up Kubernetes cluster.

To give some concrete example, let's assume there is a telecom company that provides SMS/MMS, voice, and other telecommunication services and wants to extend their business to provide APIs to send messages, buy phone numbers or shortcodes, integrate with other popular messengers like WhatsApp, Telegram, and Viber which opens possibilities for conversational e-commerce, ticketing, payments, and other businesses.

Typical GSM Network Infrastructure looks like this:

GSM+Core+network-Diagram-1796680223.png

There is a need to build an API to send SMS messages from one recipient to another. What is full stack here? I would say everything from the phone of the sender to the phone of the receiver. Every node in between. This includes the knowledge of how cell tower works, what is SMSC, SMS aggregators, SMS delivery reports, P2P and A2P protocols, multipart messages, shortcodes, OTT (to build over-the-top messaging apps), and much more.

And even before there is a team of API developers, the company first should build a core platform to allow such capabilities. From the technical side, there are hardware engineers, system and network engineers, telecom engineers, DevOps engineers, software developers, and perhaps some big data experts who should be involved in this project.

It is highly unlikely to demand from the hardware engineer knowledge on how to build decent UIs, from the DevOps engineer to design PCB (printed circuit boards) and from the front-end developer to set up Kubernetes cluster.

Are you really a full stack?

Even on the software development level, there are too many things to be concerned about. In the vast majority of cases, there is a need for architecture & design, CI/CD, performance optimization, database design, different frameworks knowledge, etc. Consider the following picture:

Fullstack.drawio.png

This is an oversimplified version of the possible skills required to deliver horizontally working code in production. Each of the skills could be divided further into sub-categories. For example, if you can use kubectl to check running pods and services, it doesn't necessarily mean that you would be able to configure a cluster. If you can develop a basic API it doesn't mean that you would be able to build RESTful API according to Richardson maturity model 3 (known as HATEOAS) without additional time to learn or being an expert in API design.

Real world

In the real world to build a complete system and put it into production the team should have the following skills as an example:

Fullstack.drawio(5).png

Is this work for one or two "full-stack" people? I doubt. Even if they are very mature and skilled, there are areas that require more in-depth expertise like setting up replica sets for MongoDB, choosing a shard key for better cluster performance, or using an aggregation pipeline. But even if you have such two unicorn experts to build everything, how long does it take? And what if you need a more interactive UI with a smooth design and style? Can they do it?

In that example, it's totally fine to have a team of 3 or 4 where one person is a front-end developer, and 2 back-end developers with knowledge of GraphQL, API design & security, MongoDB, software architecture, and CI/CD. One of the two back-end developers could have more skills in NoSQL databases and another in DevOps so that he can set up build and release pipelines. Another option is to have one DevOps person with a good grasp on security who can facilitate infrastructure setup, Terraform configuration, build agents setup, and more.

T-shaped and cross-functional

A T-shaped person is someone who has deep knowledge in one area and a broad base of general knowledge in other supporting areas. Someone could be very good at creating front-ends and have some basic knowledge of APIs designs, or very good at database modeling and APIs design with some really basic knowledge of HTML.

To some extent, T-shaped people have a higher interchangeability rate, but it is a misconception to think that they can replace people with deep knowledge in some areas without additional time to learn the subject. And that additional time could delay delivery for a long.

People in the team complement each other which makes the team as a unit cross-functional. Ideally, the team should be able to design, build and deliver code into production. It does not necessarily need to be a team of full-stack developers, the skills could and would overlap, but it's the Team who should have a complete set of skills to do the work.

Stack overflow of cognitive load

It is quite natural for people to be better at one discipline than at another. From project to project that could be a different case, but in more or less non-trivial domains and environments in-depth expertise is required. The modern state of software development is too diverse and evolves at an incredible pace.

Besides that, people could also have their own long-term career development plans in specific fields. This should be taken into consideration and encouraged.

There are plenty of shades of front-end disciplines: UI design, web components, CSS preprocessors, reactive front-end programming, build ecosystems and package managers, frameworks, and architectures. This is an entire world. The same goes for the back-end side, where things are even more complicated. What makes it worse is that all of that evolve at a pace that other industries don't ever have.

Apart from that, all developers within a team should share and follow the same conventions, tools, and practices which are often quite different per technology stack and platform.

And while wise companies invest in learning budgets so that developers could learn new things and improve existing techniques, there are some limits to the capacity and duration of working memory that impede learning and has negative effects on task completion.

Overwhelming a developer with a bunch of very diverse tasks increases the cognitive load, creates an unhappy and unhealthy climate and eventually increases the turnover rate.

What about pay grade?

Perhaps you think that full-stack developers earn more? Well, it's not the case. The average salary for a back-end developer in U.S. is $115,355 per year. Front-end developers earn $102,152 per year and full-stack developers earn $102,663 per year. As you can see this is not more than a delusion.

Summary

The full-stack term is misunderstood and overestimated. There is a good reason for companies to have people with identical skill sets, where everyone could do everything. Reality is far from that. The tech industry evolving at an insane pace: tooling, languages, and techniques are constantly improving. The ability to learn and adapt become one of the main requirements for an engineer. But engineers are people after all. And people have their own goals and plans which are not necessarily aligned with organizational goals. Wise organizations encourage and promote ambitions and find opportunities for their employees. The core unit of work delivery and accountability is a Team, not individuals. They should be able to decide how to fill the gaps in the skills required to do their job the way they see fit.