Meta developer tools: Working at scale
I&#x27;ve worked for both Facebook and Google so can make informed comments on this with two exceptions: Buck2 came after I left and I&#x27;m honestly not sure what sapling is. Is it some Mercurial-like re-implementation a bit like how Google&#x27;s Piper is a re-implementation of Perforce?<p>The tl;dr is that Google&#x27;s developer tooling and ifnrastructure is superior in almost every way. Examples:<p>- When I started at FB we used Nuclide, an internal fork of the Atom editor. While I was there it was replaced by VS Code. It&#x27;s better but honestly they should&#x27;ve built their tooling off of Jetbrains products. Jetbrains make IDEs. VS Code is a text editor like vim or emacs. There&#x27;s a massive difference;<p>- Buck should&#x27;ve been killed and replaced by Bazel. I can&#x27;t speak to Buck2 but this seems like a pointless investment;<p>- Thrift should be killed and replaced with gRPC&#x2F;Protobuf. Same deal;<p>- FB&#x27;s code search is just grep. It&#x27;s literally called BigGrep. Grep can get you pretty far but it&#x27;s just not the same as something with semantic understanding. Google has codesearch, which does understand code, and it&#x27;s miles ahead. This has all sorts of weird side effects too, like Hack code at FB can&#x27;t use namespaces or type aliasing because then grep wouldn&#x27;t be able to find it. When there were name conflicts you&#x27;d sometimes be forced to rename something to get something to compile;<p>- Tupperware (FB&#x27;s container system) is a pale shadow of Borg;<p>- Pushing www code at FB is a very good experience overall. You commit something and it&#x27;ll get pushed to production possibly within an hour or two or, at busier times, it might take to the next day. This requires no release process or manual build. It&#x27;s basically automatic; Google&#x27;s build and release process tends to be way more onerous;<p>- The big achillees heel in FB&#x27;s www code is that it is one giant binary. There&#x27;s no dependency declaration at all. This means there&#x27;s an automatic system to detect if your change affects other things and that process often fails. This leads to trunk getting broken. A lot.<p>- Because of the above problem there is a system to determine what tests to run for a given commit. This is partially about what the affected components are but also longer-running tests aren&#x27;t run-on-commit and often those tests would&#x27;ve found the problem. There is no way to say &quot;if this file is modified, run this test&quot;. That&#x27;s a huge problem;<p>- FB has a consistent system for running experiements and having features behind flags (ie gatekeeper). This wasn&#x27;t the case when I was at Google. It may well have changed;<p>- Creating a UI for an internal tool or a new page is incredibly easy at FB. There are standard components with the correct styling for everything. If you want to write an internal tool, you can start at 9am and have it in production by noon if it&#x27;s not terribly complicated;<p>- The build system for C++ at FB is, well, trash. For Buck (and Bazel), the build system creates a DAG of the build artifacts to decide what to build. FB C++ might take 2 minutes <i>just to load the DAG</i> before it builds anything. This is essentially instant at Google because a lot of infrastructure has been built to solve this problem. This is a combination of SrcFS and ObjFS. Incremental builds at FB to run tests doesn&#x27;t really work as a workflow;<p>- All non-www builds at FB are local builds. Nothing at Google (on Google3 at least) is built locally, including mobile apps. This is way faster because of build artifact cachcing and you have beefier build machines.<p>- There tends to be less choices as to what to use for FB code (eg storage systems). I consider this largely a good thing. You will typically find 5 different way of doing anything at Google and then need to consider why. You will often find different teams solving the same problem in slightly different ways or even the exact same way.<p>- There are people at FB who work on system-wide refactors (eg Web security, storage). These people can often only commit their diffs that might touch thousnads of files on weekends.<p>- A lot of generated code is committed at FB that isn&#x27;t at Google. This exacerbates the previous problem. FB has a ton of partially and completely generated files that mean a change to the generating code has a massive effect. At Google, for example, the protobuf generated code is genearted at build time and isn&#x27;t in the repo.<p>There&#x27;s probably more but that&#x27;s what comes to mind.