I’ve started my software engineering career by chance.
I’ve studied a bunch of HTML, CSS, ActionScript and PHP at high school, and I started to make websites as an hobby, without even asking for a revenue.
During my last high school year, I did an internship in a creative/web agency, and my life changed forever.
I also wrote code for some big companies and foundations (Facebook, Linux Foundation, Apache Foundation, Maserati, ViacomCBS).
I can create a complex realtime and distributed system on my own.
I can design its architecture and write its backend code using a microservices architecture.
I can develop its frontend using React, Vue, Svelte, SASS, Stylus, Less or just plain CSS.
I can setup a CI/CD process and deploy that application on AWS, DigitalOcean or somewhere else.
I’m not saying that I am the best developer at writing architecture or backend code.
I’m not the best developer for writing frontend code.
I’m not the best devops engineer.
I just can do it, because I love to do that, just like any other developer.
Biggest tech companies will never want to hire me
That’s a fact.
FANG companies (Facebook, Amazon, Netflix, Google, just to name few) won’t never be interested in hiring someone like me, just because I’m not a specialist
I love the “On being a generalist” article from Flavio Copes, ’cause he described exactly my thoughts about that topic:
You’re a specialist if you’re a developer focusing on React and you just do that. You even call yourself “React developer”.
You’re a generalist if you know and use React, but also know Vue, you can design a page in Figma and translate that design into a React component with CSS. Plus, you also know how to deploy an application to Heroku.
I highly recommend to read that article in order to understand what I mean.
The problem is that big tech companies doesn’t really care about “generalists”.
Let’s say that I want to apply for a position at Google.
During the interview process, I may be asked to solve some Leetcode or HackerRank problems, just to show my knowledge about algorithms and data structures.
But guess what? I have a very little knowledge about that.
That’s because 99% of the time, in 2020 you’re developing REST/GraphQL APIs and some other similar stuff, that doesn’t really require a computer science degree (in web development, of course).
At time of writing, I have 7+ years of experience in professional software development, and guess how many times I had to choose between two different sorting algorithms? What about choosing between two different data structures?
I’m not saying that learning DSA (data structures and algorithms) is completely useless. I’m just saying that there are a lot of great developers that can do their jobs searching on Google for DSA.
And nice fact: after years of professional software development, it will be incredibly easy for developers to learn those algorithms/data structures.
Avoiding to hire devs just because of lack of knowledge about DSA is just stupid.
Developers should be hired for their attitude, curiosity, commitment and passion.
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.— Max Howell (@mxcl) June 10, 2015
FANG-like companies doesn’t really care if you are a fullstack developer. They just want you to be an expert in that given language and nothing more. You must be an expert in DSA because they just want to say that “they hire the best developers”.
I’ve met some amazing developers in the companies I’ve worked for, and FANG companies will never benefit from such great people.
By the way, I think I will never apply to one of those companies, ’cause I perfectly know that my experience doesn’t really mean anything to them and I would be rejected after a 10 minutes call because of what I wrote above.
It is harder to get some information
Since I started to learn React.js back in 2014, I’ve started to get attracted by the Functional Programming paradigm.
While coding FP in JS/TS/Elixir can be extremely easy, writing correct FP code in Haskell or OCaml can be really challenging.
Coding Haskell software without an academic background is hard, and all those “learn Haskell in one month” books doesn’t really help.
As I said before, without a proper academic background, it is harder for a self taught developer to understand which data structure or algorithm should be used and why.
An year ago I was writing a small Redis implementation in Node.js, and I needed a fast way to store and retrieve data in vanilla JS. It took some time to understand why the HashMap data structure could be the right choice for that task.
Same when I wanted to build my whole blockchain just for fun. I’ve never studied linked lists or Merkle trees, but after some research, I finally found out the answers to all of my questions.
Yes, it might be harder for us self taught developers to get access to some information.
But it doesn’t mean that we can’t do it.
Some companies just want a degree
I won’t spend much time on that.
During my professional career I’ve leaded a team of CS degreed developer and they didn’t even know that I don’t have any degree.
Guys, now you know.
Some consultancy companies just want developers with a CS degree just to tell their customers: “Hey, I’m putting a team of 10 Software Engineers with a CS degree for your project”. That happens a lot, but again, especially in web development that doesn’t really make a difference.
CS degree should be something useful for you as a person/professional, not for the company.
As a developer, you can always achieve the same results of a graduate engineer. Maybe it will be harder (and yes, for me it is way harder some times), but you can do it.
Impostor syndrome and burnout
That’s the worst part of being a self taught developer.
I’d summarize my thoughts with a Neil deGrasse Tyson quote:
As areas of knowledge grow, so too do the perimeter of ignorance
And that’s absolutely true.
The more I dig into a topic, language, paradigm, the less I feel I know about it.
That’s maybe because as a self taught developer, I don’t know what’s next.
“Oh great! So in order to print something to the console in Haskell I need to use the
“Well, but what is a monad actually?”
“A monad is just a monoid in the category of endofunctors, of course!”
“Awesome, what is an endofunctor?”
“It’s basically a functor from one category back to the same category”
“Cool, and wtf is a functor?”
“A functor is a map between categories”
“…ok but wtf is a category actually”
and so on.
Maybe some developers doesn’t really care about that.
But from my point of view, I feel “incomplete” without deeply understand what I’m doing.
Ok, I can print a string to the console in Haskell, awesome. But why should I wrap it into a monad?
Why is everything becoming so complicated?
Every time I discover something new, a new world seems to appear in front of me, and I have to explore it.
This makes me feel so ignorant.
And if I’m ignorant there’s no reason why I should work for X company.
Other developers are way smarter than me, because they seems to know everything.
I fear to loose my job because I’m not like the other developers.
I’m doing something so easy, that everyone could do it.
These are some of the most common thoughts that a self taught developer can have when he/she’s stuck with a problem, when he/she discovers something new and unexpected, or just when they read some amazing blog posts or open source software from other developers.
That leads to the burnout, which I actually experienced once and has been terrible.
I had to take two week of holidays because I didn’t want to code anymore.
I deleted most of my local repositories (thanks
God Linus there’s Git), I didn’t touch my computer for days and I just wanted to quit my job.
On the other hand, I also feared to loose my job because of my incompetence and my inability to get out of this bad situation.
That has been quite terrifying.
I think that impostor syndrome is something that many developers are facing every day (even the CS-degreed ones), and I know that sometimes I can go a little overboard.
Computer Science is a very competitive field, and I’m sure that I’m not the only one experiencing this.
By the way, there’s something I didn’t mentioned yet in this post.
I may seem a bit critic about the software development industry, but that’s not the purpose of this blog article.
Software development is a really complex job that can give great satisfactions to the ones that are doing it with passion.
Every time that I feel frustrated I try to look back and see how many things I did and how much I enjoyed doing them.
I can’t see myself doing another job.
I love to create things with code, ’cause code is freedom.