Essay · Frameworks
Calendars as Source Code
Your calendar is the source code for your week. Treat it with the same rigor you'd give production systems.
Engineers spend hours reviewing code before it ships to production. We run tests, check for edge cases, debate naming conventions. Then we accept meeting invites without a second thought and wonder why our weeks feel chaotic. The calendar is the most important system most of us never design intentionally.
← Back to essaysThe calendar as codebase
Think of your calendar as a program that runs every week:
- Events are functions. Each one takes time as input and produces outcomes as output.
- Recurring meetings are loops. They run whether or not they're still needed.
- Back-to-back meetings are synchronous blocking calls. No room for error handling.
- Empty space is buffer. It absorbs unexpected load and prevents cascading failures.
Most calendars are legacy codebases: accumulated cruft, cargo-culted patterns, no one quite sure why half the meetings exist. We'd never ship code in this state. Why do we ship weeks like this?
Code review for calendars
Every Sunday evening, I review my calendar for the coming week the way I'd review a pull request:
- Purpose check: What is this meeting supposed to produce? If I can't answer in one sentence, it probably shouldn't exist.
- Attendee audit: Does everyone here need to be here? Am I a required reviewer or just CC'd?
- Duration test: Could this be shorter? Most 60-minute meetings can be 30. Most 30-minute meetings can be 15 or async.
- Placement review: Is this scheduled at a time that makes sense? Deep work meetings in the morning, administrative meetings in the afternoon.
- Buffer check: Do I have space between meetings to context-switch, take notes, or handle the unexpected?
I decline or shorten at least two meetings most weeks. Not rudely - just with a note: "I don't think I'm needed for this one" or "Can we try this in 25 minutes instead of 50?"
Design patterns for calendars
The maker/manager split
Paul Graham's classic essay describes two modes: maker time (long uninterrupted blocks for creation) and manager time (hourly slots for coordination). Most calendars mash these together randomly.
I designate specific days as maker days (minimal meetings) and manager days (meetings clustered together). It's not always possible, but even partial separation helps.
Office hours instead of open door
Instead of being available anytime, I publish office hours: two blocks per week when anyone can book time with me. This respects both my time and theirs. Questions that can wait, wait. Urgent issues still come through immediately.
Speedy meetings by default
Google Calendar has a setting for "speedy meetings" - 25 minutes instead of 30, 50 instead of 60. The five minutes back compound. More importantly, it creates a forcing function: you have to actually end on time.
Recurring meeting reviews
Every quarter, I audit recurring meetings. For each one: Is this still necessary? Should the attendee list change? Could the frequency decrease? Recurring meetings are like subscriptions - they quietly accumulate until they consume everything.
Anti-patterns to avoid
| Anti-pattern | Why it's harmful | Alternative |
|---|---|---|
| Tetris calendar | No room for the unexpected | Block 20% as buffer |
| Status meetings | Updates that could be async | Written updates, meet only to discuss |
| Zombie recurrings | Meetings that outlived their purpose | Quarterly recurring audit |
| Early morning ambushes | Destroys morning focus time | No meetings before 10am |
| Friday afternoon commits | Decisions made when energy is lowest | Keep Fridays light |
The meeting as function
Good functions have clear inputs, outputs, and single responsibilities. Good meetings do too:
interface Meeting {
purpose: string; // One sentence max
inputs: Preparation[]; // What attendees should bring
outputs: Decision | Action[] | SharedContext;
duration: Minutes; // Shortest possible
attendees: Person[]; // Minimum viable set
}
If you can't fill in this interface for a meeting, the meeting isn't ready to be scheduled. This isn't bureaucracy - it's the same discipline we apply to writing clear code.
Protecting the schedule
The hardest part isn't designing a good calendar. It's defending it. Other people will constantly try to write to your codebase.
- Block deep work time first. If you don't schedule it, it won't happen.
- Set working hours. Make your availability explicit, not infinite.
- Practice declining. "I can't make this work" is a complete sentence.
- Propose alternatives. "I can't attend but here's my input async" is often enough.
You're not being difficult. You're being a responsible maintainer of a critical system.
The meta-lesson
The real insight isn't about calendars. It's about intentionality. Most of us let our weeks happen to us. We accept defaults. We inherit patterns. We wonder why we're exhausted.
Engineers know that good systems don't emerge by accident. They're designed, reviewed, iterated, and maintained. Your week is a system too. Treat it like one.
Try this week
- Open your calendar for next week
- For each meeting, write down its purpose in one sentence
- Identify two meetings you can decline, shorten, or make async
- Block two hours for deep work before anyone else can claim them
- At the end of the week, retro: did the changes help?
Small changes compound. A calendar that serves you instead of depleting you is worth the investment.