Making the schedule

I’ve prepared the session schedule for a number of conferences, including this year’s Southwest Fox, several DevCons, and at least one GLGDW. When I prepare a conference schedule, I work with a set of rules, some of which are obvious (no speaker can give two simultaneous sessions) and some of which are not (no speaker should have sessions right before and right after lunch).

The goal, of course, is to create a schedule that works for both the speakers and the attendees. Here’s my list, and the rationale for each:

No speaker has two consecutive sessions, including before and after lunch. Speakers generally like to have the slot before a session as a chance to take a final look at their notes, run through examples again, and get themselves psyched (as well as go to the bathroom, comb hair, etc.). In addition, unless the sessions are in the same room, two in a row presents set-up/break-down difficulties. As for lunchtime, typically, speakers with before lunch sessions are among the last to make it to lunch, while speakers with after lunch sessions need to be among the first to leave. Having both just makes it unpleasant for that speaker.

With repeated sessions, the same pair of sessions do not appear in the same two slots. That is, if session A and session B are given in the same slot the first time, they’re in different slots the second time. This rule is a little stricter than it needs to be for attendees, but the goal is to avoid giving people the problem of not being able to attend session A if they attend session B.

A corollary to the last rule is that no two unrepeated sessions go in the same time slot. That is, if some sessions are being given only once, each of them appears in a different time slot. The reasoning for this is obvious. If two were given at the same time, no one could attend both of them.

If possible, no speaker should have more than one 8 AM session. That first morning slot is tough. It means getting up in time to actually be coherent by 8. Most speakers would prefer to never have 8 AM sessions. By spreading them around, no one can complain. A corollary here is that if I’m both writing the schedule and speaking, I get an 8 AM session. If I don’t share the pain myself, how can I expect speakers not to complain? For Southwest Fox 2007, not only did I have an 8 AM session, but Rick (Schummer) had two of them. While that broke this rule, it did cut down on complaints from other speakers. (That wasn’t, of course, why I did it. I just couldn’t get the schedule to work out right any other way, and I knew Rick wouldn’t complain.)

If possible, no speaker should have more than two sessions in any day. Giving a session is actually hard work. Two in a day is plenty.

If session A provides background information for session B, schedule at least the first repeat of session A before the first repeat of session B.

In any time slot, try to have a diverse set of topics. If there are tracks, try to have each topic in a time slot come from a different track. Depending on the number of tracks and the number of topics in each, this may or may not be possible. Even when I can’t put all different tracks in a time slot, I try never to have more than two from the same track at the same time. (Rick told me that he was really impressed when he saw the boards for the rooms. We’d color-coded the topics by track and he noticed that each room was heavily one color. He hadn’t noticed the pattern just looking at the schedule.)

As much as possible, repeats go in the same room as the first time. This fits into the track motif. Back when presentations were done on computers provided by the conference, it also cut down the number of machines speakers had to test before the conference. Even now, it does cut down on the number of possible computer-projector compatibility problems.

Give all the sessions once before repeating any sessions. This is a rule that usually has to be broken a little. It’s rare to have the number and distribution of sessions work out so that you can draw a straight line and say “first time, above the line; second time, below the line.” In addition, if a speaker needs to arrive late or leave early, this rule, as well as the “no more than two sessions a day” rule may have to go.

Try to have the two repeats of a session on different days. This allows people who’ve attended a session to tell others about it and build audience for the second repeat. (And I guess the reverse is true, too—if a session is awful, it lets people find out.) For a conference like Southwest Fox, which is only two-and-a-half days, this rule is hard to follow, but I still use it as a guideline.

So, given all this, how do I make the schedule? Believe it or not, paper and pencil. I prepare a grid for each day, and print out the list of sessions. Normally, I print the list organized a couple of different ways. This year, I had a list by speaker and a list by track.

Then I start penciling topics into slots, following the rules. As conflicts arise, I erase and try again. Sometimes, it’s exceptionally difficult, especially when several speakers have special scheduling needs. For whatever reason, this year’s Southwest fell into place quite easily.

Once I think I have the schedule done, I go back through it, checking it against the major rules. If it passes, I have somebody else take a look at it. For Southwest, that was Rick and Doug. Rick says his way of checking the schedule is to see whether he can (theoretically, anyway) get to all the sessions he wants to see.

My scheduling experience has made me both more and less sympathetic to the schedules made by others. That is, I know the difficulty of getting it right, so I’m forgiving about small glitches. But I also know it can be done, so I get pretty annoyed by conference schedules that seem carelessly thrown together rather than being the product of conscious effort.

The Space Race

One complaint we saw a lot on the evaluations was that a room was overcrowded for one session or another. This is actually a hard problem for us to solve.

Conference room layouts fall into two basic categories: those (like this year’s Southwest) where all the rooms are the same size, and those where session rooms have different sizes. Each type presents issues for scheduling, but on the whole, it’s a lot easier when all the rooms are the same size.

When rooms of significantly different sizes are used, whoever makes the schedule not only has to try to figure out which sessions fit together to give everyone something to attend at each slot, but also which sessions will draw big crowds and which will be attractive only to a select group.

Sometimes, that’s easy. I was pretty sure that Christof’s “Dark Side of VFP” session would draw a huge audience. He’s a great speaker, it’s a sexy title, and people know that he knows more about what’s going on inside VFP than just about anyone outside Microsoft. (Now there’s a thought—wouldn’t it be cool to have had Calvin Hsia, VFP’s Lead Developer, in the room for that session!)

On the other hand, I was surprised by the SRO crowd for Cathy’s “Outfox the VFP Report Writer” session. I knew she’d give a good session, and there’d be plenty of meat, but I didn’t expect it to have such wide appeal. Shows what I know.

If we’d had rooms of different sizes, I would have put Christof’s session in the biggest room, but not Cathy’s. In fact, the first time those two sessions were given, they were side-by-side.

With same-sized rooms, we don’t have to try to figure that out. On the other hand, we don’t have the flexibility of multiple sizes. It’s a bit of a catch.

The one area where we do have flexibility on this is in how we have the rooms set up. I think pretty much everyone prefers classroom style, with tables and chairs, over theater style, with only chairs. But of course, we can fit a lot more people in in theater style. (According to the conference facility, the rooms we used can fit about twice as many in theater style.) We chose to split the difference, putting a few tables in the front part of the room, and then several rows of chairs in the back. Each room was initially set up for 50 people. (That changed as people moved chairs from room to room to meet needs. One thing you can always count on about the Fox gang is that they’re not afraid to move furniture.) Four rooms of 50 seats each seemed pretty good for 150 attendees plus 16 speakers (with four speaking at any given time).

For next year, we’ll look hard at the set up of the individual rooms and perhaps use fewer tables and more rows of chairs. I think we’ll also try to keep sessions we expect to be very popular out of room 4, the one at the far end of the hall, because traffic in and out of there was difficult.

They like us! They really, really like us!

The title says the most important thing we learned from the Southwest Fox evaluations. Most attendees were very happy with the conference. Of 92 people who filled out the overall conference portion of the evaluation booklet, 88 said they were likely to come to Southwest Fox again in the future. That’s an incredibly high number, but matches what people told us in person.

Although the overall tone of the comments was positive, nothing else had quite that high a score. Nonetheless on a five-point scale (from “Disagree” or “Poor” or “Not important” to “Agree” or “Excellent” or “Very important,” depending on the question), the average score was above 4 on every question except one.

What was that one? “How important is the facility and location in your decision to come to Southwest Fox in the future?” The average score for this one was 3.18, just a hair above neutral. Some people went farther in their comments, indicating that the room is irrelevant to them as long as it has a bed.

As is usually the case, we learned more about what people thought from the comments than from the numerical answers. A few issues were mentioned on lots of evaluations.

First, we blew it on coffee. In trying to keep costs under control, we decided to provide a full (rather than continental) breakfast, buffet lunch and an afternoon snack. At the last minute, we added coffee and tea to the first morning break. (Since none of us are coffee drinkers, we hadn’t fully thought this issue through until we were on site.) Good thing. Even with coffee and tea at breakfast and the morning break, a lot of people commented on the need for coffee all day. We’re definitely revisiting this question for next year.

We also blew it on the pre-con day with no drinks (other than water) or snacks. I think I can state that we’ll certainly have coffee and tea available; we’ll look at the question of snacks, as well.

Another frequent comment was a request for power strips in the session rooms. An increasing number of people expect to run their notebooks in sessions (especially since we provide free wireless in the conference center). Because our session rooms were all part of a larger ballroom, most of the available outlets were in the back of the room. People wanted more. This is an easy-to-solve problem.

We had a lot of comments about the temperature in the session rooms. But it wasn’t as simple as “it’s too cold” or “it’s too hot.” It varied by room, time of day, and number of people in the room. We actually went to the facility staff a number of times during the conference to have them adjust the temperature, but there were enough variables that it was hard to get it right.

My favorite comment, which appeared on a fair number of evaluations was along the lines of “this session paid for the conference.” That’s a goal we always have as speakers, and anytime we see that comment, we’re thrilled.

More to come.

Reporting on the overall conference data

Reporting on the overall conference evaluations was both easier and harder than reporting the speaker evaluations. Easier because we needed only a single report, with no need to break things down by speaker. Harder because instead of three open-ended questions, there were 12.

My first inclination was to handle the comments as I had on the speaker evaluations, with a separate cursor and detail band for each. But 12 detail bands seemed excessive. More importantly, I was feeling too lazy to write the code for the 12 queries and set up the 12 relations and so forth.

Instead, I decided to use the solution I’ve been using for years for simulating multiple detail bands. Create a single cursor with all the data in the right order, and an extra field that identifies the “detail band” to which a given record belongs. That still called for an enormous UNIONed query and I still felt too lazy to write it. So I decided to let the query write itself.

I wrote code to create a cursor with one record for each open-ended question. Then, the code loops through that cursor and uses textmerge to create the query that collects data for that question.

With that out of the way, the rest was easy. I wrote a query to compute the averages for the various numerical questions. For some questions, we actually wanted to see the breakdown of answers, not just the average, so the query handles those with SUM(IIF(, 1, 0)).

Here’s the complete program:

SELECT CNT(*) as nEvalCount, ;
SUM(IIF(lWeekend, 1, 0)) as nWeekend, ;
SUM(IIF(lWeekend, 0, 1)) as nWeek, ;
AVG(nKeyLength) as nKeyLength, ;
AVG(nKeyConten) as nKeyConten, ;
AVG(nKeyNext) as nKeyNext, ;
AVG(nConfRooms) as nConfRooms, ;
AVG(nWireless) as nWireless, ;
AVG(nHotel) as nHotel, ;
AVG(nTopics) as nTopics, ;
AVG(nLevel) as nLevel, ;
AVG(nSpeakers) as nSpeakers, ;
SUM(IIF(lKokopelli, 1, 0)) as nUsedKoko, ;
SUM(IIF(lKokopelli, 0, 1)) as nNoKoko, ;
AVG(nKokoUse) as nKokoUse, ;
SUM(IIF(lNextYear, 1, 0)) as nNextYear, ;
SUM(IIF(lNextYear, 0, 1)) as nNoNext, ;
AVG(nMaxHotel) as nMaxHotel, ;
SUM(IIF(nMaxHotel=1, 1, 0)) as nHotel1, ;
SUM(IIF(nMaxHotel=2, 1, 0)) as nHotel2, ;
SUM(IIF(nMaxHotel=3, 1, 0)) as nHotel3, ;
SUM(IIF(nMaxHotel=4, 1, 0)) as nHotel4, ;
AVG(nFAcility) as nFacility ;
FROM ConfEval ;

CREATE CURSOR OpenEnded (cQuestion C(100), cField C(10))
VALUES ("What did you like about the conference?", ;
VALUES ("How can we improve the web site?", ;
VALUES ("How can we improve the registration process?", ;
VALUES ("How can we improve the conference check-in?", ;
VALUES ("How can we improve the variety of topics presented?", ;
VALUES ("How can we improve the evening sessions/activities?", ;
VALUES ("How can we improve other things?", ;
VALUES ("What else should the keynote include?", ;
VALUES ("Speakers recommended?", ;
VALUES ("Topics recommended?", ;
VALUES ("Why not attending next year?", ;
VALUES ("Other comments?", ;


cQuery = ""
nItem = 1
IF NOT EMPTY(m.cQuery)
cQuery = cQuery + CRLF + "UNION ALL ;" + CRLF

cThisQuestion = ALLTRIM(OpenEnded.cQuestion)
cThisField = ALLTRIM(OpenEnded.cField)
<> AS mComment, ;
>" AS cWhich, ;
"<>" AS cQuestion, ;
<> as nSort ;
FROM ConfEval ;
>) ;

cQuery = m.cQuery + m.cThisQuery
nItem = m.nItem + 1

cQuery = m.cQuery + CRLF + "ORDER BY nSort, nRec INTO CURSOR curComments"


SELECT curComments


The report looks simpler than the speaker evaluation report. All the average and break-out data is in the title band, which is set to appear on a separate page. Then, there’s a single group, based on the nSort field. The group header contains the cQuestion field and the detail band contains the mComment field and a dotted line, so we can see where one person’s comments end and the next begins. Here’s a picture of the report:

Next time, some comments on the actual evaluation data.

Southwest Fox 2007 Photos Online

I posted photos Tamar and I took at Southwest Fox 2007 today. Thanks to Dave Aring (once again!) for cleaning them up and Cesar Chalom for posting a blog entry that make quick work of generating thumbnail images using the GDIPlusX code from VFPX. If you were at the conference and took any photos you’d like to share, we’d love to have them. Please email them to dhennig AT stonefield DOT com.

Processing the Evaluations

I didn’t expect helping to run Southwest Fox to give me a chance to learn new things about VFP. But speaker coordination was one of my responsibilities, so I took the lead in handling the evaluation data. On the plane coming home, I designed a couple of tables to hold the data and started working on data entry forms.

We gave each attendee an evaluation booklet with an identical section for each time slot, plus an overall conference evaluation at the end. (One of the things I learned doing the data entry was that we should put the overall conference evaluation at the front of the booklet, not the back.) At the end of the conference, we divided the evaluation booklets into three equal piles; we each took a pile home with us.

Because the data entry would be distributed and we wanted things to be simple, I chose to go with a nearly flat file design. I created two tables, one to hold evaluations of the individual sessions, with one record for each session evaluated, and another to hold the overall conference evaluation data, with one record per evaluation booklet. We already had tables for the speakers, topics and timeslots, so I put foreign keys to those into the session evaluation table.

I created a data entry form for each table, keeping things as simple as I could, but with an eye toward streamlining data entry. One thing that made creating these forms easier was that we only needed to add records, not to edit them.

The real fun came in creating reports once we’d done the data entry. We needed two reports, one for the session evaluations and one for the overall conference evaluations. Each posed interesting problems. The key issue in both cases was that we had lots of free-form comments in the evaluations and needed a way to combine that data with the averages for the numeric questions.

For the session evaluations, we also needed to give each speaker his or her own evaluations and no one else’s. I started, as I pretty much always do for reports, by working on queries to pull out the data to report. I needed to average each of the numeric ratings for each repeat of each session, as well as count the number of evaluations submitted. No problem; a simple grouped query handles that:

SELECT iTimeSlot, iSpeaker, iTopic, CNT(*), ;
AVG(nPrepared) as nPrepared, ;
AVG(nKnowledge) as nKnowledge, ;
AVG(nInteresti) as nInterest, ;
AVG(nMatchDesc) as nMatchDesc, ;
AVG(nValuable) as nValuable, ;
AVG(nRelevant) as nRelevant, ;
AVG(nAgain) as nAgain;
FROM SessionEval ;
GROUP BY 1, 2, 3

To add the speaker’s name, the session title and the time the session was given, I used that query as a derived table (one of the features added in VFP 9 that’s really grown on me over time) inside another query that joined the look-up tables with these results:

SELECT SessAvg.*, Speaker.cFirst, Speaker.cLast, ;
Topic.mTitle, TimeSlot.tStart ;
(SELECT iTimeSlot, iSpeaker, iTopic, CNT(*), ;
AVG(nPrepared) as nPrepared, ;
AVG(nKnowledge) as nKnowledge, ;
AVG(nInteresti) as nInterest, ;
AVG(nMatchDesc) as nMatchDesc, ;
AVG(nValuable) as nValuable, ;
AVG(nRelevant) as nRelevant, ;
AVG(nAgain) as nAgain;
FROM SessionEval ;
GROUP BY 1, 2, 3 ) SessAvg ;
JOIN Speaker ;
ON SessAvg.iSpeaker = Speaker.iID ;
JOIN Topic ;
ON SessAvg.iTopic = Topic.iID ;
JOIN TimeSlot ;
ON SessAvg.iTimeSlot = TimeSlot.iID ;
ORDER BY cLast, cFirst, iTopic, tStart ;

With that data in hand, I looked at the harder part. For each session, we’d provided three places to write comments:

  • What did you like about this session?
  • What didn’t you like about this session?
  • Other comments

I wanted to group all the answers for each question for a given session together, so the speaker would see all the positives, then all the negatives, then any other comments.

Making this work gave me my first chance to use VFP 9’s multiple detail band reports in a production situation. I wrote three separate queries to pull out the answers into separate cursors, and related each of those cursors to the summary cursor, SessionAvgs. Here’s the query and relation for the things attendees liked about a session:

SELECT iTimeSlot, iSpeaker, mLikes, RECNO() as nRec ;
FROM SessionEval ;
ORDER BY 1, 2 ;
INDEX on PADL(iTimeSlot, 2) + PADL(iSpeaker, 2) TAG TimeSpeak

SELECT SessionAvgs
SET RELATION TO PADL(iTimeSlot, 2) + PADL(iSpeaker, 2) INTO curLikes

Then, I started to design the report. I added two groups: iSpeaker, the speaker’s primary key; and transform(iSpeaker) + transform(itimeslot), the combination of speaker and timeslot. I set the inner group to start on a new page. (In writing this, I realize that the outer group was unnecessary.)

I put the session-level information in the group header of the inner group, laid out pretty much as it looked in the evaluation booklet.

Next, I added two additional detail bands to the report. I set each of the three detail bands to be driven by one of the cursors containing the comments, and I gave each detail band its own header and footer bands (a very cool feature). I put the question for each band into the detail band header. The detail band itself contained a single field, set to float and stretch, with an expression like this:

transform(curLikes.nRec) + ": " + curLikes.mLikes

Why include the record number? To let speakers match up likes, dislikes and other comments from a particular attendee.

Once I got all this working, I thought I was done, and sent the data, the code and the report off to Rick and Doug for comments. Doug took my queries and modified them to generate rankings for both speakers and sessions. We decided that speakers might want to know their own rankings, so I incorporated Doug’s code into the program, and added a line to the group header to show that information.

I also added some code to generate PDFs, one per speaker. I tried both FRX2Any and XFRX, and found that for this particular report, XFRX handled things better. (I’m using each of the two for different client projects at the moment.)

Again, I thought I was done, but when I started writing a cover email to go to the speakers, I realized that, along with the rankings, it would be useful for the speakers to see the overall averages for each of the numeric items, so I added another query to calculate those, and added that data to the group header, as well.

Here’s the final report as it looks in the Report Designer:

Since this is already way too long for a blog entry, I’ll write about the report for the overall conference evaluations separately. Over the next week or two, I’ll also talk a little about what people had to say about Southwest Fox and the sessions.


A month ago Southwest Fox 2007 was just getting started. It was a terrific conference thanks to so many people including the speakers, the hotel staff, the conference center staff, and of course all the developers who came to the conference.

Since the conference wrapped up the three organizers have been working hard on a couple of fronts. The first front is to review the evaluations and get them entered into a set of tables, and then get the results to the speakers. This has been accomplished. The feedback to the speakers was very positive and the constructive criticism useful in making the sessions better. If you have feedback to provide the organizers you can send this via snail mail if you want it to be anonymous, or send it to info AT swfox DOT net. You can also mail in the evaluation forms if you forgot to drop it off at the registration table before heading home.

The general conference evaluations have been helpful in our planning for next year. I think we will be discussing some trends we recognize in more detail in future posts. The evaluations were anonymous, but attendees posted questions in the evaluation. We cannot directly send answers, so I believe we will address some of these questions here on this blog.

The second front is the planning for next year. Believe it or not, we started this process Sunday afternoon, right after the conference finished and we completed our wrap-up meeting with the conference center folks. We are working on the contract for next year with the same hotel and conference center.

Tamar, Doug, and I decided to start this conference blog as another way to communicate information about the conference to everyone who is interested in the event, and to open up a discussion about the things we are thinking of doing next year. I hope your find this useful.

Thanks again to everyone who made Southwest Fox 2007 a success.

Only 333 days until Southwest Fox 2008! Mark your calendars for October 16-19, 2008. More details to come.