I'm very annoyed that all fields are optional. Which means I have to do additional validation on server side and in a language like rust it's double annoying because now you have `T` or `Option<T>` and it's confusing for some types:
- `string` will be rust's `String` except it is an empty string by default - All "custom" types are `Option<T>` even if that makes no sense semantically
So now you have to check if a string is empty, which I guess is technically a string anyway. However, now you have no idea, it is an empty string as a value or lack of value? You end up wrapping `string` into a `StringValue` and now linter is complaining that you shouldn't use those.
Overall parser for protobuf messages got simpler, but now enforcing safety is on server's implementation.
Which is even more crazy then missing parts have default value, when you consider how that behaves in some cases of mismatching schemas (it also can introduce annoying limitations when trying to create idiomatic libraries in some languages, especially such with "type-safety").
And then add in some of the "automatic type conversions it does".
And to top if of some edge cases tend to very often diverge in implementations of different languages, no matter what the original intention was.
And the result is uh, just uh, very very uh.
I understand why google uses them, it fits them. It probably a good idea given google scale problems, company and team structure and "skill level" of each member.
But that doesn't mean it's a good fit for everyone.
> That is projected upon it by people who do not understand it.
This is the the most Googley response possible. If it's so hard to understand, maybe Google should have done a better job of explaining it?