Small companies with too many specialists run into trouble when the balance of work between specialties fluctuates and bottlenecks form. Or when a couple people go on vacation and one gets sick and all of a sudden you have nobody who can debug the database.
In a large company, each developer can only be working on a tiny corner of the codebase at any given time, and there should be plenty of redundancy. Generalization serves less of a purpose, and specialization allows the company to take advantage of deeper expertise (or hire more junior, lower-salaried developers who haven't had time yet to build up significant experience in more than one area.)
Full-stack conversation happens every now and then at my company (big corp), and there is just no way that I see it being successful.
My platform team requires:
- JVM/Kotlin - Domain-Drive Design - Akka, streams - Kafka, PostgreSQL, HazelCast, ElasticSearch, Cassandra, CosmosDB - Kubernetes / DevOps (the platform infra stuff), knowing how to troubleshoot and resolve issues - Pragmatic REST design and industry trends/best practices - Build pipelines, exploring Jenkins/CircleCI - Distributed system design - Reactive system and reactive programming design/development - Pragmatic, well-designed relational and nosql databases (indexes, foreign key relations, understanding wide columns and document based (we have both ScyllaDB and CosmosDB) - Kong API gateway management - Core business logic, inter-connected systems (upstream and downstream), complex pipelines
When the hell am I supposed to learn, practice, and keep up on html/css/js?
My org also has a product team which develops our mobile and web applications. The engineers on this team are trying to learn and build AngularJS (legacy), React, React Native, and nodejs for their product APIs which call our platform APIs (backend-for-frontend pattern). They can barely get time to learn how to dockerize their node apps, let alone deliver on business features while actually becoming GOOD. The same applies to my team on platform.
Full-stack might be fine at a startup or small company, but the way I see it full-stack is the classic "Jack of all trades, master of none", or in cynical terms - crappy to mediocre at everything.
I would much rather work with a peer who is specialized and I can be confident in their html, css, javascript, react and node skills as an engineer over someone who can cobble together something that might work initially, but has a shitty design, doesnt follow best practices, or will be a nightmare to maintain as stuff in our environment tends to stay in production 5-10+ years.
We started out as a single development team, full-stack, where everyone was doing everything and it was chaos. Nobody was good or did anything well, which lead to some really shitty code and team members stressed out about how much of a tech stack footprint they were having to try to learn.
Can it be done by the right type of individuals? Absolutely. I could spend a weekend or two and probably learn how to create an initially working React app, but I'm going to struggle to take it very far and wont be able to solve complex problems.
Better to have each developer full stack and focus on screens. So each guy goes from top to bottom. He/She would also write system tests.
If the code base is simple, then developers can do it all.
If the code base is complex, then developers must specialize.