Misha A
09/18/2025, 7:11 AMMarek Rogalski
09/18/2025, 7:36 AMMisha A
09/18/2025, 7:40 AMMisha A
09/18/2025, 7:45 AMGeorge
09/18/2025, 10:01 AMMisha A
09/18/2025, 11:40 AMTom Larkworthy
09/18/2025, 11:53 AMMisha A
09/18/2025, 1:09 PMMisha A
09/18/2025, 1:14 PMGeorge
09/18/2025, 2:24 PMJari
09/18/2025, 2:25 PMDaniel
09/18/2025, 3:08 PMJared M. Smith
09/18/2025, 5:02 PMLibraries are the easiest case of all, especially pure ones.Elm has spoiled me to everything else. 😊
Misha A
09/18/2025, 5:46 PMMisha A
09/18/2025, 5:51 PMTom Larkworthy
09/18/2025, 6:40 PMrequired fields because they prevent future migrations. Every long lived proto message is stacked with deprecated fields, but they are at least costless on the wire.
A fancy DB migration technology I keep staring lustfully at is https://pgroll.com/blog/introducing-pgroll-zero-downtime-reversible-schema-migrations-for-postgres but I have never used it (its docs even say it implements expand and contract).Bill Mill
09/19/2025, 1:07 AMMisha A
09/19/2025, 4:06 PMTom Larkworthy
09/19/2025, 4:10 PMMisha A
09/19/2025, 4:11 PMMisha A
09/19/2025, 4:13 PMBill Mill
09/20/2025, 2:14 AMMisha A
09/20/2025, 8:48 AMMisha A
09/20/2025, 9:04 AMOnce a field was exposed in the public API, it would be exposed forever unless it became a security problemNitpick: you mention 1 reason to remove field yourself: security. What you call API here, seems to mean api response. Adding new fields to existing response is safe (for some formats, like json), keeping old fields is doable and +- cheap. But API is not only response but a request too: where ignoring incoming args is safe, cheap and easy, but requiring new args is backward incompatible. A very good break down of this asymmetry is in video linked above:
Tom Larkworthy
09/20/2025, 9:11 AMDaniel
09/20/2025, 9:29 AMMisha A
09/20/2025, 12:52 PMv19 as the oldest available version in that table 🙂 (and yes, there were at least 18 major versions, and the v1 is just 7 years old), and quote https://developers.google.com/google-ads/api/docs/sunset-dates#differences_between_deprecation_and_sunset
> API endpoints for the sunset versions stop working after the sunset dates. The Google Ads API will throw an error if you try to access the API endpoints of the sunset versions.
Meaning even top100 money bag in the world choses to shut down 1yo apis (v19 release February 26, 2025, shutdown February 2026)Misha A
09/20/2025, 12:52 PMTom Larkworthy
09/20/2025, 12:59 PMTom Larkworthy
09/20/2025, 12:59 PMMisha A
09/20/2025, 1:01 PMGiven that we (tried very hard to) never make backwards incompatible changes to the database, the *app*s would check at startup that their database schema version number was greater than or equal to the database version number stored in the database, and refuse to start if they were not.
This was a general pattern: If an app encountered any unexpected or missing configuration, it refused to start and threw noticeable, hopefully clear, errors.:) Everything is way easier for internal "network of apis and clients", simply because you can have dashboard with all mismatches. "Internal apis" - is an important qualifier to any "never do this" and "easy to do that". On the other hand: I use your api. You don't even know this. You shut down v1. My app does not start anymore. You never see this. What do I do? What do you do? :)
Misha A
09/20/2025, 1:04 PMI think Google ads is a special caseit only takes 1 "I just don't wanna" from your transitive api dependency vendor to force you to shut down your v1, not even any legal, math, funding, security reasons.
Bill Mill
09/21/2025, 4:05 PMI use your api. You don’t even know this. You shut down v1. My app does not start anymore. You never see this. What do I do? What do you do? :)It would be a long process of announce a deprecation a long time in advance, add warnings, eventually when it’s close to being shut off do announced intermittent blackouts, then finally shut it off. It would be extremely protracted and painful, but that was appropriate to the API we were building - it was a big commitment
(you, gov, payment processor) need a new [required] field [in the request]? – breaking change.yes, absolutely! That would be a new endpoint, that is a consequence of this API design. You can add endpoints safely but not add a required field to them. This isn’t a gotcha, that was the design
Misha A
09/22/2025, 3:33 AMGeorge
09/22/2025, 4:14 AMEvery program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.I like to think of the chain of callers like a rubber band. As one side changes, it puts pressure on the other end to keep up. You can only hide the issue behind backward compatibility layers for so long until something breaks.