I used a bootcamp to get my foot in the door. I studied college textbooks in my spare time for a few years to fill some of the gaps in my knowledge, and then hardcore interview prepped for a few months leading up to my interviews. I got accepted into all of the tech giants and ultimately decided to go to Google.
This is by far the best job I've ever had, and I couldn't be happier with how this all panned out.
People vastly overestimate how much you need to know to get a job at a tech giant. Not everyone at Google is a computer science or math wizard - in fact, the number of jobs that require people with highly specialized knowledge is quite low. Most people are doing the same app development you'd do anywhere else.
Unlike you, I have a CS degree, and I've applied to the top five a few times now. Microsoft and Amazon contacted me, and after I agreed to an interview they both went quiet. Facebook never got back, and Google rejected me twice after sending in my CV.
I've tried a number of ways, through LinkedIn, direct applications, and even asking face-to-face at conferences, but it feels like I've angered some almighty tech god because none of them seem remotely interested, or are happy to tease me with an interview, only to ignore me after I reply.
I've always assumed that if it's this hard for me, then it must be as hard, or harder for others, so it'd be interesting to hear about the actual process of getting an interview from your perspective.
If I were to take a guess, I'd say that I got a bit lucky - right place/right time sort of thing. I had a few years of experience under my belt, which separated me from the new grads, but not so many years of experience that I'd be competing with senior engineers. On top of that, I applied for front end positions, which I think tech giants have only recently started to value - this has left a bit of a void that needs to be filled, which possibly made it easier for me to get the initial recruiter calls.
My resume was also relatively strong for someone with two years of experience. Solid university, strong GPA, and at my previous jobs I always tried my best to wiggle myself into taking on large projects and write tooling to make everyone's lives easier. This gave me a lot of stuff to talk about during the interviews and made for some impressive looking bullet points.
My personal resume consisted almost entirely of my work accomplishments with a few lines for my education. No side projects.
My personal journey took ~2.5 years. I didn't think it was possible to get into a tech giant out of bootcamp so I never tried. Worked two different jobs for a year each, figured I'd give the interviews my best shot, and got accepted.
For background knowledge, I used Algorithms 4th ed. as my textbook. My source of practice problems was LeetCode - did a few/day over the course of around 6 months leading up to the interview.
I personally applied as a front end engineer, but the only difference is that the system design interview question gets swapped with a front end focused one. Within Google my official title is still "Software Engineer" and I'm expected to work across the stack.
I have a copy of CLRS on my desk, but I actually found Algorithms 4th ed to be the perfect level of difficulty for someone with no math or CS background.
While I am self-taught and without a CS degree, I did spend 4 years at a top 15 PhD program in mathematics (UIUC), and have undergrad degrees in math & physics.
After leaving grad school, I was desperate for any career track job - after 2 years of fruitless job searching, I got fed up and started teaching self whatever skills I felt I needed. Observing lots of web developer positions open, I decided to target programming skills. Half a year after then, I got my first job as a frontend web developer. Turned out I loved the work, and invested a lot of hours outside of work investing in myself to improve my skills. I also was introduced to the world of open source, and guided to contribute. Fast forward to today, I have 4 1/2 years of web development experience, predominantly frontend but about two years working across the stack. I have architected frontends for most of my career, as well as done some major open source work.
So, it could be just a memory exercise. If you practice on leetcode and memorize about a 100 different problems, then you should be able to get in any of these companies (as illustrated by other people here).
Last but not least, to really answer your question, you basically feel pressured to deliver a lot in a small period of time. Not once, not twice, always. You get judged a lot on your abilities and at the end of the day, you still work on products that solve very basic problems - web app, mobile app, e-commerce, social, etc.
It's all about fear and ego. Was I able to work at one of these top companies? Am I the smartest employee in my group? Is my annual package bigger than my friends packages? Am I wearing a t-shirt of my employer during the weekends? Things like that... from experience, you should be hunting for a much bigger opportunity in life. Go where things don't exist yet and don't get distracted by very successful people like zuck, jobs, gates, etc. who have built empires. Do you want to work for their missions or yours? Use them as examples, don't work for them!
It's going to be hard to be hired at one of those companies without previous experience, whether that is through academic accreditation or through relevant work experience. So if you're already working as a developer in some capacity that's a good first step.
The knowledge you're missing (specifically for the interview process) comes in two flavors: breadth and depth.
In terms of breadth, you want to understand databases (applied set theory, you can focus on RDBMS), networking, computer architecture (including latency and memory), and system design.
In terms of depth, you want to dive into complexity theory, algorithms and data structures. You'll want to know data structures and algorithms such that you can both implement them and reason about their asymptotic complexity. Specifically, know data structures (arrays, linked lists, stacks, queues, etc) and algorithms (searching, sorting, graphs, etc) and know their respective complexity classes.
On a practical note, you should practice whiteboard coding for implementing the foregoing as well as 1) testing your code and 2) incrementally improving it (i.e. get comfortable writing a reasonably quick solution to a problem, then grappling with it to improve the approach and make it faster). You'll also want to practice mapping problems to the algorithms and data structures you've learned.
Functionally, in an interview you'll be doing the following:
1) Receive problem,
2) Think about the problem before diving into it, and map the problem to a first order solution,
3) Test the solution to reasonably account for edge cases,
4) Now improve your solution's complexity for time or resource requirements.
I can't comment on how happy the working environment is, but I'm familiar with folks working at at least two of those both with and without CS degrees. It's not at all an insurmountable hurdle; the biggest obstacle is taking an inventory of your unknown unknowns and working through them.
After getting a very entry level PHP job based on reading a few O'Reilly books, I spent a couple years getting progressively less shitty jobs with progressively higher pay and levels of responsibility. By the time I got an interview with Amazon, I was a legitimate PHP expert. I read a book on Amazon's leadership principles and worked through Cracking the Coding Interview to prep for my interview loop at Amazon, and I'm pretty sure only one or two of my interviewers knew I didn't have a CS degree -- the rest didn't look at my resume.
Now that I've been at Amazon for two years, I don't think any employer would care about my lack of a CS degree. I'm certainly happy to be making several times more than I did in my previous career (French teacher).
Self-taught programmer here for a long time (later got a CS & Engineering degree at a UC).
I worked at Trimble, Stanford (with IITians) and many other Fortune 500 shops as a consultant without a degree. No problem.
The only thing a degree really solves it tells HR "candidate completed some hazing ritual, with a smattering of learning how to learn."
Some people look at degree as a pedigree, but it's mostly BS (and expensive).
The goal of certifications and degrees should be based on whether it's required by a specific industry (ie professional engineer) or job role (ie doctor).