Last night I was reviewing the skills I've gained since starting my journey as a developer.
I realized something: as a loose estimate, you need a firm grasp of no less than 11 different systems or syntax models just to carry a modern web app from backend to client, from indev to production on your own.
I'm not joking, and that's no small feat.
The List
This is a brief example of a full stack dev's possible code languages and other systems that they would use at some point in the full stack devops cycle.
All 3: HTML5/CSS3/JS
These should be obvious for anyone in web dev.
At least one each of:
- SQL distro - for database
- Java/Python/C# - for serverside logic
- React/Angular/Vue/etc - for frontend
- Bootstrap/Bulma/etc - CSS design
- Apache or other webserver - for hosting
- Node.js - for package management
- Webpack, Browserify, Parcel - build scripts and cross compiling
- LINUX - because I guarantee you will use it at some stage, if not develop all of your work in a Linux distro already.
- probably other stuff I forgot
And Even More
This list doesn't even touch on details of:
- design principles
- version control
- networking
- hardware
and the deluge of standards and specific knowledge for each. Usually it's required to have at least passing knowledge in those areas as well.
So What?
If you were to follow the requirements of that list your list of skills could be something like this:
- HTML5/CSS3/JS
- Oracle SQL
- Java
- Vue
- Bootstrap
- Apache
- Node.js
- Webpack
- Debian (& Bash)
- Git
- Adobe XD for design/wireframe
- And maybe a bit of firewall/netsec stuff.
Personally, it's so satisfying to know I can do most of that list already. I'm learning more every day. It's been a long road but compiling that list makes it so much cooler to see my own progress.
It also humbles me considerably. I'm reminded that people who really know their stuff in this field are worth respecting. Because it takes a lot of work to get there.
If you're ever feeling a bit of impostor syndrome, if "I can't do this" keeps creeping into your head...
Stop and think about what you already know. We have to do a lot in this field to be competitive. Not convinced?
That list is an impressive one for anyone else on the planet: imagine people's reaction if you told some random passerby that was curious that you know 10 programming languages and use them all at work. Their heads might explode. I know plenty of great people who are very knowledgeable in their fields that look at me like I'm Hackerman for knowing that the Developer Tools in Chrome even exist.
But for us, that kind of portfolio is just "par for the course." It's easy to get caught up in that viewpoint and forget that we're already specialists in a field that can be really opaque to a lot of people. Remember that. And stay humble about it.
TL;DR
Don't compare. Just improve yourself. Give yourself some credit. List your accomplishments to yourself.
And next time you question if your web developer friend is crazy (or if you are) for doing what we do..
Yes. I'm pretty sure we're all crazy.
Top comments (15)
I would add C, is a small language thats the base for everything,
almost everything has a C flavored API.
I would add Functional Programming concepts, even if you only do OOP,
you can still use some FP features that improves your code.
I would add Design by Contract, is an alternative to TDD, is great to catch bugs.
NodeJS is not a package manager, thats NPM.
I never liked Bootstrap, with its dependency for JQuery,
I prefer Bulma or Spectre CSS. Water CSS for quick stuff.
I am a Linux person, but even Windows oriented companies used Linux servers,
even more with WSL, Docker for Windows, Alpine, Wine, etc.
Never seen C# on Linux, I know that it works on Linux, but still you never see it,
I know is big for Game engines, but thats because is a proprietary vendor lock-in,
I dont feel to attracted to it, is like a C that requires a Virtual Machine to run,
like the worse of both worlds, sorry.
Great post, very informative.
"npm (originally short for Node Package Manager)[3] is a package manager for the JavaScript programming language... npm is included as a recommended feature in Node.js installer" - en.wikipedia.org/wiki/Npm_(software)
I really like this comment. C is a great language to know because it really is the basis of everything. Python's built in C, for example.
You have a very good point with C# being uncommon on Linux. I usually see it on Windows. But that's why I included it, because Windows is still a big deal regardless of personal allegiance to a platform. Besides, if you know any other C stuff or Java you can catch the basics of C# pretty quick.
"Java/Python/C# - for serverside logic"
i think its quite fascinating that you didn't mention PHP.
My main serverside logic (and web backend logic) is basically all written in PHP and will be for the foreseeable future.
no problem man, just had to mention it because it stood out for me :D
I'll tick that under the "probably other stuff I forgot" category. ;) thanks for mentioning.
To play the Devil's Advocate:
I think many people's conception of "full stack" is sometimes very wrong.
I don't know a single person with the title of Full Stack Developer that does any server-related work outside of very small companies, government or freelancers. I've never seen a full stack role that required design skills.
I'd say the vast majority of full stack positions I see are looking for someone who can reasonably code a full app by themselves including a database, back end and front end. This mostly likely means using an ORM to access the database, so very limited knowledge of SQL/NoSQL is really needed. They're looking for generalists that know architecture and design principals well enough that the syntax of the language doesn't matter anymore, they can pick up the concepts within a few weeks and hit the ground running.
If we generalize, according to your list:
SQL distro - for database - Mostly with an ORM, using your back end language's syntax...
Java/Python/C# - for serverside logic - If you're already listing Node below as something you should know in order to use it for package management, you might as well just use it for your back end, as well.
React/Angular/Vue/etc - for frontend - Sure, a front end framework is nice to know and is most likely how you'd be building any large scale app anymore, but you could also just use your back end language's templating language and build an MVC app.
Bootstrap/Bulma/etc - CSS design - I don't know that memorizing some class names and how they fit together is really that hard. All of these frameworks have excellent documentation, you can literally just copy and paste the code and it works. If you were building your app with vanilla CSS, sure.
Apache or other webserver - for hosting - Why? Some basic knowledge is definitely helpful, but any company worth working for is going to have a team dedicated to managing the servers. That's a full time job in itself. That said, you could just pick a serverless tech stack and deploy "cloud functions" to AWS/Firebase/Azure/etc.
Node.js - for package management - Again, I don't see why using NPM requires you to know Node, but if you're assuming deep knowledge is needed here, why waste time learning Node plus another back end language if you only goal is to consider yourself "full stack"? Just use Node.
Webpack, Browserify, Parcel - build scripts and cross compiling - Unless you're building your own build pipelines from scratch for some reason, pretty much every modern JS framework has a CLI that does all this work for you. All you need to know is how to type in "npm run ___" on your command line.
LINUX - because I guarantee you will use it at some stage, if not develop all of your work in a Linux distro already. - Some decent knowledge of the Unix shell can be helpful, but definitely isn't needed. There's plenty of mature GUI applications that will do everything for you at the click of a button. Even then, what if you're developing on Windows and deploying to IIS? Linux is knowledge is not needed.
The way I see it, the only three things you really need to know are:
Even then, we could probably take HTML and CSS off your list if you're going to use a CSS framework, because you can copy and paste the code snippets on their website straight into your app. That leaves us with just JavaScript.
Calling yourself "full stack" is easier than its ever been, especially with serverless. Being a Full Stack Developer who truly knows every part of the stack is where it's more difficult... but I think you'll find that most people in these roles are better at one side than the others, and that's okay.
Until recently, companies like Google, Amazon, Facebook, etc. only hired for the title of "Software Engineer", because they want people who are strong enough in communication and the concepts of Computer Science that never change, not people who are really great at framework A or language B. In most cases, your ability to code isn't even in the top metrics when interviewing for these companies because they know that if you understand the underlying principals of computer science and can think logically and communicate those thoughts to your peers, you can learn the coding part.
People who spend their entire careers working on a single language and framework might be amazing at working inside their own domain and are probably also very well compensated, but ask them to work in anything else and they'd be completely lost. This is fine for some and you'll probably gravitate towards being this person later in your career, but in the beginning, you shouldn't be focusing on learning specific technologies, you should be focused on learning concepts. Ask anyone who's been in the industry for 20+ years, they've probably worked with at least 5-10 languages and don't even bat an eye at it anymore. That doesn't mean you should just skip around to a ton of different languages, though. The better you know one language, the easier it is to pick up another as long as you're focusing on the architecture and not just the syntax.
I think you strike a really good point here in terms of what people are really looking for.
I believe it all comes down to the tools at hand and what the team needs. A smaller company could need a full stack dev similar to what I described. They help a bit with everything.
In your case, the more applicable description would be the HTML, CSS and JS generalist that figures out other stuff as needed. Since there's usually teams in place to handle the specific stack elements already.
I feel like the market is big enough at this point that you could choose either "style" mentioned, or something in-between, and find a job somewhere. Whether or not style A pays better than style B for the work needed is a different story I guess.
Full stack teaches the attitude of "I can figure this out". This knowledge is the bare minimum of what one needs to build a modern application alone. It IS crazy, and it's incredible to be a generalist. That said, humans work SO well when the specialists and generalists work together.
I agree with this wholeheartedly.
Full stack dev's are the jack of all trades in web dev. I'd certainly trust a design team to get the UX just right, more than I could. I'd certainly trust a DB admin to get the schemas all laid out correctly. Even if I could design and normalize an okayish one myself.
But if you just need it done, a full stack dev should be able to help out with a majority of less intensive and specific tasks in any part of the stack. IMHO.
This is why C# is awesome! With Entity Framework you don't need to know SQL and or create tables, and Blazor will kill the need for angular or react, and the need of creating two models, one for the front and other for the back end.
A full stack developer is just someone with the ability to introduce technical debt in any layer of the stack
This is a great primer for what a full-stack dev should know. +1
Don't you mean "...crazy fun" 😁
That's a very encouraging post 👍👍