Genii Weblog

Behind the closed doors of support

Fri 12 Dec 2003, 12:19 PM



by Ben Langhinrichs
I have just come out the other end of one of those support nightmares, and I thought it might be informative to describe a support call from the other side for those of you who have wound up waiting and waiting for assistance.  A customer who has bought some licenses in the past and recently purchased a few more asked for help because an application which worked in R5 under Midas 2.5x had a problem when they tried it with Midas 3.20a, but they needed a 3.x license because they were upgrading to Notes 6.5x.  Almost everything worked, but some bullets were not lined up properly, with each bullet indented further.

After trying to diagnose the problem over the phone, it became clear that it was going to be a bit more complicated, so I asked for a sample db, as it is almost always more likely you will get a solution if you can reproduce the problem.  The customer agreed and sent a sample db.  So far, so good, and better than lots of support calls.

Now, things have been busy, so it took a day or so to look at the database, and when I did, I was taken aback.  Most customers either use Midas for a fairly discreet task, or have one small script library which uses Midas, or if they have done a lot more, they don't show it to me.  This, on the other hand, was a very cool, very complex application with multiple nested script libraries and classes using Midas in all kinds of exciting ways.

I was happy.  Big mistake.  When you think like a developer or a salesperson, cool, complex solutions are a treat.  When you think like a support person, they are a nightmare.

Anyway, I was able to reproduce the problem, but I had a heck of a time following the logic and tracking down where the problem occurred.  It sounds fine to "use the debugger", but it is a lot harder when you are dealing with thousands of lines of code and lots of intermediary steps and two debuggers (the LotusScript debugger as well as the C++ debugger for when Midas is used), and all the code looked fine.

I told the client it would take a bit longer.  The client was very patient about this (one advantage of not charging for support is that people are a bit more patient about waiting), but told me when their deadline was.  A week out, it hardly seemed a problem at all.  Another big mistake.

This proved to be a terribly intractable problem.  At first, it seemed a case of a developer taking advantage of a bug in Midas 2.x which was fixed in 3.x, but that proved to be wrong.  Then it seemed to be a bug when with the AppendRTItem method when copying onto a stored form, but that also proved to be wrong.  Along the way, there were many other distractions, along with the inevitable issues because it turned out that the developer had made some changes between the 2.x and 3.x versions ("no, we didn't change anything, I promise").  On and on, whenever I had a spare couple of hours, such as those between 1 and 3 am.

Finally, I had it narrowed down to a problem shifting paragraph margins.  There is a bug when the logic is called on paragraphs that have just been copied and already had the paragraph attributes changed.  Trust me, you don't want to know more.  So here it is, the end of the week and the day of the deadline, and I finally came up with a workaround which allowed them to use the production version, as it was way too late for them to use an interim version with all the testing that would entail.

The workaround was laughably simple.  Look at the before and after (revised slightly to protect the innocent), and tell me what you would think of the support person who spent a week and then told you to make this change:

Original code
Public Sub ShiftLeftMargin(rt As MidasRT, adjust)
   Dim para As GeniiRTChunk
   If adjust = 0 Then Exit Sub
   
   Set para = rt.DefineChunk("Paragraph 1")
   Do While para.Exists
      Call para.ChangeParagraph("ShiftLeftOffset=" + Cstr(adjust))
      Call para.GetNextTarget
   Loop

Revised code
Public Sub ShiftLeftMargin(rt As MidasRT, adjust)
   Dim para As GeniiRTChunk
   If adjust = 0 Then Exit Sub
   
   Set para = rt.DefineChunk("Paragraph 1")
   Call para.GetLastTarget
   Do While para.Exists
      Call para.ChangeParagraph("ShiftLeftOffset=" + Cstr(adjust))
      Call para.GetPreviousTarget
   Loop

Rich Text Comparison using Midas
Public Sub ShiftLeftMargin(rt As MidasRT, adjust)
   Dim para As GeniiRTChunk
   If adjust = 0 Then Exit Sub
   
   Set para = rt.DefineChunk("Paragraph 1")
   Call para.GetLastTarget
   Do While para.Exists
      Call para.ChangeParagraph("ShiftLeftOffset=" + Cstr(adjust))
      Call para.GetNextTargetGetPreviousTarget
   Loop

Customer's likely conclusion
Clearly, I got a totally incompetent support person

My conclusion
Clearly, I have to learn to limit these support calls

My son's conclusion
Clearly, it is time for Dad to start charging for support

Copyright © 2003 Genii Software Ltd.

What has been said:


81.1. Tom Duff
(12/13/2003 08:34 AM)

On the other hand, I think it speaks volumes as to the care and commitment you put into your product.


81.2. Nathan T. Freeman
(12/15/2003 11:46 AM)

Actually, I found a lot of occassions where starting at the bottom and moving to the top worked more reliably with Midas, at least in the 2.x codestream.