Wednesday, November 14, 2007

I'm close to finishing up some work on one of my first true TDD projects and it has gone great for the most part. It did take a long time to get started though. The hardest part for me was fighting the urge to just open the designer and start dropping controls. Visual Studio really does guide developers towards a designer-centric approach which, after having done this for a few years, is very hard to resist. What I ended up doing was thinking about the problems that this application was going to solve and starting there. Make your tests define the problem area and move outward. The idea is that, if you can't write your tests that show what your code will do, are you even ready to write the code yet?

I was able to get my first few tests out quickly, but then I hit a block where I struggled with the structure I wanted to follow. This turned out to be good because, instead of coding something up that was substandard, I was able to fight through this struggle and come out with a better solution in the end. In doing this, I discovered a great benefit that TDD provides - you can continue coding even if you don't know all of the answers to all of the problems that your application will solve. For example, I'm still not sure what file format I'll be using in my application (or even if I'll use the file system). It really doesn't matter, though, because I was able to set up an interface and mock that dependency out in my tests and continue with the rest of my application. Had I started with the designer, I likely would have sat around until I had hashed out the file format requirements.

Once I got past my initial hang ups, I was able to fly through the rest of the code. What is even better is that I feel a huge amount of confidence in this code - code that still has no UI around it. I haven't felt this good about code quality in, well, ever.

If you're wanting to start with TDD, I'd like to recommend a few resources. First, read more code. If you aren't using it yet, go get TortoiseSVN and pull down some open source code. The Rhino.Commons repository is an excellent source of code (as well as great utilities). I can also recommend Jeremy Miller's StoryTeller code. I don't do anything with FIT tests, but the code is still a great example of WinForms code driven by tests.

Another great resource is screencasts. Watching someone write their tests first helps immensely. Evan Hoff has a great screencast on TDD. It also shows some of the power of ReSharper.

One final thought for this post is something that Bob Martin spoke about in this Channel 9 interview on programming discipline. Bob pointed out that few disciplines are as fragile as programming is. For example, if even one bit is off in your application, it has the potential to crash. One example of a profession that is also fragile is accounting. If one digit is off in the wrong spreadsheet, the CEO of a corporation can get thrown in jail. The way that the accounting profession has solved this is by entering their numbers twice - with credits and debits. If something gets entered wrong, it won't balance. When the sheets balance, there is confidence in the reported numbers. In the same way, TDD and unit tests provide the balance and confidence that applications are doing what they were intended to do.

Technorati tags: ,
posted on Wednesday, November 14, 2007 12:56:48 PM (Central Standard Time, UTC-06:00)  #    Comments [2]
 Tuesday, November 06, 2007

image

I didn't expect to see this in the next version of PowerShell - very cool. It definitely still needs some work, but I like the start. The syntax highlighting for opened script files is nice. I'd like to see some intellisense in there, but it isn't a big deal. If intellisense would slow it down much, I think I'd rather not have it anyway. I think the biggest issues I've got with it so far is the lack of options to customize fonts and colors as well as tab expansion.

I've haven't had a chance to play with anything else, but it seems nice so far.

posted on Tuesday, November 06, 2007 8:40:44 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
 Friday, November 02, 2007

I'm finding myself wondering if I'm a beta junkie or a CTP junkie.

Why?

Because Jeffrey Snover announced that there will be a CTP release of PowerShell 2.0 next week. I'm not waiting for the beta either - I'm downloading the CTP bits as soon as the post announcing its release gets to Google Reader. Maybe I should change my "beta junkie" title to "pre-release junkie" or "I just like to install things junkie."*

PowerShell 1.0 single handedly turned me into a console user. I do 90+% of my file operations from PowerShell instead of Windows Explorer. I also do a large portion of my pseudo coding at the command prompt to see whether a basic algorithm will work the way I expect it to. I'm very excited to see what the team has come up with.

Update (per post from Jeffrey Snover):

The PowerShell V2 CTP is not for everyone. You should read this PowerShell Team blog entry ( http://blogs.msdn.com/powershell/archive/2007/11/02/ctp-watch-this-space.aspx ) to find out what it is and what it isn't and then make an informed decision before installing the CTP.

I may be an "I just like to install things junkie" but that doesn't mean that you should be to. Be responsible with pre-release software. If you've got production code that relies on PowerShell behavior, etc. you should consider holding off on installing it on your development machine.

 

* With all these installs I do, I actually do see UAC prompts a lot. And no, I haven't turned off the prompt.

posted on Friday, November 02, 2007 10:26:11 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
 Wednesday, October 31, 2007

If you live anywhere around Memphis, be sure to be there on November 10. That is when the Memphis Day of .NET is scheduled. It was just announced today that Charles Petzold will be delivering the keynote as well! Charles has already posted about it on his blog. I'm incredibly jealous of all of you who are planning on being there - I had been planning to go but then when I found out when it was scheduled, I realized I had conflicts and wouldn't be able to make it. Of the other speakers scheduled, I got the chance to meet both Keith Elder and Jeff Blankenburg at DevLink and I know their presentations will be great. I know that Colin and others have put a lot of hard work into making the Day of .NET great, so if you get the chance, go out there and show them your support!

posted on Wednesday, October 31, 2007 8:23:45 PM (Central Standard Time, UTC-06:00)  #    Comments [0]

It is Halloween after all. It would be a great day to start learning Boo.

Sorry. I couldn't help myself.

posted on Wednesday, October 31, 2007 12:46:36 PM (Central Standard Time, UTC-06:00)  #    Comments [0]
 Friday, October 26, 2007

Ayende is the man. Seriously.

Today, he released Rhino Mocks 3.3 to great fanfare.

If there wasn't great fanfare, there should be. My favorite new feature - mocking objects that inherit from MarshalByRefObject. You might be asking yourself, why does this matter? Doesn't that only apply to remoting? Well, yes, sort of. The thing is, a huge number of the built-in classes in the CLR support this remoting infrastructure. You know the ones I'm talking about - the built-in classes that are hard to mock and test.

At least they didn't let you mock them out until today. Here's an example of something that might have been harder to test before today:

[TestFixture]
public class Tests
{
    [Test]
    public void TestingCoolRhinoMocksStuff()
    {
        MockRepository mocks = new MockRepository();

        Process p = mocks.CreateMock<Process>();
 
        using (mocks.Record())
        {
            Expect.Call(p.Responding).Return(false);
        }
 
        using (mocks.Playback())
        {
            Assert.IsFalse(p.Responding);
        }
    }
}

Yeah, I'm mocking System.Diagnostics.Process. Sweet.

Take a look in Reflector and you'll find out just how many objects actually inherit from MarshalByRefObject. I think you'll be quite surprised.

Thanks Ayende!

posted on Friday, October 26, 2007 10:56:32 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
 Thursday, October 18, 2007

I was reading through my feeds this morning and came across this gem of a paragraph:

Manual testing is immoral. Not only is it high stress, tedious, and error prone; it’s just wrong to turn humans into machines. If you can write a script for a test procedure, then you can write a program to execute that procedure. That program will be cheaper, faster, and more accurate than a human, and will free the human to do what humans to best: create!

The paragraph is actually an aside to the rest of the post, too! Go read the entire TDD post in context at the ObjectMentor blogs.

posted on Thursday, October 18, 2007 7:15:18 AM (Central Standard Time, UTC-06:00)  #    Comments [0]
 Wednesday, October 17, 2007

My wife and I got back from Nashville last night and we had a great time. While she went around shopping at garage sales and hanging out with family, I got to spend some time with some great developers at devLink. The conference was incredible. I'm still amazed that they were able to do so much with only $50, but no complaints here :-)

Here are a few of the high points from the conference:

Keith Elder had a great presentation on the Enterprise Library. It was especially good to hear from someone who is using EntLib successfully from a WinForms perspective. I also got to talk to him a little after his presentation on some of their techniques for storing configuration across smart client applications.

Josh Holmes is a great speaker. I'm not at all surprised that he is one of the hosts for the new Code To Live! show. He is clearly passionate about the coding craft. He shared some great information about the DLR with us.

I got to hear Dave Laribee talk about Domain Driven Design, which was great. I also spoke with him about ALT.NET and Microsoft's upcoming MVC framework for ASP.NET. He told me that there are already plans for the next ALT.NET conference which is great news.

Ron Jacobs had the closing keynote on Saturday evening that covered Test Driven Development and the Model View Presenter architecture. It was a great presentation and it was encouraging to have Microsoft's presence there encouraging and pushing TDD.

One of the best things about the conference was how approachable everyone was. I got to meet a lot of great people and I even got the change to give Colin grief about winning the blogging contest (not that you can give someone much grief about winning an Xbox 360). My only complaint was that I wasn't able to attend some of the other presentations where there were schedule conflicts.

All in all, the conference was great. The staff and the presenters all did a great job.

posted on Wednesday, October 17, 2007 11:57:29 AM (Central Standard Time, UTC-06:00)  #    Comments [0]