# Monday, February 28, 2011
Monday, February 28, 2011 9:00:00 PM (GMT Standard Time, UTC+00:00)
Monday, February 28, 2011 6:15:00 PM (GMT Standard Time, UTC+00:00)
# Wednesday, February 23, 2011

Last week, I delivered a new presentation on Microsoft Windows Work Foundation at the Microsoft Developers of Southwest Michigan user group in Kalamazoo, MI. The slide deck is below. The presentation was heavy on demos and light on slides, so I had fun with PowerPoint – I included a photo of Mike Eaton on almost every slide. Mike is the president and host of the user group and the man who invited me to speak there. He was impressed enough to suggest a throatpunch was appropriate.

I have retitled this presentation “Real World Lessons with Windows Workflow Foundation” and I am scheduled to deliver it again in ann arbor, East Lansing, Toledo, and Flint over the next few months. In addition, I will be presenting on Visual Studio database tools at the Redmond .Net User Group next week.

Below is my upcoming schedule.

Date Event Location Topic
Mar 28 Redmond .Net User Group Redmond, WA Migrating Database Schemas with Visual Studio 2010
Apr 13 Ann Arbor .Net User Group ann arbor, MI Real World Lessons with Windows Workflow Foundation
Apr 21 Greater Lansing .Net User Group East Lansing, MI Real World Lessons with Windows Workflow Foundation
May 17 Northwest Ohio .Net User Group Toledo, OH Real World Lessons with Windows Workflow Foundation
Jun 22 West Michigan .Net User Group Grand Rapids, MI Real World Lessons with Windows Workflow Foundation
Wednesday, February 23, 2011 2:00:00 PM (GMT Standard Time, UTC+00:00)
# Tuesday, February 22, 2011

A workflow is a set of related activities. The relationship between these activities can take many forms.

Activity 3 may take place immediately after Activity 2.

Or Activity 6 some condition that is tested in Activity 7 and determines whether Activity 8a or 8b executes next.

Or Activity 9 may test a condition and repeat Activities 6-8 until the condition is false.

Below is a diagram representing a simple workflow that you may have written in a general purpose programming language, such as C# or Visual Basic. You may even have drawn a flowchart similar to this, either to assist in designing the program or to help document the program’s logic after it was written.

Figure 1

General purpose languages work very well for these simple workflows, as you can use constructs such as if statements and while loops to construct the program and assemble the activities.

But workflows can contain activities with more complex relationships and this complexity can make it difficult to write these workflows in a general purpose language.

Figure 2

In the workflow of Figure 2, four tasks are executed in parallel. For our purposes, parallel simply means that it doesn’t matter in which order each task begins or ends – it only matters that all 4 of them must complete before the workflow continues to the next activity.

This relationship can be complicated further if the workflow demands that only one of these activities complete before proceeding or if any 3 of the 4 activities complete. These scenarios would be difficult to write in procedural code. Doing so requires tracking global variables and a way to cancel activities that started and no longer need to complete.

Another complication occurs when a workflow requires external input at a step in he middle. Imagine a scenario in which an e-mail is sent to a manager. The e-mail contains a link to a web page. The manager clicks the link, reviews information on the web page and clicks a button to allow the workflow to continue to the next activity. The manager may click this button shortly after the e-mail is sent; or he may wait hours, days, or even weeks before clicking it. He may never click the button and our workflow should be able to handle this possibility (possibly by invoking a different activity after a specified timeout period). It is not scalable for a workflow to remain in memory for days or weeks, waiting for input. The practical solution is to serialize the state of the workflow and save it to a persistent data store; then de-serialize it and reload it into memory when the input finally arrives. If multiple copies of the same workflow are in progress, it’s also important that the correct instance is loaded into memory. When the manager clicks the button, some piece of data must tell the workflow which instance to retrieve.

A workflow framework can help to manage these complex relationships between workflow activities. Allowing a framework to manage these relationships also tends to keep the business activity code (the code executed by each activity) separate from the workflow code (the code that manages relationships between the activities.) This makes for a simpler and more maintainable code base.

Microsoft Windows Workflow Foundation (WF) is a framework designed to help you create and manage workflows.

You could write such a framework yourself, but why do that if this would be a lot of work and frameworks already exist to manage this for you?

WF provides a graphical user interface to design workflows by dragging a dozens of built-in activities from the Visual Studio toolbox onto a design surface. WF provides a rich API for building workflows and custom activities.

By hosting a workflow in IIS, you can accept incoming requests as web services or other WCF services; by utilizing WF’s integration with SQL Server, you can persist a workflow to a database and allow it to be retrieved at a later time; by using the built-in activities that ship with WF, you can simplify some of the programming tasks you need; and by creating a workflow with the graphical Workflow Designer in Visual Studio, you can more easily visualize the relationship between each step.

WF takes care of much of the workflow infrastructure for you and makes it easier to separate the internal activity logic from the workflow logic.

Tuesday, February 22, 2011 2:00:00 PM (GMT Standard Time, UTC+00:00)
# Monday, February 21, 2011
Monday, February 21, 2011 7:14:00 PM (GMT Standard Time, UTC+00:00)
# Saturday, February 19, 2011


At the end of 2009, I took over as President of the Great Lakes Area .Net User Group (GANG). One of the first things the new officers and I did was to meet and set goals for 2010. We set the following goals for the year and announced them at the January 2010 meeting.

  • Get members more engaged and involved
  • Increase meeting attendance by 50%
  • Increase supporting membership by 30%
  • Continue to attract high-quality speakers
  • Increase sponsorship by 100%
  • Finish year in the black financially

Most of those goals focused on growth of the group. Prior to 2010, the group was successful, but we felt it had plateaued and we wanted to make more people more aware of GANG and excited about coming to meetings. We successfully met the 2010 goals by increasing attendance, sponsorship and supporting membership during the year.

At the end of 2010, the leadership team met again to discuss goals for the upcoming year.

This year’s goals focus on connections: Connecting members more with the group; connecting the group more with its members and connecting with other user groups.

Our goals for 2011 are

  • Cultivate Ownership In Group
  • Continue to Attract High-Quality Speakers
  • Support and Connect with other Area User Groups
  • Average 60 attendees per meeting
  • Increase supporting membership by 15%
  • Increase Monetary Sponsorship by 10%
  • Make it an event!

Below I describe our plan to achieve these goals.


If a member feels connected with a user group, he or she is more likely to support that group with his money and his time; he is more likely to run for a leadership role in the future; and he is more likely to recommend the group to his friends and colleagues.

Last year, we implemented things like networking time before the meeting, name badges, and after-meeting social hour to help members connect with one another. This year, the big change is in the number of volunteers we have. Over the holidays, the officers sat down and listed all the tasks that go into putting on a user group. When people told us they want to volunteer, we were able to send them this list and allow them to pick the tasks they want. 

I have already announced that I will not run for President next year. By getting more people involved, there should be no lack of leadership when I step down. I think this turnover is good for the group.


GANG has always done a great job at this. Over the years, we have had some outstanding speakers. Many of them were Microsoft insiders, MVPs, book authors, Regional Directors, and heartland influencers. Many of the speakers at GANG also speak at major conferences around the world.

This year, we are looking to attract speakers with bigger names than in the past. This means bringing in speakers from a wider geographic area. Our sponsors will help defer some of the cost of this. As of this writing, we have confirmed Richard Campbell and Steve Bohlen will speak at GANG in 2011 and we are waiting to hear on some other well-known speakers.


GANG is part of a strong developer community in Michigan and the Midwest. Currently, we have the highest user group attendance in Michigan, which gives us a platform for making our members aware of other groups in the area. We will be strongly encouraging our members to attend other user groups and the officers of GANG have made a commitment to attend 20 other user groups during the year. This will help us connect with other groups and to bring new ideas into our group. In January, we actively promoted the 5-year anniversary celebration of the Ann Arbor .Net Developers User Group. I attended this event and saw a number of GANG members there.

The March GANG meeting will be presented in partnership with the Greater Detroit Cloud Computing User Group and will feature a presentation on REST and hypermedia.


We finished 2010 strong in terms of attendance and we’d like to continue that trend. Average meeting attendance rose from 35 in 2009 to 54 in 2010. We will continue our strategy of promoting the group via Twitter, Facebook, LinkedIn, e-mails, and our web page; However, word of mouth remains the best method for getting the word out.

This year, we will repeat our membership drive in which members earn raffle tickets for attending meetings and for bringing new people to each meeting.

The best way to increase attendance is to deliver a quality product.


If we provide value to our members, I believe those who can afford it will gladly support us. We have made it easier for them to do so by allowing members to support us via PayPal and by clicking a link on our web site. We also plan to send a reminder e-mail when a membership expires.


In 2009, the Michigan recession caused corporate sponsorship to dwindle so low that we could not provide food at most meetings. In 2010, we raised over $4000 from corporate sponsors, a huge increase over the previous year.

This year, we are looking to raise even more. Our strategy is to define sponsorship levels and to communicate the benefits a sponsor receives by contributing at each level. Benefits include mentions during our meetings, logos on our web site, slide decks and e-mails, and the opportunity to present Lightning Talks before meetings.

This money will go toward providing food at the meetings and travel costs for speakers traveling a great distance.


I don’t remember who it was, but someone described a GANG meeting last year as more of an event than a user group meeting. I really liked this description and want to strive to make it even more true in 2011.

We are planning some fun things at each meeting, such as trivia questions, and a more personal introductions for each speaker. We have also planned a few special events throughout 2011, such as a Food Drive and a Membership Drive.

The biggest event of the year will take place in October, when GANG celebrates its 10-year anniversary. Our October meeting will be replaced with a day-long, single-track conference featuring many of the founding and early members of GANG. Details will be announced soon.


The goals we set for the coming year are more evolutionary than revolutionary. GANG seems to be heading in the right direction and we want to keep that momentum going. As of this writing, we have held two meetings in 2011 and we are on track to achieve these goals.

Saturday, February 19, 2011 11:39:00 AM (GMT Standard Time, UTC+00:00)
# Monday, February 14, 2011
Monday, February 14, 2011 7:12:00 PM (GMT Standard Time, UTC+00:00)
# Monday, February 7, 2011
Monday, February 7, 2011 1:35:00 PM (GMT Standard Time, UTC+00:00)