Beyond Bullet Points

posted on 05/15/08 at 11:36:42 pm by Joel Ross

A while back, I read Beyond Bullet Points, a book about putting together presentations with Power Point, but without using bullet points, or in essence, not making boring presentations. There's a lot of ideas that I really, really like about their approach. I've never been one to put tons of text on my slides anyway, so the approach wasn't exactly unfamiliar. It does require a change in how you think as your putting together your slides. I don't think I would necessarily go through the whole process of writing out everything I planned to say in my presentation as the book suggests, but I do like the idea of using graphics in place of boring text.

As a result of reading the book and hearing about other's experiences going beyond bullet points in their own presentations, I decided to do the same with mine. I had an existing presentation that I decided to rework. It already had a video incorporated into one of my slides, so I was on my way. My talk is about 30 minutes (then another 30 minutes of demos), and I have ten slides, with three not really counting - an intro slide, a demo slide and a resources slide (Yes, I could have done better on those, I'm sure). The other seven slides all had their original text replaced with a just a headline and a picture.

Here's a couple of before and after examples to give you an idea of the changes. This is from my presentation at the West Michigan Day of .NET this past weekend.

First, my continuous integration tools slide.

CIToolsOld CIToolsNew
Before After

Next, my CI tasks slide. I think this one is my favorite.

CITasksOld CITasksNew
Before After

As you can see, the after ones look a lot cleaner. It also has the added benefit that your audience doesn't spend the first 30 seconds reading your slide instead of listening to you explain what you want them to know.

Oh - while I was sitting in the speaker's lounge, someone mentioned that you can't do a presentation without a picture of a kitten in your slide deck. I'd never heard that before, but luckily, I had that covered as well!


I haven't received the feedback from the presentation yet, but the feedback I sought beforehand was pretty much unanimous that the new approach was better than the old one. To be honest, the new way takes a lot more prep - you need to know your material front and back because your slides don't give you nearly the hints that the old method does. Of course, I still cheated and had my speaker notes there for me to fall back on.

If you've read the book, you might be thinking that I missed the whole point of the book - to create your presentation "Hollywood-style" and treat it like a screen play. That's partially true. I got that from the book, but this was an existing presentation that I'd done a couple of times in the past and had it be successful. I didn't want to rework the whole presentation - I just wanted to tweak it a bit. Once I decide on a topic for another presentation, I'll go through the whole process then. For now, this was good enough!

Tags: | |

Categories: Personal


West Michigan Day of .NET '08

posted on 05/12/08 at 12:40:12 am by Joel Ross

On Saturday, I attended the West Michigan Day of .NET event, and had a great time - for the little bit I could actually be there. Unfortunately, I had to leave around lunch time, so I couldn't stick around as long as I would have liked.

Anyway, I arrived there early so I could be sure I was prepared for my presentation - I was second on the schedule. First, I grabbed breakfast, said hi to Jeff Tucker, Matt Davis and Seth Longcore (none of which have blogs - yet!), and headed to the speaker's lounge where I met Jay Wren and Dan Rigsby. I ended up skipping out on the first session so I could get in one last dry run before I was to go on. That didn't happen, since Mike Eaton, Dan Hounshell and Dave Redding walked in. Later, The Quick Solutions guys came in - Steven Harman, Tim Wingfield and James Bender. So yeah, no prep, but it was great meeting a bunch of people that I've interacted with online over the past 6 months (mostly via Twitter, the new conference back channel).

Chris Woodruff, who helped organized the event, introduced me to Patrick Foley (that's his twitter link. His blog seems pretty quiet). Despite being a Dallas Stars fan, he's a pretty decent guy and, as it turns out, has been working with a co-worker of mine on another project! Someplace in there (it's a blur), I met Jeff McWherter as well.

By then, it was time to head off to my session. I was up after Joe Wirtley, so I got a chance to say hi to him as he was unhooking his computer and I was hooking up mine. I had a slight technical issue getting the right resolution on the projector, but luckily I was able to work around it before I started. The session went fairly well. I would guess I had about 20-25 people in the session and had quite a few good questions. I was up against Josh Holmes and his building rich Internet applications session, which was disappointing, since I wanted to see that one!

After I finished up in my room, I headed over to Mike Eaton's Silverlight session to show support (read: tweet one liners from the back of the room). The room was packed, and only after I found a spot did I realize I was sitting next to Chris Broland, someone I've been following on twitter for a while. And when I say I realized who it was, I mean he told me who he was! Mike's session was pretty good - good content and good style. I've got a few pointers for him, but overall, he did a great job (especially considering he was partying all night before the event!).

After that, I pretty much had to leave. But not before I caught up with Dean Weber (no blog, Dean?) and had a nice conversation with him. After that, I headed back to the speaker's lounge to pack up. There were lots of tweeps in there that I hadn't yet met, but didn't have the time to do much more than pack up, so I missed a chance to introduce myself and say hi, which was a bit disappointing.

On the way out to the car, Wally McClure was grabbing something from his car, so I said hi, and I got a chance to meet him. We had a good conversation. Wally has a very distinct voice, which I'd become accustomed to through his podcast. I think I spent most of the short conversation thinking about how nice it was to put an actual person to the voice that I've heard on his podcast for a while now.

Then I got in my car and headed off. It was a great event, and I'm sure there's someone that I met that I didn't mention here, and if that's so, it's not on purpose. It was a whirlwind morning for me, and it's late after a very, very busy weekend!

Categories: Personal


Continuous Integration at West Michigan Day of .NET

posted on 05/11/08 at 11:13:32 pm by Joel Ross

This past Saturday, I gave a presentation on continuous integration at the West Michigan Day of .NET, and as promised, I'm posting my materials for anyone who wants them. Even for those who didn't attend, I think that simply by dropping your code into this process and modifying a few settings, you could easily have a build process ready to go quickly.

CI - What, Why & How (18.6 MB zip)

For those who were at the presentation, this is the contents of my C:\Build folder (the one that would be on the build server). I've removed all of the .svn folders. It also has my presentation slides, which don't have much content, but there are some notes in there. This was my first attempt at a more "Beyond Bullet Points" type of presentation, so hopefully it worked out.

Here's are the links to the tools I talked about, as well as the ones on the last slide:

Note that not all of these tools are free. NCover requires a license, and Simian is only free for free or open source software.

For everyone who attended, thanks for allowing me to present on something I am passionate about, and hopefully there's something that will benefit you on your future projects.

Tags: Continuous Integration | CruiseControl.NET | NUnit | NAnt | NCover

Categories: Personal, Development


Decorating Your Domain Entities

posted on 05/07/08 at 11:47:40 pm by Joel Ross

I don't have a specific link for this one, but I remember a conversation I had (on Twitter of course!) with Nate Kohari, author of Ninject, and Justin Etheredge about the attribute requirements specified by Inversion of Control containers on domain entities. Ninject, for example, requires attributes on properties to do property injection. During the conversation, I stated that I prefer to keep my domain entities clean, and not have them decorated with attributes. And Ninject supports that, so that's how I was using it.

But as I thought about it, I realized I was being hypocritical. Here's a sample property generated from the NuSoft Framework.

   1:  [DatabaseColumn()]
   2:  [TypeConverter(typeof(MinToEmptyTypeConverter))]
   3:  [DataObjectField(true, false, false)]
   4:  public string Username
   5:  {
   6:     [DebuggerStepThrough()]
   7:     get { return this._username; }
   8:     set { this._username = value; }
   9:  }

One property has four attributes!

Now the question is, which is the Right Way to do things? Are you OK with attributes in your domain entities, or would you rather have them be pure? Does it matter the direction of the attribute's intent? I.e., is it more acceptable to have an attribute for the data layer (which is underneath the domain layer) than to have an attribute for an IoC container (which sits on top of the domain layer)? Or vise versa?

And yes, I realize there isn't a Right Way that fits all cases. Anyway, I'm not sure where I stand now. I thought I liked clean entities, but I also see value in having the attributes as well.

Tags: | |

Categories: Development, C#


Validation In The NuSoft Framework

posted on 04/23/08 at 12:50:36 am by Joel Ross

One of the new features of the NuSoft Framework that we added for version 3 is validation. We went back and forth on how we wanted to implement it - at one point we even had a third party validation framework integrated into our project. We eventually decided against that, backing out those changes. We didn't want to distribute a third party DLL with our source. At the time, I was against the decision, but have since come around and think that what we've built has the functionality that we need. Note that I'm not saying necessarily that I think we should be against working with third party libraries - just that we won't include them with our source. We might provide the hooks to use them easily, but we won't include it by default.

Anyway, back to validation. We've include two types of validations out of the box - required fields and maximum length (for string fields). We also provide the hooks so you can include your own custom validations. It's much easier to understand with a code sample. Here's a check to see if a customer is valid.

   1:  if(this.Customer.IsValid)
   2:  {
   3:      this.Customer.Save();
   4:  }
   5:  else
   6:  {
   7:      foreach (ValidationError error in this.Customer.GetValidationErrors())
   8:      {
   9:          ErrorMessages.Text += error.ErrorMessage + "<br />";
  10:      }
  11:  }

We've added a property to all entities - IsValid - to determine if an entity is valid. If it is, then you can go ahead and save the customer. If not, then you can get at the errors and display them. Note that calling Save() without first checking IsValid when the entity is not valid will throw a validation exception.

Anyway, that's the very basics of validation. You can also validate just a particular property:

   1:  List<ValidationError> errors = 
   2:      this.Customer.GetValidationErrorsByProperty(Customer.CustomerProperties.ContactName);

As you can see, we've added constants for each property as a subclass to each entity. It's not perfect, but it does allow for a little bit of security to avoid "magic strings". The above call will validate just the "ContactName" property. By default, it will check to see if the field is nullable and if so, ensure that the current value isn't null. If the field is a string, it will also verify that the length does not exceed what the database can handle.

These methods are in EntityBase, so if you want to add custom validations, you can override the methods in the entity class - for example, in the Customer class, if I wanted to check that "ContactName" did not start with "Z", I can override the above method and add my validations:

   1:  public override List<ValidationError> GetValidationErrorsByProperty(string propertyName)
   2:  {
   3:      List<ValidationError> errors = new List<ValidationError>();
   4:      if(propertyName == CustomerProperties.ContactName)
   5:      {
   6:          if(ContactName.StartsWith("Z"))
   7:          {
   8:              errors.Add(new ValidationError("Contact Name can't start with 'Z'", this, propertyName));
   9:          }
  10:      }
  11:      errors.AddRange(base.GetValidationErrorsByProperty(propertyName));
  12:      return errors;
  13:  }

You can also do validation by groups. We have a class called ValidationGroup that holds the built-in validation groups: Length and Required. You can add custom ones to this class if you want as well.

The last main area I wanted to touch on with respect to validation is the events that we fire. We've added four events.

  • EntityValidating
  • PropertyValidating
  • PropertyValidated
  • EntityValidated

I listed them out in that order on purpose. When you call GetValidationErrors() (or check IsValid), the EntityValidating event will fire. Then, for each property validated, the PropertyValidating and PropertyValidated events will fire. Finally, the EntityValidated event fires. As is customary in the framework. the "ing" events have cancel abilities, so you can cancel validation. Obviously, canceling during a Save won't make the database accept nulls where it shouldn't, so you'd still get a Sql exception instead of a validation exception. The event args for these events contains the entity being validated and the current SqlHelper (if available), just like the standard EntityEventArgs. In addition to those, it also adds the property being validated, and the validation group being validated - if those are available.

So that's validation in a nutshell. I think we've made it pretty flexible, but I'm also realistic about it's limitations in it's current form. The one glaring issue to me is the fact that you can't validate a new value before you actually apply it to the entity. One thing I'd like to see is a way to test a value - maybe an overload on GetValidationErrorsByProperty that takes the new value - I haven't thought through the best way to do it yet, so I'm just speculating. But that seems like a decent way to do it without having to set the property on the entity to do the check.

This was actually one of the advantages of having a third party library - it gave us this ability. Not only that, but it would produce client side custom validators where it could - validating length, required fields, etc. Of course, it's been a very conscious decision to keep the framework UI agnostic, so producing ASP.NET specific validation controls isn't really something we want to do. We have the pieces to expose some of this, but right now, it would be a manual process and not necessarily intuitive. Maybe I'll follow this up with an example of you can do that.

For those who have used other validation frameworks, what features are we missing? How would you have done things differently? We're (in my opinion) still early in our implementation - it works and is extensible, but I know there's room for improvement. I just need someone smarter than me to help point me in the right direction!

Categories: Development, C#, RCM Technologies


NuSoft Solutions Acquired By RCM Technologies

posted on 04/21/08 at 11:21:12 pm by Joel Ross

It's old news now, but back in March, we were informed that RCM Technologies had acquired NuSoft Solutions. Here's the official press release.

For those who didn't know, I work at NuSoft Solutions (specifically the Kinetic IG group). And now, I work for RCM Technologies - still in the Kinetic IG group, as RCM doesn't plan to change much of what we do day to day. RCM is a publicly traded company, so this will be the first time I work for a public company. I'm not sure how it'll be different, if at all.

This is the second acquisition I've been through - I was with Sagestone when we were acquired by NuSoft. That transition worked out very well for me, so I'm hoping for more of the same this time around. Only time will tell.

Categories: Consulting, Personal, RCM Technologies


Speaking at the West Michigan Day of .NET

posted on 04/21/08 at 10:19:47 pm by Joel Ross

For the second year in a row, I will be speaking at the West Michigan Day of .NET on May 10th, 2008. I'll be doing a presentation on continuous integration:

The next release is looming in the distance, and you’re responsible for integrating the changes for all of the developers on the team. Last time, it took all day just to get it to compile. There’s got to be a better way! In this day and age of Agile software development, release cycles are getting shorter and shorter. As the build cycle gets squished, it’s imperative that a team doesn’t waste days at a time creating a build. Using Continuous Integration, development teams can “feel the pulse” of their project and be sure that builds aren’t a major headache. In this session, we’ll look at how a team can use continuous integration to enable quicker and easier builds, garner faster end user feedback, perform automated testing, and make deployments faster. Then we’ll dig into some of the common tools used to make continuous integration possible, followed by a demonstration of creating a simple, extendable build process.

Right now, I'm scheduled to go on at 9:45 that morning, but there's always a possibility that could change.

I'm really looking forward to this event - not so much my session (I've already seen it!), but all of the other great sessions and speakers that are going to be there. Just as an example, I'm up against Josh Holmes and Jay Wren, among others. I'll be there for at least part of the day and I'm looking forward to meeting a few people that I've interacted with on Twitter who are going to be there.

Categories: Personal


Screen-casting as a Support Tool

posted on 04/16/08 at 12:14:33 am by Joel Ross

Over the past week, I've been going back and forth with a third party vendor about some issues with their product. They have been unable to reproduce what we are seeing. We've gone back and forth giving them more detailed information, and they've been responsive, but they still can't reproduce what we're seeing.

As a developer, I can tell you it's just about impossible to fix a problem you can't reproduce locally.

So, we decided it would be best if they could see the issues we are seeing. Since we don't necessarily want to allow their support staff direct access to our installation (and their days are our nights), we decided a screen-cast would be in order.

TechSmith, who incidentally is located in Okemos, Michigan (near Lansing, where I grew up), offers a free product called Jing. I downloaded and installed it, and in five minutes, I had a nice two minute video that perfectly demonstrated the issues we were having. This should really clear things up, and given how simple this was, I can see doing this in the future as a good way to demonstrate (and show exactly how to reproduce) issues.

Categories: General


The NuSoft Framework (and me) on the CloudSocket Podcast

posted on 04/13/08 at 11:23:04 pm by Joel Ross

Chris Woodruff, a coworker of mine, recently started the CloudSocket Podcast. So far, he's published two episodes, and one of them is with me, talking about the NuSoft Framework.

It's a pretty short chat - about 18 minutes. It covers a bit of the history of the framework, a bit of the future direction, and a decent discussion of what the framework attempts to accomplish. If you listen to it, let me know what you think. Personally, I didn't think I touched on everything I should have or wanted to, but I've always been my harshest critic, so I'm curious what others think.

Categories: Podcasting is Four Years Old

posted on 04/13/08 at 10:35:34 pm by Joel Ross

On April 13th, 2004, I finally had a blog set up that I felt comfortable with. I'd used blogspot, a couple of other generic blogging engines, and my family web site before that, but I finally decided that it was time to find a permanent home.

So I set this up. 1,114 posts later, I'm still loving having a forum to express my ideas, share my experiences, and develop a relationship with you - my readers.

It's been a great experience so far, and I'm looking forward to keeping this site going for a long time to come.

Categories: Blogging


<< 1 ... 7 8 9 10 11 12 13 14 15 16 17 ... 124 >>