Now we've released volume 2006.3 of DXperience (that is, of our UI controls and frameworks for .NET), it is time to think about volume 2007.1, the first version of next year.
Coincidentally, I've set aside Wednesday, the day after tomorrow, as the day I install Vista on my main machine (and already I can hear you say, huh? what's that got to do with the next version of DXperience?). At that point I will be using .NET 3.0 full-time, on an operating system that automatically comes with it. Already Windows XP SP2 comes with .NET 2.0, although I suppose you can elect not to install it, but Vista will have .NET available as part of the install. From next January, Vista will start the uphill task of becoming as ubiquitous as XP: it will start to be shipped with new PCs and will be available as a paid upgrade.
Now, I, of all people, have no idea at all how quick that process will be. How many people will upgrade and how quickly? Dunno. Haven't the foggiest, old chum. No matter what though, .NET 2.0 will continue its onward march to become the version of .NET to target, especially as .NET 3.0 is "just" a few more .NET assemblies thrown on the top of .NET 2.0. And .NET 3.5 is not that far away (at least I think that's what it's going to be called).
And we, as third-party vendors of .NET products, have to be there before our customers, because when our customers need some .NET control that targets .NET 2.0/3.0 we have to have written it already. And we had better have all the .NET 2.0 bells and whistles as part of that control.
Now this can be read to mean WPF (Windows Presentation Foundation) controls, and I won't deny it: we have already started our investigations and research in this area, but we're way too early for me to even begin discussing what we're going to do. It doesn't help that WPF controls have to work on two different design surfaces: that provided by Cider in Orcas (the designer for the next version of Visual Studio) and that provided by Microsoft Expression Interactive Designer, both of which are in a state of flux.
But it also applies to our WinForms controls and ASP.NET controls and our application frameworks. We need to target .NET 2.0 more strongly than we have done in the past. I admit we've started the process: some of the functionality we have in our controls is only there for .NET 2.0 (for example, our accessibility support is better in a .NET 2.0 application than in a .NET 1.x application because the underlying support is more full-featured in .NET 2.0). And the XPO guys have already started blogging about what we're thinking with regard to LINQ support, and that's .NET 3.5 material.
So, here I am thinking about what to do with .NET 1.x. I really feel as if we are starting to hobble ourselves and our customers by attempting to target all versions of .NET. There was a tech support case recently that I was asked to comment on whose solution was downright obvious: use a nullable type wrapping a value type. Except that our control has no knowledge of nullable types: it's a .NET 2.0 feature. So we're going to have to use a "special" value to represent a database null. It's just a horrible hack; I hated it way back when I had to do that, and I still hate it now (there's inevitably some code that doesn't "know" about the special value -- a bug waiting to happen, which is why I was called in on this particular support case).
One of the plans I'm considering and that we're now discussing for 2007.1 is this: freeze the set of controls that work with .NET 1.x to the set that were shipped with 2006.3. Maintain them, provide tech support for them, deliver bug fixes and workarounds for the foreseeable future (at least well into 2008 and maybe even as far as 2009). In essence, continue providing minor releases of 2006.3 for the next 18 to 24 months (or longer, depending on demand).
However, under this plan, the new controls and functionality we'll make available in 2007.1 will be for .NET 2.0 and 3.0 only. We can fully take advantage of the new functionality embedded in the .NET 2.0 framework, as well as use new features like generics, iterators, and anonymous methods (and the aforementioned nullable types) to in turn deliver the features you need in that environment.
Given that this is one of the plans we're considering, what do you think?