Again, I’ll defer to @chreekat to set the policy for the code, but from my view, the random-drop adds unnecessary complexity to the code, and I don’t think dev’s should have to accept that at this time unless they are fine with it.
The calculation is then repeated since the patron count changed, and any additional auto-drops are triggered
Here’s why it’s so extra complex with the randomness. So:
- Given the rare case where multiple patrons are at their budget limit
- One pledge to one project puts all those patrons over
- If the random drop from one patron reduces a different project which is not also a project of the other patrons, then it leaves the other patrons over-budget still and thus requires all this extra repeating of the calculation until we’re sure nobody is over-budget.
Here’s the screwiest case:
- 20 patrons at budget-limit, all pledged to project A and several others which are all distinct among all the patrons
- The random drop happens to drop projects except A from the first 19 over-budget patrons
- The 20th patron randomly drops project A.
- Now all the other patrons have room to fit in all their dropped projects without being over-budget (they could have not had any drops).
Sure, this all happens when they are close enough that dropping is likely anyway. But in this instant, we’re talking about 20 rounds of calculations with 20 patrons getting notifications, and 19 of them come back to see that they are allowed to manually pledge back the exact project that was dropped for them and feel confused about why they were dropped.
Also, from the projects’ perspectives on UX, there’s a level to where we are asking projects to understand that there’s some degree of trade-offs between projects (popular projects can eat budgets and leave less for others…), but I think it gets worse to allow this case: “wait, I had X patrons, but now I’ve lost patrons just because other people (not my patrons) pledged to some other project??” (we’d never see a situation where a successful Kickstarter project causes another Kickstarter project to fail, so anything in that direction is already uncomfortable, and I suggest we minimize that effect other than the basic concept of system-wide budgets at all).
There’s so many interactions when we allow this more complex dropping process and so much increase in calculation and code complexity by having drops that don’t affect the project that got the new pledge.
To put it one last way:
If we always drop the same project that got the pledge, the code tests are extremely simple. It’s always one pledge, one drop, same project. Done. Never a need to check for other patrons still being over-budget. The first drop is all that’s ever needed.
If we drop project B after a pledge comes to project A, there’s no guarantee about whether or not there are other patrons over-budget still, so there needs to be all these extra calculations and tests etc.
Last thing I’ll say on this: having made the above points clearly, if @msiep wants the UX to allow any sort of scenario where pledge to A results in a drop to B, that’s his decision on design. But this is a case where @chreekat needs to be able to veto this. So, if @chreekat wants to go with @msiep’s design, fine. But @chreekat needs to hold the veto here, and I encourage him not to accept what seems to me to be a much bigger code burden for what seems to be dubious value to me on the design (since it introduces real issues with UX as well, as I mention above).
Since this whole issue only happens at the edge-point of just going over-budget, the simplest implementation seems the best to me.