* Build rules were extremely simple to write
* Sandboxing meant we could safely share a global cache of build artifacts, massively reducing build times
* It runs a persistent server process that caches dependency and file change state, so incremental builds are fast
* Buck had a lot of android-specific magic to make APK generation fast as well, not sure if that's in bazel.
A lot of the stuff that's nice about these build systems only really becomes an issue on large codebases (thousands of engineers, tens of millions of LOC).
The main weakness of buck (not sure about bazel) was handling 3rd party code; either you'd checkin prebuilts or port the build to buck.