Headspring's Blog

Featured Posts

Q1 2012 Company Offsite: Hula Hut and a Boat Ride

April 24th, 2012 by

Last Friday the whole Headspring gang got together for one of our quarterly company excursions.  This afternoon began on the beautifully serene dock at Hula Hut, where we chowed down on a delicious fajitas bar.  After lunch, we went over new policies, promotions and awards,  and Jeffrey led open discussion on how to identify and improve our strengths as a company.  Then we moved on to our Riverboat cruise, to relax, share a few beers and enjoy the breezy weather.

For your viewing pleasure:

Read more

Increasing Development Enjoyment with RavenDB

April 23rd, 2012 by

We have a lot of different options for data storage and retrieval available today. These options include the traditional relational database, document databases, key value stores, and even flat files. Every option has its benefits over the others, making some options better for some things and other options better for other things. Once the data storage and retrieval option is selected, we then typically have to select a product. Within a solution space, most products offer some distinction from their competitors. Such distinctions make certain products popular choices for a particular technology stack. For example, MySQL is a common choice for the LAMP stack, as is Microsoft SQL Server for the .NET stack.

Why is this so? There are several reasons for this, and their importance varies between administrators, developers, managers, and even executives.

From a developer’s point of view, it comes down to whether or not the product in the solution space makes the work more enjoyable. Read more

From WebForms to MVC

April 20th, 2012 by

Most of my first job out of college was spent doing desktop development, some of which was in VB6. I didn’t love it, but it was easy to learn. When this button is clicked, that function runs in response to it. Easy.

The controls-and-event-handlers model combined with the language also made it exceptionally easy to create a tangled pile of misplaced responsibilities, but I think you’ve got to experience that kind of pain before you can see that alternatives even exist. Once you’ve felt the pain, you can better-evaluate which guidance is actually going to be helpful.
Read more

Get to Know a Developer: Cedric Yao

April 19th, 2012 by

Headspring’s latest new hire is Cedric Yao, Senior Consultant.  We’re really excited to have him on board, and I am super excited to get a fresh addition into this series.

Cedric has been in Austin for a few years, and just welcomed his first born son into the family 5 weeks ago!  We talked about Austin, why working here is so much fun, and what we really love about technology.  As it turns out we share a lot of the same interests in bringing together communities through technology.  His experiences are going to be a real help to me with planning and preparation for Headspring’s Central Texas Give Camp in September.

Here’s how the rest of our conversation went: Read more

Demystifying RavenDB Queries and Dynamic Indexes

April 19th, 2012 by

Not long a go, I wrote a detailed blog post on getting started with RavenDB and described the process of performing the most basic CRUD (create, retrieve, update, and delete) operations. The operations covered in the post are great for working with single data entities. One thing I didn’t discuss was how to retrieve a set of data entities and that is exactly what I want to dive into here.

Retrieving data from RavenDB is dead simple and the .NET client offers excellent support for LINQ based queries. Let’s start by reviewing the IDocumentSession interface:

namespace Raven.Client
{
  public interface IDocumentSession : IDisposable
  {
    ISyncAdvancedSessionOperation Advanced { get; }
    void Delete<T>(T entity);
    T Load<T>(string id);
    T[] Load<T>(params string[] ids);
    T[] Load<T>(IEnumerable<string> ids);
    T Load<T>(ValueType id);
    IRavenQueryable<T> Query<T>(string indexName);
    IRavenQueryable<T> Query<T>();
    IRavenQueryable<T> Query<T, TIndexCreator>() where TIndexCreator : AbstractIndexCreationTask, new();
    ILoaderWithInclude<object> Include(string path);
    ILoaderWithInclude<T> Include<T>(Expression<Func<T, object>> path);
    void SaveChanges();
    void Store(object entity, Guid etag);
    void Store(object entity, Guid etag, string id);
    void Store(object entity);
    void Store(object entity, string id);
  }
}
view raw gistfile1.cs This Gist brought to you by GitHub.

The query method in the interface is the gateway to retrieving sets of data and offers three signatures which give us immense flexibility with our queries.

Let’s explore the Query<T>() method! Beginning with the example context…

Read more

Overcoming Perfectionism

April 16th, 2012 by

Perfectionist (my rough definition):  Someone who wants to always do things without errors or mistakes, without considering the costs incurred or likelihood of attainment.

Summary

In this article I share my personal struggles with unproductive perfectionism in my work.  I point out how much “true perfection” really costs, and that it often isn’t even possible.  I discuss why overcoming perfectionism is important, and share some strategies I’ve found useful for balancing passion and perfectionism.

Introduction

Hi, my name is Nolan and I’m a recovering perfectionist.  I love software development and I’m very passionate about what I do.  The problem is, sometimes I care too much and passion turns into perfectionism.

I started thinking about this after my first post.  I was checking it to see if there were any comments I needed to respond to.  I’d written the article over a week before it was published, so I casually glanced over it.  While reading I suddenly realized I’d completely left a word out of a sentence.  I was mortified.  I’d proofread it at least three times and had gotten someone else to look over it.  How could this have happened?  My first blog post and I’d failed to do it “right”. Read more

NuGet Package Restore

April 13th, 2012 by

Text is easy.

Source control tools slice and dice text all day. It’s easy to compare, easy to merge, and easy to compress. Even in a busy project, large portions of your code don’t really change all that often. Git, for instance, can pretend to store every commit as a point-in-time copy of your whole source tree by sharing large unchanged blobs of text with other commits.

Text is easy. Binary is tough. Read more

2012-04-24-01

Metrics, reports, KPIs, and the stuff developers must provide to executives

April 12th, 2012 by

In September of 2007, I joined Headspring as the CTO.  Now I serve as President and Chief Operating Officer.  When I joined, there were 4 other employees including the original founder serving as CEO.  He founded the company in 2001.  It has always been professional services, but the strategy has changed a few times over the years.  I started my career as a developer in the mid nineties, and now I’m an executive with lots of great developers that I support.  Like most, our company runs on metrics.  As a manager, I understand their worth.  Earlier in my career, I had no idea.

Every day, I glance at our operational dashboard.  While I won’t share full screen-shots yet, I want to share some of the graphs I use every day to ensure the company is doing well.  Consider this graph.

CropperCapture[22]

 

Read more

Guest Blog: Entity Framework Code First DbContext – Validation

April 11th, 2012 by

Introduction

In this post we will be discussing how DbContext API helps us in validation of entities in Entity Framework Code First workflow. The API allows various options to define validation of entities and their properties. It also makes it easier to execute these validations providing validation results. We are going to be using some basic entities in a simple Institute and introduce various forms of validations using different options available in the framework. The whole intent is to learn these available options. In a real world example you might be more or less inclined to be using any of these options. Read more

Becoming a Headspringer: Take Advantage of Working with Smart People

April 10th, 2012 by

As I was pondering a new topic to blog, I stumbled into one this morning. I was running some ideas by a few Headspringers, and they provided several options. I decided to go with a hybrid of their suggestions. What I originally planned to blog was a way to test Enumeration subclasses of the Enumeration class from Tarantino. What I ended up with was an even better way to test them. This is not an unusual happenstance at Headspring. If you talk to other Headspringers, you’re going to learn something new. It never ceases to amaze me how often I’m learning something. I like to think I’m doing some teaching, too, but I’m confident that I’m currently learning more than teaching.

In case it isn’t clear by the title, part of becoming a Headspringer is to learn from the great people you get to work with every day. So, if you’d like the opportunity to work with talented, passionate people, we are hiring!

Now let’s get to the original idea of testing the Enumeration subclasses. I will walk through my original code, then what Mr. Brandon Barry showed me, and why it’s an improvement. Read more