En annan utvecklares showmodul fastnade i samma problem. Där blev fixen en hel utvecklingsplan. Jag hade redan flyttat problemet till en central scheduler.
Jag följde samtidigt en fristående showmodul som löste många liknande radioproblem. Där fanns separata timers för flera typer av prat. När kollisionsproblemen började synas behövde utvecklaren inte bara rätta en liten detalj.
Fixförslaget växte till flera tydliga utvecklingssteg. Först skulle de befintliga timerreglerna extraheras till en gemensam planerare utan att beteendet ändrades. Därefter skulle riktig arbitration slås på med tidsfönster, min-gap och prioritet. Som ett tredje steg kunde generativa segment läggas in som lågprioriterad fill.
Det intressanta för mig var att jag redan hade dragit samma slutsats i min egen kod: dispatch måste centraliseras, policy ska fortfarande ägas av respektive modul.
timer_hourly → maybeTalk()
timer_ident → maybeTalk()
timer_banter → maybeTalk()
timer_feature → maybeTalk()
// Alla tror att de äger minuten.oneMinuteTick()
↓
collectOpenSlots()
↓
evaluatePolicies()
↓
arbitrate()
↓
fire | wait | missDet här var en av de tydligaste punkterna där jag kände att min egen kodbas hade vuxit förbi “patcha en befintlig radio”. Jag hade redan byggt en generell lösning på den typ av problem som fortfarande behövde brytas ut i flera steg i referensmodulen.
Jag tog också med mig något viktigt från deras problem: den centrala schedulern får inte börja duplicera alla andra regler. Listener-gate, budget, showstatus och skill-cooldown ska fortfarande avgöras av sina egna policyfunktioner. Schedulern ska bara avgöra vem som får använda tiden.
Referensmodulens problem gav mig en extern kontroll på min egen arkitektur
Det är lätt att bli hemmablind i en egen kodbas. När en separat utvecklare beskriver samma problem och landar i en väldigt liknande central scheduleridé blir det ett slags oberoende validering.
Jag tog samtidigt med mig deras tydliga uppdelning mellan dispatch och policy. Det är lätt att en central scheduler växer och börjar bestämma allt. Då har jag bara flyttat monoliten. Därför vill jag behålla listenerpolicy, budget och skill-cooldowns i sina egna moduler och låta schedulern konsumera svaren.