You could apply the same logic to a whole bunch of tech like Kubernetes, service mesh etc etc and arrive at the same result.
Every tech has a trade off, understanding it is critical. Don’t pick tech spot SOLELY based on FAANG use.
You could apply the same logic to a whole bunch of tech like Kubernetes, service mesh etc etc and arrive at the same result.
Every tech has a trade off, understanding it is critical. Don’t pick tech spot SOLELY based on FAANG use.
I'll admit I have been tempted to stray down this path in the past. I think for me it was the fact that the company refused to provide any time for training or improvement, leading to the desire to chose tech in projects that would build skills rather than being the most expedient.
You can find this in lots of places not just FAANGs
I guess this is because of the hope for it getting open sourced and the dev becoming famous. Also, the less experienced people are, the more they are thinking that they are breaking new grounds.
But I think it's pessimistic to reduce it to people trying to make the job more interesting, and at least with more senior people it's often about reusing technologies internally.
For instance, an application may have a use case that requires very high messaging rates, so they build up a team to operate Kafka clusters. Then later you end up with a bunch of teams using Kafka when far simpler things would do the trick, because it's already available and there's a whole team supporting it, with expertise to debug it if things go wrong. It doesn't look good if you take the system on its own, but in context it's a pretty reasonable decision.
IMHO sometimes this reasoning goes too far (I've seen people suggest we rewrite super relational apps to NoSQL to avoid operating SQL DBs!), but it usually comes from good intentions.
The side effect of this ever shifting tooling set, is almost no one masters anything. All software is varying levels of crap written by newbies, because when the tools change every project you are always a newbie in that tool set.
I think this is pinpointing the key exploitability in the market. If you have seen enough tech come and go, you can figure out which 98% of this year's idea are the same as the year before, and 40 years ago.
At that point you can start cutting through the bullshit and design things using brand new tech as if you had used it for 20 years already. At that point you're way ahead of the rest of the pack.
(And you can choose not to use the brand new thing, and argue convincingly for why the almost-exactly-the-same 30 year old, more mature and stable, tech is better.)
Though you may still develop blind spots and miss a crucial difference in this year's iteration of the same idea.
You can be a systems engineer – understand the computers at a fundamental level – with focus on systems software – building low-level high-performance components/kernels – for storage systems, databases, in-memory systems etc (each of these have a lot of technical domain knowledge specialisation within them). You can spend 10 years in this field and continuously develop/enhance your expertise incrementally – it is quite stable and rewarding experience. A branch of this specialization is distributed systems engineering – where emphasis is on software operating in a distributed cluster over network – which has additional challenges unique to the aspect of being distributed.
You can be an applications engineer – understand application software engineering methodology – with focus on user/business facing application feature development in a scalable software team setting. The key focus here is not so much about low-level computer systems but more about software engineering discipline. It is about the inter/intra-team sport that is developing and continuously evolving a very large application software code base that is alive with changing/evolving user/business features. It is about modeling the functional domain of the user/business/real world. It is about the modern consumer Internet software development techniques – experimentation, live incremental safe feature releases etc. A branch of this specialization is developing application frameworks and tooling (rather than user/business functional features) to make the life of a feature engineer more productive. You can spend 10 years in this field and become an expert at software engineering discipline of churning out quality features on time and on budget.
The experience and learning in the above job families transcend any particular technology stack. The learnings are transferable from one tech-stack/functional-domain to another with relatively minimal effort. This effort is part of the work itself and doesn't turn you into a newbie for having to do it.
p.s: A generalist full stack engineer is usually an applications engineer who is somewhat good at systems engineering and is able to glue together systems to achieve the application features well. These engineers can take a startup from start and through initial growth phase and up to start of hyper growth phase. But there's a scale/performance threshold – where the scale of application deployment grows, performance starts to hurt your users, you need strong systems engineering specialists to fix those deeper systems/distributed-systems problems. Public cloud systems have been continuously raising that threshold since the beginning.
Was in a big Javascript project, where any article over 3 months old was useless or wrong. The internals of the app constantly being rewritten to flavor of the month.
I really like mastering things, so I've tried to stick with a technology stack (that I have kind of mastered), but I don't think it's been good for my career.
Other differences that are important:
- Real engineering interviews test skills that are pertinent to the day to day work of the engineers; FAANG (and copycat) interviews tend not to
- Real engineering isn't plagued by fad-following or driven by personalities: it's backed by research and established empirical practice
That said, the profession of "real engineering" has its share of problems: advancement is as political as it is in any other industry and it's got relatively low pay compared to the true value of the output are two of the biggest.
Agreed, and I'd go even further than that:
FAANG use should be quite far down the list of criteria, since the use cases and engineering culture are so different to most people's.
[0] Inefficient in the sense that they're wasting money which could be easily reclaimed - they're probably going to be improved over time as the state of the art improves, but that relies on the whole field moving forward.
I can't count the number of times I've heard Docker pitched with "it's what Google uses!", while the truth was that they didn't.
Before that it was MongoDB which was "just like Spanner which was key to Google's success", while in reality it wasn't even similar.
And you should organize in Spotify-like tribes, even though that idea is one person's idea about how they wished things worked, filtered though an eco chamber of conference talks.
As an engineer it is easy to dismiss these ideas when you have enough behind the scenes knowledge. But the point of storytelling isn't to build technology, but to pitch it. It does a good job at that. So use it, but wisely.
But service mesh is getting easier and easier by the day. And brings quite a lot of benefits!