I recently saw this tweet by Allen Holub, about how the idea of a full-stack developer is a fantasy. I published a reply but figured expanding my thoughts in a blog post made more sense.

What is a full-stack developer?

First, we have to define what full-stack means.
If we’re talking about the same thing as Dmitry in this Quora reply, then yes, I agree — a full-stack developer would be as rare as a unicorn.

You have to be able to navigate infrastructure, from packet switching and TCP/UDP and NAT/DNS to AWS/Kubernetes/Docker Swarm/Mesos to media queries and CSS. From Assembly and POSIX and SNMP to Stylus and Babel. Knowing this all from gzip and Redis to garbage collection and VMs, jailing, clustering. Let me be skeptical about all those JavaScript dudes claiming they know the stuff. They do not. Today’s stacks are huge and any nonsensical statement “I know this all” are at the very least naive, at the very worst a lie.

However, if we’re talking about what I — and what seems to be what most people — believe a full-stack developer is, then I do think they exist, and there are a lot of them.
To me, a full-stack developer is someone who knows how to build an app by themselves — not that they’ll necessarily always work with the entire stack.

If the plan is to use the LAMP stack, that’s simpler. If you’re planning to run Kubernetes Clusters, a message broker, and several microservices, then the complexity is much higher, and it will be difficult for a single developer to be able to work across the entire stack.
The point isn’t necessarily touching the entire stack at all times, but having at least some knowledge of different areas of technology (backend, frontend, infrastructure in general, Linux, etc) and being able to navigate through them.

The people who do the following, for example, are all full-stack developers IMO:

  • Developing an application using vanilla PHP, jQuery, SQLite, HTML, CSS, setting up a Linux box, and Nginx or Apache. e.g: Pieter Levels with remoteok.io and nomadlist.com (and many others).
  • Developing an application using Laravel (PHP), Vue.js, queues (SQS, Redis, etc), Tailwind, setting up CI/CD pipelines, and deploying it to a Linux machine running Nginx and PHP and setting up separate servers for the services (Redis, MySQL, etc). e.g: Me and many (probably most) Laravel developers
  • Developing a Rails application with or without front-end frameworks, Tailwind, and deploying it through Heroku, Fly.io, or manually setting up Nginx and Passenger. e.g: My friends Andrew Culver and Dave Paola

Allen mentions something that I agree with: a team is (almost) always better than a single developer doing everything. Just because you can do everything doesn’t mean you should.

The downfall of full-stack software developers

A funny thing I noticed when first learning web development (~ 2008) is that people didn’t really categorize which “end” they were on. People were just “developing apps”. But maybe that’s just because I was a beginner and never got to the professional level. When I started programming again at the end of 2014, I started hearing terms such as “Angular”, but people were still just “web developers”.

In 2015, I started looking into Rails, and people were “Rails developers”. I don’t remember seeing “backend Rails engineer”. The courses taught you how to build an app in its entirety — frontend, backend, and set up a web server.
In that same year, I started learning Laravel — what I’m still doing these days — and the same thing happened. The courses taught you the entire stack. People would call themselves “Laravel developers”.

From 2015 to 2019-20, I had a startup where I was the solo dev working with Laravel, Vue, asynchronous queues, Redis, servers, CI/CD pipelines AND Ionic for the 2 mobile apps we had. Was I full-stack?

From, maybe 2016 or so, I started seeing a trend of more specialized developers. People coming out of bootcamps or courses only that only taught React, or Javascript/Node.js. I don’t know whether that’s good or bad, but it’s something I noticed, at least in the web dev world.

I wonder how the push for microservices and distributed architectures, in general, had an effect on that. Also, these days you have things like Remix and Blitz.js, which are… wait for it… full-stack frameworks.

In the communities I’m a part of — Laravel, indie makers, and, as an admirer, Rails, the default still is full-stack.

Like I said in the beginning, to me, a full-stack dev is not someone who knows the entire thing, from Linux to Redis’ Lua scripts to setting up Kubernetes clusters, inside and out. It is someone who has developed applications touching the entire stack and, while not a specialist in all of them, knows their way around things.

Now, specialization is a thing, and at their workplace, they might only touch a part of the stack. That’s okay. But my point is that they know the entire thing to some extent and that they are not that uncommon. Think small and mid-sized companies and shops: they usually do not have a specialized engineer for each area. People wear many hats.

The superpowers

To me, one of the most amazing things about being a software developer is that I can build things myself. If I have an idea, I can spin up a Laravel (or whatever, maybe go vanilla) installation, and start working on it.
Not being able to work through the entire stack kinda kills that idea. Imagine if I didn’t know how to (or didn’t want to, for some reason) do front-end development — how would I have built my company’s software? How would most small to mid companies that build some software survive?

Now, I get that many people start working for others, and sometimes in a specialized role, such as a frontend engineer, and never have the need to learn the other pieces. I know quite a few FE engineers that have absolutely no idea how the backend of the software they work on works, and that’s okay.

I do, however, think that learning other things makes you a better engineer. Not only does it give you much more autonomy, since you can do things on your own, but it allows you to collaborate with your peers in a much better way, also reducing the feedback loop.

It is much easier for me to collaborate with FE engineers, system administrators, DevOps engineers, QA engineers, etc. because I have some knowledge of things outside of my main domain, and have worked in those areas at some point.

Conclusion

To summarize, here’s what I think, in a nutshell:

  • Full-stack developers are not uncommon; in fact, I think it’s the normal.
  • I don’t remember seeing so many specialized developers a couple of years back. Full stack still seems to be the default in my bubble. Even outside Laravel/Rails, in the indie makers bubble.
  • You don’t have to know the entire thing through and through to be a FS developer. That’d be impossible.
  • It seems to me specialized roles started to become more common since 2016 or so, kinda tagging along with Node/React.
  • There seems to be an interesting comeback to full-stack in favor of independent backend and frontend apps, with lots of folks coming back to Rails or the Rails Way and things like Remix and Blitz.js.
  • Being full-stack gives you a lot of autonomy. You can build your own ideas and have a larger array of tools to solve problems. It also allows you to better collaborate with peers who work on different pieces of the application.
  • I might be completely off-track here and saying a bunch of gibberish. Maybe I even misunderstood Allen’s tweet.

Another interesting fact — when I think about people that I admire or that influenced me, they usually can build apps by themselves.
For example: Taylor Otwell, Adam Wathan, Aaron Francis, Andrew Culver, Pieter Levels, DHH, Jack Ellis,Kent C. Dodds, Fabio Vedovelli… the list is long. But, basically, almost everyone that I think of might not necessarily do FS development today, but knows how to build apps by themselves if they want to.