Blog - Robert Bogue [MVP]
Rob's Notebook
SharePoint Calendar
Thor Projects LLC - Welcome
Sunday, April 20, 2008

SharePoint Workflows Preconference Session

Today I had the opportunity to spend some quality time with about 70 folks. We spent the day learning SharePoint workflow from the ground up. We started with what our workflow options were and moved on from there to walk through the out of the box workflows. Once we had seen the Three State and Approval workflows we quickly added in a SharePoint Designer workflow and talked about its limitations. The real fun didn't start until we fired up Visual Studio and started creating workflows. We started through the packaging of the workflow to make it deployable to SharePoint. Once we had a workflow up and running we started adding log to history activities and send email activities to demonstrate some of the basic power of visual studio workflows. Without missing a beat we moved into custom task edit forms, a custom association edit form, and ended with some custom activities.

As I promised the attendees, the code is available at http://www.thorprojects.com/Files/200804SPConn-Workflow.zip

I'm considering bundling up this content, and a few other things into a SharePoint Workflow course or DVD. I'd love to hear feedback on interest for such a product.


Categories: Professional | 0 Comments
 
 
Wednesday, April 16, 2008

Web Part Event Firings and Why You Shouldn’t Have Code in the Constructor

So I'm working on an end user focused blog post about the difference between closing (Close) and deleting (Delete) a web part. In the middle of that I realized that although we've been told that the web part still runs when you close a web part on a page, we've not been told what still runs in the web part. So I fire up Visual Studio and I create the world's dumbest web part. (There should be a competition.) All this web part does is log each time any one of the methods that can be overridden is called. Essentially any time the web part receives any sort of action. I run the web part in WSS v3 and I get the following results:

Adding

Regular Load

Minimized

Closing

Closed

Constructor

Constructor

Constructor

Constructor

Constructor

Constructor

ResolveAdapter

ResolveAdapter

ResolveAdapter

Missing: Dispose

ResolveAdapter

OnInit

OnInit

OnInit

  

OnInit

TrackViewState

TrackViewState

TrackViewState

  

TrackViewState

HasControls

OnLoad

HasControls

  

OnLoad

OnLoad

EnsureChildControls

OnUnload

  

EnsureChildControls

EnsureChildControls

ResolveAdapter

Missing: Dispose

  

ResolveAdapter

ResolveAdapter

CreateChildControls

  

  

CreateChildControls

CreateChildControls

OnPreRender

  

  

OnPreRender

OnPreRender

SaveViewState

  

  

SaveViewState

SaveViewState

HasControls

  

  

HasControls

HasControls

RenderControl

  

  

RenderControl

RenderControl

Render

  

  

Render

Render

RenderBeginTag

  

  

RenderBeginTag

RenderBeginTag

AddAttributesToRender

  

  

AddAttributesToRender

AddAttributesToRender

RenderContents

  

  

RenderContents

RenderContents

RenderChildren

  

  

RenderChildren

RenderChildren

RenderEndTag

  

  

RenderEndTag

RenderEndTag

OnUnload

  

  

OnUnload

OnUnload

Dispose

  

  

Dispose

Dispose

  

  

  

 

There are a couple of things to note here. First, in the Adding scenario – when the web part is being added to the page, two instances of the web part are created but only one of them has events fired against it. You'll have to trust me that it's only one instance that's being used. This means we've got one Dispose method call that's missing. i.e. Web Parts must implement IDisposable which is the Dispose method and the dispose method should be called every time the web part is created. When I get to the closed scenario is where it gets bad. When you're closing the web part and when the web part is closed you only get one constructor – but never a dispose.

By the way, please don't get too hung up on the order of events here. You'll see that HasControls fired twice in the Regular Load scenario – that's pretty normal to have some slight variations in timing that cause a few extra or fewer calls. This might serve as a rough framework but it's not the final word on event firing. (You've been warned.)

Back to our story… what does all of this mean? Well, let me first say that I've had several folks who've asked me questions via email over the years and when it comes to be parts I always encourage them to move code out of the constructor and into OnInit or one of the other functions. In Web Part land there's just not enough spun up at constructor time for things to work all the time. I've had more than a few folks say that their web parts magically started working once they moved code back into OnInit. So again, what does this mean?

Essentially, unless you've got a good reason, don't use the Web Part's constructor. I've seen problems with web parts that use it and this latest data seems to show that the dispose method doesn't always get called – in some cases you'll get a constructor call but no Dispose. However, in every case if OnInit is called there seems to be an Dispose call.


Categories: Professional | 0 Comments
 
Saturday, April 12, 2008

This blog is online with CKS:EBE

This is my first post from CKS:EBE v2.  It's been a long journey.  For most of the last three years you've not been able to comment or track back to my blog posts.  That's been because the tool I was using before didn't have any sort of blog spam filtering and when blog spam started to become popular it became a problem to manage.
 
If you find anything that's not working on the site please let me know.

Categories: Professional | 2 Comments
 
Saturday, April 12, 2008

Progress on "The SharePoint Shepherd's Guide for End Users"

I wanted to provide a quick update on The SharePoint Shepherd's Guide for End Users.  First, I have the blog's branding (i.e. SharePoint Theme) deployed to the site.  Instead of looking like an out of the box SharePoint site it looks like a real branded site.  I've love to hear feedback on the branding -- or on problems you're having with it.

Second, I've been maintaining a list of links, reviews, and refrences on the site.  If you're interested in what people have been saying about the book, please check it out.

Third, It looks like the book will be available in standard book distribution VERY soon.  Amazon.com already has a page for the book up.  It doens't yet let you order it, it has no image, no description, etc., however, you can be alerted when it's available from them.  I've signed up for an alert so hopefully I'll be able to communicate availability here.

Finally, thank you to everyone who has been supporting the project.  I've been overwhelmed by the interest in the project.


Categories: Professional | 0 Comments
 
 
Thursday, April 03, 2008

SharePoint is not Lotus Notes

I’m not the world’s biggest fans of so called “think tanks” and their reports.  While I have the deepest respect for some of the analysts I’ve met, I also know more than a few that truly miss the point.  They don’t get it.  They don’t understand the market they work in.

Recently one of the folks that I don’t think really understands the market – CMS Watch – started hocking their latest dribble about SharePoint in the CMS market.  One of the things in the report is a comparison of SharePoint to Lotus Notes. I don’t know for sure but this is apparently the case since several reporters – to whom I can only imagine a copy of the report was sent to – have posted articles making this comparison.  I can further only assume that this is a desperate attempt on CMS Watch’s part to sell a few copies of the report since the comparison doesn’t make sense.  I feel sorry for the reporters (who are overworked and underpaid) who fell into the trap of repeating this senseless comparison.

I think there are a ton of reasons why this comparison is silly.  Let me summarize the top few:

1)      One successful product is being compared to another from a different era  -  It’s sort of like comparing Lotus 1-2-3 against the current offering of MS Excel.  1-2-3 was, for its time, the best spreadsheet.  Similarly, Word Perfect 5.1 really hit the market the right way.  It was a really good word processor until the Windows GUI and WYSIWYG overtook character based word processing.  Both of these products (Lotus 1-2-3 and WordPerfect) were successful products.  The basic comparison is that SharePoint may become like Notes.  Notes was, for its time, the right product.  It is a good, money making product even today.

2)      Offline and the web – Notes is an offline database tool.  Call it groupware, a collaboration tool, or whatever you want.  It’s good at managing sparsely changing databases.  I know of several applications that Microsoft has failed to displace because they’re based on the rich replication that the tool has for offline access.  SharePoint, at least what we have today, is an online only tool.  Sure it’s got options for taking stuff offline – both from Microsoft and third parties – but we’re not there yet.  So we have a tool that from the start was designed to deal with the offline scenario – and one that was designed to deal with the online scenario.  They’re totally opposite design approaches.

3)      User Driven vs. Management Driven – It is a fallacy that Notes was driven by end users.  Notes utilization was driven by departmental IT.  Folks may believe I’m splitting hairs, but I don’t think so.  Notes was adopted because departmental IT (what some folks call Business Unit IT) needed solutions and central IT wouldn’t do them.  They could develop Notes applications and corporate IT would host them.  SharePoint is being driven in some cases literally by end users who need to share a spreadsheet or keep versions of a document.  It’s not the departmental IT manager.  It’s the administrative assistant or the business analyst or the chemist.  The adoption model isn’t the same.  Honestly, the adoption is much more akin to the MS Access adoption model.

4)      Users Hate Notes – As some have correctly pointed out, most folks who hate Lotus Notes hate it as a mail client – and well they should.  I’m a strong Outlook advocate.  Its issues pale in comparison to those of Notes.  I don’t have any particular malice towards Lotus Notes as a sparsely connected DB – it’s great at that.  The issue is trying to force it to be a mail client too.  SharePoint doesn’t do email.  Exchange and Outlook do Email.  SharePoint integrates with Exchange and Outlook.

So let’s follow the supposition that SharePoint will follow the lifecycle of Lotus Notes.  Where does that leave us?  With a product that has one of the longest lives of any product in PC history?  To a product that has 120M users?  I guess I don’t see that as a bad thing.

The implication is that SharePoint will someday become a legacy product for organizations as they seek to divest themselves from it.  Uh, duh.  That’s going to happen.  The trick is when and why?  I don’t know the when, but as for the why – it will be because MS doesn’t make the right investments in the product.  I think MS has a much better track record at making the right investments than IBM has.

I’m really waiting on someone to catch on that the MS Access comparison (which I made above) is a better comparison. MS Access adoption was driven by end users.  It was very easy to let MS Access databases get out of hand -- just as it’s easy to let SharePoint sites to get out of hand.  However, what SharePoint has going for it is it’s still recoverable – where Access wasn’t.  Oh, yea, and you *CAN* throw hardware at a SharePoint performance problem (due to bad design) where with Access you really couldn’t.

Can you do bad designs with SharePoint?  Absolutely.  Is this any different than any other CMS (or collaboration) product?  No.  Well, why then, you might ask, are there so many screwed up SharePoint implementations and so few of the other products?  Let the other products do 1 Billion in sales – and 100 Million licensed users.  Take a look at the numbers again – you’ll probably find that the numbers aren’t that different as a percentage.  Everyone’s seeing more screwed up SharePoint implementations because there are more of them to be screwed up.


Categories: Professional | 1 Comment
 
Thursday, April 03, 2008

Customer Service is a Thankless Job – Sorry

I have the greatest respect and admiration for folks who do customer support.  I couldn’t do it.  My personality just wouldn’t allow me to walk folks through plugging in the proverbial power cord every day of the world.  I am sure that I’d become the first ever documented case of spontaneous human combustion.  Because of this I’ve contemplated whether I should write this blog post for quite a while.  However, I ultimately realized that although I had my issues with individual customer service folks who had helped me, I am substantially more frustrated with the systems that allow this to continue – and in fact encourage it.

So I need to provide a little bit of background.  Around the first of this year I tried getting to http://technet.microsoft.com for whatever reason it didn’t respond.  I didn’t think much about it, I was just going to register for something so it wasn’t a big deal.  A week or two later I tried again and it still didn’t work.  At this point I got a little more curious.  So I logged into a server at Bluelock.  I could get to TechNet from Bluelock.  That meant it was a local problem.  So I put on my debugging hat and dug in.

A quick check of nslookup reviled that the IP address resolved for both locations were the same.  OK, it’s not a DNS problem.  Good to know.  I then started digging in and ran a packet trace from my firewalls (a SonicWall Pro2040 @ Bluelock and a SonicWall TZ170 here).  I saw something very odd.  At Bluelock I got the SYN and SYN ACK packets I’d expect to form up the TCP connection.  Here I got SYN, SYN ACK, SYN, SYN ACK.  Hmmm, that means the TCP stack locally didn’t like the ACK designed to form up the TCP connection.  I try a few other machines on the network including Windows Server, XP, Vista, etc.  They’re all having the same issue.  I tried with the local PC firewall on and without it on.  Still the same result.  I decided to eliminate more variables.  I instructed Telnet to make a connection to TechNet on port 80.  Although Telnet is a lousy web browsing client <grin>, it is one of the most basic ways to test whether a TCP connection can form.  When it didn’t work I had eliminated a ton of stuff.

So, in preparation for my call to support, I went in with a laptop and bypassed my TZ170.  I MAC cloned its external address so Brighthouse/Road Runner, my cable provider, wouldn’t lock out either the TZ170 or the laptop – so far as they were concerned it should have looked like the same computer.  When I did the test I observed the same thing.  No connections to technet.microsoft.com but arguably every other web site seemed to work.  (I’d later find out that there were a handful of other sites that were affected by this problem, but that wasn’t until later.)

So I hook everything back up and pick up the phone to call the Road Runner national help desk.  A pleasant sounding lady named Brandy answered the phone.  I briefly described that there was one web site, technet.microsoft.com, that I couldn’t get to.  She asked me “Did you put www in front of that?”  I politely explained that this web site didn’t have a www in front of its address.  I further explained that I had done a substantial amount of troubleshooting and had isolated the problem to the fact that TCP connections weren’t being formed up to the web site – although it was transmitting packets.  I offered to send her the packet capture and described the telnet procedure I had used to eliminate a ton of the variables that can happen in a typical system.  After a brief pause she asked “Did you try clearing your browser cache and cookies?”  I politely responded that it was clear that I wasn’t communicating effectively with her and that I’d appreciate the opportunity to speak with her manager.  To be clear, I expected this sort of an interaction, as I said before, most folks that customer support speaks with aren’t able to find the on/off switch.  I don’t expect them to be reading packet traces with me (as a point of fact I couldn’t tell you what IN the packets was wrong.)  I look at this interaction as an important and unfortunate necessity.  However, what happened next would start me down the process of changing my TV and Internet service.

A supervisor answered the phone that would only identify himself as Mike.  I explained the situation to Mike.  After a brief interaction Mike told me that this was a problem caused by the equipment or configuration on my end and wasn’t their responsibility.  When I asked him how he reached this conclusion he told me that I could get to every other web site and he could get to technet.microsoft.com therefore it must be my problem.  I presume Mike was in Reston, VA and I’m in Indianapolis, IN – there are a few different pieces of equipment between him and I.  I’ve seen all sorts of weird issues for clients caused by routers that are overloaded, overheated, or damp (don’t ask).  I certainly didn’t agree that because he didn’t see the problem that it didn’t exist.  I’ve never met God personally but that doesn’t shake my belief that he does exist.  I’ve never seen an electrical fire but that doesn’t mean I don’t believe they don’t exist.

So I asked Mike to escalate the case and he refused.  When I asked to speak with his manager is when the story got sad and entertaining at the same time.  Mike responded that he didn’t have a manager.  I said, well, supervisor, director, boss -- whomever did his reviews…  He responded he didn’t have any of those.  I had to pause.  I knew that the manager of the call center who’s working at 11PM on a Monday night isn’t the CEO of the organization, so I was being lied to.  I strongly dislike being lied to.  I dislike it even more when it’s so obvious.

So I asked, Mike if he signed his own paychecks.  He said no but wondered why I cared about an accounting function.  I responded that I didn’t – but that if he didn’t sign his own paychecks he had a boss.  So I continued the only person in an organization that doesn’t have a direct boss, that I know of, is the CEO.  I asked him if he was the CEO and when he responded no I asked him if he worked for the CEO.  He said yes, and I asked if he worked for the CEO directly.  He responded that he did.

So at this point, I’ve demonstrated that Mike’s a liar.  He clearly communicated he didn’t have a boss, manager, etc., but then later indicated that he worked for the CEO.  However, I’ve still got a problem.  I don’t believe that Mike actually works for the CEO.  I decided to give up for the evening and talk to someone during the day shift.

At this point I think I need to make a personal statement, if I ever have an employee so boldly lie to a client they will be fired – on the spot.  I don’t see how any organization can stand to have its employees boldly lying to customers like this.  It’s this clarity of conviction that makes the rest of the story so troubling.

I called back during the day and got Mona.  I politely told Mona I needed to speak with a supervisor and when asked what for, I said that I needed to register a complaint about a supervisor from last evening and I didn’t feel comfortable sharing that complaint with her.  She transferred me to Martha.

I explained the customer service situation to Martha and asked that she do whatever was appropriate to deal with the concern.  I considered the issue disheartening but had written it off.

Dealing with the customer service issue meant I didn’t have time to deal with the actual problem so I had to wait to call back – in the evening.  (Taking care of my customers is a priority.)  When I called back in I got Kelly.  Kelly transferred me to Mike.  My conversation with Mike was only slightly better in that he said that he would look into the issue.  He didn’t offer to allow me to talk to the next level of support, provide me with a NOC ticket number, etc.  He simply said he’d look into it.

When I asked when I could expect to hear something from him, he said he couldn’t make a commitment on when the problem would be resolved.  When I clarified that I was just looking to know when I’d hear from him on this issue again he indicated that he couldn’t make a commitment – not even for a status call.  I shared with him that I felt this was bad customer service.  He told me I was wrong that you never make a commitment you can’t keep.  To me, follow up calls should be something you have control of.

So without any timeframe guidelines since Mike wouldn’t provide them – I called back in 4 hours later to request a status update.  To be clear, I didn’t expect that the problem would be resolved, I just thought I might be able to get the NOC ticket number.  The technician answering the phone told me that Mike had tried to call me and that I didn’t answer.  I logged into Vonage and verified that I hadn’t missed any calls.  I asked the technician for the status update and he indicated that the notes didn’t indicate what the update was.  So after informing him that there was no call I asked to be transferred to Mike again.

Mike was noticeably frustrated.  When I asked what the status update was he indicated that he didn’t call.  (Apparently the technician was mistaken)  When I asked for a status update I was told that he couldn’t work on the issue because I had called in.  For this to be truth this would presume that he was personally troubleshooting the issue, something I wasn’t ready to accept.  I asked him when I should call in again he told me that he’d call me when he had something to report – and more disturbingly he said “You need to stop calling in.”  I was shocked.  I called in a few minutes after four hours of delay from originally reporting the problem after he wouldn’t communicate an expectation to me – it wasn’t like I was calling in every 10 minutes.  However, the whole point of customer service is to talk to customers who are having problems.  It would seem that if no one calls in then there wouldn’t be any jobs.

Mike also threatened to close the case that he ultimately admitted he had opened with the NOC.  My response was something along the lines of “If you think I’m upset now…”  I apparently convinced him to leave the case open as I hung up because at 2AM I got a call from a technician (that I let go to voice mail).  The technician indicated that he had a few questions but he thought he knew what the problem was.

By the time I woke up TechNet worked.  I called in to close the case and asked to speak with a manager again about the customer service issues.  I again got Martha.  Martha indicated that their boss (Mike’s and hers) wouldn’t be in until 10AM (it was like 8:30).  I asked for a call back and she assured me she’d give him the message.

By this time some of the corporate sales and support guys had returned my calls that I made.  I know a few people in the area who use Brighthouse for their corporate Internet connectivity.  So I managed to get a call.  The corporate service manager acknowledged some issues on the network due to some IP addresses they acquired from Japan and indicated they were are of the issue.  Since my problem was resolved I thanked him and moved on.

Two weeks later I was clearing off my desk found my note and called back in.  This time when I spoke with Martha she indicated that Mike’s boss wouldn’t be calling me back.  No reason was given.  I was nearly ready to change services, but I needed one more push.

That push came a week later when TechNet stopped working again.  I called back in and after initially having a technician walk through it with me and get assigned a NOC ticket… I was told I’d get a follow upcall.  The next day, I tried to follow up and being told that I had never done any troubleshooting steps and that I had been told repeatedly this was my issue and not an issue on the Road Runner network.

The end.  I’m done.  I decided that I there were too many customer service issues.

I switched to AT&T’s U-Verse service.  I’ve called in a few times with some questions – and I can’t tell you the customer service difference.  The folks I’m talking to are polite, respectful, willing to help… all things that I never got out of the Roadrunner National Helpdesk.

So back to the starting point, why does this bug me so much?  Well, I have a set of unanswerable questions:

1)      How can you have such poor customer service skills in a manager and not realize it?

2)      How can anyone in a customer service position refuse to call a customer back?

3)      Organizationally, how do you fail to recognize such a systemic problem?

I wonder if I’ll get a call back now that it is too late.


Categories: Personal | 0 Comments