jcalder
Joined 3 years ago
Joined 3 years ago
They wanted to answer the questions of "is twitter biased against Republicans" so they measured it, turns out they favored republicans.
To synthesis my comment down (because it's easier once I've written it once, poorly):
The complexity you see in Bazel/Buck/Pants build files may seem like a result of their decision to use a programming language. That's a red herring. That complexity is fundamental to the problems people need to solve to build software. If you remove the ability to solve it in your build system the complexity will move to other systems.
Wrappers, CI, whatever. The complexity is just the problem space rather than a result of bad tooling.
Interfaces are VERY GOOD for migrations.
If you decide that you want to stop using some compiler flag, or maybe use a different compiler, or change your python version, or...
You can right a regex to go over all your shell invocations, change them, then test, or you can do something like:
``` def build_thing(name, srcs, hdrs, migration=False): if migration: ...
build_thing( name = "my_lib", srcs = ["my_lib.cc"], hdrs = ["my_lib.h"], ) ```
You can then manually flip that to test stuff, write a script to flip it for every team, sending out a PR (because your targets can have oncalls) and they can land it, and then at the end you can flip the default and manually add a False to the holdouts.
All this stuff gives you the ability to do hard stuff at scale.
I'm incredibly skeptical of this.
I'm ex-meta and have worked a lot with the enterprise solutions you're talking about and the choice of starlark (originally python) as the build definition language is one of the killer features of the systems.
People want to create macros, target generators, etc. It's a common use case for a lot of engineers and IMO is a pretty killer feature.
Being able to say "This is an X86 Python Binary", "This is an M1 python binary" and then bundle those into "this is how you build either of those binaries based on inputs" without ever touching the internals or anything other than (more or less) a blob of python is why those tools scale organizationally.
It allows the teams that need to do weird stuff to unblock themselves without drowning the tools org. Sure, it has draw backs. Super deep macro layers are kinda a crime against humanity and debugging/evolving them can be quite expensive, but I think that's just the cost of software.
If that logic isn't in the build definitions it'll expand into a meta layer that generates configuration (I've seen giant "Translate this definition into 30 configs to run stuff" systems time and time again).
I may just be super biased from past mistakes and wins, but I think what you're doing is just moving the complexity out of your tool into neighboring tools and selling it as a win isn't really true, it's shuffling complexity around not removing it.