A recent project involved turning a manually bash-scripted loadsim into a CI-triggered deployment gate, which was parameterizable, handled system-under-test provisioning and cleanup, observable, and uploaded its results to block storage. You can probably tell where this is going: it took longer than expected. Why, though? By all accounts, the task is straight forward, and there are no "wow I'm not even sure how we'd do that" type subproblems involved. My take, though, is that graphs explain why, and particularly going from no graphs to many explicit graphs is the specific reason.

To set the stage, I'll provide the before and after:

I'll stop there, but you can see how each of these things blows up. Were this "implicit graph" mode, we could just add lines to the bash script to do the marginal thing, and say "we aren't going to generalize this". It would be easy to break, as the dependencies between the concepts are completely implicit (manifest at runtime by what it does, not defined by and explicit model).

All of the pain and inaccuracy in estimation/planning came from the turning of implicit relationships into explicit graphs:

Why did we have to pay down this debt now? Well, we're going from "thing we run on our laptops sometimes" to "thing that runs every time we want to merge a related PR", where the latter has much higher quality expectations.