Blocking a day that survives contact with reality
Start with deep work, and put it where your attention is best rather than where the calendar happens to be free. For most people that is the first two or three hours after they start, before the inbox has caught up with them. Everything else in the day can move around a fixed morning block. A fixed morning block cannot move around everything else.
Batch the small stuff. Email, code review, Slack, expenses and the rest are cheap individually and expensive when spread across the day, because each one costs you the re-entry into whatever you were doing. One admin block after lunch and one at the end of the day covers almost everything, and anything that genuinely cannot wait an hour was never going to fit in a plan anyway.
Leave at least a fifth of the day unblocked. Work runs long, people interrupt, and a day with no gaps turns the first overrun into a cascade. Slack is not wasted time. It is the reason the rest of the plan still holds at 4pm.
Put breaks in as real blocks with real labels. A break you did not plan gets taken anyway, just later, longer and with more guilt attached. The point of all this is to decide once, in the calm minutes before the day starts, so that you spend the day working instead of choosing. A plan you never look at again was still worth writing. See the guide for developers for how this holds up against on-call and code review.