Category Archives: Microsoft

Follow-up: a happy ending to the Visual Studio story – Microsoft team steps in to help

A couple of days ago I published a long post documenting the challenging experience I’d had trying to buy a new Visual Studio cloud subscription:

My sorry tale of trying and failing to buy a Visual Studio cloud subscription

Well, I’m happy to report that, after the efforts of a number of awesome people at Microsoft, I’ve managed to successfully activate my Visual Studio subscription and I’m now up and running again with both Windows 10, Visual Studio and (shortly) SQL Server installed and functioning correctly.

So, this time around, let me tell a happier tale…

It starts when, having seen my plight, John Montgomery got in touch via twitter, looping in Buck Hodges:

John Montgomery and Buck Hodges of Microsoft see my plight on twitter and kindly reach out.

These two are both heavy hitters in Visual Studio and .NET in Redmond. John is Partner Director of Program Management, and Buck Hodges is a Partner Director Software Engineer. Having these guys on the case is already reassuring.

Buck’s initial suggestion didn’t quite work out but after getting back in touch with them he asked me to drop him an email so he could expedite the process. Things then started happening quite quickly.

Buck immediately looped in Andrew Brenner, Mike Tayebi, and Marc Paine to help. Marc is a Principal Software Engineer Manager, and Andrew is a Senior Program Manager.

Marc and Andrew got to work on finding a fix and, later in the evening, Marc emailed me instructions with a workaround they’d come up with. Due to timezone differences, and meetings the following morning, I couldn’t immediately try it out. As soon as I could I gave it a try and was overjoyed to be find that I was now able to assign the subscription to myself via in a private browsing session:

I can now see and assign my Visual Studio Professional subscription to myself

I’m not quite home and dry yet but this, in itself, is serious progress. A few minutes later I received the following welcome email to activate my subscription:

Yes! Welcome email from Microsoft at last.

I click the Activate my subscription button (actually I copy the link into another private browsing session) and I’m able to successfully activate my subscription.

Now, when I log in to I’m can access all my benefits:

Visual Studio subscription downloads.

Visual Studio subscription product keys.

(I’m loving the fact there’s an entry in there for Office 95 Professional, btw.)

I’m able to download and install both Windows 10 and Visual Studio 2015:

Success! BOOM!

Success! BOOM! That’s both of the above installed and running in a Parallels VM. I’m extremely happy. I’m also extremely impressed with the speed of the Windows 10 install – I didn’t time it, but it really was only a few minutes. Very cool.

Marc also tells me that they’ve figured out why I couldn’t see or manage any subscriptions and are discussing a solution so that in future the workaround won’t be necessary, as well as investigating some other failure points I identified. Andrew also spent time going through my previous post creating a list of issues that various teams need to address to avoid other people having a similar experience.

Honestly, I’m so impressed with the way these guys stepped up and helped out. I’d particularly like to thank John, Buck, Marc, and Andrew for all their work and time in getting me unblocked, and for taking ownership over the process.

This is absolutely consistent with my previous experience dealing with people who work for Microsoft. Once you find an in to the right person or group of people, past the seemingly impenetrable corporate exterior, what you find are smart people who really care about what they do and about delivering a great experience to customers, and who will go above and beyond to do that. I know they’re going to find and implement solutions for all the problems I had.

I’d also like to thank the UK licensing support team who, whilst they weren’t equipped to handle these kinds of problems, did try and help out as much as they could, as well as Jeff Lambert (Escalation Engineer), and Trevor Hancock (Senior Escalation Engineer), who got in touch to try and help, and followed up to see how I was getting on.

Lastly, I’d like to thank my friend Elisabeth Blees, who is a Program Manager in the Visual Studio team, and who checked in to see how I was getting on, followed up with Buck and his team, and updated me on what they’d been doing.

So I’m pleased to say I’m up and running, and help from Buck and his team really couldn’t have come at a better time: I’m giving a talk on performance tuning .NET and SQL Server web apps at tomorrow’s DDD event at Microsoft’s UK headquarters in Reading, and now I have everything I need to do that.

Thanks again to all!

My sorry tale of trying and failing to buy a Visual Studio cloud subscription

UPDATE: this story now has a happy ending – a bunch of awesome Microsoft people helped me activate my subscription so I could get up and running.

Let me start off by saying this isn’t a rant against Microsoft in general, or me saying they suck, or that I hate them.

Microsoft don’t suck.

I don’t hate them.

They make some of the best products in the world: Windows 10 is great, Visual Studio is fantastic, SQL Server is awesome, Azure is likewise brilliant, and the Xbox is a staggering achievement, especially considering where Microsoft started out in games.

They’ve had a bit of a miserable time in the mobile market but at least nowadays Windows 10 Mobile is a decent product and I’m sure, if they play the long game as they usually do, they stand a decent chance of building a good business around mobile, just like they’ve done in gaming, and just like they’re doing with cloud.

So what is this? Simply an expression of extreme frustration at the overwhelming crappiness of a specific process: that of buying a Visual Studio subscription.

I feel a bit bad about posting it actually. I started out building this document as a way to keep track of everything I’d tried and to make it easier to explain to Microsoft’s support team what was going on, but after 28 hours and no progress I feel like I need to make my voice heard perhaps a little more loudly. I also really need everything written down where anyone who’s involved can see and understand what I’m seeing as I work through this process.

By the way, it’s not that people at Microsoft haven’t tried to help (see below), but none of it has worked. I still don’t have access to subscriber downloads and product keys, which is blocking at least some of my work.

Some Background

I used to work for a company called Red Gate, up until the end of 2013 – a fact that will become relevant later. Back in those days I did some work on Node Tools for Visual Studio, which I carried on into 2014. As a result of this Microsoft kindly gave me an MSDN subscription, which only recently expired.

After a few months of doing other things I now need to start working with Visual Studio and Windows again for some projects, along with upcoming speaking engagements over the next three months. I therefore need to buy a Visual Studio subscription.

I don’t mind paying at all, and here’s why: a Visual Studio cloud subscription costs $539/yr. Given it includes SQL Server, plus Windows operating systems for for dev and test environments, to me this represents excellent value for money.

So no big deal, or at least it shouldn’t be. You just visit, pay for a subscription, and you can download the products you need and crack on.

Reality Bites: The Purchase Process

I’m not enough of an idiot to try buying Visual Studio direct from Microsoft are a massive company with sprawling web properties, so I start out with a web search. It doesn’t matter whether you use Bing or Google, if you search for “buy visual studio” you pretty quickly end up at:

The page itself looks really promising, and there are links to a page that describes the benefits included with the standard and annual cloud subscriptions. From my perspective the important point is that I get access to all the Microsoft products I need to develop software, along with some free Azure hosting, which is great.

How to buy Visual Studio page.

Looking at this, it’s a pretty easy sell for me to go with the annual cloud subscription at $539/year because it includes everything I need at a lower TCO to the standard perpetual license.

So I click on the Buy now button for the annual subscription and end up at:

Visual Studio buy annual cloud subscription page.

This is marginally irritating to me because I’ve already said I want to buy the thing so I either want it in my shopping cart, or to be taken somewhere where I can pay for it, not to another page full of information I already know/don’t care about. I don’t need to be marketed to at this point.

Still, there’s an obvious Buy button, so I click that one too.

Now I end up at

(No, I’m not making that URL up.)

Visual Studio login page.

I briefly debate whether to create a new Microsoft account against my business email address (for which I’m the company owner) rather than reuse my existing account against my personal email address.

In the end I decide to create the new account, so I type in my business email address and, as expected, I get an error because I’ve never signed up for a Microsoft account using this address:

Expected error after using new email address so I can create a new Microsoft account.

Like I say, this is fine, because it gives me what a want: a way to create a new Microsoft account. Arguably this should have been an option on the previous screen but whatever – the main thing is I have a way to do it.

This is where things start to get ugly though, because when I click on “get a new Microsoft account” what happens is it opens a new tab pointed at the original login screen:

Visual Studio login page.

This was in Chrome. In Firefox it’s even worse: it opens up two new tabs, both on this page. I tried it in private browsing, in case Microsoft have banjaxed their cookies, but still no luck.

Much as I might want to, I can’t use IE or Edge because I’m running OSX. I’d need to create a Windows 10 VM via Parallels. Unfortunately I can’t do this because without the Visual Studio subscription I’m trying to buy (!), and I also unfortunately don’t have any old Windows 8.x VMs lying around that I could use for this purpose.

OK, well, no worries. I’ll just use my existing Microsoft account attached to my personal email address instead. I realise this is probably a better idea anyway because my website at is hosted in Azure and is tied to this account. I can just buy a new subscription and change the email address for my account, right?


So I enter the email address for the account I already have, against which the expired MSDN subscription is attached, and after a few seconds this redirects me to to log in:

(Again, no, I’m not kidding with that URL.) page to login to existing Microsoft account.

So I enter my password, select Keep me signed in, and click Sign in. It doesn’t work. I’m redirected and end up on a page at with the following error:

Basic login error after login attempt on

There’s some more detailed information at the bottom of the page:

More detailed login error information.

I try this several times with the same result. Suspecting cookies I switch from Chrome to Firefox, go through the same process, up to the login page, and try to log in again.

This time it works. I suspect it would also have worked if I’d used a private browsing window in Chrome. Clearly something about trying to create a new account hosed the cookies (I use ‘cookies’ in the loosest sense of the word – they could be using local storage on the client for all I know; I haven’t looked).

Now I’m at:

This is a page I’ve been on before, but now I have a popup that looks like it’s going to take me through the purchase process:

Popup to purchase Visual Studio subscription.

There are no other options in the dropdown so I hit Continue. This goes through a couple of redirects, lands back on the same page with a different URL (, says it’s checking my subscription, then gives me an error and greys out the Continue button:

Error saying I am not an admin or co-admin of the subscription.

(Later it becomes clear to me that this error is factually correct, if unhelpful. The Windows Azure MSDN – Visual Studio Ultimate item refers to an old, expired, MSDN subscription that I had through Red Gate. At this point I don’t realise this though.)

In desperation I click Create new Azure subscription but it takes me to a page on that doesn’t seem immediately relevant to what I’m doing because it’s talking about Pay-As-You-Go Azure subscriptions, whereas I want to buy a Visual Studio subscription, so I ignore it.

In passing I notice that Firefox has blocked Flash on the site and briefly wonder why the site uses Flash at all:

Firefox has blocked Flash on

Anyway, as I said, the page doesn’t seem relevant so I ignore it and move on. Later it will become apparent that this was a mistake and, I suppose, my bad.

Frustrated, I decide to log in to my Microsoft account from elsewhere, in a private browsing session, to see if I can figure out what’s going on.

I end up back at

Here I am, back at trying to log in again.

Eventually, via some tediously circuitous route that I’m unable to fully recollect, I end up at Oddly I note that there appear to be two profiles attached to my account, one named “Microsoft Account”, and the other named “Red Gate Software Ltd”. (Switching between these profiles involves 3 redirects taking around 4 seconds in total.)

The "Microsoft account" profile attached to my account.

The "Red Gate Software Ltd" profile attached to my account.

I have access only to Visual Studio Dev Essentials benefits (i.e., all the free stuff), but this isn’t surprising since I left Red Gate 3 years ago and, as I’ve already said, the MSDN subscription that Microsoft kindly gave me expired recently.

There’s nothing here that shows me definitively what the problem might be but I am a bit suspicious about this Red Gate Software Ltd profile. I’m at Red Gate for the day so I pay a visit to their Information Systems team to see if they have any insight into what’s happening. Not surprisingly, I’m no longer in the list of subscribers they manage, so no dice there.

In the end I call the relevant Microsoft UK support line on 0800 051 7215 and select option 3 for Visual Studio subscriptions.

I talk to a guy there, who’s name I didn’t get on this occasion, who after a few minutes on hold whilst he investigates tells me that I need to create a new Pay As You Go Azure subscription, then I’ll be able to attach my Visual Studio cloud subscription to that. There was a bit more to it than that because I didn’t immediately grasp what he was telling me to do or why, or where I had to go to do it. He gave me a number to call for Azure support who would be able to help me.

Not really wanting to waste any more time on the phone, I did a bit of googling, and ended up back where I was after I’d clicked Create a new Azure subscription above, only now I understood that this was the right place to be.

I went through the process of creating a new subscription, supplying new payment information along the way (my old payment method had long since expired), which went fairly smoothly and I ended up in the Azure portal, as expected, with all my stuff (most of it entirely uninteresting):

Successfully created an Azure Pay-As-You-Go subscription and logged in to Azure portal.

OK. So about an hour and a half has passed since I first tried to buy Visual Studio. Bear in mind that buying goods on Amazon takes me about 10 seconds once I’ve decided what to buy.

Now I go back through the process to buy Visual Studio for the third time, and end up back on this page again, only now my new Pay-As-You-Go subscription is showing up:

Now I can buy Visual Studio with my Pay-As-You-Go subscription.

This time when I click Continue the subscription check succeeds and I can go ahead and select a quantity, confirm my acceptance of the terms and conditions, and click Confirm. I get a message indicating that my purchase has been successful. (I don’t have screenshots of this because I can’t get back to this point – more below.)

This all looks good but I can’t immediately figure out how to download my software. When I go to the benefits section of my account, all I have are the essentials, and both the Subscriptions and Downloads sections of my account are still blank:

Blank subscriptions section in my profile after purchasing.

At this point I’m stumped so it’s time to call support again. I speak to a guy called Adam.

He tells me I should have received a welcome email. I check my email and discover that I haven’t received the expected email.

He also asks me to send him screenshots of my subscriptions area, and my area, which also shows nothing:

MSDN administration blank subscriptions area and error.

Adam’s a nice guy and he’s trying to be helpful. In fact everyone I’ve spoken to at Microsoft is nice and trying to be helpful; it’s just that I don’t think they’re really equipped to actually help. This is frustrating. By now about 2 hours have passed since I first tried to buy Visual Studio and I’m getting chippy. I don’t yell at or insult Adam, because it’s not his fault, but I do ask him to pass on some fairly blunt feedback about the purchase process to his manager.

Adam tells me there’s no record of my purchase and I should try again. However, now when I go back through the purchase process the button I need to click to make a purchase is greyed out and I can’t get any further:

Greyed out button that I'd previously used to make a purchase.

(Interestingly, and I hadn’t realized this at the time, this seems like the process I’d go through to add more subscriptions, since if I increase the quantity to 2 the Update button enables. Of course, that adds to the cost so I don’t go through with it because I don’t want to be billed for two subscriptions.)

He doesn’t know what to do about this so he needs to pass the details along to technical support and will get back to me. This is fine. I have a meeting, then I have lunch.

Roughly another two hours have passed and I’ve heard nothing back about my attempted purchase, and still no welcome email.

I call support again and end up talking to Adam again. I feel a bit sorry for him at this point because I’m really not happy by now and it’s really not his fault. He tells me that my enquiry will be dealt with. I’m sure that’s true but I ask him for a timescale because it’s now getting in the way of what I need to do in the afternoon. He says he’ll pursue it as soon as we’ve finished talking and get back to me.

About half an hour later I get an email from Adam (contact details redacted):


On 30 Aug 2016, at 15:03, [email protected] wrote:

Dear Bart,

Please be informed that your predicament needs further investigation.

I have forwarded your issue with greyed out button ‘update’ to our technical support.

Once there is a feedback in your case we will inform you accordingly.

My apologies for this inconvenience.

Thank you for cooperation and understanding in advance.

Kind Regards,



So basically I’m back where I was before with an enquiry forwarded to technical support but no progress.

For the hell of it I try buying again with a completely fresh private browsing session in Firefox but end up at the same roadblock.

I log in to Azure again and have a look at my subscriptions at because I’m wondering if the subscription I created on Azure even worked if my Visual Studio subscription purchase didn’t. Here’s what I see:

List of Azure subscriptions.

At the bottom you can see the old Windows Azure MSDN – Visual Studio Ultimate subscription, which is still active even though the associated MSDN subscription is long gone. (I’m not complaining, btw: it just strikes me as a bit odd.)

Then at the top there’s the new Pay-As-You-Go subscription I just created. If I click on the new subscription I see this:

Summary information for my Pay-As-You-Go subscription.

So, according to this I clearly have a Visual Studio annual cloud subscription, but there’s no record of it shown on It confirms my suspicion about the disabled Update button: it’s disabled because I’ve already bought one subscription and it’s not going to enable unless I want to add more subscriptions to what I already have.

Still, it doesn’t really help me because I can’t download Visual Studio 2015, SQL Server, or Windows 10. If I go to marketplace it shows I haven’t made any purchases, and if I go to downloads it’s all SDKs and command line tools for working with Azure. This stuff is cool and I’ll probably use some of it, but it’s not what I need right now.

Anyway, I go to the pub, go home, sleep, and by the time I’ve got up the next morning I’ve now heard directly from two different Microsoft employees kindly trying to help me out. I’m really grateful to both of these gentlemen – I think it’s great when people take the initiative to reach out and help:

John Montgomery and Buck Hodges of Microsoft see my plight on twitter and kindly reach out.

I go with Buck’s suggestion since, at this point, I’m blocked, I’m getting no progress elsewhere, and I’ll try anything to get some help. He’s asked me to open a free support case at

It’s worth pointing out that when I tried this first thing in the morning I got a 404 from the page where I had to select the problem type, but I tried again later – after a long meeting – and it seems to be working properly.

Cloud Services Assisted Support page suggested by Buck.

This seems pretty straightforward so I just click on Basic Support which, after a few redirects, takes me to

Choosing a problem type to create an incident.

I select Account Administration from the dropdown. This shows me a category list:

Incident category list.

Since I’m having trouble buying a Visual Studio subscription I select License assignment and purchasing. Now I get a section appear that allows me to contact Microsoft:

Now we get to start filing a support request.

I click Start request. This takes me to, and it’s here that I start to worry that something isn’t right.

Form to create an incident.

The problem is in the top right hand corner. Note the product name, which is Visual Studio Team Services Preview. This doesn’t seem right to me at all: all I’m interested in is getting access to the subscriber benefits for my Visual Studio cloud subscription, which to me sounds like a different product.

Worried I might be about to disappear down another irrelevant rabbit hole I start a new private browsing session and try to go through the same process but this time I log in to first. It makes no difference and I end up back in the same place, only it looks like it signed me out somewhere along the way. I decide to fill in the form anyway.

The last page of this form includes a severity rating, which serves only to aggravate me since I am entirely blocked on two separate projects because I can’t access my subscriber benefits and download Visual Studio:

The rather presumptuous severity rating.

Sure, from Microsoft’s perspective this might be “Severity C (Minimum business impact)” but not from mine, and who are they to make the decision about how much of a problem this really is? Remember that more than 24 hours has now elapsed since my initial purchase attempt.

At least on this occasion my submission is successful:

I've successfully submitted a support request.

In the meantime I hear from somebody called Michal at to say that they are still waiting on a response from the technical support department:


Dear Bart,

Thank you for your e-mail.

Let me kindly inform you that we are still waiting for response from the responsible department.

We will contact you as soon as any new information is available.

Kind Regards,



Yesterday I was also in touch with @MicrosoftUK on twitter, where a guy called Tom asked me to DM him to talk about MSDN admin subscriptions. Having done so I’ve now heard back and had a brief exchange with him via DM:

Twitter DM conversation with Tom on the MicrosoftUK account.

At this point you can probably tell I’m getting a bit frustrated again, albeit that I’m trying to be polite.

In case Tom’s on to something here I go back to Red Gate again and verify that they are not administering any current or past MSDN or Visual Studio subscriptions attached to my Microsoft account. They verify that this is the case – I do not appear in their subscriber management list, can’t be found via search, nor by any other means.

Where does all of this leave me?

Well, after 30+ hours of wrangling there appears to be nothing I can do except wait. As much as people are clearly trying to help I don’t feel like anyone I’ve dealt with so far is in a position to resolve the problem.

As a result, I’ve still got no Visual Studio download, let alone a working copy installed, nor any other software downloads or license keys available to me. As I’ve said, this now means I’m blocked on a couple of projects, which is frustrating and shortly likely to become extremely problematic.

Those of you with long memories might remember Bill Gates’ rant from 2003 about his experience of trying to purchase Moviemaker and the Digital Plus pack:

It’s not a terribly British turn of phrase but, as it echoes down the years, I can’t help but agree with him when he says, “I am quite disappointed at how Windows Usability has been going backwards and the program management groups don’t drive usability issues.”

Yeah, that pretty much sums it up. There isn’t one part of this process where something didn’t break, often in a way that blocked me completely or left me confused.

And, further on that point…

A few observations about my experience of using Microsoft’s various websites during this episode

Firstly, and most obviously, so much is broken. If you just go to read content you’ll probably be fine but the moment you want to interact with anything at all whether it works or not seems to be a complete crap-shoot. Compounding this, much of both what is and what isn’t broken seems confusing or non-obvious.

Microsoft sites use way too many redirects. I mean JUST WAY TOO MANY. So many actions result in three or four redirects back and forth between different properties. Not only does this slow everything down but it mostly breaks of the browser Back button functionality. This means if you do need to go back it’s often just easier, or your only option, to start the entire process again.

Microsoft websites are SLOW. Most pages take several seconds to load and, as already noted, the redirects really don’t help.

This isn’t universally true but usability and user experience overall is pretty poor. The next action you take often isn’t obvious. You end up just experimentally clicking around to find what you need. Moreover there’s very little consistency across sites. The broken functionality only serves to weaken an already poor experience in these cases.

Navigation in general is haphazard. For example, depending on how you go about getting there, if you want to manage your Azure account you might end up in the old Azure management console (with a prompt encouraging you to use the new portal), or you might go direct to the new portal. I still can’t figure out what I did to end up going down each different route but I can assure you it happened.

It’s really hard to find stuff. You end up having to use Google or Bing. Even then you might well end up with incorrect or irrelevant information. For example, if you search for “visual studio subscriber downloads” you get pushed towards the old MSDN Subscriber Downloads page. This is fine if what you have is an old but still live MSDN subscription. However, if you have a Visual Studio subscription you need to download from a different page, which doesn’t appear in the search results.

Really horrible errors are commonplace. Much of this seems to be due to extremely undisciplined use of cookies (or related client-side storage technologies). Sometimes these errors will appear in the page all nicely formatted even if they are pretty uninformative. Sometimes you’ll just get a raw response like this back from the server:

{"$id":"1","innerException":null,"message":"TF400898: An Internal Error Occurred. Activity Id: bc208830-44cd-435b-a79f-7e5e8db87730.","typeName":"System.FormatException, mscorlib","typeKey":"FormatException","errorCode":0,"eventId":0}

Indeed. A blob of incomprehensible JSON in my browser window. Classy.

In case you’re wondering, this came from

I feel like I’m being exposed to a sort of distorted external manifestation of Microsoft’s internal processes and architecture when I move between these sites and interact with their support teams. Whilst this is some mixture of interesting and infuriating, mostly the latter at this point, on a very basic level it’s not what I care about as a user: I just want to be able to buy, download, and use the software, and that’s it.

It’s not like everything is universally bad though. There are in fact many good individual bits:

  • Pages on the site seem on the whole simple, well-designed, and easy to use. Maybe there’s the odd extra click in there that you don’t need, but that’s nitpicking and it feels like, if the purchase process actually worked properly then it would be fairly simple to use.
  • There’s a lot of information in the new Azure portal but, on the whole, it’s well laid out and fairly easy to find your way around. I wasn’t even looking particularly hard and managed to find one setting that suddenly made my website fly (which I think was new over the old management portal). Honestly, even the old management portal was pretty good. I certainly never had any issues figuring out what I needed to do.

The problem is that as a whole the experience just kind of sucks because there are too many overcomplicated and apparently poorly tested dependencies between the different sites. The plumbing that joins everything together just doesn’t seem to work properly. There’s just way too much that’s brittle, or just doesn’t work under any circumstance (that I can realistically achieve).

Like I say, this isn’t a rant against Microsoft in general, just an account of the frustrations of trying to do one particular thing: buy and download some software. The fact that this is so difficult, well… from one of the world’s largest and most successful software companies it’s all rather unsatisfactory.

Maybe I’m doing something wrong, but it’s not clear what. Maybe there’s something wrong with my account. Again, it’s not clear what that might be.

I’ll update when I have more.

A final postcript

I just received another update from the support team that isn’t saying anything useful, other than somebody’s looking at the problem. Notably, no timescales:

Dear Bart,

Thank you for your e-mail in regards to subscription access.

Please be informed that I placed your case in our internal department hands.

As soon as they provide me with the feedback we will inform you accordingly.

I hope the above information is of assistance.

Should you have any further issues, please do not hesitate to contact us.



Update: A final postscript and a happy ending

I’m overjoyed to say that this tale, like all the best stories, has a happy ending. A group of fantastic people from Microsoft – notably John Montgomery, Buck Hodges, Marc Paine, and Andrew Brenner – kindly stepped in and helped me out.

They were able to provide a workaround to activate my subscription and are discussing solutions for the problems I encountered with a view to fixing them so nobody else runs into these problems.

Read the full story here.

Current talk list 2016: web and database performance

It’s that time of the year where, for me, talk proposals are submitted. I also tend to take it as an opportunity to refresh and rework talks.

This year I’ve submitted talks for DDD, DDD North, and NDC London (this one’s a bit of a long shot), and am keeping my eye out for other opportunities. I’ll also be giving talks at the Derbyshire .NET User Group, and DDD Nights in Cambridge in the autumn.

Voting for both DDD and DDD North is now open so, if you’re interested in any of the talks I’ve listed below, please do vote for them at the following links:

Here are my talks. If you’d like me to give any of them at a user group, meetup, or conference you run, please do get in touch.

Talk Title: How to speed up .NET and SQL Server web apps

Performance is a critical aspect of modern web applications. Recent developments in hardware, software, infrastructure, bandwidth, and connectivity have raised expectations about how the web should perform.

Increasingly this attitude is applied to internal line of business apps, and niche sites, as much as to large public-facing sites. Google even bases your search ranking in part on how well your site performs. Being slow is no longer an option.

Unfortunately, problems can occur at all layers and in all components of an application: database, back-end code, systems integrations, local and third party services, infrastructure, and even – increasingly – the client.

Complex apps often have problems in multiple areas. How do you go about tracking them down and fixing them? Where do you begin?

The answer is you deploy the right tools and techniques. The good news is that generally you can do this without changing your development process. Using a number of case studies I’m going to show you how to track down and fix performance issues. We’ll talk about the tools I used to find them, and the fixes that resulted.

That being said, prevention is better than cure, so I’ll also talk about how you can go about catching problems before they make it to production, and monitor to get earlier notification of trouble brewing.

By the end you should have a plethora of tools and techniques at your disposal that you can use in any performance analysis situation that might confront you.

Talk Title: Premature promotion produces poor performance: memory management in the CLR and JavaScript runtimes

The CLR, JVM, and well-known JavaScript runtimes provide automatic memory management with garbage collection. Developers are encouraged to write their code and forget about memory management entirely. But whilst ignorance is bliss, it can also lead to a host of problems further down the line.

With web applications becoming ever more interactive, and the meteoric rise in popularity of mobile browsers, the kind of performance and resource usage issues that once only concerned back-end developers have now become common currency on the client as well.

In this session we’ll look at how these runtimes manage memory and how you can get the best out of them. We’ll discuss the “classic” blunders that can trip you up, and how you can avoid them. We’ll also look at the tools that can help you if and when you do run into trouble, both on the client and the server.

You should come away from this session with a good understanding of managed memory, particularly as it relates to the CLR and JavaScript, and how you can write code that works with the runtimes rather than against them.

Talk Title: Optimizing client-side performance in interactive web applications

Web applications are becoming increasingly interactive. As a result, more code is shifting to the client, and JavaScript performance has become a key factor for many web applications, both on desktop and mobile. Just look at this still ongoing discussion kicked off by Jeff Atwood’s “The State of JavaScript on Android in 2015 is… poor” post:

Devices nowadays offer a wide variety of form factors and capabilities. On top of this, connectivity – whilst widely available across many markets – varies considerably in quality and speed. This presents a huge challenge to anyone who wants to offer a great user experience across the board, along with a need to carefully consider what actually constitutes “the board”.

In this session I’m going to show you how to optimize the client experience. We’ll take an in depth look at Chrome Dev Tools, and how the suite of debugging, data collection and diagnostic tools it provides can help you diagnose and fix performance issues on the desktop and Android mobile devices. We’ll also take a look at using Safari to analyse and debug web applications running on iOS.

Throughout I’ll use examples from to illustrate. is an HTML5, JavaScript, and CSS games site. Currently it hosts a version of Star Castle, called Star Citadel, but I’m also working on versions of Asteroids (Space Rawks!), and Space Invaders (yet to find an even close to decent name). It supports both desktop and mobile play. Whilst this site hosts games the topics I cover will be relevant for any web app featuring a high level of interactivity on the client.

Talk Title: Complex objects and microORMs: an introduction to the Dapper.SimpleLoad and Dapper.SimpleSave extensions for StackExchange’s Dapper microORM

Dapper ( is a popular microORM for the .NET framework that provides simple way to map database rows to objects. It’s a great alternative when speed is of the essence, and when you just don’t need the functionality offered by EF.

But what happens when you want to do something a bit more complicated? What happens if you want to join across multiple tables into a hierarchy composed of different types of object? Well,then you can use Dapper’s multi-mapping functionality… but that can quickly turn into an awful lot of code to maintain, especially if you make heavy use of Dapper.

Step in Dapper.SimpleLoad (, which handles the multi-mapping code for you and, if you want it to, the SQL generation as well.

So far so good, but what happens when you want to save your objects back to the database?

With Dapper it’s pretty easy to write an INSERT, UPDATE, or DELETE statement and pass in your object as the parameter source. But if you’ve got a complex object this, again, can quickly turn into a lot of code.

Step in Dapper.SimpleSave (, which you can use to save changes to complex objects without the need to worry about saving each object individually. And, again, you don’t need to write any SQL.

I’ll give you a good overview of both Dapper.SimpleLoad and Dapper.SimpleSave, with a liberal serving of examples. I’ll also explain their benefits and drawbacks, and when you might consider using them in preference to more heavyweight options, such as EF.

How to quickly convert all NTEXT columns to NVARCHAR(MAX) in a SQL Server database

I was at a client’s earlier today and the question came up of how to convert all NTEXT columns to NVARCHAR(MAX) in their SQL Server databases, and it turns out they have rather a lot of them.

There are a couple of obvious advantages to this conversion:

  1. Online index rebuilds with SQL Server Enterprise Edition become a possibility,
  2. Values are stored in row by default, potentially yielding performance gains.

My response to this was, “Yeah, sure: I can write a script to do that.” Two seconds after I said this I thought, “Hmm, I bet 30 seconds of Googling will provide a script because this must have come up a zillion times before.”

Sure enough, there are some pretty reasonable hits. For example,

Buuuuuuuuuuuut as ever, you’d be naive indeed to think that you can just copy and paste code from StackOverflow and have it work first time. Moreover, even with modification, you need to go over it with a fine-toothed comb to make sure you’ve squashed every last bug.

For example, this boned me earlier because I wasn’t paying proper attention:

CASE WHEN is_nullable = 1 THEN 'NOT' ELSE '' END

You can see the logic is reversed from what it should be.

So, anyway, I ended up concocting my own, of which you can find the latest version at

There are essentially three phases:

  1. Change the datatype of the NTEXT columns to NVARCHAR(MAX) using ALTER TABLE statements
  2. Pull any values small enough to fit in row out of LOB storage and back into rows using UPDATE statements. Thanks to John Conwell for pointing out the necessity of doing that to realise any performance increase with existing data.
  3. Refresh the metadata for any views using sp_refreshview – this makes sure that, for example, columns listed for them in sys.columns have the correct data type.

Phases 1 and 2 are actually done together in a loop for each NTEXT column in turn, whilst phase 3 is done in a separate loop at the end. I just refresh the metadata for all views because, although I could figure out only the views that depend on the tables, it’s simpler to just do them all and doesn’t take that long. Of course, if you have thousands of views and a relatively small number of NTEXT columns you might want to rethink this. My situation is numbers of tables, views, and NTEXT columns are all of the same order of magnitude so a simple script is fine.

For those of you who don’t have git installed, or aren’t comfortable with DVCS, here’s the full script:



-- Set this to 0 to actually run commands, 1 to only print them.
DECLARE @printCommandsOnly BIT = 1;

-- Migrate columns NTEXT -> NVARCHAR(MAX)

DECLARE @object_id INT,
@columnName SYSNAME,
@isNullable BIT;


DECLARE @ntextColumnInfo TABLE (
object_id INT,
ColumnName SYSNAME,
IsNullable BIT

INSERT INTO @ntextColumnInfo ( object_id, ColumnName, IsNullable )
SELECT  c.object_id,, c.is_nullable
FROM    sys.columns AS c
INNER JOIN sys.objects AS o
ON c.object_id = o.object_id
WHERE   o.type = 'U' AND c.system_type_id = 99;

object_id, ColumnName, IsNullable FROM @ntextColumnInfo;

OPEN col_cursor;
FETCH NEXT FROM col_cursor INTO @object_id, @columnName, @isNullable;

@command =
'.' + QUOTENAME(OBJECT_NAME(@object_id))
+ QUOTENAME(@columnName)
WHEN @isNullable = 1 THEN ''
+ ' NULL;';
PRINT @command;
IF @printCommandsOnly = 0
sp_executesql @command;

   SELECT @command =
'.' + QUOTENAME(OBJECT_NAME(@object_id))
' SET '
+ QUOTENAME(@columnName)
' = '
+ QUOTENAME(@columnName)

   PRINT @command;
IF @printCommandsOnly = 0
sp_executesql @command;

   FETCH NEXT FROM col_cursor INTO @object_id, @columnName, @isNullable;

CLOSE col_cursor;
DEALLOCATE col_cursor;

-- Now refresh the view metadata for all the views in the database
-- (We may not need to do them all but it won't hurt.)

DECLARE @viewObjectIds TABLE (
object_id INT

INSERT INTO @viewObjectIds
SELECT o.object_id
FROM sys.objects AS o
WHERE o.type = 'V';

object_id FROM @viewObjectIds;

OPEN view_cursor;
FETCH NEXT FROM view_cursor INTO @object_id;

@command =
'EXECUTE sp_refreshview '''
PRINT @command;

   IF @printCommandsOnly = 0
sp_executesql @command;

   FETCH NEXT FROM view_cursor INTO @object_id;

CLOSE view_cursor;
DEALLOCATE view_cursor;

NOTE: this won’t work where views are created WITH SCHEMABINDING. It will fail at ALTER TABLE for any table upon which schemabound views depend. Instead, to make it work, you have to DROP the views, then do the ALTERs and UPDATEs, then re-CREATE the views. Bit of a PITA but there’s no way around it unfortunately. I didn’t need to worry about this because my client doesn’t use schemabound views.

Of course it goes without saying that you should back up your database before you run any script like this!

To use it you just need to substitute the name of your database where it says _YOUR_DATABASE_NAME_ at the top of the script.

Also, As with automating many tasks in SQL Server, dynamic SQL is a necessity. It’s a bit of a pain in the backside so a @printCommandsOnly mode is advised for debugging purposes, and I’ve switched this on by default. You can copy and paste the commands into a query window, parse them, or even execute them to ensure they work as expected.

Once you’re happy this script does what you want set the value of @printCommandsOnly to 0 and rerun it to actually execute the commands it generates.

You might wonder why I’ve written this imperatively rather than in set-based fashion. Well, it’s not just because I’m a programmer rather than a DBA. In fact the original version, which you can still see if you look at the file’s history, was set-based. It looked pretty much like this:


-- Migrate columns NTEXT -> NVARCHAR(MAX)

DECLARE @alterColumns NVARCHAR(MAX) = '';
SELECT  @alterColumns = @alterColumns
+ QUOTENAME(OBJECT_SCHEMA_NAME(c.object_id)) + '.' + QUOTENAME(OBJECT_NAME(c.object_id))
+ CASE WHEN c.is_nullable = 1 THEN '' ELSE 'NOT' END + ' NULL;'
+ CHAR(13)
+ QUOTENAME(OBJECT_SCHEMA_NAME(c.object_id)) + '.' + QUOTENAME(OBJECT_NAME(c.object_id))
' SET '
' = '
';' + CHAR(13) + CHAR(13)
FROM    sys.columns AS c
INNER JOIN sys.objects AS o
ON c.object_id = o.object_id
WHERE   o.type = 'U' AND c.system_type_id = 99; --NTEXT

PRINT @alterColumns;

EXECUTE sp_executesql @alterColumns;

-- Update VIEW metadata

DECLARE @updateViews NVARCHAR(MAX) = '';
SELECT @updateViews = @updateViews
+ 'EXECUTE sp_refreshview '''
+ QUOTENAME(OBJECT_SCHEMA_NAME(o.object_id)) + '.' + QUOTENAME(OBJECT_NAME(o.object_id))
''';' + CHAR(13)
FROM sys.objects AS o
WHERE o.type = 'V'

PRINT @updateViews;

EXECUTE sp_executesql @updateViews;

It’s certainly a lot less code, which is nice. And it doesn’t use CURSORs, which is also nice.

However, it does have problems:

  • The PRINT statement in T-SQL truncates output if it goes beyond a certain length. I don’t know exactly what this length is off the top of my head, but my generated scripts were more than long enough to reach it.
  • The result of this is you can’t copy and paste the complete generated script into another query window, so it might make debugging a bit trickier in some instances.
  • The really problematic thing is that, when something goes wrong, you can’t necessarily relate it back to the exact command that failed, whereas the imperative version makes this easy since each generated command is executed individually.

So I threw away the, on the face of it, "cleverer" and more "elegant" set-based version in favour of the longer, clunkier (but easier to debug) imperative version.

I hope you find it useful and please feel free to submit patches, pull requests, bug reports, feature requests via the main project GitHub page at (Turns out I’m building up a small library of handy scripts so I’ll be pushing a few more items into this repo in due course.)

Reminder: Demoing Node Tools for Visual Studio 1.0 Beta at NodeJS & JavaScript Cambridge TONIGHT!

Hey everyone, just wanted to put out a quick reminder that I’ll be demoing the latest Node Tools for Visual Studio 1.0 Beta at the NodeJS & JavaScript Cambridge meetup tonight.

It all kicks off at The Fountain on Regent Street from 7.45pm with beer.

I do love events that start off with beer, particularly ones where I’m speaking because it takes the edge off a little. Sign up at:

Also speaking is my friend, and former colleague, Forbes Lindsey. He is an active Jade contributor and will be giving a talk entitled The Jade template language, which I would highly recommend.

It should be a fun and interesting evening, with plenty of time for questions and discussion, so do come along if you can. I’ll certainly be happy to receive any feedback or suggestions you have for Node Tools for Visual Studio, and will pass it along to the team.

Look forward to seeing some of you there!

Node Tools for Visual Studio 1.0 Beta has landed

Those of you lucky enough to be at BUILD last week will no doubt be aware that Node Tools for Visual Studio 1.0 Beta has just been released.

Here are some of the headline improvements:

It’s also worth calling out the extensive Azure support in the suite, offering the ability to create, deploy, and debug Node apps on Azure (including on Linux) – exciting stuff!

Rather than have me talk too much about it, take a look at the videos the team have put together and see it in action for yourselves:

  • Installation walkthrough from Pavel. There’s something very exciting in this video: you may not be aware, but Visual Studio 2013 is available for FREE for both startups, via BizSpark, and students, via DreamSpark.

See the full announcement on Soma Somasegar’s blog.

As ever, please have a play. We’d love to hear your feedback so please get involved in the discussion. Also, do please let us know about any bugs you find.