I recently had to select a TFS 2010 process template to support a new development project using Scrum. Besides the obvious need for the template to work well for a Scrum project, I also wanted to keep things simple and flexible for my client. It was critical to choose a fully supported template with a future upgrade path for TFS v.Next.
Some of the considerations included:
- How well does the template support Scrum?
- How well rounded are the various TFS artifacts (work items, reports and SharePoint)?
- Is there any extra tooling, documentation or other benefits?
- How well supported is the template today and (best guess) into the future?
One of the great debates around TFS best practices is whether to create a separate team project for every development project, or whether to use a single team project to contain multiple dev projects. There are valid arguments for each option, which have largely been discussed elsewhere. To reduce the administrative overhead of managing many team projects and to provide consistency of the process template configuration, I decided that multiple dev projects in one team project was the right choice. If there are ever any custom modifications to the process template, it will only need to be done in one place.
That led to a few more questions:
- Does any process template tooling assume that the team project contains only one dev project?
- Do the reports included with the process template support multiple dev projects, or can they be easily modified? This applies to both SSRS and Excel reports.
- Can the work item queries be easily modified to support multiple dev projects?
All of these requirements narrowed the field to three:
- MSF for Agile Software Development V5.0
- Visual Studio Scrum 1.0
- Scrum for Team System V3.0
I quickly ruled out Visual Studio Scrum due to concerns about its lack of maturity and support. My guess is that this template will morph into an out-of-the-box template as part of TFS v.Next. Today, however, it’s very basic. It doesn’t have any Excel reports and very few SSRS reports, no document templates and only very basic SharePoint support. It has a handful of seven basic work item types. On the project forum, I found a lot of questions and issues raised with no response from Microsoft, and there haven’t been any posts from Microsoft for months. I got the feeling that this template wasn’t going to receive any more attention until it becomes part of the TFS product (if it ever does).
That narrowed the field to two: MSF vs SfTS. SfTS is in its third release, now under the EMC brand, so it has been refined through real-world experience over many years. Support was a concern right away, because the SfTS forums are pretty dead and there is no official support program. The extra tooling is nice (TFS Workbench), the work item templates make sense and there’s a good selection of SSRS reports. There’s even a Windows service to do time rollups and so on. There are good feature lists and comparisons elsewhere, so I won’t spend time on that here.
In the past, SfTS hasn’t always had a clear upgrade path. There was little documentation about upgrading an SfTS project from TFS 2005 to 2008, for example. Today there’s a migration tool from V2 to V3, which is great. However, it’s anyone’s guess if and when the EMC employees who maintain the template will carry it on to TFS v.Next. That’s a definite concern.
One big sticking point with SfTS is that it has a built-in assumption that one team project holds a single dev project. If you use the project setup wizard in TFS Workbench, it will wipe out and replace the areas and iterations, etc. defined in the project. It also relies on a very specific iteration hierarchy which builds off of a release, not a product. There didn’t appear to be any good way to use this template with multiple dev projects in a single team project, and that’s what finally got it crossed it off the list.
The choice was MSF for Agile Software Development V5.0, thanks to its clear support from Microsoft, robust process guidance documentation and document templates, extensive reporting, good SharePoint support, reasonable selection of work item types and ability to be tweaked to support multiple dev projects. Is it the best Scrum template? Maybe not, but I think it will work fine for our needs. We’re not purists about Scrum or any agile process, so we’ll take the good parts and tune it to work best with the client’s culture and the particular skills on the team.
While tracking down an issue the other day, I stumbled across 25,000+ empty subdirectories inside a single folder: Documents and Settings\<username>\Local Settings\Application Data\Microsoft\WebsiteCache (or on Vista, Users\<username>\AppData\Local\Microsoft\WebsiteCache). NTFS can technically handle this, but file system performance can slow down for a directory containing such a large number of subdirectories.
How did this happen? I’ve been using the same XP workstation for BizTalk and some .NET development for one year, using Visual Studio 2005 SP1, BizTalk Server 2006 R2 and the Visual SourceSafe 2005 provider. My BizTalk solutions include a C# web application project alongside numerous BizTalk projects. After deleting everything in the WebsiteCache folder, I discovered that my BizTalk solutions opened noticeably faster. Upon opening and closing the solution a few times, it turns out that Visual Studio was creating one empty subdirectory in WebsiteCache for most or all of my project files and items in Solution Items. Each time I opened a solution around 15 new subdirectories were created, but never deleted. Over the course of a year, I accumulated 25,000+. Another developer found 33,000+ subdirectories in his WebsiteCache folder!
Opening the solutions was taking longer and longer as time went on. By clearing out the WebsiteCache folder, the solutions (with VSS integration, and which contain around 12-15 projects) now open 10-15 seconds faster.
Other people have reported this issue to Microsoft Connect, but the issue was closed as “not reproducible.”
In my current project I’m using Enterprise Library 3.1’s Caching block to cache data retrieved from web services. The caching code is implemented in a regular C# class library, and I have NUnit 2.4 tests to test it. In order to configure Enterprise Library at runtime I’m using Enterprise Library’s FileConfigurationSource to point to a separate configuration file. Works great.
However, I discovered while running my unit tests that when I ran a test and then tried to close NUnit GUI or re-run a test, there was a 5-10 second delay before the IDE closed. An AppDomainUnloadException was being thrown at the end of the delay. When I commented out the code that created the Enterprise Library CacheManager object the delay disappeared, so clearly Enterprise Library was doing something to block the AppDomain from unloading.
After some digging I found the issue. FileConfigurationSource creates a worker thread that monitors the associated configuration file for changes. The factory objects, in this case CacheManagerFactory, hold a reference to the FileConfigurationSource object. There is no way to explicitly dispose or clean up the FileConfigurationSource object itself. NUnit loads the assembly to be tested into a new AppDomain, and when it shuts down or runs another test, it tries to unload the test AppDomain. What ends up happening is that NUnit asks the AppDomain to unload, but the FileConfigurationSource’s file monitoring thread does not shut down. As a result, the AppDomain cannot be unloaded and we see the delay and the AppDomainUnloadException. Needless to say, this is REALLY annoying.
One partial solution that I found is the Enterprise Library 3.0+ method FileConfigurationSource.ResetImplementation(). If you create a FileConfigurationSource object and then immediately call the static FileConfigurationSource.ResetImplementation() method with the same file path, but pass false to the ‘refreshing’ parameter, the configuration file will not be monitored for changes. This will have the effect of shutting down the monitoring thread and allowing the AppDomain to unload… but you lose auto-refresh of configuration.
I still haven’t found a real solution to this. The ‘patterns & practices’ guys need to make FileConfigurationSource implement IDisposable or something. In the meantime, I’m forcefully killing NUnit all the time or waiting out the delay, both of which are really a pain.
Reader Ravindranath posed several questions today in a comment, and I think that they deserve a post of their own. Here they are again:
- As a part of migrating from .Net 1.x to .Net 3.x, is it advisable to re-architect for the newer .Net 3.x features (WWF, WCF, WPF, etc)?
- When is it a MUST to re-architect and when is it optional?
- Are there any approach papers towards this?
There are two primary areas of benefit for those considering an upgrade from .NET 1.0/1.1 on Visual Studio 2002/2003 to .NET 2.0, 3.0 or 3.5: benefits resulting from IDE enhancements, and benefits resulting from .NET Framework enhancements.
First, let’s talk about IDE enhancements. Today, your IDE of choice should be Visual Studio 2008, whether you are using .NET 2.0, 3.0, 3.5 or are considering an upgrade from .NET 1.0/1.1. VS2008 is the first Visual Studio IDE for .NET that can target multiple versions of the .NET Framework, so if you are using .NET 2.0 today, you have nothing to lose and everything to gain by moving from VS2005 to VS2008.
Just a few of the benefits of Visual Studio 2008 include:
- Completely new CSS-oriented ASP.NET designer, shared with Expression Web (formerly FrontPage)
- Improved code analysis (FxCop) tools
- Improved performance analysis tools
- Team Explorer 2008 client for Team Foundation Server 2005/2008, with an improved Source Control Explorer
Since Visual Studio 2008 is still a new release, there are some Visual Studio IDE extensions that haven’t been upgraded yet. Depending on how important those are to you, it’s possible that you could be forced to wait for updates. Two notable examples are BizTalk Server 2006 R2, which requires VS2005 and has no announced timetable for a VS2008 update, and Microsoft’s Enterprise Library, which includes a configuration editor plug-in that is not VS2008-ready. Enterprise Library has an easy workaround since you can either use the standalone editor or hop over to VS2005 for configuration tweaks, but BizTalk’ers are out of luck.
Now to move on to the main focus of Ravindranath’s questions: upgrade benefits resulting from .NET Framework enhancements.
The .NET Frameworks 1.0, 1.1 and 2.0 were completely isolated from each other, but that changed with .NET 3.0 and 3.5. The .NET 3.0 and 3.5 Frameworks can be thought of as layers on top of each other. In fact, as I’ve written about previously, .NET Framework 3.5 requires both .NET 2.0 SP1 and .NET 3.0 SP1. ASP.NET has, in fact, remained at version 2.0.
Projects upgrading from .NET 1.0/1.1 to 2.0/3.0/3.5 will gain their major benefits not from features in 3.0 or 3.5, but from the CLR enhancements introduced back in Framework 2.0. In most cases you will find immediate performance and memory usage benefits with a straight conversion to 2.0, making no code changes except in the rare cases where you might have used a method or class that had a breaking change in 2.0.
My answer to question #1 is generally No, and my answer to question #2 is that redesign is never required. Now, of course, I have to qualify that with a couple of caveats, and put some logic behind my answers.
First, it really depends what kind of application is involved and what is important to the business behind it. My primary example here is Windows Presentation Foundation (WPF). If your application is a consumer-focused application where graphics and fancy look-and-feel are very important, then yes, it makes sense to take a very hard look at moving to WPF. You will never reproduce what WPF can do in Windows Forms — although even that requires the caveat that WPF controls can be hosted inside a Windows Forms application!
If you really need the full power of WPF and your app is currently Windows Forms-based, you’re really looking at a rewrite, not an upgrade. WPF carries with it a significant learning curve, immature tools and third-party libraries and a major time investment. I do not discourage its use, but you do need to have good reasons and a real need for it, and know what you are getting into. In another year or two, there will be no reason not to build all smart client apps with WPF, but we’re not there yet.
Second, there is often no good reason to rewrite your ASMX-based Web services with Windows Communication Foundation (WCF). ASMX is still supported, and it will remain in the Framework into the future.
There are two main reasons to rewrite existing ASMX services with WCF:
- You have an explicit need for the WS-* features introduced in WCF and cannot get by with the WS-* subset in the Web Services Enhancements add-ons.
- You need the ultimate in performance from your service.
I recommend without qualification that all NEW services (which can be anything from an MSMQ listener to a web service to a self-hosted TCP endpoint) and service clients be written with WCF. Once again, you will experience a fairly significant learning curve, but WCF is the communication framework of the future, so you’ll have to learn it eventually. Of the major new subsystems in .NET 3.0/3.5, WCF is the one that most developers will use most often, and it is the first one to learn.
That leaves Windows Workflow Foundation (WF) and CardSpace, and these are the least common. As with most security-related programming tools, CardSpace will never excite much developer interest. I think it will remain a niche tool. On the other hand, WF has a lot of potential, but it also takes the most time for developers and architects alike to fully comprehend how to put it to use. One sample that is out demonstrates the automation of a Windows Forms form using nothing but the WF rules engine to drive validation and enabling/disabling controls as values and control focus changes. Normally this would involve dozens of event handlers and many lines of code in even a relatively simple form, but this sample has almost no code behind the form. That’s a pretty slick example of just the WF rules engine, which doesn’t even address the actual workflow engine.
So, to recap, in most upgrade scenarios from 1.1 to 3.0/3.5, I think you will be best served by a direct upgrade, not a rewrite. Then evaluate, in order, where you might be able to put to use WCF, WF, WPF and CardSpace, but don’t rush to use any of them just because they’re there! You will gain huge benefits just from the improvements in the 2.0 CLR and Framework and in the newer Visual Studio IDEs, so enjoy those improvements without too much worry about the 3.0 alphabet soup. You’ll find a use for them when the time is right.
Finally, I am not aware of any specific papers including guidelines for when to re-design or not in these areas. Generally, I would look to MSDN and primarily the patterns & practices team for this type of analysis, but I haven’t seen anything yet. If any readers know of related papers, please feel free to post links in the comments.
As you may or may not know, Windows Presentation Foundation (WPF) does not ship with a data grid control. [I’ll pause while I wait for the cursing to die down…] First, I need to make an important distinction: there is a Grid control in WPF, but it is a layout control, not a data grid like Windows Forms’ DataGridView/DataGrid. The good news is that the usual array of third-party component vendors has jumped in to fill the gap. The bad news is that most are still at various stages of beta or 1.0 releases.
Update: For the sake of completeness, I should mention that Windows Forms controls can be hosted in WPF, and that’s another option to consider. Here, I’m talking about “pure” WPF controls.
The WPF data grid controls that I have discovered include:
For the last three months I’ve been working on a .NET 3.5 WPF-based business application (a rare animal these days, since most WPF samples and real-world apps are highly consumer-oriented). I’ve been using Visual Studio 2008 Beta2, and jumped over to the RTM the day it was available. The main purpose of this application is data editing, so I needed a solid data grid control. I started by checking out the options listed above.
My first approach was Infragistics xamDataGrid. They offer a free Express edition, so I started with that (and later purchased the product to obtain support). It went in pretty easily and visually looked nice. My data source is a collection of objects that implements IBindingList. If your collection class does not implement IBindingList, you will not be able to add new rows to the grid (this is also true with Xceed). I quickly discovered that xamDataGrid did not provide the out-of-box behaviors that one would expect when adding and canceling a new row. For instance, if you start a new row, enter some values, then hit Escape twice, my expectation is that the new row is canceled and removed (see Access, SQL Management Studio, etc.). I also had trouble getting the grid to bind to a column using a ComboBox instead of a string value. I had a collection of objects that represented all possible values of a field (CountriesCollection, for example), and was binding the ComboBox to a property of that same object type (binding CurrentCountry property, of type Country, for example).
The Infragistics support forum for xamDataGrid consisted of many people posting questions and rarely receiving answers. There were many threads ending with “Hello, is anyone from Infragistics listening?” Thinking that premier support would be great, we purchased the product. Quite frankly, I was disappointed with the “premier” support. I got responses that did not address my specific scenario (as explicitly described in the support request), and those that said “it’ll be fixed in a future hotfix.” Suffice it to say, I dumped xamDataGrid.
I highly recommend Xceed DataGrid for WPF. This is a solid product with good support. It has been out in real release, not beta, for a long time already, and it just works. It took a half day or so to drop it in and hook it up, figure out a few subtleties, and it was ready to go. I still had some questions, so we purchased this product too, and their support staff turned the questions around quickly with definitive answers. Xceed also offers a free, highly-capable version of DataGrid for WPF, so check it out. One thing to note if you are used to Windows Forms data grids: Xceed DataGrid for WPF does not support the IDataErrorInfo interface for bound object validation and automatic error display. They have that in their suggestions list but with no timeline.
Save yourself some time and hassle and go straight to Xceed DataGrid for WPF.
NOTE: I have no connection to Xceed whatsoever; I just hope this saves you some time since I learned the hard way!
The next major release of Visual Studio 2008 and the .NET Framework 3.5 have quietly been released to manufacturing over the weekend, along with .NET Framework 2.0 SP1 and .NET 3.0 SP1. This is an important release of Visual Studio because it fully integrates the tooling for the technologies released in .NET 3.0 (Windows Communication Foundation, Windows Presentation Foundation, Windows Workflow Foundation and CardSpace) and, for the first time, can target multiple versions of the .NET Framework.
Our team has been building experience in the .NET 3.0 technologies for most of this year and playing with the betas, and we’re looking forward to working with the improved tooling in the RTM release.
Download .NET Framework 3.5 here. The .NET 3.5 installer will install the 2.0/3.0 Framework and 2.0 SP1 and 3.0 SP1 automatically. The service packs are also available separately for 2.0 and 3.0. As for Visual Studio 2008, I think the MSDN subscriber downloads site is having issues already, probably due to high demand.
I just finished installing .NET Framework 3.5 RTM on my laptop running Vista Enterprise. The install took a long time, about 30 minutes, but succeeded. Along with 2.0 SP1 and 3.0 SP1, it also installed two Vista hotfixes, KB929300 and KB110806. This release, like 3.0, is more of an additive release that requires and builds upon 2.0 and 3.0, unlike the 1.1 to 2.0 transition.
There is also a big new training kit (120 MB) that includes presentations, demos and labs. You can get that here. There are also 3.5 whitepapers by David Chappell and a 3.0 common namespaces and types poster.
I’ve been working with 3.0 and the 2008 betas for about 10 months now, so I’ve been a bit negligent with my blogging! It has just ended up to be another really busy year. I hope to get some new posts out about 3.0/3.5 soon.
.NET Framework 3.5 builds incrementally on the new features added in .NET Framework 3.0. For example, feature sets in Windows Workflow Foundation (WF), Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF) and Windows CardSpace. In addition, .NET Framework 3.5 contains a number of new features in several technology areas which have been added as new assemblies to avoid breaking changes. They include the following:
- Deep integration of Language Integrated Query (LINQ) and data awareness. This new feature will let you write code written in LINQ-enabled languages to filter, enumerate, and create projections of several types of SQL data, collections, XML, and DataSets by using the same syntax.
- ASP.NET AJAX lets you create more efficient, more interactive, and highly-personalized Web experiences that work across all the most popular browsers.
- New Web protocol support for building WCF services including AJAX, JSON, REST, POX, RSS, ATOM, and several new WS-* standards.
- Full tooling support in Visual Studio 2008 for WF, WCF, and WPF, including the new workflow-enabled services technology.
- New classes in .NET Framework 3.5 base class library (BCL) that address many common customer requests.