I overlooked that all tagged fields are optional. Builders would only make sense, if tagged fields could be required. Also, I'm not sure if they would be possible for structs with non-tagged fields and if they would even be useful in that case. So, you can ignore that idea.
The way I see it, tagged fields give you the flexibility at the cost of a slight size/performance overhead. And they also require additional manual labor for validation.
Non-tagged fields are inflexible (changes are not backward/forward compatible), but they are simpler to work with and more performant. Changes require API versioning.
For simple types it often doesn't make sense to use tagged fields. For example, for types like GeoCoordinates(Latitude, Longitude), tagged optional fields only add unnecessary complexity, without any real benefits. Another Protobuf limitation I dislike.
> Have your experiences differed; Where you’re frequently removing fields from existing types?
Not really (but I don't have much experience with large systems). I think that adding new fields is most common by far. Adding a new required field can be "dangerous" as an updated server won't be able to read old messages anymore (unless API is versioned of course).
I think that ability to have have either tagged or untagged fields in Slice is great.
> we’re literally releasing support for them tomorrow! Although we call them “enums with fields”
That's great! I don't care what they are called as long as they are available :)
Regarding varints, how does your QUIC like implementation compares to something like this[0]? Any thoughts on pros and cons?