Finding out if I’m overscheduled

If you’re anything like me, your task list is long and growing, but
the time you have is just as fixed. How do you manage that? I handle
that problem by looking at my calendar and my task list together when
I’m planning my day. I tend to be too optimistic about my tasks,
trying to schedule more into my day than I should. Fortunately, Emacs
can help me make sure I don’t overcommit. Here’s how it works.

When I create and schedule tasks, I try my best to add time estimates.
The numbers in the TODO headline represent minutes.

* TODO 15 Announce tea party
  SCHEDULED: <2007-12-08 Sat>
* DONE 30 Drop letters off at post office
  SCHEDULED: <2007-12-08 Sat>
* TODO 60 Write blog post about tasks
  SCHEDULED: <2007-12-08 Sat>
* TODO 60 Make book notes
  SCHEDULED: <2007-12-09 Sun>
* TODO 30 Start on my letter for 2007
  SCHEDULED: <2007-12-08 Sat>
* TODO 60 Follow up with DemoCamp contacts
  SCHEDULED: <2007-12-08 Sat>
  DEADLINE: <2007-12-09 Sun>
* TODO 60 Respond to mail
  SCHEDULED: <2007-12-08 Sat>

Then my custom agenda view looks like this:

Day-agenda:
Saturday   8 December 2007
  6:00......  --------------------
  8:00......  --------------------
 10:00......  --------------------
 12:00......  --------------------
 14:00......  --------------------
 14:00-17:15  Scheduled:  TODO Take another driving lesson - emergency stuff
 16:00......  --------------------
 18:00......  --------------------
 20:00......  --------------------
 22:00......  --------------------
              In   1 d.:  TODO 60 Follow up with DemoCamp contacts
              Scheduled:  TODO 15 Announce tea party
              Scheduled:  TODO 60 Write blog post about tasks
              Scheduled:  TODO 30 Start on my letter for 2007
              Scheduled:  TODO 60 Follow up with DemoCamp contacts
              Scheduled:  TODO 60 Respond to mail
              In 937 d.:  101 things in 1001 days
62.7% load: 225 minutes to be scheduled, 359 minutes free, 134 minutes gap

I’ll need to figure out over the next few weeks what kind of a load
threshold is good (you really don’t want to try for 100%), but at
least it’s visible!

(setq org-agenda-custom-commands
      '(("i" "My agenda"
         ((org-agenda-list nil nil 1)
          (sacha/org-load)))
        ;; ... other stuff goes here
      ))

(defun sacha/org-show-load ()
  "Show my unscheduled time and free time for the day."
  (interactive)
  (let ((time (sacha/org-calculate-free-time
               ;; today
               (calendar-gregorian-from-absolute (time-to-days (current-time)))
               ;; now
               (let* ((now (decode-time))
                      (cur-hour (nth 2 now))
                      (cur-min (nth 1 now)))
                 (+ (* cur-hour 60) cur-min))
               ;; until the last time in my time grid
               (let ((last (car (last (elt org-agenda-time-grid 2)))))
                 (+ (* (/ last 100) 60) (% last 100))))))
    (message "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap"
            (/ (car time) (* .01 (cdr time)))
            (car time)
            (cdr time)
            (- (cdr time) (car time)))))

(defun sacha/org-load (match)
  "Can be included in `org-agenda-custom-commands'."
  (let ((inhibit-read-only t)
        (time (sacha/org-calculate-free-time
               ;; today
               (calendar-gregorian-from-absolute org-starting-day)
               ;; now if today, else start of day
               (if (= org-starting-day
                      (time-to-days (current-time)))
                   (let* ((now (decode-time))
                          (cur-hour (nth 2 now))
                          (cur-min (nth 1 now)))
                     (+ (* cur-hour 60) cur-min))
                 (let ((start (car (elt org-agenda-time-grid 2))))
                   (+ (* (/ start 100) 60) (% start 100))))
                 ;; until the last time in my time grid
               (let ((last (car (last (elt org-agenda-time-grid 2)))))
                 (+ (* (/ last 100) 60) (% last 100))))))
    (goto-char (point-max))
    (insert (format
             "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap"
             (/ (car time) (* .01 (cdr time)))
             (car time)
             (cdr time)
             (- (cdr time) (car time))))))

(defun sacha/org-calculate-free-time (date start-time end-of-day)
  "Return a cons cell of the form (TASK-TIME . FREE-TIME) for DATE, given START-TIME and END-OF-DAY.
DATE is a list of the form (MONTH DAY YEAR).
START-TIME and END-OF-DAY are the number of minutes past midnight."
  (save-window-excursion
  (let ((files org-agenda-files)
        (total-unscheduled 0)
        (total-gap 0)
        file
        rtn
        rtnall
        entry
        (last-timestamp start-time)
        scheduled-entries)
    (while (setq file (car files))
      (catch 'nextfile
        (org-check-agenda-file file)
        (setq rtn (org-agenda-get-day-entries file date :scheduled :timestamp))
        (setq rtnall (append rtnall rtn)))
      (setq files (cdr files)))
    ;; For each item on the list
    (while (setq entry (car rtnall))
      (let ((time (get-text-property 1 'time entry)))
        (cond
         ((and time (string-match "\\([^-]+\\)-\\([^-]+\\)" time))
          (setq scheduled-entries (cons (cons
                                         (save-match-data (appt-convert-time (match-string 1 time)))
                                         (save-match-data (appt-convert-time (match-string 2 time))))
                                        scheduled-entries)))
         ((and time
               (string-match "\\([^-]+\\)\\.+" time)
               (string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry)))
          (setq scheduled-entries
                (let ((start (and (string-match "\\([^-]+\\)\\.+" time)
                                 (appt-convert-time (match-string 1 time)))))
                  (cons (cons start
                              (and (string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry))
                                   (+ start (string-to-number (match-string 1 (get-text-property 1 'txt entry))))))
                        scheduled-entries))))
         ((string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry))
          (setq total-unscheduled (+ (string-to-number
                                      (match-string 1 (get-text-property 1 'txt entry)))
                                     total-unscheduled)))))
      (setq rtnall (cdr rtnall)))
    ;; Sort the scheduled entries by time
    (setq scheduled-entries (sort scheduled-entries (lambda (a b) (< (car a) (car b)))))

    (while scheduled-entries
      (let ((start (car (car scheduled-entries)))
            (end (cdr (car scheduled-entries))))
      (cond
       ;; are we in the middle of this timeslot?
       ((and (>= last-timestamp start)
             (<= last-timestamp end))
        ;; move timestamp later, no change to time
        (setq last-timestamp end))
       ;; are we completely before this timeslot?
       ((< last-timestamp start)
        ;; add gap to total, skip to the end
        (setq total-gap (+ (- start last-timestamp) total-gap))
        (setq last-timestamp end)))
      (setq scheduled-entries (cdr scheduled-entries))))
    (if (< last-timestamp end-of-day)
        (setq total-gap (+ (- end-of-day last-timestamp) total-gap)))
    (cons total-unscheduled total-gap))))

On Technorati: , , ,

Random Emacs symbol: select-safe-coding-system-function – Variable: Function to call to select safe coding system for encoding a text.

Buying time: Experimenting with scheduling

One of my business validation experiments has suddenly kicked into high gear. People love the sketchnotes I’ve been taking. Since they’re interested in illustration and event coverage, I’m happy to take advantage of that opportunity to learn more about business. I want to see where we can take this. In addition, I want to connect with way more people and find out how I can help them.

I’ve been investing more time into delegation as a way to buy time and share opportunities. One of the small processes I’d like to delegate is scheduling, which can be quite stressful for me. I often review my mail on the subway, and it’s difficult for me to look up locations or refer to notes. I worry about time zones and missed connections, so I want to make sure that there are calendar entries at the right time, with the right people, and with backup contact information. As I dig deeper into validating business ideas and connecting with people, I’ll be trying to set up appointments with so many people that I’d worry about dropping the ball, not getting back to people, or not following up in case people haven’t gotten back to me.

Software tools such as ScheduleOnce aren’t quite there yet in terms of completely handling the scheduling process. I want to be able to delegate appointment-setting to someone who can arrange times, suggest venues, make sure important information is included in the event description, and follow up as needed.

One of my friends was open to the idea of working as my virtual assistant, so I set her up on oDesk and gave her access to my accounts. It’s good to know people you can trust with your Google account. While you can delegate without giving full mail and calendar access, some things are just easier when people can find what they need. I did set up a separate email account for her so that she wouldn’t have to clutter her personal mail with all the requests.

Even though we’re just starting out, it’s such a relief to be able to forward her mail and know that she’s going to keep track of things. We’re not quite at a smoothly running process yet, but maybe we’ll get there in the next few weeks. I’d love to get to the point where I have a few keyboard shortcuts for templates that explain what’s going to happen (including details she’ll need in order to plan), and she’ll follow up and make it happen. I’d also like to be able to keep track of the people that we’re trying to reach and where we are in the process. She’s been busy catching up with other work this week, but I hope that as her coursework settles down and we work out the kinks in the process, things will run even more smoothly.

I’m also experimenting with automated ways to make it easier to arrange times. ScheduleOnce seems to be the most promising of the bunch. Doodle often gets timezones quietly wrong, and Tungle is just about to close its doors. I’m not completely sold on ScheduleOnce, but people seem to have the fewest problems scheduling with it. There’s so much more to setting appointments, though.

If we’ve got a lunch, coffee, or call coming up in the next month or so, I appreciate your patience as we experiment with the scheduling process!

Tweaking my scheduling process for delegation

Scheduling stresses me out. I’ve had several calendar hiccups before: wrong dates, ambiguous locations, no contact information (or incorrect ones!), and so on. I want to fix that so that I can get better at meeting people and following up.

What would success look like? I think it would be awesome to get to the point where I can easily set lunches, coffees, and calls with people. This is how that process might look like:

  1. I bump into people in person or get an email from them. If I meet them in person, I scan in or take a picture of their business card and add it to my file.
  2. I introduce my assistant through e-mail and ask him/her to schedule lunch/coffee/a call. I use an e-mail template on my computer or a snippet on my phone to make sure that I include all the information necessary. My assistant also refers to a note with my preferences and processes.
  3. My assistant contacts the person and negotiates schedule / location using http://scheduleonce.com or manual scheduling through e-mail, following up in case people don’t respond. If possible, we’ll suggest a venue with good WiFi near the person’s office or location. He or she would create a calendar entry for the meeting as well as travel/preparation time around it.
  4. We have a task board where I could see where people are in the process, so I can be sure that nothing slips through the cracks. My assistant updates it, and we review it periodically.

It’s important to me that the process doesn’t make people feel like I’m standoffish or self-important. I also want to make sure that we don’t drop the ball even if I change assistants or take tasks back, so I want to use something like Trello to track scheduling status.

Here are some templates that I’m thinking of using:

Sample e-mail introducing the assistant and asking her to set things up

Hello, John!

I’d love to meet with you for lunch to discuss sketchnoting – my treat. Criselda (cc’d here) will be helping us set up something that works with your schedule. Criselda: Could you please organize lunch for maybe the second week of December? Thank you!

Sacha Chua

Sample e-mail from assistant

Hello, John!

I’m Criselda, and I’m looking forward to helping you and Sacha get together for a great conversation about sketchnotes. For lunch, would either Dec 10 (Mon), Dec 11 (Tue), or Dec 13 (Thu) work for you? 12pm usually works, but she’s happy to meet earlier or later if needed. Alternatively, if none of those dates work for you, you can check her availability at http://meetme.so/sachac or send me a few dates and times that fit your schedule.

Also, where will you be at that time? If you’ll be near your office at 123 Anywhere Street, I can find a restaurant nearby. If you’ll be elsewhere, tell me and I’ll look for somewhere close – anywhere near the subway line would be fantastic. Got a favourite? We’d love to find out about it!

What phone number would be the best to reach you at in case something comes up?

Best regards,
Criselda Hernandez

Sample calendar entry

Subject: Lunch: John / Sacha – sketchnotes
Attendees: [email protected]
Location: Restaurant Name (123 Restaurant Address St., Toronto)
Sacha’s phone: 416-823-2669
Your phone: 123-456-7890
Restaurant website: http://www.example.com
On Yelp: http://www.example.com
To reschedule, please contact Criselda at ______ . Need to reschedule on the day of the event? Please call Sacha.

<agenda / notes from e-mail>

Sample confirmation

Hello, John!

This is Criselda again. I’ve set up the calendar invitation for your meeting with Sacha for 12pm on Dec 13 at Restaurant Name. Please tell me if you’re having problems adding it to your calendar. If you need to reschedule, please feel free to get in touch with me. You can check http://meetme.so/sachac for Sacha’s updated availability. If you’re rescheduling on the same day, please call Sacha at 416-823-2669. Thank you, and I hope you have a great conversation!

Criselda Hernandez

What do you think? If I used a process like this to schedule something with you, would you feel weird about it? What would make it better? Have you delegated or are you in the process of figuring out how to delegate! I’d love to talk to you!

Delegation update: Scheduling!

I think we’ve got this scheduling process sorted out, and I really really like it. It turns out that I didn’t have to fuss about with lots of templates or worry so much about exceptions.

When I’m reaching out by e-mail, all I have to do is cc: my assistant and add a short paragraph with details. She knows how to handle things. She knows my preferences for in-person and online meetings. She can follow up and make things happen.

So far, amazing. Things appear on my calendar! I can send Criselda a long e-mail with the AngelHack schedule for the weekend, ask her to pull out just the 2:15pm demo and block off 1h before / 2h after for travel, and it appears on my calendar with the venue information and other things I need to know. I feel comfortable asking her to coordinate with multiple people. This is good.

Here are a few things we’ve done to make it nice and smooth:

  • I used Google Calendar to share my calendar with her so that she has full edit access to it without being able to access the rest of my e-mail. Stephan Spencer has his assistants process his e-mail for him – I’ll get to that level of trust someday!
  • I set up an account for her on Google Apps. Because she uses a @sachachua.com address, I feel like I need to explain less about who she is, and I worry less about offboarding.
  • I add the person’s name to the subject line: That way, when she’s reviewing her inbox, she can easily distinguish the different conversations.
  • We use Trello to keep track of task status: I want to be able to see whom we’re waiting for a response from and the status of other tasks I’ve assigned her, and Trello makes it easy to do that. I do most of the Trello task updates, but I hope we’ll get the hang of updating the boards together.

Who’s interested in talking about delegation and scheduling? We can look into scheduling a Google Hangout!