Latest Posts
This is the third part in what I hope to be a four-part series about creating a WPF application using TDD to drive the functionality and MVVM to keep everything testable as we go. The idea is to use view models to split away functionality from the view and have it available for testing while not losing any capabilities along the way. If you haven’t read the first two parts, you may want to do that.
In this part, we’ll see what it takes to have a user gesture, in our case, either a double-click on a row in our ListView or clicking a button, take us to a different page in our application.We’ll write the code to get you to the other window in this post and leave the corresponding code to get back for readers as an exercise, should they want to confirm they understand how this all works. So, here we go.
The end result
At the conclusion of this process, we’re going to be able to start from the opening page, showing players and their numbers:
and navigate to this second page:
About this time, I’m feeling pretty good about my screen design abilities as well, as these pages are beautiful! (One thing I’ve learned about myself over the years is that I have very little taste when it comes to designing UIs :))
Step 1 – Writing the command logic to command the pages to switch
As before, when we’re adding new behavior based on a user gesture, we start by writing the ICommand class. We do this because it fleshes out both the details of that class, but also because it drives us down the road of creating the interface that the command class is going to use. This interface is going to be eventually implemented by the view model class, the TeamStatControlViewModel in our case. We don’t “officially” know that at this point, though, so we work through this interface, which represents one of the growing number of roles our view model fulfills. Fo more information on this style of development, read this paper by Steve Freeman.
Let’s begin by writing our first test for the command class. This is the test that invokes the behavior that the role we’re collaborating with makes available to us. In keeping with my experiment of creating lots of little fixtures, each of which represents a complete, but individual, behavior of my system, I’ve created a fixture called InterPageNavigationFixtures. My idea is that this fixture will hold all tests that document how navigating between pages works. Our first test:
1: [Fact]
2: public void SwitchToPlayerViewStartedWhenViewPlayerCommandExecutes()
3: { 4: var viewPlayerSwitcher = new Mock<IViewPlayerModeSwitcher>();
5: ViewPlayerModeSwitchCommand cmd = new ViewPlayerModeSwitchCommand(viewPlayerSwitcher.Object);
6:
7: cmd.Execute(null);
8:
9: viewPlayerSwitcher.Verify(s => s.SwitchToPlayerViewMode());
10: }
Like the other test we created for a command, we define the interface that represents the role we’re going to use, IViewPlayerModeSwitcher, and then our command class. The rest of the test ensures that the correct behavior happens when we invoke the command’s Execute method.
To make this test compile, we have to create some things, including the interface, the command, and some very minimal method signatures in both.
In the ViewModels project, we add the interface:
1: namespace ViewModels
2: { 3: public interface IViewPlayerModeSwitcher
4: { 5: void SwitchToPlayerViewMode();
6: }
7: }
as well as the skeleton of the command:
1: namespace ViewModels
2: { 3: public class ViewPlayerModeSwitchCommand
4: { 5: public ViewPlayerModeSwitchCommand(IViewPlayerModeSwitcher modeSwitcher)
6: { 7: }
8:
9: public void Execute(object parameter)
10: { 11: }
12: }
13: }
Run test, test fails, implement minimal behavior to make test pass:
1: public class ViewPlayerModeSwitchCommand
2: { 3: private readonly IViewPlayerModeSwitcher modeSwitcher;
4:
5: public ViewPlayerModeSwitchCommand(IViewPlayerModeSwitcher modeSwitcher)
6: { 7: this.modeSwitcher = modeSwitcher;
8: }
9:
10: public void Execute(object parameter)
11: { 12: modeSwitcher.SwitchToPlayerViewMode();
13: }
14: }
At this point, the test passes, and we can invoke the switching behavior that will be implemented in our view model shortly.
The last thing I was to do here before moving on is to expose the command through the view model so the view can bind to it. A simple test, much like others we’ve seen before:
1: [Fact]
2: public void ViewModelExposesSwitchToPlayerViewModeCommandAsICommand()
3: { 4: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null, null, null);
5:
6: Assert.IsAssignableFrom<ViewPlayerModeSwitchCommand>(viewModel.PlayerViewMode);
7: }
8:
and we implement this by simply adding an auto-property to our view model called PlayerViewMode.
Part 2 – Making the view model change application modes
In this next, the view model will begin to switch modes in the application between the Player Summary mode and View Player mode. I’m intentionally calling these modes here because I don’t want the view model to know about windows and views and other UI-ish specifics. As far as it is concerned, the application has two modes in which it can work, and someone else is going to be able to translate from the information about modes and transitions to swapping out views and controls. This is purely an example of separating concerns, where the view model only cares about the modes of the application and another class, more than likely in the same assembly as the view logic, will know how to act upon modes switching.
Starting down this road, we’ll write a test that drives out the interface for how we’ll tell something outside of the view model that a mode is changing. We’ll be talking to a role I chose to call the ModeController, commanding it through its PlayerViewMode. Here is the test:
1: [Fact]
2: public void ModeControllerCommandedToSwitchToPlayerViewByViewModel()
3: { 4: var modeController = new Mock<IModeController>();
5: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null, modeController.Object, null);
6:
7: viewModel.SwitchToPlayerViewMode();
8:
9: modeController.Verify(nc => nc.PlayerViewMode(It.IsAny<Player>()));
10: }
Since the TeamStatControlViewModel needs access to the mode controller, we had to modify its constructor to take an argument of that type. We call the method we’re trying to drive through the tests, SwitchToPlayerViewMode, and then comes our assertion. Our assertion is a bit interesting here – maybe I’m thinking too far ahead, but I’m considering how the view that is going to eventually be rendered is going to work. Its going to need to know about the player that was selected, so it can show it. In fact, that player is probably going to become its DataContext. To give the new view, which will be rendered by someone else at some other time, access to the player, I’m passing it along here. I’m not writing the code that will actually cause it to be passed yet, as you can see by the It.IsAny<Player> argument in the Verify statement, but I’m declaring that an object of that type is going to be passed to it when the system runs for real. Let’s implement this small step:
First, the IModeController, which sits in the ViewModel sassembly:
1: namespace ViewModels
2: { 3: public interface IModeController
4: { 5: void PlayerViewMode(Player player);
6: }
7: }
and then the minimal code in the view model:
1: public class TeamStatControlViewModel: IApplicationExitAdapter, IViewPlayerModeSwitcher
2: { 3: private readonly IApplicationController applicationController;
4: private readonly IModeController modeController;
5: private readonly IPlayerRepository playerRepository;
6:
7: public TeamStatControlViewModel(
8: IApplicationController applicationController,
9: IModeController modeController,
10: IPlayerRepository playerRepository)
11: { 12: this.applicationController = applicationController;
13: this.modeController = modeController;
14: this.playerRepository = playerRepository;
15: ApplicationExit = new ApplicationExitCommand(this);
16: PlayerViewMode = new ViewPlayerModeSwitchCommand(this);
17: }
18:
19: public void SwitchToPlayerViewMode()
20: { 21: modeController.PlayerViewMode(new Player());
22: }
23: }
Please not that I’m only showing the interesting bits here, and removing code that didn’t change from the last time we looked at this class. The bits that did change are an additional parameter to the constructor of this class and the addition of the SwitchToPlayerMode method. Since that method came from the IViewPlayerModeSwitcher, I also went ahead and implemented the interface here. (Note – Since this isn’t a lesson in TDD, I skipped the step of how I used the AddMethodParameter refactoring to slowly add the new constructor and move away from the old one. I didn’t do this in one big step, I did it in small steps, using the tests to guide me to what to change next.)
The next step is to get the player that is selected in the ListView and pass that along in the call, instead of passing an empty player. Here is the test used to drive that:
1: [Fact]
2: public void SamePlayerPassedToModeControllerAsSetInViewModel()
3: { 4: var modeController = new Mock<IModeController>();
5: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null, modeController.Object, null);
6: Player player = new Player();
7: viewModel.SelectedPlayer = player;
8:
9: viewModel.SwitchToPlayerViewMode();
10:
11: modeController.Verify(nc => nc.PlayerViewMode(player));
12: }
There are only small differences between this test and the one before it. The main one is that I’m defining a new property on the view model, SelectedPlayer. A ListView sets this property every time the selected item changes in its view, and this property will allow our view model to be informed about which player is selected at any time. Now we can pass along that player in the PlayerViewMode call, and all is well. Here are the minor changes in TeamStatControlViewModel:
1: public Player SelectedPlayer { get; set; } 2:
3: public void SwitchToPlayerViewMode()
4: { 5: modeController.PlayerViewMode(SelectedPlayer);
6: }
Part 3 – Hooking up what we have
Despite the fact that I write a lot of tests for my code, I still like to see it work every now and then! This would be one of those times. We’re at the point now where we should be able to wire up everything we have and get to the point where the mode controller would be able to swap out controls, were we to have implemented that last piece of functionality. Let’s hook up what we got and see what works.
Let’s start by making a couple of quick changes in the XAML. We’ll add a SelectedItem attribute and binding in the ListView and we’ll hook up the ViewPlayer button to the command:
1: <ListView IsSynchronizedWithCurrentItem="True" Grid.Row="1" VerticalAlignment="Stretch"
2: SelectedItem="{Binding SelectedPlayer}" ItemsSource="{Binding Players}">
1: <Button Command="{Binding PlayerViewMode}" Grid.Column="0" Content="View Player Stats" 2: HorizontalAlignment="Right" Style="{StaticResource NormalButton}"/>
That should be enough to have the user gestures be sent to our view model.
The view model itself is complete, but we need to make some class implement the IModeController. Again, I think the best place, at least for now, is the App class, so we’ll put that interface there – I do suspect that we’ll eventually pull that out of the App class and make it its own class, so that we can test it, but we haven’t had that need yet. Someday, maybe…
That leaves some very minor changes in App.xaml.cs. We add the interface to the class definition, implement the PlayerViewMode method, and tell the container that App implements the IModeController interface (line 8), which allows it to pass an object of that type to the view model’s constructor.
1: public partial class App : Application, IApplicationController, IModeController
2: { 3: private readonly IUnityContainer container = new UnityContainer();
4:
5: private void Application_Startup(object sender, StartupEventArgs e)
6: { 7: container.RegisterInstance<IApplicationController>(this);
8: container.RegisterInstance<IModeController>(this);
9:
10: container.RegisterType<IPlayerRepository, PlayerRepository>(new ContainerControlledLifetimeManager());
11: container.RegisterType<TeamStatControlViewModel>(new ContainerControlledLifetimeManager());
12: container.RegisterType<TeamStatControl>(new ContainerControlledLifetimeManager());
13:
14: container.RegisterType<MainWindow>(new ContainerControlledLifetimeManager());
15:
16: Current.MainWindow = container.Resolve<MainWindow>();
17: Current.MainWindow.Content = container.Resolve<TeamStatControl>();
18: Current.MainWindow.Show();
19: }
20:
21: public void ExitApplication()
22: { 23: Current.Shutdown();
24: }
25:
26: public void PlayerViewMode(Player player)
27: { 28: ;
29: }
30: }
At this point, we’re good to try it out, so start up the application, click on a name, press View Player, and… OK, still nothing happens because we don’t have another window yet. I tested this by putting a breakpoint on line 28 and debugging it to see that I made it to here, which I did, and that the correct player was being sent here. I know my tests told me that this should work, but in the immortal words of Ronald Reagan, “Trust, but verify”.
Part 4 – Showing the other view
We’re in the home stretch now. Let’s show the other view. First, let’s just assume that I created another view. You can see it way back at the top – its the second window you see, with a big name and number in it. Once you’re at this point, all you need to do to enable the app to switch between the main view and this view is to implement the App.PlayerViewMode method correctly. I couldn’t find a way to test this, since I’m manipulating the UI directly, so I just wrote the code:
1: public void PlayerViewMode(Player player)
2: { 3: Current.MainWindow.Content = null;
4:
5: Current.MainWindow.Content = container.Resolve<PlayerDetailControl>();
6: ((PlayerDetailControl) Current.MainWindow.Content).DataContext = player;
7: }
A couple things to note here. First, I didn’t register the type, PlayerDetailControl, with the container. The Unity container will do its best to create any object that hasn’t been registered with it by calling whatever constructor it can find that matches up with arguments it knows how to build. In our case, the class has a default constructor, so it knew how to build it. Since we didn’t register it, Unity will just create a new instance of the control for me every time I ask for it. I can then assign the player to be its DataContext, and we’re done. That turned out to be very easy :)
At this point, we should be able to select a player, click on the View Player button, and the other view should appear. Success! But we’re not quite finished yet… sorry! Two more points to make
Part 5 – Double clicking and CanExecute for the command
Before we finish, I want to cover two other things. The first is how to enable double click behavior for the ListView. There isn’t a simple way to attach a command behavior to the ListView in the version of WPF I’m using. I know that AttachedBehaviors are part of the new WPF version that’s in development now, but I don’t have that, so you’re stuck with this explanation :)
Since there wasn’t a way to attach a command to the double-click event, I had to put code into the code-behind page, which is the first time I’ve had to do that yet! I wired up an event handler to the double-click event through a small change in the XAML for the ListView:
1: <ListView IsSynchronizedWithCurrentItem="True" Grid.Row="1" VerticalAlignment="Stretch"
2: MouseDoubleClick="ListView_MouseDoubleClick" SelectedItem="{Binding SelectedPlayer}" ItemsSource="{Binding Players}">
and added a trivial handler in the TeamStatControl.xaml.cs file:
1: private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
2: { 3: TeamStatControlViewModel viewModel = (TeamStatControlViewModel) DataContext;
4: viewModel.PlayerViewMode.Execute(null);
5: }
All this method does is to call the Execute method of the same command that the button runs. Trivial code. So now we can double-click on a player in the list and the right thing happens.
But what happens if no player is selected (OK, I couldn’t figure out a way to make this happen for the real list view, but it seemed like an interesting example and thought experiment!). We need to implement the CanExecute behavior for the ViewPlayerModeSwitchCommand. As usual, we do this through tests.
In our first test, we confirm that the command cannot execute if no player is selected:
1: [Fact]
2: public void ViewModelFunctionalityIsNotOnlyAvailableWhenNoPlayerIsSelected()
3: { 4: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null, null, null);
5: ICommand playerViewModeCommand = viewModel.PlayerViewMode;
6:
7: Assert.False(playerViewModeCommand.CanExecute(null));
8: }
and we implement CanExecute as simply as we can to make the test pass:
1: public bool CanExecute(object parameter)
2: { 3: return false;
4: }
Our next test is a little more interesting, as it requires that the CanExecute returns true if a player is selected:
1: [Fact]
2: public void ViewModelFunctionalityIsAvailableWhenPlayerIsSelected()
3: { 4: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null, null, null);
5: ICommand playerViewModeCommand = viewModel.PlayerViewMode;
6: viewModel.SelectedPlayer = new Player();
7:
8: Assert.True(playerViewModeCommand.CanExecute(null));
9: }
The only real modification here is that we use the SelectedPlayer method of the view model to set the player that would be selected through the real view. We expect that the command class is able to query this SelectedPlayer property through its reference to the view model using the IViewPlayerModeSwitcher interface. Well, that’s what we’d expect, anyhow…
1: public bool CanExecute(object parameter)
2: { 3: return modeSwitcher.SelectedPlayer != null;
4: }
The SelectedPlayer property isn’t available through that interface, so as our final step along this long and tortuous path, we add it to the interface, our implementation code compiles, our tests all run, and we celebrate by going home early for the day.
Conclusion
I hope people are finding this case study to be useful. I found a lot of different resources on the web about doing bits and pieces of your WPF/MVVM application test-first, but I still had a lot of unanswered questions. First and foremost on that list was how to do simple navigation like I’m doing. By putting together most of a whole application, I hope its more clear to readers how the different pieces fit together.
I do plan on doing one more step along the way, probably posted tomorrow morning (8/25/2009). I want to show how to handle pop-up windows, including windows dialog boxes as well as custom WPF windows. I had to deal with this on my own project, and it took a bit of thinking to figure out how to do it in a testable way.
Until tomorrow!
-- bab
This is part two of the blog series about creating a WPF application using TDD to drive the functionality and MVVM to split that functionality away from the view into something more testable. You may want to read part one if you haven’t already.
In this part, we’ll see what it takes to display data on the front page about each player on the softball team. We’re not going to display all their stats, since we don’t need to for the example, but it would be very easy to extend this to do so. (N.B. I have a more full version of this that I’ll post that includes a database backend with more data in it than what I’m going to show here. The data backend is irrelevant to the layer being discussed here, so I’m going to ignore those details.)
The end result
At the end of this process, what we’re going to have is a list of players and their numbers. We could easily extend it to total stats for each of them, but that’s outside the point of the example, and is left as an exercise for the reader (I hated when college textbooks said that!).

So anyhow, you can see the 4 players listed and their numbers. This data came from the data repository that I created behind the view, in a class called PlayerRepository. I’m not going to go into the details of how this repository class was created, as the database layer is outside the scope of this article, so we’ll just assume that we created it when it was needed, and I won’t include discussion or tests for it. The important part of us to think about is how the data got into the view model and how it got from there onto the view. And that begins our (short) story.
Step 1 – Get data to the view
In order to get data to the view, the view model needs to expose an ObservableCollection that the view can bind to. I decided to create a property called Players on the TeamStatControlViewModel, driving it through tests. I created a test fixture in the ViewModelFixtures assembly called TeamStatControlPlayersDataBindingFixture, and I put my test into there (as an aside, I’m trying a different style of fixtures here, where I’m naming fixtures after behaviors or features and putting all the tests for those features in that fixture. I’m intentionally trying to break out of the app class <-> fixture class model and create tests around the behaviors of the system, regardless of where those behaviors may lie. Let me know if you like it, please.)
1: [Fact]
2: public void ViewModelExposesObservableCollectionOfPlayers()
3: { 4: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null);
5:
6: Assert.IsType<ObservableCollection<Player>>(viewModel.Players);
7: }
We have to add the Players property to the view model and create an empty Player class in our Model assembly to get this test to compile. Once it runs and fails, we implement the property in the view model to return an empty ObservableCollection<Player> collection. Run again, and the test passes.
1: public ObservableCollection<Player> Players
2: { 3: get { return new ObservableCollection<Player>(); } 4: }
Step 2 – Get the data to the view model
Now that we have the data available to be shown on the view, we need to provide that data to the view model. We do this by giving the view model access to the PlayerRepository we spoke of earlier and letting it query the repository for the data as needed. Again, very simple. Here is the test in that same test fixture:
1: [Fact]
2: public void DataIsPulledFromModelWhenRetrievingPlayersFromViewModel()
3: { 4: var playerRepository = new Mock<IPlayerRepository>();
5: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null, playerRepository.Object);
6: playerRepository.Setup(pr => pr.GetAllPlayers()).Returns(new List<Player>());
7:
8: ObservableCollection<Player> players = viewModel.Players;
9:
10: playerRepository.Verify(pr => pr.GetAllPlayers());
11: }
The test start driving to define the behavior our system is going to need. We already know that the view model is going to need a reference to the repository, so we add the repository to the constructor arguments for the view model on line 5. (I like working backwards in a situation like this to discover the objects needed. I’ll write the constructor signature first and use that to drive object creation on previous lines, like you see here.) This forces us to create a mock version of the repository, which we do in line 4 by discovering an IPlayerRepository interface, details to be fleshed out. On line 6, we set up the behavior that we want the view model to invoke on the repository, which is the GetAllPlayers method, which for our purposes needs to return an empty collection of the appropriate type. Finally, we invoke the Players property and verify that the repository’s GetAllPlayers method is indeed called.
In getting this to compile, we create the IPlayerRepository interface and modify the signature of TeamStatControlViewModel to take the new IPlayerRepository parameter. Run test, test fails, and we finally implement:
1: public interface IPlayerRepository
2: { 3: IList<Player> GetAllPlayers();
4: }
and
1: public class TeamStatControlViewModel: IApplicationExitAdapter
2: { 3: private readonly IApplicationController applicationController;
4: private readonly IPlayerRepository playerRepository;
5:
6: public TeamStatControlViewModel(IApplicationController applicationController, IPlayerRepository playerRepository)
7: { 8: this.applicationController = applicationController;
9: this.playerRepository = playerRepository;
10: ApplicationExit = new ApplicationExitCommand(this);
11: }
12:
13: public void ExitApplication()
14: { 15: applicationController.ExitApplication();
16: }
17:
18: public ICommand ApplicationExit { get; set; } 19:
20: public ObservableCollection<Player> Players
21: { 22: get { return new ObservableCollection<Player>(playerRepository.GetAllPlayers()); } 23: }
24: }
At this point, we have data coming from the repository and available to the view. All that’s left is to hook up to the view.
Step 3 - Hooking up to the real view
I’m going to cheat a bit and not define a DataTemplate for this and just directly bind to the two columns I’m going to define, Name and Number. I have a ListView in the middle of my window, as you can see in the screencapture at the top if this post. I define a couple GridViewColumns in it and bind them to Name and Number:
1: <ListView IsSynchronizedWithCurrentItem="True" Grid.Row="1" VerticalAlignment="Stretch" ItemsSource="{Binding Players}"> 2: <ListView.View>
3: <GridView>
4: <GridViewColumn Header="Player" DisplayMemberBinding="{Binding Name}"/> 5: <GridViewColumn Header="Number" DisplayMemberBinding="{Binding Number}" /> 6: </GridView>
7: </ListView.View>
8: </ListView>
Obviously I wouldn’t do this on a real project, I’d use a DataTemplate. But for now, this will do. The ItemSource is set to the Players property, and the two columns are set to the fields I want to show.
We don’t have a real instance of our IPlayerRepository yet, so lets build a really simple one. In real life, this would be a repository over the top of a database, but we don’t need to go that far for now. Let’s just create the simplest repository we can for now:
1: public class PlayerRepository : IPlayerRepository
2: { 3: public IList<Player> GetAllPlayers()
4: { 5: return new List<Player>
6: { 7: new Player
8: { 9: Name = "Linsey",
10: Number = "42"
11: },
12: new Player
13: { 14: Name = "Michelle",
15: Number = "31"
16: },
17: new Player
18: { 19: Name = "Susan",
20: Number = "17"
21: },
22: new Player
23: { 24: Name = "Joan",
25: Number = "26"
26: }
27: };
28: }
29: }
One thing we’re still doing is exposing the Player class to the view. This is not necessarily the best practice that has evolved, since the Player class is defined in the Model layer. The danger is that we may end up needing to add INotifyPropertyChanged behavior to the Player class, which would pollute our domain model with view-specific code. If that were to happen, it would force us to refactor the view model to return an observable collection of something else, like an ObservableCollection<PlayerViewModel>, so that we would have a place to put our view-specific code. We don’t need to yet, so we’re not going to bother. This is a potential refactoring to come, though.
And our final change is to add the PlayerRepository type into our Application_Startup method, so that Unity knows how to build the repository and pass it into the TeamStatControlViewModel:
1: private void Application_Startup(object sender, StartupEventArgs e)
2: { 3: container.RegisterInstance<IApplicationController>(this);
4:
5: container.RegisterType<IPlayerRepository, PlayerRepository>(new ContainerControlledLifetimeManager());
6: container.RegisterType<TeamStatControlViewModel>(new ContainerControlledLifetimeManager());
7: container.RegisterType<TeamStatControl>(new ContainerControlledLifetimeManager());
8:
9: container.RegisterType<MainWindow>(new ContainerControlledLifetimeManager());
10:
11: Current.MainWindow = container.Resolve<MainWindow>();
12: Current.MainWindow.Content = container.Resolve<TeamStatControl>();
13: Current.MainWindow.Show();
14: }
Compile and run, and all should work.
Conclusion
This was a fairly easy step to take. We exposed a property on our view model to let our view see the data we want to publish. Our view model has a repository injected into it to let it get the data as needed. That was really all there was to it. Two tests, and we got to where we needed to be.
The next step along the way will involve navigating from the front page to a player detail page. Stay tuned for the next installment, coming right up!
-- bab
The most common, canonical use of the Singleton pattern irritates me. Every time I see it, I think, “The singleton-ness of a class is an implementation detail, and shouldn’t leak out through that class’s interface.” Yet, that’s what it always does.
In the usual implementation, someone decides that some new class they’ve written is so resource critical, or so standalone, or so useful that they can have only one instance of that class and that instance has to be visible everywhere. Ignoring the intricacies of threading and so on, a Singleton usually looks exactly like this:
1: public class MyImportantResource
2: { 3: private static MyImportantResource instance;
4:
5: private MyImportantResource()
6: { 7: // ...
8: }
9:
10: public static MyImportantResource Instance()
11: { 12: if (instance == null) instance = new MyImportantResource();
13: return instance;
14: }
15: }
And it gets used everywhere like this:
1: public class Consumer
2: { 3: public Consumer()
4: { 5: var importantResource = MyImportantResource.Instance();
6: importantResource.FooTheBar();
7: }
8: }
Now what happens when I decide I want two of these? Or I decide that I want to let people create as many of these resources as possible? Or, even more commonly, what happens when I want my Consumer class to use a mocked out version of MyImportantResource? I’m scre^h^h^h^hin trouble.
The trouble comes from the fact that Consumer is reaching out into the ether and grabbing the resource it needs on its own. It isn’t giving me, the developer, control over what type of ImportantResource to use or where the ImportantResource is coming from. The Inversion of Control principle is being violated by having the class gather its own resources rather than having its creator decide and pass resources to it.
My typical solution
What I typically have been telling people is that it is OK to have a singleton, treat it as a singleton, and love the singleton pattern… within reason. At the point in your code where you’re creating all your objects and wiring them up, you should feel perfectly free to use singletons. But no layer beneath that should have any knowledge of the singleton-ness of a class. Grab that singleton and pass it into whoever needs it, preferably as an interface, and you’ve restored order and testability to your system by again returning to the Inversion of Control principle.
My DI solution
Dependency Inversion containers solve this problem for you automatically. I’ve been using Unity lately, and I’ve grown to really like it. One of the things I really like about it, and I’m sure all DI containers have this property, is that I can register a type with the container and tell it that I only want it to create a single instance of this type and pass it around whenever someone asks for that type. Bam! I have a singleton again, but I’ve completely separated the singleton-ness of the class from its singleton-like usage. Major win. Here is the code that lets me do that.
First, the interface over the important resource:
1: public interface IImportantResource
2: { 3: void FooTheBar();
4: }
Now the changes in the MyImportantResource class to bring it back to being a regular class. Note that all mention of singleton-ness is gone from this class. Its just a plain, old class again, which is how we like it.
1: public class MyImportantResource : IImportantResource
2: { 3: public MyImportantResource()
4: { 5: // ...
6: }
7:
8: public void FooTheBar()
9: { 10: throw new NotImplementedException();
11: }
12: }
Next, the changes in the Consumer class that promote the loose coupling encouraged by Inversion of Control, by injecting an IImportantResource at construction:
1: public class Consumer
2: { 3: public Consumer(IImportantResource importantResource)
4: { 5: importantResource.FooTheBar();
6: }
7: }
And finally, the object construction code I can write:
1: public static class Configurator
2: { 3: private static IUnityContainer container;
4:
5: public static void Main(string[] args)
6: { 7: container = new UnityContainer();
8:
9: container.RegisterType<IImportantResource, MyImportantResource>(new ContainerControlledLifetimeManager());
10:
11: Consumer consumer = container.Resolve<Consumer>();
12: }
13: }
The interesting bit of code here is on line 9, where I register MyImportantResource. I’m telling the container that whenever someone asks for an IImportantResource, it should give them a MyImportantResource object, and that it should give it the same instance every time (that what the new ContainerControlledLifetimeManager()) says. I’ve magically turned my MyImportantResource into a singleton class without polluting the code of that class with statics and instance methods.
Conclusion
Operationally nothing has changed. Assuming people always go to the container for their object instances, MyImportantResource is still a singleton. I will only have one instance of it, it is still accessible from a single place. Should I ever decide to allow 4 instances of it, I can create my own lifetime manager class that will create up to four instances and manage them for me. But now all of my classes are just that, classes. The design decision of how many instances of the resource is separated from the operation of the resource, which allows the two different design issues to evolve separately. And I’ve applied Dependency Inversion to the Consumer class, which allows it to have mock versions of the resource injected to enable testing scenarios that were more difficult when it was using the singleton.
-- bab
This is a preview of the material I’m going to be presenting at the St. Louis Day of Dot Net in a couple weeks.
Introduction
For those of you who are reading this blog for the first time, I’m pretty much the St. Louis Agile Zealot. Long hair, flowing robes… you get the picture :) I’ve been advocating Agile and XP in St. Louis since around 2000, through speaking at various user groups and local conferences, teaching at local companies, giving talks in the park, dropping leaflets from airplanes, and so on. I live Agile in my day job at Asynchrony Solutions, where I lead their Agile training and mentoring group. I am totally sold on Test Driven Development as the best way for me to write my code, and I’ve been occasionally known to share that opinion with others.
As far as WPF experience goes, I’m still pretty new in my learning curve. I’ve been playing with a project on my own for a few months, trying new things, reading, and experimenting. When I first started out, I completely wrote a Winforms app in WPF. I used a full-on MVP/MVC architecture, had my button click methods in my window classes, etc. A complete mess… Then I started reading about MVVM and that sparked something inside me that realized that this finally made sense. This was something that gave me a lot of the advantages of the MVP-like architectures, such as being able to test my UI without actually running the UI, but without the overhead of wiring all that junk up myself.
What follows are the lessons I’ve learned in the process of rethinking my original app and in writing this sample app for my talk.
The Application
My daughter plays select softball for one of the organizations here in St. Louis. They have a web site that lists all their stats throughout the year, and I thought it would be fun to mimic that site as a desktop app. The application would list all the girls’ total stats on the front page and give you the ability to drill down into detailed stats for each game on subsequent pages. For fun, I wanted to be able to add stats for new games, and add and delete players. With that set of features, it seemed that I’d be able to drive out a lot of interesting opportunities to change around the design to let me write the code in a TDD manner.
Here is the main page of the application, in all its glory. Remember that I am but a poor developer, with a developer’s eye for style :)
The display of stats isn’t complete yet, but it was enough to validate that my data binding was working. Let’s look at what it took to get this far…
Note: If you want to skip the setup stuff and get right to the parts where behavior is added, jump ahead to Step 3.
Our Roadmap
As a quick review, before we dive in, here is an overview of the MVVM design pattern and the players involved.
The View represents the surface that the user interacts with. It is the WPF code, the UI, and XAML… all that stuff that users see and that is hard to test in an automated fashion. Our goal is to take as much logic out of there as possible, to allow us to have the highest amount of confidence and the greatest amount of test coverage that we can achieve.
Next to the View is the ViewModel. The ViewModel represents the entire set of data and behavior contained in the View. It has properties to expose all the different pieces of data that the View will need to display, and it exposes another set of properties for all the behavior that the View will need to invoke.
The View and ViewModel are tied together in two separate, but very similar, ways. Through Data Binding, data travels between the View and ViewModel automatically. WPF, through the wonders of its internal magic, keeps consistent the data shown in the View and the data held in the ViewModel. There is a bit of work that we have to do to ensure this happens, but it mostly all automatic. The Commands are representations of the behavior that users invoke through the View. Individual commands are exposed through properties on the ViewModel and tied to controls on the View. When the user presses a button, for example, the command attached to that button fires and something happens. You can think of Commands as little controllers, focused on a specific topic, whose responsibility it is to respond to a user action in a particular manner by coordinating the response to that action between the View and ViewModel.
Our goal here is to put all logic about the View into the ViewModel. The View should be very thin and code-less, and the Commands should be thin shims that merely provide an execution conduit between the gesture being made and the behavior being invoked in the ViewModel. Code in the View or in Commands should be looked up with suspicion, with an eye towards trying to move it into someplace more testable. Sometimes you can move that code, and sometimes its entirely appropriate where it is, but the question should always be asked.
Step 1 – Modify the template to support TDD
When you create a WPF application using the Visual Studio New Project dialog, you get the framework of an empty application. There is no code anywhere, other than an InitializeComponent() call here and there. Most of the interesting behavior, at this point, takes place through XAML – things like instantiating the Application object, creating the main window and causing it to display, and other basic things like that. While this works, and works fine for the empty application, we’re going to need more control over how this initiation process occurs, for reasons we’ll discuss later in this post or a subsequent one.
So, to control the initial creation, there are a few changes we need to make. The first step is to put ourselves in control of when and where the main window is created. As time goes on, there are aspects of this creation process that we’re going to want to control, like wiring together other objects, so we’ll need full control over the how windows and controls are born.
App.xaml
When first created, App.xaml looks like this:
1: <Application x:Class="WpfApplication1.App"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: StartupUri="Window1.xaml">
5: <Application.Resources>
6:
7: </Application.Resources>
8: </Application>
The StartupUri attribute of the Application element is what causes the class defined in Window1.xaml to be instantiated. We want to prevent this from happening until we’re ready for it, so we have to take this out. We’ll still need to create this window, however, so we’ll need to arrange for another way to create objects as the system is starting. It turns out that WPF exposes and event that is perfect for this initialization, the Startup event. By providing a handler for the Startup event, we can have a place to put all our initialization code.
App.xaml now looks like this:
1: <Application x:Class="WpfApplication1.App"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: Startup="Application_Startup">
5: <Application.Resources>
6:
7: </Application.Resources>
8: </Application>
Now we have to add some code into the App.xaml.cs file to create the objects we need and to wire them together. Please note that I’m not writing tests for this code, because this is configuration code, not business logic. I view logic such as this the same way I view a Main method, and I tend not to test Main’s. It is where objects are created and wired together and then told to go on their merry way. This is not meant to be reusable code and should be just simple declarations of objects and assignments of variables. If I manage to screw up Main, the application isn’t going to work anyhow, and I’m pretty sure I’ll know it :)
1: using System.Windows;
2:
3: namespace WpfApplication1
4: { 5: public partial class App : Application
6: { 7: private void Application_Startup(object sender, StartupEventArgs e)
8: { 9: Current.MainWindow = new MainWindow();
10: Current.MainWindow.Show();
11: }
12: }
13: }
The final step is to rename the template-provided window name of Window1 to MainWindow and make sure I instantiate it with the proper class name in the Application_Startup method, the handler for the Startup event. Once that is done, you can start the project, and an empty window should appear.
One more change…
Before going further, I’d like to introduce Unity into the codebase. Unity is the dependency injection library from Microsoft, and I’ve found it to be very useful in my WPF applications. Here is the previous code after injecting Unity (injecting Unity – HA! I kill myself).
1: using System.Windows;
2: using Microsoft.Practices.Unity;
3:
4: namespace WpfApplication1
5: { 6: public partial class App : Application
7: { 8: private readonly IUnityContainer container = new UnityContainer();
9:
10: private void Application_Startup(object sender, StartupEventArgs e)
11: { 12: container.RegisterType<MainWindow>(new ContainerControlledLifetimeManager());
13:
14: Current.MainWindow = container.Resolve<MainWindow>();
15: Current.MainWindow.Show();
16: }
17: }
18: }
Briefly, the point of this code is to register a type, MainWindow, with the Unity container, and then use the container to instantiate the MainWindow object as the application’s main window. The reason I introduced Unity is to separate myself from the semantics of object creation. Unity will take care of instantiating any objects I ask for, as well as any objects that the class being created needs. Its just a way of relieving myself of having to worry about constructor signatures, basically.
Step 2 – Adding the initial content
Its time to fill in the empty window with some content. We’ll avoid adding any behavior yet, we just want to see something. The strategy that we’re going to use is to keep the MainWindow class as the one window in our application, and we’ll swap in and out different pieces of content to show in it. In my projects I’ve found this pattern to be useful, because it lets me layer content to mimic a workflow in the application, and have the content always show up in the same place, be the same size, and not take extra work to manage.
So our goal now is to set the MainWindow’s content to be the initial view we want to show people when they first open the application. The design for this looks like this:
And the implementation is easy, too.
First, I create my user control, TeamStatsControl:
At the same time, I create a ResourceDictionary to hold styles that I’ll be using around the app and merged that dictionary into my UserControl.Resources section. I created a menu, a somewhat attractive header, and a couple of buttons. There’s no behavior in it yet, but that’s coming shortly.
Now, for the fun part, let’s make the simple change to make the content show up in the MainWindow. Since we’re creating a new object, our TeamStatControl, we have to make a few simple changes in App.Application_Startup. We need to register the user control with Unity so that it can create it as needed, and then resolve an instance of it as the Content property of the MainWindow. Once that is done, WPF takes care of making it appear in the window.
1: private void Application_Startup(object sender, StartupEventArgs e)
2: { 3: container.RegisterType<MainWindow>(new ContainerControlledLifetimeManager());
4: container.RegisterType<TeamStatControl>(new ContainerControlledLifetimeManager());
5:
6: Current.MainWindow = container.Resolve<MainWindow>();
7: Current.MainWindow.Content = container.Resolve<TeamStatControl>();
8: Current.MainWindow.Show();
9: }
And, by the way, I also changed the Width and Height properties in MainWindow to be 600 and 1000 respectively so that the entire user control would be visible.
Step 3 – Adding behavior
Now that the shell is in place, we can add the behavior that we want. First, lets add the basic behavior of exiting the application in an orderly way. We want to be sure to do this in a way that all the code that we write is testable, and that is going to require a bit of extra work over and above just writing the simplest code. This is the price one pays when writing code using TDD, but the extra effort pays off in systems that work.
Let’s start by writing our first test. This test will be a test of the Command object, which is the object that the view will interact with. An underlying force of the MVVM pattern is that the ViewModel encapsulates the visible data and behavior of the View. And the Command object acts as the conduit through which the gestures of the user are translated into tangible actions in the ViewModel. Here is a sequence diagram showing this behavior:
Clicking the button causes the Command.Execute method to fire, which calls a method in the ViewModel. That method does the real work of this system, with the calls coming before it just part of the plumbing to cause things to happen.
So lets write a test to show that the above sequence is what will actually happen – that calling the Execute method of some Command object will invoke some sort of behavior that causes the application to exit.
Our first test:
1: namespace ViewModelFixtures
2: { 3: public class ApplicationExitBehaviorFixture
4: { 5: [Fact]
6: public void ApplicationExitingBehaviorInvokedWhenExecuteCalled()
7: { 8: var exiter = new Mock<IApplicationExitAdapter>();
9: ApplicationExitCommand command = new ApplicationExitCommand(exiter.Object);
10: exiter.Setup(e => e.ExitApplication()).Verifiable();
11:
12: command.Execute(null);
13:
14: exiter.Verify(e => e.ExitApplication());
15: }
16: }
17: }
For those of you unfamiliar with the tools used in this test, I’m using Moq as my mocking framework and xUnit for my tests. These are my two favorite tools for TDD as of now, and I highly recommend both of them.
Beginning on line 7, defines the behavior of the system when my ApplicationExitCommand.Execute method is called. I’m defining the interface that the command is going to talk to, IApplicationExitAdapter, and I’m doing this in total and complete ignorance of what class is ever going to implement that interface (OK, I’m lying – its going to be my view model, but let’s keep that our secret for now).
And the code that we write to get this test to compile:
1: namespace ViewModels
2: { 3: public interface IApplicationExitAdapter
4: { 5: void ExitApplication();
6: }
7: }
1: namespace ViewModels
2: { 3: public class ApplicationExitCommand : ICommand
4: { 5: public ApplicationExitCommand(IApplicationExitAdapter exitAdapter)
6: { 7: throw new NotImplementedException();
8: }
9:
10: public void Execute(object o)
11: { 12: throw new NotImplementedException();
13: }
14:
15: public bool CanExecute(object parameter)
16: { 17: throw new NotImplementedException();
18: }
19:
20: public event EventHandler CanExecuteChanged;
21: }
22: }
Strictly speaking, I went a little further than I had to here, choosing to implement ICommand, but all commands that are hooked through a View as we’re discussing need to implement this interface (or one of a couple of others that are more advanced), so I just went ahead and did it.
Short Aside – Projects and Solution Structure
Before we go further, we should discuss the projects I’ve chosen to use in this solution, and why they were chosen. I have one project that holds the view and a separate project that holds the view models. I intentionally kept the Views and ViewModels separate to enforce the direction of the relationship between them. The Application class and the other WPF controls need to have access to the ViewModels, if only to create them and assign them to DataContexts. ViewModels, however, should be 100% ignorant of their views. The simplest way to enforce this constraint is to put all view model code into another assembly, which is what I’ve done.
Now its a simple matter of implementing the code to make the test pass:
1: public class ApplicationExitCommand : ICommand
2: { 3: private readonly IApplicationExitAdapter exitAdapter;
4:
5: public ApplicationExitCommand(IApplicationExitAdapter exitAdapter)
6: { 7: this.exitAdapter = exitAdapter;
8: }
9:
10: public void Execute(object o)
11: { 12: exitAdapter.ExitApplication();
13: }
14:
15: public bool CanExecute(object parameter)
16: { 17: return true;
18: }
19:
20: public event EventHandler CanExecuteChanged
21: { 22: add { CommandManager.RequerySuggested += value; } 23: remove { CommandManager.RequerySuggested -= value; } 24: }
25: }
I also went ahead and added some boilerplate code into the CanExecute and CanExecuteChanged method and event inside this class. This boilerplate code is what you start with every time you write a command. You can think of this as creating a command using a code template inside Visual Studio.
At this point, the command should be invoking the behavior that we want, as seen in this diagram:
Now that the behavior is being called inside the IApplicationExitAdapter, we’ll need to make the giant leap and assume that it is, indeed, our view model class that is going to be implementing that interface. This only make sense, since the Command is invoking behavior on some class that represents the behavior of the View, and the class that represents a View’s behavior is that View’s ViewModel. Q.E.D. Once we’ve crossed that intellectual chasm, we’ll go ahead and implement the functionality inside the view model.
For that, we write this test:
1: [Fact]
2: public void ApplicationControllerInvokedWhenViewModelExitApplicationCalled()
3: { 4: var applicationController = new Mock<IApplicationController>();
5: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(applicationController.Object);
6: applicationController.Setup(ac => ac.ExitApplication()).Verifiable();
7:
8: viewModel.ExitApplication();
9:
10: applicationController.Verify(ac => ac.ExitApplication());
11: }
This test causes us to make a few design decisions. First, we’ve discovered an interface called IApplicationController that is going to be responsible for controlling application-wide behavior, which would certainly include things like exiting at the appropriate time. We’re also creating the view model class, TeamStatControlViewModel, since we have to add behavior directly to it now. And finally, we’ve discovered that the view model needs to have a reference to the IApplicationController interface, to allow it to invoke functionality through that interfacee. This leads us to creating a constructor for the view model through which we can inject the interface at creation.
Here is the resulting code. First, the simple IApplicationController interface:
1: namespace ViewModels
2: { 3: public interface IApplicationController
4: { 5: void ExitApplication();
6: }
7: }
and now the TeamStatControlViewModel:
1: namespace ViewModels
2: { 3: public class TeamStatControlViewModel : IApplicationExitAdapter
4: { 5: private readonly IApplicationController applicationController;
6:
7: public TeamStatControlViewModel(IApplicationController applicationController)
8: { 9: this.applicationController = applicationController;
10: }
11:
12: public void ExitApplication()
13: { 14: applicationController.ExitApplication();
15: }
16: }
17: }
That’s just enough code to make that test pass, so we’re momentarily happy. However, our system isn’t going to work yet, because we haven’t found anyone to implement the IApplicationController interface. That’s our next major decision.
I’m going to choose to put this interface onto the App class, at least for now, since it seems to be the one place in our application that has knowledge of the entire application. It may turn out later that we need to move this responsibility somewhere else, but we’ll leave it here for now.
We’ll go ahead and make the easy changes to App.xaml.cs, which consist of making it implement IApplicationController and writing the ExitApplication method, which simply calls Current.Shutdown().
1: public partial class App : Application, IApplicationController
2: { 3: private readonly IUnityContainer container = new UnityContainer();
4:
5: private void Application_Startup(object sender, StartupEventArgs e) {...} 6:
7: public void ExitApplication()
8: { 9: Current.Shutdown();
10: }
11: }
The important point to note is that the IApplicationController interface lives in the ViewModel assembly, even though it is being implemented by the App class in the main WPF assembly. This means that the main WPF application project has to have a reference to the ViewModel project, which is the direction we want the dependencies to flow. By moving the ViewModel classes and interfaces into an a project separate from the view classes, we’re enforcing our dependency management design as we described earlier.
This now leaves us with this for a design:
So we’re in the home stretch now. We have all our code built – what is lacking now are the few scattered bits and pieces needed to wire this whole thing together. There are several of these pieces, and we’ll look at them one at a time.
Let’s start with the object creation changes needed in App.Application_Startup. Over these last few changes, we’ve created a new interface for the App class, so we need to tell Unity that when I ask for an instance of an IApplicationController, it should pass back a reference to the App class. You can see this code on line 3 below. We also created a TeamStatControlViewModel, which we tell Unity about on line 5.
1: private void Application_Startup(object sender, StartupEventArgs e)
2: { 3: container.RegisterInstance<IApplicationController>(this);
4:
5: container.RegisterType<TeamStatControlViewModel>(new ContainerControlledLifetimeManager());
6: container.RegisterType<TeamStatControl>(new ContainerControlledLifetimeManager());
7:
8: container.RegisterType<MainWindow>(new ContainerControlledLifetimeManager());
9:
10: Current.MainWindow = container.Resolve<MainWindow>();
11: Current.MainWindow.Content = container.Resolve<TeamStatControl>();
12: Current.MainWindow.Show();
13: }
Next, we know that TeamStatControlViewModel is going to be the DataContext for the TeamStatViewModel, so let’s make that happen in code. The easiest way is to change the constructor for the TeamStatControl to take the view model and assign it to be its DataContext in its constructor. The really cool part of this is that we don’t have to make any changes in App.ApplicationStartup based on this constructor changing. Unity will just build all the dependent objects for us and call whatever constructors it can find, and it all just works.
1: public TeamStatControl(TeamStatControlViewModel viewModel)
2: { 3: DataContext = viewModel;
4: InitializeComponent();
5: }
Now that we have the objects built and wired up, we need to do the data binding to put the commands into the controls on the interface. The first place to do this is in TeamStatControl, where we define the Quit button. We need to assign an instance of the ApplicationExitCommand to the Command attribute of the button. Here is the XAML code that will do this for the Quit button:
1: <Button Command="{Binding ApplicationExit}" Grid.Column="1" Content="Quit" HorizontalAlignment="Left" Style="{StaticResource NormalButton}"/>
We do this by creating a binding to the ApplicationExit property of our data context, the TeamStatControlViewModel. The view is now expecting the view model to expose a property called ApplicationExit, of type ICommand, through which it can get the command. We don’t have that property right now, so lets write a test that makes us create it.
1: [Fact]
2: public void ViewModelExposesApplicationExitCommandAsICommand()
3: { 4: TeamStatControlViewModel viewModel = new TeamStatControlViewModel(null);
5:
6: Assert.IsAssignableFrom<ApplicationExitCommand>(viewModel.ApplicationExit);
7: }
This test says that we can get an ICommand from the view model and the ICommand we get is actually an ApplicationExitCommand, which is what we need. We just need to implement that through creating a simple auto-property in the view model. That satisfies what we need for the binding we defined in the XAML. Now, we construct the command in the constructor of the TeamStatControlViewModel class and pass an instance of the view model to the constructor of its command to wire that up, and we’re set!
1: public TeamStatControlViewModel(IApplicationController applicationController)
2: { 3: this.applicationController = applicationController;
4: ApplicationExit = new ApplicationExitCommand(this);
5: }
6:
After all this, running the application and clicking the Quit button should cause the app to vanish silently, slipping into the night, never to be seen again. Whew!
A Bonus
Now that all this hard work is done, we can also hook this same logic to the menu button. If we go into the XAML and find the line where we define the menu item, we just set its Command attribute to be a binding to ApplicationExit as well, and now it works, too.
Conclusion
As I said at the beginning, this blog entry, and the couple more that will follow this week, will form the basis for my St. Louis Day of Dot Net talk on this same subject. I’d appreciate any and all feedback on this article, especially including things that weren’t clear, design leaps I made without a clear reason, and alternative ways to do the same things I did.
You can find the complete project for this on my website. You may need to install Unity to get the solution to compile.
Thanks for reading, and I hope it helps!
-- bab
Only a few seats left, apparently, for the conference on August 28th and 29th. Register here. Looks like lots of good sessions, lots of good topics, and filled with good speakers.
Personally, I’m speaking on Using MVVM and TDD to test drive a WPF application.
bab
I'm writing an example for a workshop on estimation in an agile context, and I'm considering using the idea of preparing a multi-course meal. I think I like this because it is entirely non-technical, so I can give it to developers, customers, QA, or anyone else without regard to previous technical knowledge. I also like it because there are obvious tie-ins to concepts like freshness, inventory, rapid delivery, and so on. That is as close to the real-world considerations of a software project I can think of while keeping it approachable for everyone.
So, here goes:
I have 100 guests showing up in 6 hours for an end of project celebration. This is the entire project team and their families. They did a great job on their last delivery, so we want to reward them with a feast. The menu is top secret, but we want it to surprise and delight them as much as possible. Here is the schedule:
12:00PM - 1:00PM - Guests start arriving. I need hors d'oeuvres ready and passed around through the crowd as they gather.
1:00PM-2:00PM - Salad and appetizer course served
3:00PM-4:00PM - Lunch
5:00PM-5:30PM - Dessert and Coffee
That gives us 4 different courses to serve. I have a kitchen filled with supplies, everything you might need. The pantry is well stocked, tons of pots and pans, spices, herbs, three ovens and stoves, and anything else you might need. I just need you and your team of world-class chefs to create something for me and my guests.
I'd like to have 4 or 5 different hors d'oeuvres, 3 different kinds of salads, 2 kinds of appetizers. Lunch should be a buffet of 3 meats, 2 pasta dishes, 3 vegetables, and a rice dish. I'd like 3 different desserts, one decadently sweet, one fruit dish, and a big cake.
So, off you go. Give me a selection of great food at each of these times. Bear in mind that things can go wrong, like ovens not working, menus changed, schedules shortening, so you'll have to constantly keep your eye on time and delivering the best culinary value for the given effort.
So, how did that sound? I intend to mix things up by adding vegetarian dishes to the lunch menu, an oven going out, changing the schedule, running out of something... Basically doing whatever it takes to have them adapt, replan, and go forward.
Does this sound close enough to a real software project to be useful? Does the exercise sound like anything that would teach estimation and prioritization? Any sort of feedback would be greatly appreciated.
bab
I’ve been puzzling over what seemed to be an insurmountable problem lately. It seemed that the guys who came up with the MVVM design pattern totally missed the boat on anything more than a simple, single-page app. It couldn’t be me, since I’m a SuperGenius (TM).
Well, OK, it did turn out to be me. Once I stopped flailing about in WPF-land and actually thought about the problem, it became easy.
The Problem
What I was trying to do seemed pretty simple, and I couldn’t figure out how to make it work, which is why I was sure it was them and not me – how wrong I would be…
Basically, I had an app with multiple views. In one view, I was doing something that caused some data to be updated. I wanted to show the updated data in another view. Since the two views were using two different ViewModels, I couldn’t figure out how data binding by itself could solve the problem. Then it came to me – the two different ViewModels were sharing the idea of the data they were both showing, and data is supposed to live in the Model layer. Duh!
Once this epiphany drilled its way through my head, I figured out how to solve the problem (Note – I’m 100% new to WPF, so there is every chance there is an easier way to do this. If you know it, please let me know!)
The Solution
The key to this was to make both my ViewModels implement INotifyPropertyChanged to hook them up to propagate changes to and from their Views. Then I created an event in the Model that would be raised whenever the underlying data they were sharing was changed. My model looked like this:
1: public class Model
2: { 3: private String modelValue;
4:
5: public delegate void ModelChangedEvent(object sender, ModelChangedEventArgs e);
6: public event ModelChangedEvent ModelChanged;
7: public void SetValue(string newValue)
8: { 9: modelValue = newValue;
10: if(ModelChanged != null)
11: { 12: ModelChanged(this, new ModelChangedEventArgs {OldValue = modelValue, NewValue = newValue}); 13: }
14: }
15: }
And I had my target ViewModel listen for this event. In the event handler for the ModelChangedEvent, the ViewModel used the newValue to set the value it needed to show on the View, which caused the PropertyChanged event to be raised, and everything worked like a champ. Here is the target ViewModel:
1: public class ReflectedViewModel : INotifyPropertyChanged
2: { 3: private string reflectedValue;
4: private Model model;
5: public event PropertyChangedEventHandler PropertyChanged;
6:
7: public Model Model
8: { 9: get { return model; } 10: set
11: { 12: if(model != null) throw new InvalidOperationException("Attempted to set model more than once."); 13: model = value;
14: model.ModelChanged += model_ModelChanged;
15: }
16: }
17:
18: void model_ModelChanged(object sender, ModelChangedEventArgs e)
19: { 20: ReflectedValue = e.NewValue;
21: }
22:
23: public String ReflectedValue
24: { 25: get { return reflectedValue; } 26: set
27: { 28: if(value.Equals(reflectedValue) == false)
29: { 30: reflectedValue = value;
31: if(PropertyChanged != null)
32: { 33: PropertyChanged(this, new PropertyChangedEventArgs("ReflectedValue")); 34: }
35: }
36: }
37: }
38: }
You can download the entire example from here.
Conclusion
This was not a hard problem to solve, once I stopped and actually thought about it. I got so wrapped up in the new framework and toys (WPF/XAML) that I forgot about everything else I knew for a bit :)
As usual, any and all comments appreciated. Comments telling me about easier and more idiomatically correct ways of writing this are 100% welcomed!
-- bab
My good friend, Matt Philip, wrote an interesting blog entry the other day about Six-Word Memoirs By Writers Famous and Obscure. I thought it might be interesting to write about the agile methods, their values, and their practices, following a similar style. So here goes, my own take on Six-Word Memoirs on Agile Values, People, and Activities…
Agile: Business plans, developers do, people thrive
Agile: Don’t want “resources”, give me people!
Agile: Project success comes from working together
Agile: Engine converting features to software daily
Agile: Solve biggest problem. Lather, rinse, repeat
QA: Hey, I made the team!!! Yea, QA!!!
QA: Building it right the first time
QA: Equal parts developer, tester, and customer
QA: The glue that holds ‘em together
QA: Helping customers define what they want
Scrum Master: Equal parts facilitator, friend, and psychologist
Scrum Master: My job is to listen carefully
Scrum Master: If I do it, you don’t!
Scrum Master: Fixing problems is not the solution
Customer: Content is mine, method is yours
Customer: I chart the course to success
Customer: You let me worry about that
Customer: Word of mouth, my best tool
Customer: Don’t read specs, ask me questions
Developer: I eat user stories for breakfast
Developer: I trust my customer and team
Developer: It feels good to be valued
Developer: Method is mine, content is yours
Developer: Best architectures owned by whole team
Developer: Ivory tower architects need not apply
Developer: Red, green, refactor. Lather, rinse, repeat.
Developer: Its more fun done in pairs
Delivery: Running, tested features - what really counts
Delivery: Scope is negotiable, quality is not
Delivery: Not over, under promising, just delivering
Delivery: Reliably delighting the customer every week
I could do more, but lets leave it there. Any more?
—bab
A fairly obvious observation hit me today…
If you are trying to pair program without also doing test driven development, when do you change roles? When doing TDD with Pairing, there is a rhythm to when the roles switch - see Micro Pairing. But if you’re not doing TDD, the person typing is frequently lost in solving a fairly large problem, they are balancing a bunch of things in their heads, and they have to finish a big thought before they could possibly swap the keyboard with their pair. So, while the typer is solving these big problems, what does the other person do? Just sit there? It just seems pretty painful…
I’m sure its not impossible, but it sure seems like TDD is a near necessity for Pair Programming.
Thoughts?
— bab
I’ve been tagged by Brad Wilson to tell a bit about my geek childhood. Like most of you, I certainly had one :)
My earliest geek memories starts with watching Star Trek back in about 1972. It was Return of the Archons - the one where the zombies in robes wander around talking about “Being of the Body”. I remember being totally and completely fascinated by it, and being hooked on science fiction from that point on. That led me to finding the Heinlein juveniles, like Space Cadet, The Rolling Stones, Double Star, Citizen of the Galaxy and so on. I can honestly say that Heinlein’s attitudes about politics, religion, and life, as well as Spock’s general logical demeanor, were a huge influence on me back when I was somewhere near 10 or a bit younger.
A few years later, I learned about amateur radio somehow. I think it was a year or two before we moved from Des Moines, IA to St. Louis, MO. I remember buying The Amateur Radio Handbook, a highly technical book that was years too old for me — I must have been about 8 at the time. I wanted to get my ham license right then, immediately, so I started studying. Of course, electronic theory was a big part of the test, so I had to learn about stuff like Ohm’s Law. The only problem was that it kind of required algebra, and at 9, I hadn’t really learned that yet. So my 4th grade teachers, Mrs. Clark and Ms. Dean, sent me to the 5th grade teacher for algebra tutoring. I did finally get my license a couple of years later, after moving to St. Louis. A couple helpful hams in town taught me the last few bits I needed, including letting me practice Morse Code, and I passed my General test when I was 10 or 11. I was now WD0FDG :) Over the next couple of years, I studied for the highest class license, the Amateur Extra, taking the test a couple of times, only to fail. On my last attempt, I missed the last two questions on the exam, pushing me over the limit by 1. Had I passed, I would have been one of the 10 youngest Extra class licensees in the country at that point :(
After that, I spent a lot of my time reading Heinlein’s more mature novels, talking on my radio, playing with electronics, playing violin, and other exciting activities for an early-teen boy.
I eventually did find sports and girls a few years later, but some things never change… I haven’t been on the radio on years, but I know I’ll get back to it some day. I did pick up amateur astronomy a few years ago, a similarly geeky habit, still read Heinlein religiously, if you’ll excuse the expression, and still watch Star Trek in all its forms. And now there is this computer thing that seems to eat up so much of my time :)
Well, that is the geek story of me. Hmmm, I guess I should tag a couple of other folks now… How about Cory Foy, Ade Miller, and Michael Feathers…
(I’ll update this post with a picture of me as a kid once I get home!)
— bab
This is a true story from a true client I’m working with . The names and details have been changed to protect the innocent…
Story splitting
Several of us were attending a pre-sprint planning meeting yesterday, trying to flesh out the user stories that the product owner was planning to bring to sprint planning in a few days. They are still pretty early in their agile adoption as well as their technology adoption, so there are lots of questions floating around about process and tools.
A story came up in the meeting that described the interaction that a user would take when visiting the site the first time, more specifically around the user agreement presented to them the first time they logged into the site. The story was something like:
“As a user, I want to be to able to accept the user agreement so that I can access my content”
The details of this story included a specific workflow to follow if the user didn’t agree, including errors to show them, and a need to refrain from showing the user agreement again after agreeing to it the first time.
Conversation around this story went on for a while, mainly focusing around the second part, how to handle remembering what the user did the last time they visited the site. There were technical details about where this information needed to be stored that hadn’t been agreed to yet, and team spun a bit around this issue.
The suggestion was made to split the story into two. The first story would be the same as the first, “As a user, I want to be able to accept the user agreement so that I can access my content”, and it included all the acceptance criteria other than the remembering part. The second story would be “As a previously logged in user, I will not be presented with the user agreement, since I had already agreed to it”, which picked up the remembering part.
By splitting the story in this way, they were able to work out the important part for the customer, which was the user agreement workflow, and defer the technical issues over where to store the agreement status until they could discuss the issue more.
Moral of the story
When discussing a story, if there is contention about how part of it is done, it is sometimes possible to split the story so that the understood part is separated from the not understood part, allowing progress to be made. In this case, we knew how to write the workflow, but not how to prevent the user from seeing the agreement each time. We split the story at that particular edge, which allowed the team to build something useful, and to defer what they didn’t know yet until they knew more about it later.
— bab
This post will be my last post on my old .TEXT based blog engine as I am now moving over to a new host (DiscountASP.net) and a new blog engine (BlogEngine.net).
This post will only appear on the old site.
Since everyone should be using my Feedburner feed, RSS should continue without issue. Also, I've got 301 redirects in place for any links to the old URLs.
Hopefully I didn't miss anything.
So there I am browsing a couple of internal sites suddenly IE7 switches into a mode where it shows me thumbnails of all my open tabs.
"Wha happan??"
I pressed ESC and it went away. But then I couldn't figure out what did it. No combination of Shift, Ctrl, Alt + Tab would do it. Hmmm... Oh well... Back to work.
Five minutes later it happened again. Twice was enough for me to find the pattern.
I was using Outlook Web Access (aka OWA). For a long time I've been a stickler for keeping track of which messages I've really read and which I haven't. So in regular Outlook, I turn off the "auto mark as read" feature of the preview pane and manually mark as read or unread using Ctrl+Q and Ctrl+U.
A thought that back in IE6, Ctrl+Q behaved that way in OWA too, and for all I know the code is still there. But now, in IE7, when I press Ctrl+Q I get the thumbnail view:
Very cool! Not sure how much I'll use it, but it is neat. It also got me wondering about other shortcuts. I'm sure there are more, but I also found that it support Ctrl+1, Ctrl+2, etc. for direct selection of tabs. (Firefox does this too.)
I'm surprised how often I have to say this to other developers and engineers, but violations of this simple object-oriented mantra seems to be everywhere. Almost every time I look at a class inheritance hierarchy, I find this principle violated.
Why is this use of inheritance bad? First of all, let's talk about what inheritance is good for:
- Polymorphism - In OOP, this means that you can treat derived classes as if you had been passed an instance of the parent. This was formalized by Barbara Liskov in her 1988 paper "Data Abstraction and Hierarchy". Another way to say is is, "Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it." [Martin-96]
- Categorization - The process in which ideas and objects are recognized, differentiated and understood. Categorization implies that objects are grouped into categories, usually for some specific purpose. Ideally, a category illuminates a relationship between the subjects and objects of knowledge.
Let me refer you to the wonderful book, C++ Coding Standards: 101 Rules, Guidelines, and Best Practices
by Herb Sutter and Andrei Alexandrescu:
Despite two decades of object-oriented design knowledge, the purpose and practice of public inheritance are still frequently misunderstood, and many uses of inheritance are flawed.
Public inheritance must always model "is-a" ("works-like-a") according to the Liskov Substitution Principle: All base contracts must be fulfilled, and so all overrides of virtual member functions must require no more and promise no less than their base versions if they are to successfully fulfill the base's contract. Code using a pointer or reference to a Base must behave correctly even when that pointer or reference actually points to a Derived.
...
Public inheritance is indeed about reuse, but not the way many programmers seem to think. As already pointed out, the purpose of public inheritance is to implement substitutability. The purpose of public inheritance is not for the derived class to reuse base class code to implement itself in terms of the base class's code. Such an is-implemented-in-terms-of relationship can be entirely proper, but should be modeled by composition—or, in special cases only, by nonpublic inheritance (see Item 34).
Let me call out one of the more importance sentences in that quote:
The purpose of public inheritance is not for the derived class to reuse base class code to implement itself in terms of the base class's code.
The inheritance relationship is one of the strongest coupling relationships we can have in OOP. Everyone knows that coupling is bad and cohesion is good, but we still couple like mad via inheritance. We do this for a number of reasons, but one of the big ones is that very few college grads seem to get taught this in school. It makes me wonder how many undergraduate compsci teachers actually get it. Daniel Pietraru wrote a bit about this and how he has used inheritance questions as interview questions.
The other reason I think it is so common is that our languages and tools make it look so easy and so proper. Even Fowler-esque Refactoring has refactorings called "Pull Up Method/Field/etc." that seem to be all about putting shared code into the base class. There is also the Abstract Test Pattern in TDD which specifically describes using base classes as "a way to reuse test cases".
Whenever possible, you should look to use composition instead of inheritance in your designs. The problem is that composition is harder to do, even though it results in cleaner more modular designs. Despite that, composition has a number of benefits over inheritance. Again, I'll let Messrs. Sutter and Alexandrescu tell it (remember that some of the techniques for pointers and such are very C/C++ centric and aren't relevant here, but the underlying meaning is still true):
Composition has important advantages over inheritance:
- Greater flexibility without affecting calling code: A private data member is under your control. You can switch from holding it by value to holding by (smart) pointer or Pimpl (see Item 43) without breaking client code; you would only need to change the implementations of the class's own member functions that use it. If you decide you need different functionality, you can easily change the type of the member or the manner of holding it while keeping the class's public interface consistent. In contrast, if you begin with a public inheritance relationship, it is likely that clients have already come to depend on the inheritance; you have therefore committed your class to it and cannot easily change your base class decision later on.
- Greater compile-time insulation, shorter compile times: Holding an object by pointer (preferably a smart pointer), rather than as a direct member or base class, can also allow you to reduce header dependencies because declaring a pointer to an object doesn't require that object's full class definition. By contrast, inheritance always requires the full definition of the base class to be visible. A common technique is to aggregate all private members behind a single opaque pointer, called a Pimpl.
- Less weirdness: Inheriting from a type can cause name lookup to pull in functions and function templates defined in the same namespace as that type. This is very subtle and hard to debug.
- Wider applicability: Some classes were not designed to be bases in the first place. Most classes, however, can fulfill the role of a member.
- Great robustness and safety: The tighter coupling of inheritance makes it more difficult to write error-safe code.
- Less complexity and fragility: Inheritance exposes you to additional complications, such as name hiding and other complications that can arise in the presence of later changes to the base class.
In essence, inheriting for code reuse makes your design brittle. Changes in strange places manifest themselves in even stranger places. If your language doesn't support multiple inheritance (like C# and Java), then if you use an form of class-based inheritance in your code, you are effectively preventing good Liskov-style inheritance by people who consume your code. Bad bad bad bad.
When you do use inheritance from a base class in your design, look for these gotchas:
- Protected methods in the base class - This is the stink that is the smell that Herb talks about above.
- Calling public methods in the base class from the derived class - Slightly less smelly, but still not good.
Honestly, it makes me want to try to eliminate all nonabstract inheritance in my code. In languages with good duck typing, I'd say eliminate inheritance entirely, because in those systems the only good reason to use inheritance is for derived class code reuse. I know this is an over aggressive reaction but I do wonder what our code would look like if we had good composition constructs in the language (we don't) and if we either went with pure duck typing (ala Ruby) or interface-only inheritance.
Like that's gonna happen...
Jim Newkirk, Brad Wilson and I have been in agreement about the evils of ExpectedException for a long time. When Jim and Brad wrote xUnit.net, in fact, they left it out and opted instead for a new Throws method that lets you be a lot more precise about what and when you are testing the exception.
But NUnit 2.4.x doesn't have this feature (2.5 will). Fear not! Jim has written a nice little sample of the Throws method for NUnit 2.4.x that provides this same experience in his new post Replacing ExpectedException in NUnit.
If you are using NUnit today, I would really suggest you read the post and consider changing the way you test exceptions in your unit tests.
Time for another trip home to the mother ship for my monthly dose. I'll be in building 25 all week and staying at my (still unsold) house in Sammamish. Looking forward to some quality face time with my team.
I used to use the Microsoft Virtual CD-ROM tool, but the public one doesn't work in Vista. I also used Daemon Tools, but apparently it now bundles some SpyWare so I won't touch it.
After a bit of digging today, I found this: Mount and ISO Image in Windows Vista :: the How-To Geek
It works perfectly and is free.
PS. I still don't understand why this isn't baked into the OS, but it isn't.
Found this little gem while looking for something else... thought I'd share it.
When you have a computer with a recent model CPU, chances are it's a dual-core CPU. Both Intel & AMD have been producing dual core CPU's for a few years now. By default, Windows Vista will only use a single core during boot-up. You can easily change this from the System Configuration utility:
- In Vista's Start Search type msconfig & hit the [Enter] key on your keyboard
- Once System Configuration has started, select the Boot tab and click the Advanced Options button

- In the BOOT Advanced Options dialog, check the "Number of processors" check box, and choose 2 (or 4 if you have quad core) for the number of processors.
- Click OK twice.
Done and done. :)
I've been a tequila sipper for years. When I was young I had an incident with whiskey that put me off it, possibly for life, and tequila has nicely filled that gap.
I know the difference between good tequila and bad tequila. Good tequila is 100% blue agave and has a little number on the label that say NOM ####. That number if the distillery registration number. Look for it.
My good friend and fellow tequila sipper Aaron Mikulich sent me this great article today that sums up good tequila better than I ever could:
bbum’s weblog-o-mat » What is good tequila?
A choice quote from the beginning:
First, Cuervo Gold is not good tequila. It is actually a really terrible product, quality wise, backed by some brilliant market. Sadly, most of the tequila consumed in the United States is Cuervo Gold or something equally as bad. And by “bad”, I mean bad taste and vicious hangover.
Amen brother!
We use OneNote a LOT at work. Once you get used to it, it is basically an offline Wiki. You can link all over the place easily, store it on a server to share, and work offline. I love it.
But once you get to using it this way, you end up with a whole bunch of notes. It can be hard to find something when you need it.
Enter OneNote Instant Navigator...
Assign a hotkey (I use Win+I) and now you can very quickly get to any note you want. I love it.
UPDATE: Forgot the link: http://i-navigator.hut2.ru/
Cameron Skinner, the Product Unit Manager for VSTS Architecture Edition, has returned to the blogging world by announcing (a little bit late) his new role.
Skinner's Blog : New role running the VSTS Architecture Edition team
Hopefully he'll keep blogging more!
I know Chris Tavares mentioned this at work one day when I was at P&P, and I'm very excited that he blogged it and made it so easy to do.
The last vsvars32.ps1 I'll ever need
I made one tiny modification, which is to default to 9.0 instead of 8.0 since that is the environment I use, but other than that it seems to work great.
Thanks Chris!
Not sure how I missed this, but a few weeks ago the patterns & practices team released Enterprise Library for VS 2008 (aka EntLib 4.0).
Grigori Melnik has blogged all about it here:
http://blogs.msdn.com/agile/archive/2008/05/16/enterprise-library-4-0-for-visual-studio-2008-released.aspx
Check it out! Lots of good stuff in there!
I'm always digging around looking for people talking about our stuff. FOund another one today by Willy-Peter Schaub, an MVP. He does a pretty good job, with screenshots and all that, of talking about the features in the CTP.
Rosario April 2008 CTP Investigation (Part 3) - Architecture - Willy-Peter Schaub's Cave of Chamomile Simplicity
Enjoy!
I'm back from TechEd 2008 Developer where we showed off not only our VSTS 2008 stuff but spent a lot of time talking about our Rosario features and in particular our UML support.
We got some time in the Billg keynote which was great, had thousands of excited customers come by our booth and I did a session all about Team Arch Rosario on Friday.
Feedback has been continuously positive and we're all very excited about what we're doing and about how customers are feeling about it. The UML direction seems to be very positive so far.
Also, via Mark Groves I found another blogger talking about our stuff, this time with a demo video of Reverse Engineering UML Sequence Diagrams from code. I've yet to do a demo of this where people don't get excited.
http://theumlguy.spaces.live.com/blog/cns!B4665B67C2981533!136.entry
Enjoy!
I see this get discussed all the time on some of the agile aliases I'm on.
I care how much time is left, not how much time you spent on it.
I know people like to talk about “using the data to make our estimating better” but there are flaws in that argument that just can’t be ignored:
- Nobody ever does it. In fact, I don’t even know of a process to achieve this. Hollering at people who over/under estimate is not an improvement process.
- It assumes you can make developer estimates better. More experienced developers estimate better, that I’ll take as a given, but can you accelerate this with novice/junior developers or testers? I don’t think so.
- Software is NOT like mechanical engineering. It is a craft. Every activity you do is very likely the first time you’ve done it exactly that way. So our inability to accurately and precisely estimate shouldn’t be all that surprising.
At least that’s how I see it. :)
Jeff Levinson's has followed up his last column on the April 2008 VSTS CTP with a new one called The Joy of Sequence Diagrams.
In this article Jeff reviews the Logical Class Diagram and the Sequence Diagram.
My favorite bit:
The benefit of the revamped diagrams is that not only can the represented information be semantic, but it can also be non-semantic. That is, it can be used to communicate ideas and thoughts without adding any particular constraints to a solution. This makes the new suite of diagrams in the Architecture Edition particularly powerful and useful.
Hopefully Jeff will cover more in his upcoming articles.
Today on an internal agile alias, a discussion came up about simulating agile team rooms for disbursed teams. I've played around with this for years and had some suggestions for them:
It can be simulated, but it is hard and requires extra discipline by the team. A few key things:
- Think about how to simulate the “in the room” experience where you can overhear and participate in conversations going on around you? Team void chat software like Ventrilo, Team Speak or our own Corporate Conference Calling system can work. Can you have an “open mic” in the team room? You also can give up on audio and use team room chat software like IRC. I’ve used them all. There are plusses and minuses to each.
- Think about the changes you may need to make to development practices. Do you use Pair-Programming and TDD? If so, you may want to take a look at Micro-pairing as a technique for coordinating the TDD/Pair handoffs. (Micro-pairing was actually created in response this exact scenario. I was pairing with another developer who was remote.)
- In addition to practice changes, think about how to deal with remote desktop sharing. Live Meeting works, but can be a bit heavy. Virtual Server and the standalone Virtual Server client actually let two people connect to the same desktop. I know that VNC, an open source remoting tool, also allows this, but I would recommend you to be cautious with that tool. It has some known security bugs and your network admins may not allow it. Check with them first.
- Make sure everyone on the team has all the necessary access they need to be a full team member. Access to version control, portals, file shares, email aliases, etc. all must be available.
- Think carefully about how you do your team meetings. When you have only 1 or 2 people who are remote and the rest of the team is in a room, the person on the far side WILL feel out of the loop unless you run the meeting as if everyone were remote. One thing I’ve heard of is to actually have everyone go into their individual offices and dial-in to the meeting so everyone is on an equal footing.
- Drastic time zone differences can make this very very hard on some team members. Ultimately this can be make-or-break for successful disbursed teaming. If people are 8 hours apart, when do you schedule standups and IP meetings? My rule of thumb is that more than 3-4 hours apart will kill you and you should split it into two teams that are closer in time to each other.
These are based on 3-4 years of playing around with these concepts at P&P. YMMV.
I know I've been kinda quiet since moving to VSTS Team Architect, but getting settled into a new job and moving your family can be a bit time consuming.
However, I was taking a break looking at some blogs and stuff and found a few people talking about some of the new stuff in our most recent CTP!
Very cool indeed and I wanted to share them with you.
It got me excited to see people talking about our new stuff. I promise I'll be writing more about it soon... just give me some time.
I ran across this post by Jeff Certain on his blog talking about the Rosario release of VSTS Architect Edition. Sounds like we're moving in a positive direction:
I attended the Rosario Architecture Edition preview yesterday. Frankly, I'm two orders of magnitude more excited about this than I am about anything else I've seen here at the summit yet.
Woot!
Technorati Tags:
VSTS,
Architect,
MVP
I never thought I'd see the day, but my good friend AaronX has finally started blogging. He and used to have a blog-like site that was just cool links that we found, little or no commentary and this this his new take on that idea.
http://denversurfreport.blogspot.com/
Enjoy!
My good friend Eduardo Jezierski has returned to the blog-o-sphere. His new blog is up and running and his first post explains what he's been doing at InSTEDD since leaving Microsoft.
He's promised me that he'll blog about all kinds of interesting technology and how they're using it for really cool humanitarian efforts around the world.
Good to see you Ed and good luck on your mission!
Technorati Tags:
edjez,
instedd
Haha... I love the Internet sometimes. I was sitting here in my office listening to the Tool song Jambi, tapping my foot along, counting the beats on a background thread as I am wont to do...
"Hmm... this is in 9/4 time signature. COOL!"
You see, I've always loved finding songs that have unusual time signatures. One quick search later and I found this little page over on Answers.com:
List of musical works in unusual time signatures
Cool. I'm gonna have to dig through my music for some of those.