Where you can find me this spring

MVP Summit 2008:  Tomorrow I pray to God that American Airlines doesn’t cancel my direct flight from Austin to Seattle for the 2008 MVP Summit where I will host another Party with Palermo.  As of this morning, over 220 have RSVPed for the party on April 13th at 7PM.  Eat supper before you come because the finger food will go fast!!  If you haven’t RSVPed, please do so now so I have the best count possible.

I’m also facilitating an open space session on Tuesday afternoon of the MVP Summit.  My accepted topic is:  “Why cheap developers are expensive and the unspoken quality variable.”

ALT.NET Seattle:  Next Friday and Saturday, I’ll be attending the ALT.NET Conference in Seattle.  My goal will be to keep my mouth shut and absorb ideas from folks I don’t have the benefit of being in constant contact.

Agile Boot Camp:  April 3 – May 1, I’ll be teaching another Agile Boot Camp, an agile developer training class put on by Headspring Systems.  There are still a few spots available.  Mike Palermo blogged about his experience at the March training.

DevTeach Toronto: May 12th through 16th, I’ll be speaking at DevTeach as well as throwing another Party with Palermo on the first day of the conference.  The RSVP site will go up right after the MVP Summit PwP.  I’ll be speaking on software configuration management and the ASP.NET MVC Framework.

Austin Code Camp 2008:  If I get back from DevTeach in time, I’ll drop in to the Austin Code Camp hosted by the Austin .Net User Group.  I won’t be speaking since I might not be back in time.

AgileAustin Open Space:  I’m on the board of directors of the AgileAustin group, and we are holding our first conference on May 30, 31, and June1.  It’s in Austin, TX, and you can see the website here.

TechEd 2008 Developers:  Yes, I’ll be throwing the biggest Party with Palermo of the year at TechEd 2008 Developers.  Last year saw 435 in attendance, so we’ll see if we can break the fire code this year!  I have not set up the registration site yet, but it will go on www.partywithpalermo.com.  If you are interested in sponsoring this blowout bash, contact me at any time.  It’s going to be huge!

I’m also speaking at TechEd Devs.  Unfortunately, Doug Seven cancelled by Blackbelt Software Configuration Management breakout session in the development practices track because I don’t use Team System.  I’m giving two talks in the Architecture track on architectural concerns of 1) the ASP.NET MVC Framework and 2) Object-Relational Mappers with examples using NHibernate.  See the list of sessions here.  There are 20 architecture track breakout sessions, so it’s easy to find my 2.

I’m also hosting a Birds of a Feather session of Agile Development with .Net.

I’m looking forward to the summer when things settle down a bit so that I can devote more time to my book, ASP.NET MVC in Action with Manning.

As always, you can subscribe to my feed at http://feeds.feedburner.com/jeffreypalermo

Agile Boot Camp for .Net developers: April 30-May 2 (spots available)

On April 30th, 2008, I’ll be teaching the 3rd class of the Agile Boot Camp.  This is an advanced course for .Net developers.  Students will learn about Agile, Scrum, Extreme Programming and will practice working as an agile team to extend an enterprise application using extreme programming engineering practices.

Go to http://www.headspringsystems.com/training/ to get more details and to sign up.  Once it’s full, it’s full.  The course is also listed on the AgileAlliance events page.

Here is what some of the past students are saying:

“This was the best technical training course I’ve been to, period. No fluff here. The course was packed with information and best practices that I could start implementing immediately when I got back to work on Monday.”
Brad Mellen-Crandell
Rapidparts Inc.

“Jeff is an excellent teacher and practitioner of Agile principles and methods. His integration of open source tools to boost productivity will surely help me be more successful and confident in my daily working regimen.”
Ken Jackson
Catapult Systems

“A great start to Agile/XP development strategies and the tools needed to be successful at it!”
Karthik Hariharan
Telligent

Some of the topics covered are:

• Domain Driven-Design

• Test-Driven Development

• Onion architecture

• Inversion of Control

• Resharper

• Source control with Subversion

• Pair programming

• Refactoring

• Build automation with NAnt and CCNet

• Object-relational mapping with NHibernate

• Automated unit and Integration testing

• Interfaced-based programming

• Team dynamics

• Automated deployments

• Redgate SQL Compare

• SQL Profiler

• Rhino Mocks

• Separation of Concerns

• Design patterns

Agile Coaching: The daily stand-up meeting

I’m starting a new blog series based on my experiences doing agile coaching at clients.  Along with agile projects in .Net, my company also offers agile coaching and training.  Right now, the agile coaching practice consists of me, but I’m actively working on finding people to expand that practice.  I started doing this March 2007, and since then, I’ve seen some of the same patterns repeated in very different businesses.  In this series of posts, entitled “Agile Coaching”, I’ll talk about some of the common solutions to the common problems I’m finding.  This first installment is about a daily stand-up meeting.

The daily stand-up meeting

At several clients, I’ve seen developers who aren’t co-located.  Many organizations value individual offices, and what I observed is that sometimes developer won’t communicate much day-to-day.  Perhaps there is a weekly development meeting where folks report on status.  I attended one of these, and one developer reported spending the entire last week on a single blocking issue.  A whole week!  I recommended the instituting of a daily stand-up meeting immediately.  This would give a daily sync-up opportunity for the development team.  There are plenty of other things to improve, but a daily stand-up meeting is low-hanging fruit.  It is easy to implement and returns immediate gains.

What is it?

Every morning (I like 0830 or 0900), gather the development team in the same area.  That area could be a hallway, a meeting room or whatever space is available for standing.  No chairs allowed.  The meeting should be over in under 10 minutes.  The agenda:

  • What I accomplished yesterday
  • What I plan to accomplish today
  • What issues are blocking progress

Every person in the development team reports on the three items to the rest of the team.  This is not a report to management or the coach/scrummaster/project manager.  This is so each person has a clear understanding of what is going on.  When issues are exposed early, others can help resolve them quickly.  I recommend this practice be used in every software organization. 

ASP.NET MVC: Goodbye SmartBag, Hello ViewDataExtensions

A while back, I thought up the idea of the SmartBag, which has a very friendly API for working with viewdata objects.  With the December CTP, adding objects to ViewData was a bit difficult, but now that the ViewData property is an IDictionary on the Controller base class, getting objects in is very easy.  If you like this post, subscribe to my feed at http://feeds.feedburner.com/jeffreypalermo.

Consider the following usage

[Test]
public void ShouldRetrieveSingleObjectByType()
{
    var bag = new Dictionary<string, object>();
    var url = new Url("/asdf"); //arbitrary object
    bag.Add(url);
 
    Assert.That(bag.Get<Url>(), Is.EqualTo(url));
    Assert.That(bag.Get(typeof(Url)), Is.EqualTo(url));
}

We are adding a Url object to the dictionary, and then we can retrieve the object through the Get<T> method or by passing the type.  No need for a string key if only a single Url is in the dictionary.  If you have multiple Url objects, you can fall back to keys, or you can pass in a Url[] and then Get<Url[]>(). 

In CodeCampServer, I’ve removed SmartBag and added these ViewDataExtensions.  These are extension methods to IDictionary<string, object> and System.Web.Mvc.ViewData.  In my opinion, System.Web.Mvc.ViewData should inherit from Dictionary<string, object>, so maybe that will happen in the next release.

I’ve added ViewDataExtensions to MvcContrib, so you you’d like to use them, just build the trunk of MvcContrib, and you’ll have them.  Look at CodeCampServer for widespread use of these extension methods.  Strongly typed views don’t scale when the application complexity increases, but these view data extensions make working with the dictionary a snap.  My annoyance factor is very low with viewdata now.

MvcContrib is a free, open-source project.  Feel free to use it and contribute patches to it.  Building it takes less than 1 minute on my box, and the build runs all 840 unit tests to verify the features continue to work.

So much easier to test plain ASP.NET MVC controllers!!

I was having a hard time easily testing controller classes with the MVC Framework December CTP.  Now it’s easier.  For some background, I’m writing ASP.NET MVC in Action for Manning, so I’m going through all kinds of scenarios, and in the first chapter with the tiny little Hello World samples, it’s now easier to test these.  Consider the following controller:

using System.Web.Mvc;
 
namespace MvcApplication.Controllers
{
    public class HelloWorld1Controller : IController
    {
        public void Execute(ControllerContext controllerContext)
        {
            controllerContext.HttpContext.Response.Write(
                "<h1>Hello World1</h1>");
        }
    }
}

And here’s my unit test:

using MvcApplication.Controllers;
using NUnit.Framework;
using NUnit.Framework.SyntaxHelpers;
 
namespace MvcApplicationTest.Controllers
{
    [TestFixture]
    public class HelloWorld1ControllerTester
    {
        [Test]
        public void ShouldRender()
        {
            var response = new ResponseWriteStub();
            var contextStub = new HttpContextStub(response);
            var controller = new HelloWorld1Controller();
 
            controller.Execute(new ControllerContextStub(controller, contextStub));
 
            Assert.That(response.ActualWritten, Is.EqualTo("<h1>Hello World1</h1>"));
        }
    }
}

Pretty darned simple.  Below are my stub classes.

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
 
namespace MvcApplicationTest
{
    public class ControllerContextStub : ControllerContext
    {
        public ControllerContextStub(IController controller)
            : base(new RequestContext(new HttpContextStub(), new RouteData()), controller)
        {
        }
 
        public ControllerContextStub(IController controller, HttpContextBase contextBase)
            : base(new RequestContext(contextBase, new RouteData()), controller)
        {
        }
    }
}
using System.Web;
 
namespace MvcApplicationTest
{
    public class HttpContextStub : HttpContextBase
    {
        private readonly HttpResponseBase _response;
 
        public HttpContextStub(HttpResponseBase response)
        {
            _response = response;
        }
 
        public HttpContextStub()
        {
            
        }
 
        public override HttpResponseBase Response
        {
            get { return _response; }
        }
    }
}
using System.Web;
 
namespace MvcApplicationTest.Controllers
{
    public class ResponseWriteStub : HttpResponseBase
    {
        public string ActualWritten;
 
        public override void Write(string s)
        {
            ActualWritten = s;
        }
    }
}

Extreme Programmers wanted in Austin, TX

It’s time again.  I’m hiring.  If you’d like to work for me at Austin’s leading agile consulting company, please apply through our website job posting.  The applications all get routed to me, so if you apply and fit well, I’ll end up giving you a call.  We’re hoping to hire locally, so if you already live in Austin, TX, that’s a plus.

Here’s our team page.

Here’s the job posting.

For a little more on what what do, read here.

We are a corporate member of the AgileAlliance.

For information on our Agile Boot Camp.

And, finally, if you’d like me to visit your company for a day to give you an agile assessment of your software department, just let us know.  I’m doing more and more of those lately.

Original altnetconf (cli_dev) list has now been deprecated

http://tech.groups.yahoo.com/group/cli_dev/ is closed.  A poll of the group showed that this was the best course of action.  The archives are still there.  Anyone who was a member can still search the archives.  Unfortunately, Yahoo doesn’t provide a mechanism for public message access for a closed group, so this is as good as I could get it.  All messages are still there.

If you would like to participate in more Alt.Net stuff, go to http://tech.groups.yahoo.com/group/altdotnet/