Sunday, January 7, 2007

6 x 2 + 1

Our team just started on a +1 sprint and it is going very well. I should explain what a 6 x 2 + 1 is. We normally work in 2 week sprints and deliver production level code at the end of every sprint. We’ve been working in this cycle for close to 2 years and haven’t had a chance to “fix” any past decisions and have accumulated some technical debt.

So the new formula is to work for six sprints (two weeks each) on stories determined by the customer team, but then taking one week to work on technical stories created by development team. Thus 6 iterations x 2 weeks + 1 week. The team is very excited about being able to pay down some of our technical debt. Most of stories we’ve known about and wanted to work on for a long time, but couldn’t squeeze them into the normal two week sprints. This gives a little time cleaning up after ourselves.

I don’t think we’ll be doing the plus one sprints forever, but for a new project it makes sense to plan for it until the team hits its rhythm.

How does your team take care of cleaning up your technical debt? Is it planned for? Is it ever cleaned up? Or do you never make a mistake on the design or the architecture? J

Sunday, November 19, 2006

Tragic News

Tuesday morning I got some tragic news from my friends as Two Rivers Marketing. A plane that Two Rivers had chartered for a business trip crashed a few miles outside South Bend, Indiana. On the plane were five people, four of whom I had the privilege of working with during my six months at their company.

One of them was a very good friend of mine. Actually Eric Jacobs was much more than a friend. He was friend, a father, an advocate and a leader in our community.
When my wife and I moved back to Des Moines, Eric wanted me to come to Two Rivers. He was adamant about it. In a company that had been burnt by consultants in the past, he put his reputation on the line a recommended me to the senior partners. I was flattered and I tried like crazy to make sure that he didn't tarnish his reputation by recommending me. Eric was always there to encourage me to take on a new challenge. He believed in me and that helped me believe in myself.
As a leader in the community, Eric took the reigns of the Iowa .NET User Group and has been leading us since its inception. He always joked that since he couldn't code very well, he had to find another way to contribute. He came up with the idea of linking our members with leaders of other non-profit organizations and having us create websites for them. We would never be comfortable taking the credit himself, but he was the guy ordering the pizza every month. He was the guy sending the email reminding people about the meeting. He was the guy updating the website. He was the guy!
As a father and husband, Eric was my role model. I was always amazed at his ability to raise four boys with his wife, Heather. When my family and I went through a personal tragedy, Eric and his family had gone through something similar and he helped me through it. When my wife became pregnant with our first child, he let me know what to expect and made me less anxious about becoming a father.
I couple weeks ago, Eric called and wanted to get together for lunch. Unfortunately our schedules didn't mesh and we were never able to get together. I'm so sorry we couldn't see each other one last time. God bless you Eric, you touched the lives of many. You will be missed.

Saturday, October 28, 2006

Heartland Developers Conference 2006

I've been in Omaha for the last couple days at the Heartland Developers Conference. It was a great opportunity to catch up with a bunch of people.

It was nice to see Jeff Brand again. With his new responsibilites at Microsoft, Jeff doesn't make it down to Des Moines to hang out.

I also ran into Dru Sellers. I first met Dru a couple weeks earlier at Tulsa Tech Fest. Dru does PodcastStudio.net with Jeff Julian. Thursday afternoon after our presentation, Nick Parker and I sat down and did our first podcast with them. It will be released sometime over the next few months. It was a good interview and Dru and Jeff did a great job at keeping the conversation flowing.

We had a good time Thursday night after the first day of sessions. Nick Parker, Matt Ring, Mike Vesey, Ken Sherman, Dave Havenridge, Phil Stanislav, and Matt Milner had dinner at Omaha Prime in the Old Market. The steaks were great, but I'm still searching for a shrimp cocktail that compares to St. Elmo's in Indianapolis, IN.

It was fun and I can't wait to do it again next year!

Sunday, October 22, 2006

Agile Workspaces: Microsoft's Patterns & Practices Team

As most of you know, I'm very interested (read:fanatic) in agile development and have been disappointed with the lack of leadership from Microsoft in the agile space. However it appears that the Patterns & Practices team is starting to effect the development culture at Redmond.

In this video, Ed Jezierski and Peter Provost give a guided tour around their newly renovated agile development workspace.

Multiple sized reconfigurable team rooms - Lots of whiteboard space, each room has an overhead projector and multiple flat screen monitors at each workstation. Most of the team's daily work occurs in the team rooms, but every team member has an office space (shared or individual based on job function and preferences).

Escape Pods - Private small meeting rooms where developers can "escape" to make phone calls or hold small private meetings.

Modular interior office walls - The walls can be moved without a building permit.

Customer Room - Customers are top priority and have their own meeting room.

And the coolest....

Whiteboard Windows  - A white film sandwiched between two 8 ft. tall glass panels used to seperate rooms and can be used as whiteboards on both sides. Very cool and practical.

Has your team modified it's workspace to make the team more effective? Let me know, I love this stuff!

Sunday, September 3, 2006

Dear SourceSafe, I've found another

Dear SourceSafe,

We've been together so long and during that time we've been comfortable together, but not safe. During our time together, I've learned about your quirks. I admit then we first got together, I made some mistakes. I can't blame you for everything. But as we spent more time together, I discovered things about you that were harder to overlook. You don't have atomic check-in, you exclusively locked files, and it takes you forever to check-in, check-out, and create history reports. Through all this, I stuck with you.

Our relationship has gotten so bad that when you're not around, my friends and I make jokes about you. We use hurtful names for you like "Source Unsafe" or "Sour Safe". This isn't fair to you and I feel awful about it, because I know how insecure you are.

I have to be honest with you, I've been thinking about someone else, Subversion (SVN). Subversion is different from you and that's a little scary, a little exciting, but from the little amount of time that we've spent together...it just feels right. You know what I mean? I'm sorry, but never got that feeling with you.

I know we'll continue to run into each other for years to come and I'd like to remain friends, but I think it's best if we spent some time apart for awhile.

Sincerely,
Tim

P.S. If your interested in learning more about Subversion and how to install it on a Windows system. Please refer to these links.

If you're planning on using Apache Web Server, the SVN module doesn't work with the latest version (2.2.x). Use version 2.0.54 (at the time of this writting).

http://geekswithblogs.net/emanish/archive/2006/06/14/81905.aspx
http://blog.briankohrs.com/2005/09/20/guide-to-installing-the-subverison-http-module-on-windows/
http://www.subversionary.org/howto/setting-up-a-server-on-windows

Sunday, August 27, 2006

Object-Oriented Overview and Shared vs Instance Methods

In order to be a quality software developer today, you need to have an understanding of object oriented programming. However, if you want to be an Agile or Test Driven developer, you need a much stronger understanding. Why? Because when you're agile, you must be able to make changes quickly without affecting the system. In order to do that, you need to reduce (or eliminate) duplicate code and minimize coupling. OOP provides ways to do these things better than (in my opinion) procedural programming.
 
The purpose of this post is to provide a quick start to OOP. I hope you find it helpful.
 
Object-Oriented Overview
I found a simple and short tutorial to OOP concepts. It's in Java, but the concepts work for any OO language and it's short and simple.
 
 
So do you know the difference between a class (or Type) and an object?
 
A Class is the code that defines an object. An object is an instance of that class. If you "new up" a class, you get an object. It's that simple!
 
Shared/static vs. Instance Methods
Now that you understand the differences between a class and an object we can discuss the difference between Shared and Instance methods. Shared methods are at the class level, instance methods are on the object..err...instance. This means that each object that is created has it's own copy of the instance methods, but the shared function is used by all code in the application. I guess that is why the VB.NET team named them "shared".  Since shared methods are global, they can be helpful in some situations, for example, factory methods or singletons, but in general I avoid them for a few reasons:
 
You can't put shared methods on interfaces
Shared methods can cause multi-threading problems
They encourage procedural coding
 
Example:
For this example we'll use the good ol' Person Class.
 
        Public Class Person
    'Constructor
    Public Sub New(ByVal firstName As String, ByVal lastName As String)
        Me.FirstName = firstName
        Me.LastName = lastName
    End Sub
 
    'Fields
    Public FirstName As String
    Public LastName As String
 
    'Instance Method
    Public Function DisplayName() As String
        Return String.Format("{0}, {1}", Me.LastName, Me.FirstName)
    End Function
 
    'Shared Functions
    Public Shared Function Steve() As Person
        Return New Person("Steve", "Person")
    End Function
 
    Public Shared Function Tim() As Person
        Return New Person("Tim", "Person")
    End Function
 
End Class
In the Person class, FirstName and LastName fields are data stored within an object, and the DisplayName function describes a behavior for the class.
 
An object is an instance of a class. When "new up" a class we create a new instance (object) of the class. In this example, myPerson is an object, Person is a Class.

    Private myPerson As Person = New Person
 
To access a shared method, you don't need to "new up" an object. You can call it directly on the class. For example, Person.Steve() or Person.Tim(), work without "newing up" an object.
 
However, we don't have access to instance (non-shared) methods. You can't call Person.DisplayName(), but you can "new up" a person object and call DisplayName(), New Person().DisplayName.
 
In order to add to the confusion, VB.NET shows Shared methods on object variables. Calling myPerson.Steve() on an object instance works fine in VB.NET, but causes confusion. Please don't do this. I was hoping the VB.NET team would remove this "feature" in 2005, but it would have broken alot of systems.
 
I hope this wasn't too confusing, but understanding the basic concepts will help you develop better quality systems.
 

 

Monday, June 19, 2006

IIS looses changes after restart

Mike Phelps sent this tip around to our team a couple weeks ago. I've experienced this problem and never put all the pieces before. Not it makes perfect sense. Now if I coule get him to start his own blog ;)

IIS runs strictly from memory (i.e, the IIS metabase is loaded to RAM). If you make changes to IIS, they are only made in memory. The changes don't actually stick until IIS writes to disk. This can occur with safely shutting down windows, or restarting IIS without a timeout/clicking End Now.

Want to see for yourself?

  • 1) Go to properties of the DataPortal web site, and change the anonymous credentials to be your user.
    2) Close the IIS control panel.
    3) Start/Run iisreset /timeout:0

    • A)This forces IIS to shut down, without saving to disk. The wait time is used to persist to disk.

    4) Check the user you changed in #1. It will be back to the original user.

The point: Be wary of using the timeout option when you've made metabase changes.