To preface my answer: I don't work at one of the companies you mentioned, but before I joined a graduate program I didn't have any undergraduate degree and I still worked in the industry just fine. I am reasonably certain I'd be hired at at least one of them if I tried, and I've been invited to interview at one of them a few times by a specific team.<p>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.<p>The knowledge you're missing (specifically for the interview process) comes in two flavors: breadth and depth.<p>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.<p>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.<p>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.<p>Functionally, in an interview you'll be doing the following:<p>1) Receive problem,<p>2) Think about the problem before diving into it, and map the problem to a first order solution,<p>3) Test the solution to reasonably account for edge cases,<p>4) Now improve your solution's complexity for time or resource requirements.<p>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.