Google is like grad-school. People value working on hard problems and doing them right. Things are pretty polished, the code is usually solid, and the systems are designed for scale from the very beginning. There are many experts around and review processes set up for systems designs.
Facebook is more like undergrad. Something needs to be done, and people do it. Most of the time they don’t read the literature on the subject or consult experts about the “right way” to do it, they just sit down, write the code, and make things work. Sometimes the way they do it is naive, and a lot of time it may cause bugs or break as it goes into production. And when that happens, they fix their problems, replace bottlenecks with scalable components, and (in most cases) move on to the next thing.
Google tends to value technology. Things are often done because they are technically hard or impressive. On most projects, the engineers make the calls.
Facebook values products and user experience, and designers tend to have a much larger impact. Zuckerberg spends a lot of time looking at product mocks, and is involved pretty deeply with the site’s look and feel.
Google is really big. There are multiple teams doing the same thing and don’t know about each other. There are teams that strongly believe that other teams should not exist. There are giant sections of Google that have been described as “non-Google” because of culture drift and acquisitions. When you go to the holiday party, you will not know 95% of the people there.
Facebook is much smaller, and while you won’t know everyone (or even the majority), you will probably recognize 25% of the engineers. There is sometimes duplication of work, but it is almost always intentional. Facebook is growing, and there is no reason to believe that the problems at Google wont start showing up, but it has not happened so far.
Because of its size, Google can place big bets, and try ambitious world-changing things. A project that makes tens of millions of dollars is not interesting enough for them to even try. There are many ambitious projects, most of which fail, but the successes are pretty inspiring. They can support world-class research into anything computer-science related, and beyond. So if being at the frontier of computer science is what you want, and you are good enough to convince the Google management structure to not place you into one of the many critical but not very interesting teams, Google might be the place for you.
Google has some amazing engineers. There are people at Google that have made the computer industry into what it is today. It is very unlikely that you will work with, or interact with those people. In general, the quality of the people you work with will still be very high, especially if you find yourself in one of the core teams (Search or Ads). There is a good number of academics, and Googlers are often seen presenting their work at top-tier conferences.
There is also (according to my friends at Google) a noticeable number of people that should have never been hired and the company seems reluctant (or unable) to remedy that. But, in general, Google has very smart people, who are experienced, passionate, and do good work.
Facebook engineers are typically younger, and many are less experienced. There are only 400 of them, and Facebook is much more willing to fire people. So I would say the median quality of engineers at Facebook is higher, but Google has some strong outliers.
Because Google is so big, management plays a much bigger role. There are many VPs, directors, managers (not all technical), and tech-leads. Most managers are competent, and I have almost never heard engineers disliking their managers. But there are turf wars and ideological conflicts on many levels. Google’s culture is that decisions should be distributed and made bottom-up. This means engineers and project teams have a lot of freedom but it makes it difficult for teams to cooperate.
All of Facebook’s managers are technical, many have switched to the management track from engineering. There is one VP of engineering, a few directors, and a bunch of managers. So things are not completely flat, but reasonably so. Due to the size of Facebook, the hierarchy is much less important, since it’s actually possible to develop relationships with people through out the company. This means there is a lot more peer-to-peer communication/collaboration than the management structure enables. Some of the managers at Facebook are new to management (having recently switched from engineering) and may not be as good at management as you may like. That said, I’ve been very impressed by the diligence with which they approach their new role, and the effort Facebook puts into selecting the right candidates.
At Google it’s often hard to feel like you have real impact. Many (most?) people make incremental changes to existing systems to improve stability, performance, or add minor features. Improving the throughput of a GFS cluster by 5% is huge, saves Google a ton of money, and improves the search experience of hundreds of millions of people. But it takes effort to feel like improving something by 5% is actually meaningful.
Products have to be built to scale, and have a fairly high level of polish and maturity before release. Before a project launches there is a long checklist of things it needs to handle (such as internationalization, logging, security, etc.). Even if your product was completely finished, working, and bug free, it can take months to go through the checklist and actually launch.
On the other hand, when you do launch, hundreds of millions of users will notice, and that’s awesome.
At Facebook, I had checked in code my first day there and it was pushed to the live site on the next day. There were bugs, and emergency pushes to fix those bugs, but a few days later my code was running in production and millions of people were benefiting from it. That was three years ago and it’s still the case now. In general new-hires have code go live in their first week, maybe first two weeks. Chances are pretty high that your code is directly visible by users, though as the company grows, there is a lot of work on internal tools as well.
Facebook is full of low-hanging fruit, as well as important systems that need to be replaced to handle orders of magnitude and more data, so if you want to feel like you have an impact, it’s easier at Facebook. The most critical infrastructure projects are the work of small teams, so you get to work on v0 of a system instead of v5.2.
The base salaries at the two companies are pretty close, with Google offering a bit more. Google also has an annual bonus targeted at 15%, but with various multipliers. The years I was there, it was more like 30%. Additionally, Google grants RSUs which (on expectation) should also be in the 15%-30% over four years. They will also pay for you to continue your education, and make it relatively easy (and cheap) to get a Masters from Stanford or CMU while you work at Google. They also match your 401(k) contributions which is an additional $7k, tax-deferred.
Facebook’s bonus target is 10%, but goes up non-linearly for high-performing engineers. Facebook is private (as of 2010), so deciding on the value of their RSUs is hard. Secondary markets might give reasonable estimates, but no one knows for sure. Furthermore, you will not be able to sell your shares until Facebook IPOs, and it’s not clear when that will be.*
In general, perks are better at Google. Facebook’s cafe is very good, but Google has gyms, a dance studio, a steady stream of interesting speakers, ski trips, and cellphone giveaways.
Facebook has subsidized laundry service.
*Based on information from 2010.