<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Joseph Bulger IV &#187; Consulting</title>
	<atom:link href="http://josephbulger.com/category/consulting/feed/" rel="self" type="application/rss+xml" />
	<link>http://josephbulger.com</link>
	<description>God, Family, Church, Engineering</description>
	<lastBuildDate>Thu, 20 Oct 2011 12:00:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Vacationeer&#8217;s Guide: Projections</title>
		<link>http://josephbulger.com/technology/vacationeers-guide-projections/</link>
		<comments>http://josephbulger.com/technology/vacationeers-guide-projections/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 16:00:10 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[vacationeer-guide]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=579</guid>
		<description><![CDATA[When you plan a road trip, you&#8217;re really only concerned about figuring out one thing: how long will it take me to get there? But for projects, this isn&#8217;t always the case. The same formula applies, though. Now that we know how to measure out velocity, we can use that metric to figure out one [...]]]></description>
			<content:encoded><![CDATA[<p>When you plan a road trip, you&#8217;re really only concerned about figuring out one thing: how long will it take me to get there? But for projects, this isn&#8217;t always the case. The same formula applies, though.<span id="more-579"></span></p>
<p>Now that we know how to <a title="Team Velocity" href="http://josephbulger.com/technology/vacationeer’s-guide-determining-your-teams-velocity">measure out velocity</a>, we can use that metric to figure out one of two fundamental things:</p>
<ol>
<li>How long will it take us to get there?</li>
<li>How far will we get?</li>
</ol>
<p>Velocity can&#8217;t answer both questions for us, but if we&#8217;re willing to concede and control one of the two variables, either the distance or the time, then we can project what the other thing will be.</p>
<p>For example, if the team is getting pressure to release by a certain date (sound familiar?), then with your velocity you can project how many features you&#8217;ll actually have done by that time frame. If, however, the team is under pressure to get Awesome Feature X done and released, then you can use the same formula to project when that feature will be done.</p>
<p>With road trips my family almost always chooses to control the distance and project the time. My wife wants to go to Disney World, for example. That&#8217;s choosing the distance factor. Now if I know my velocity I can project how long it will take us to get there. On the other hand, some times we want to do a quick weekend trip to somewhere just to get out for a few days. In those cases, we&#8217;re bound more by time, because we don&#8217;t want to be on the road the whole weekend. In that case, we constrain our time window, and see how far that will take us.</p>
<p>This is where the real power of knowing velocity comes from. Your implementation team is the engine of you car. Understanding velocity and how it works and what it means to your team is like having a speedometer. Until you know about velocity, you&#8217;re like driving a car with a broken speedometer.</p>
<p>A lot of common questions of project management start being fundamentally changed when you introduce velocity. For example, a question like, &#8220;How do I make my team work faster?&#8221; changes to something like &#8220;How do I increase my team&#8217;s velocity?&#8221; I&#8217;ve seen this happen almost any time that a team embraces these concepts, and it&#8217;s not only a change in the wording of the question that is profound, but in the meaning of what is behind it. Velocity is a historical metric for your team&#8217;s progress, so asking a question like how to make that number go higher because a much more scientific question completely. The answer is can be varied, but it all comes back to where it started, with the velocity. Try something out on your team, then wait and see how your velocity changes. You&#8217;re doing an experiment now. Not only that, but you know how to <em><strong>measure the results</strong></em>.</p>
<p>Enjoy your new found technique. If you have any questions or comments feel free to contact me.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/vacationeers-guide-projections/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vacationeer’s Guide: Determining Your Team&#8217;s Velocity</title>
		<link>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-determining-your-teams-velocity/</link>
		<comments>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-determining-your-teams-velocity/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 16:00:54 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[vacationeer-guide]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=570</guid>
		<description><![CDATA[Once your team has estimated a set of features, and assigned each feature their &#8220;point value&#8221;, it&#8217;s time to start measuring your team&#8217;s velocity! Measuring your team&#8217;s velocity is actually an easy thing to do. Your team will start working in release cycles that are broken down into parts. The lead or the project manager [...]]]></description>
			<content:encoded><![CDATA[<p>Once your team has estimated a set of features, and assigned each feature their &#8220;point value&#8221;, it&#8217;s time to start measuring your team&#8217;s velocity!</p>
<p><span id="more-570"></span>Measuring your team&#8217;s velocity is actually an easy thing to do. Your team will start working in release cycles that are broken down into parts. The lead or the project manager is usually a good role for determining how long these cycles should be. Some teams will have a release cycle of 3 weeks. Others will have longer cycles, it&#8217;s completely flexible. The key is to stay <em><strong>consistent</strong></em>. Once you make a choice on your cycle, you need to stick to it. The reason will become clear later.</p>
<p>The other thing to note here is that you can break down your release cycles into parts. My team calls them Iterations. I have some teams that work on 1 week iterations. I have other teams that work 3 week iterations. One team I lead has a 2 week iteration. The release cycles for all these teams are different, too. Some teams release at the end of every iteration. Other teams release every 2 iterations. I&#8217;ve worked on teams where the planning of the release was done more rigidly because of customers, and we would release every quarter or maybe 6 months. The point with those teams was not so much about the release cycle, but that the iteration cycle was still small. The largest iteration cycle I&#8217;ve worked on was 4 weeks long I think.</p>
<p>The point of the cycle here is to do one thing: allow your team a consistent amount of time to work on an attainable goal. That attainable goal is a certain number of features. How many features you ask? It completely depends on your team&#8217;s velocity! But when you first start, you don&#8217;t have a velocity, so you have to do a couple cycles just to figure out what the team can do.</p>
<p>So say you have 30 features to work on. You decide to have your team work in 3 week cycles. At the end of their first cycle, they complete 3 features. One of the features was valued at 5 points (<a title="Vacationeer’s Guide: Estimation" href="http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-estimation/">from the estimation sessions</a>, remember), and the other 2 were valued at 3 points. That means the first cycle your team finished with a velocity of 11. That&#8217;s all there is to it! Now you repeat the same process over again. Do another cycle. Maybe the team got 15 points completed. Now average the two cycles together. The team&#8217;s velocity becomes 13. Rinse. Repeat. That&#8217;s how velocity is measured.</p>
<p>This is why your cycles have to be consistent, because you&#8217;re taking an average of the points your team completes. If you change the cycle length, then it messes up your velocity values. Now, having said that, there are points where it&#8217;s appropriate to change the cycle. I&#8217;ve done it many times before, but you have to account the change in your velocity calculations when you do it.</p>
<p>Now that we know how to measure velocity, we can use it to figure out things, which is our next topic:</p>
<blockquote><p>Projections</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-determining-your-teams-velocity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vacationeer’s Guide: Credit System</title>
		<link>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-credit-system/</link>
		<comments>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-credit-system/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 16:00:51 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[vacationeer-guide]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=550</guid>
		<description><![CDATA[Now that we understand the concept of estimation, we need to talk about how this &#8220;credit system&#8221; applies to our velocity. When your team goes through estimation, each feature needs to be assigned some &#8220;credit&#8221; so that you can then use that amount for projection and release management. The issue is what you use as [...]]]></description>
			<content:encoded><![CDATA[<p>Now that we understand the <a title="Vacationeer's Guide: Estimation" href="http://josephbulger.com/technology/vacationeer’s-guide-estimation/">concept of estimation</a>, we need to talk about how this &#8220;credit system&#8221; applies to our velocity.</p>
<p><span id="more-550"></span></p>
<p>When your team goes through estimation, each feature needs to be assigned some &#8220;credit&#8221; so that you can then use that amount for projection and release management. The issue is what you use as your &#8220;credit&#8221;. A common idea would be to use &#8220;work time&#8221; as the credit. There are a couple problems with work time, though. First, each team member&#8217;s work time is different, because their productivity levels are different. This means that when they estimate they would have to think about how much time it would take for them to complete the feature, which is always going to be different with the other members, so they won&#8217;t be able to come to a consensus. They have to come to a consensus when estimating each feature, so work time won&#8217;t work.</p>
<p>Since we know we can&#8217;t use a metric that varies on each team member, we need to pick something that is relative and allows the team to vote as a whole. That&#8217;s why my teams use a concept of &#8220;points&#8221;. We use a modified version of the Fibonacci sequence (i.e. 0, 1/2, 1, 2, 3, 5, 8, 13, 21, 34, infinity). We don&#8217;t go past 34 usually because after that the risk that the estimation is significantly wrong is too high. That brings us to another point worth mentioning.</p>
<p>When you are estimating how long it takes to do something, it&#8217;s better to try to keep your features small. The same is true for road trip planning. If I am planning a trip just outside of Atlanta (where I live), then it&#8217;s a lot easier for me to figure out how long it&#8217;ll take me to get there. If I&#8217;m just going up the road, then I might even be able to get my travel time figured out down to five minutes. The farther away I go, the harder it is to accurately estimate. With a trip as far  as Orlando, I know I&#8217;m only accurate within an hour or two. That&#8217;s a much larger margin of error than five minutes!</p>
<p>The same is true in estimation and your credits. If you assign a feature a large amount of credits, then the margin of error is much larger for that feature. That&#8217;s also the reason why we don&#8217;t just let the team pick any number they want. If a team member is having trouble between an 8 and a 13, they have to pick one or the other, they can&#8217;t say &#8220;I really want to choose 10&#8243;. The point here is that there&#8217;s a margin of error because of the uncertainty, and the Fibonacci sequence shows that uncertainty in the estimations very well.</p>
<p>Once you&#8217;ve identified your credit system, then you can use that system to determine your team&#8217;s velocity. And that brings us to our next topic:</p>
<blockquote><p>Determining your team&#8217;s velocity</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-credit-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vacationeer’s Guide: Estimation</title>
		<link>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-estimation/</link>
		<comments>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-estimation/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 12:00:50 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[vacationeer-guide]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=535</guid>
		<description><![CDATA[In order to calculate velocity, we need to know how to figure out the amount of effort involved for each feature that a team works on. Before we can get to that, though, we need to determine something else which is crucial. Who, exactly, should be estimating the effort? Let&#8217;s start by identifying the major [...]]]></description>
			<content:encoded><![CDATA[<p>In order to <a title="Vacationeer’s Guide: Velocity" href="http://josephbulger.com/technology/vacationeer’s-guide-velocity/ ‎" target="_blank">calculate velocity</a>, we need to know how to figure out the amount of effort involved for each feature that a team works on. Before we can get to that, though, we need to determine something else which is crucial. <em><strong>Who</strong></em>, exactly, should be estimating the effort?</p>
<p><span id="more-535"></span></p>
<p>Let&#8217;s start by identifying the major players here. We have users, clients, managers, leads, analysts, and the implementation team.</p>
<p>Let&#8217;s start with the easy ones. The users and clients really wouldn&#8217;t have any idea of how much effort it would take. Sure, they have an idea of the benefit, which relates to the <a title="Return On Investment" href="http://en.wikipedia.org/wiki/Return_on_investment" target="_blank">ROI</a>, but not the effort. That leaves us with the rest of the actual team.</p>
<p>Who among the rest of the team would know how long it takes to build something? The people <em><strong>doing the building</strong></em>. Who does that<em><strong> not</strong></em> include? Managers, analysts, and maybe leads depending on their role. The implementation team knows how long it takes to build things, because they&#8217;re the ones building it in the first place. They may not know, however, <em><strong>what</strong></em> it is that their building. That&#8217;s where the analysts, leads, and most importantly, users and clients, come in. They are there to help the implementation team understand the features so they can give a good estimate on the effort involved.</p>
<p>One thing of note here that might not be so obvious is how does the estimation get done? Let&#8217;s say you have 3 people on your implementation team. Do you assign Feature A to team member X and ask X how long it&#8217;s going to take to do A? No. The reason you don&#8217;t do this is simple. Why is surveying so popular? Because statistically speaking, if you perform a survey correctly, you can be relatively confident in the results of the survey. Or in other words, the more people that are willing to say &#8220;Feature A is going to take X long&#8221;, the more confident you can be that those people are correct. If I asked my entire team of 10 members, and you asked only 1 member of your team, which estimate do you think we would be more confident in? That&#8217;s not to say that it would be <em><strong>right</strong></em>, but it&#8217;s more likely to be right.</p>
<p>Is it as simple as getting everyone together and going over the features and just saying how long it&#8217;s going to take? Well, not exactly.</p>
<p>We also need to talk about our credit system.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-estimation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vacationeer’s Guide: Velocity</title>
		<link>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-velocity/</link>
		<comments>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-velocity/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 12:00:05 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[vacationeer-guide]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=519</guid>
		<description><![CDATA[Velocity is the key to any project&#8217;s success. Plain and simple. I think that just about every project in some way or another tries to figure out this metric. It&#8217;s how this metric is obtained that is so important. Let&#8217;s say hypothetically that you&#8217;re leading a team. How would you want to measure this metric? [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Vacationeer’s Guide: The Golden Formula for Projects" href="http://josephbulger.com/technology/vacationeers-guide-the-golden-formula-for-projects/" target="_blank">Velocity is the key to any project&#8217;s success</a>. Plain and simple. I think that just about every project in some way or another tries to figure out this metric. It&#8217;s <em><strong>how</strong></em> this metric is obtained that is so important.</p>
<p><span id="more-519"></span>Let&#8217;s say hypothetically that you&#8217;re leading a team. How would you<em><strong> want</strong></em> to measure this metric?</p>
<p>Do you want to gauge this metric from your users? Maybe they could tell you in terms of features how fast your team is. An example of that might be, &#8220;It took Widget Company 6 months to produce a new release with 3 major features, and 2 minor features.&#8221; There&#8217;s a problem here, though. How do you know how much <em><strong>effort</strong></em> it took to accomplish these features? Users may call a feature major or minor, but that certainly has no correlation to the effort involved to produce that feature. So that won&#8217;t work.</p>
<p>Does the project manager know what the metric is? To answer that question I would ask: Does the project manager have any more information about the <em><strong>effort involved for each feature</strong></em> than the users from the previous example? If the answer is no, then you&#8217;re in the same situation.</p>
<p>Leads have the same problem. Even technical leads, who actually know exactly what&#8217;s going on with their teams at all times, and probably even do a fair bit of the coding themselves, can&#8217;t figure out the effort by themselves. They&#8217;re missing the information just like everyone else.</p>
<p>And this is where we&#8217;re left. We need to know what the <em><strong>effort</strong></em> is. How can we figure out the effort? Well, what if we estimated the effort involved for each feature, and then tracked the progress of the team for each feature. After they completed that feature, we could give them &#8220;credit&#8221; for that effort. Then we could use this &#8220;credit&#8221; as a way of describing how fast our team works.</p>
<p>The trick to understanding this &#8220;credit system&#8221; is in our next topic:</p>
<blockquote><p>Estimation</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/vacationeer%e2%80%99s-guide-velocity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vacationeer&#8217;s Guide: The Golden Formula for Projects</title>
		<link>http://josephbulger.com/technology/vacationeers-guide-the-golden-formula-for-projects/</link>
		<comments>http://josephbulger.com/technology/vacationeers-guide-the-golden-formula-for-projects/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 12:00:47 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[vacationeer-guide]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=506</guid>
		<description><![CDATA[When you get on google maps to plan out your vacation and it tells you how long your trip will take you to get there, how does google figure that out? Pretty easily actually. It takes the speed limits of all the roads it finds, and measures the distance of those road segments, and with [...]]]></description>
			<content:encoded><![CDATA[<p>When you get on google maps to plan out your vacation and it tells you how long your trip will take you to get there, how does google figure that out? Pretty easily actually. It takes the speed limits of all the roads it finds, and measures the distance of those road segments, and with those two pieces of information it can calculate the amount of time it will take you to get there.<span id="more-506"></span></p>
<p>Or, more simply put in mathematical terms:</p>
<blockquote><p>distance = rate * time</p></blockquote>
<p>Projects work the same way. The only difference is that people call these things different names. For example, the &#8220;rate&#8221; of your project is how fast your team works.  For my teams, we call that <strong><em>velocity</em></strong>, which we&#8217;ll get into more later. Distance is where you&#8217;ll be when your done.  You could look at that in a lot of different ways. For a lot of projects, that is simply &#8220;how many features have been completed?&#8221; And time is, well, time.  It&#8217;s how long your team works on your project.</p>
<p>If you know two of these variables, then you can calculate the third. For google maps, this was a simple matter of acquiring the right data for the job.  Mainly, getting the distance of the road segments and the speed limits associated with them. Nowadays I think they even take into account for traffic to some degree, but that&#8217;s not within this scope. For projects, though, how can we figure out any of these? Can we figure out <em><strong>any</strong></em> of them? Well, let&#8217;s first start off by stating something that should be obvious at this point. You can&#8217;t get calculate two of the terms with only one piece of information. What do I mean by that? If you tell me how fast your going, that doesn&#8217;t mean you can ask me how much time and where you&#8217;ll be.  It just doesn&#8217;t make sense.</p>
<p>The same thing applies to projects. All too often I see project manager&#8217;s doing something to the effect of &#8220;We need features X done by such and such a date&#8221;. That&#8217;s the same thing as you asking me to solve the 3 variable problem and only giving me one variable of information. You just can&#8217;t do it. It doesn&#8217;t make sense. What happens in the real world with these projects is that they don&#8217;t deliver what was promised, or they have to push back the date. Very rarely do they under-promise and over-deliver.  That almost never happens. Looking at it in this high level clearly shows why this is so flawed. The project lead needs to know more information. If the lead knows the rate, and they know the time, then they can figure out the features (distance). Or they might know the rate, and they know the features to release next, then they can calculate how much time it will take.</p>
<p>It&#8217;s simple. Figure out two of the variables, and you can calculate the third. The interesting thing is what the project manager usually has control over. The manager can usually manipulate the feature set that needs to be delivered, or the date, but not both. Either way, you get one of the variables. The other one you need is the rate, or what teams refer to as:</p>
<blockquote><p>velocity</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/vacationeers-guide-the-golden-formula-for-projects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A Vacationeer&#8217;s Guide to Project Management</title>
		<link>http://josephbulger.com/technology/a-vacationeers-guide-to-project-management/</link>
		<comments>http://josephbulger.com/technology/a-vacationeers-guide-to-project-management/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 12:00:43 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Leading]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[vacationeer-guide]]></category>

		<guid isPermaLink="false">http://josephbulger.com/?p=397</guid>
		<description><![CDATA[My wife loves to go on vacations. Actually that&#8217;s more of an understatement than anything else. The last vacation we went on we went to Orlando, FL and rented a house there while going to Disney World. It was a lot of fun. So what does vacationing have anything to do with project management? Well, [...]]]></description>
			<content:encoded><![CDATA[<p>My wife loves to go on vacations. Actually that&#8217;s more of an understatement than anything else. The last vacation we went on we went to Orlando, FL and rented a house there while going to Disney World. It was a <strong>lot </strong> of fun. So what does vacationing have anything to do with project management? Well, I&#8217;ll tell you.  I call myself a technical team lead.  My day usually consists of guiding my team on their current project and coaching them on how to improve themselves. As a lead, one of the things I really care about is knowing how the project we&#8217;re working on is coming along. There are a lot of methodologies out there about how to do this, but I want to take a really high level, common sense, approach to this issue and then figure out how the approaches I use work.<span id="more-397"></span></p>
<p>Planning a trip and planning a project are almost exactly the same process.  My wife wanted to go to Orlando, so what was the first thing I wanted to know? How long is it going to take to get there.  The same thing is true with projects.  Only, the question you might have may not be &#8220;how long&#8221;, it could be &#8220;how much will you get done in X amount of time?&#8221;, but as I&#8217;ll explain soon, they&#8217;re actually the same question.</p>
<p>Right now my way of planning trips is to just jump on google maps and plot a course between my house and my destination, in this case a rental house in Orlando. In a ridiculously short amount of time google maps will give you not only one route, but multiple possible routes, all of which have total distance and driving time shown for you, and google maps will even pick the one it likes the best for you.  It&#8217;s pretty awesome stuff, but it&#8217;s not ideal.  Why isn&#8217;t it ideal? Well, I should say it actually is ideal.  In fact, it is <em>the ideal</em> timeframe.  When the day comes to head out on your trip, what happens when you hit traffic? Or if the road is closed because of construction? These things slow you down, off of your ideal path. That&#8217;s not to say that it&#8217;s a waste to plan your map with google maps,  but once you&#8217;re on the road you&#8217;d be much better off if you could get updated with more info while you travel.  Instant knowledge of how your doing on the road.  Oh, if only there was some device that could do this for us. Flash forward to.. well.. <em><strong>now</strong></em> and go get yourself a GPS.  This guy tells you not only how to get where you&#8217;re going, but also how much time you have left on your trip. He&#8217;s basically your best guess on the road. He&#8217;s not 100% accurate, but he&#8217;s the closest thing you&#8217;ve got.</p>
<p>Back on project management, we have the same problem. When we start a project we always want to know how it&#8217;s going to go, so we plan.  Sure, we plan a little differently, but we end up with the same result.  We plan and come up with an idea of how long we thing it will take us to get there. The interesting part is when your project starts. All my teams have their own GPS system. I use it to see how along they are on their projects. Not only does each time have their own GPS system, but it&#8217;s a <em><strong>smart</strong></em> GPS. See, a regular GPS will tell you how much time you have left on your trip if you go at the <em><strong>planned speed</strong></em>. My teams GPS actually figures out what <em><strong>their speed is</strong></em>. And that&#8217;s the secret.</p>
<p>So how do you figure that out? It&#8217;s all about one simple formula:</p>
<blockquote><p>distance = rate * time</p></blockquote>
<p>We&#8217;ll get into that on our next post.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/a-vacationeers-guide-to-project-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating an PagedList&lt;T&gt; that uses AJAX</title>
		<link>http://josephbulger.com/technology/creating-an-pagedlistt-that-uses-ajax/</link>
		<comments>http://josephbulger.com/technology/creating-an-pagedlistt-that-uses-ajax/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 16:05:58 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Showcase]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[linkedIn]]></category>
		<category><![CDATA[paging]]></category>

		<guid isPermaLink="false">http://josephbulger.com/technology/creating-an-pagedlistt-that-uses-ajax/</guid>
		<description><![CDATA[I’ve been using this PagedList functionality that i found from a blog article Rob Conery put up, and a control I found by Robert Muehsig which I’ve really enjoyed using so far. One of the things that was missing from the functional set that I ended up needing was the ability to page the list, [...]]]></description>
			<content:encoded><![CDATA[<p>I’ve been using this PagedList functionality that i found from a <a href="http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/" target="_blank">blog article Rob Conery</a> put up, and <a href="http://code-inside.de/blog-in/2008/04/08/aspnet-mvc-pagination-view-user-control/" target="_blank">a control I found by Robert Muehsig</a> which I’ve really enjoyed using so far.</p>
<p>One of the things that was missing from the functional set that I ended up needing was the ability to page the list, but through issuing AJAX requests instead of the typical post back.</p>
<p>So I went off and extended the existing model to support AJAX requests, and thought I would share it in case anyone else needed to do the same thing.<span id="more-249"></span></p>
<p>I guess the best place to start would be the use case.  So to start I created a control that encapsulates the Paging UI layout and calls I need.  The use of the original control looks like this:</p>
<pre class="brush: csharp; title: ; notranslate">

Html.RenderPartial(&quot;AjaxPagination&quot;,
    new AjaxPaginationViewData
        {
            PageIndex = Model.PageIndex,
            Action = &quot;CondoPage&quot;,
            Controller = &quot;Home&quot;,
            AjaxOptions =
                new AjaxOptions { UpdateTargetId = &quot;updatedContent&quot; },
            TotalCount = Model.TotalCount,
            PageSize = Model.PageSize,
            NumberOfPagesToEachSide = 2
        }
);
</pre>
<p>The new AJAX functionality is called similarly:</p>
<pre class="brush: csharp; title: ; notranslate">

&lt;% using (Ajax.BeginForm(&quot;SomePage&quot;,
        &quot;SomeController&quot;,
        new AjaxOptions { UpdateTargetId = &quot;updatedContent&quot; })) { %&gt;

        &lt;% Html.RenderPartial(&quot;AjaxPagination&quot;,
                new AjaxPaginationViewData {
                        PageIndex = Model.PageIndex,
                        Action = &quot;SomeAction&quot;,
                        Controller = &quot;SomeController&quot;,
                        AjaxOptions = new AjaxOptions
                                { UpdateTargetId = &quot;updatedContent&quot; },
                        TotalCount = Model.TotalCount,
                        PageSize = Model.PageSize,
                        NumberOfPagesToEachSide = 2
                });%&gt;

&lt;% } %&gt;
</pre>
<p>A couple things to note. You’ll notice that the AJAX control is rendered inside a Ajax.BeginForm. This is because I’m using the Microsoft.Ajax way of making AJAX calls.  This could also be done using jQuery or something else that can process AJAX calls. I just went this way because the scripts are already included in asp.net mvc app when you first create the project.  The result of the AJAX call will be a partial view, and we’ll need to put that somewhere.  That’s where the UpdatedTargetId comes into play. Other things we include in the AJAX control that are not in the original are the Action and the Controller, and some AjaxOptions. PageActionLink doesn’t work with the AJAX control, because we’ll be using Ajax.ActionLink to build the link, which is why I broke it up into Action, and Controller. For the AjaxOptions, we need those to specify the target of the call.</p>
<p>So now that’s been explained, let’s look at the controls themselves.  Here’s a comparison of the original control and the ajax control.</p>
<p>The original is one this way:</p>
<pre class="brush: csharp; title: ; notranslate">

&lt;% if (Model.HasPreviousPage) { %&gt;
    &lt;a href=&quot;&lt;%=Model.PageActionLink.Replace(&quot;%7Bpage%7D&quot;, (Model.PageIndex - 1).ToString())%&gt;&quot;&gt;Previous&lt;/a&gt;
&lt;% } %&gt;

&lt;% if (Model.GetFirstPageToLink() != 1) { %&gt;...&lt;% } %&gt;

&lt;%for (var page = Model.GetFirstPageToLink(); page &lt;= Model.GetLastPageToLink(); page++) {
    if (page == Model.PageIndex) { %&gt;
        &lt;%=page.ToString()%&gt;
&lt;% } else { %&gt;
    &lt;a href=&quot;&lt;%=Model.PageActionLink.Replace(&quot;%7Bpage%7D&quot;, page.ToString())%&gt;&quot;&gt;&lt;%=page.ToString()%&gt;&lt;/a&gt;
&lt;% }

    if (page != Model.GetLastPageToLink()) { %&gt;|&lt;% } } %&gt;

&lt;% if (Model.GetLastPageToLink() != Model.PageCount) { %&gt;...&lt;% } %&gt;

&lt;% if (Model.HasNextPage) { %&gt;
    &lt;a href=&quot;&lt;%=Model.PageActionLink.Replace(&quot;%7Bpage%7D&quot;, (Model.PageIndex + 1).ToString())%&gt;&quot;&gt;Next&lt;/a&gt;
&lt;% } %&gt;
</pre>
<p>And the AJAX control is done this way:</p>
<pre class="brush: csharp; title: ; notranslate">

&lt;% if (Model.HasPreviousPage) { %&gt;

&lt;%= Ajax.ActionLink(&quot;Previous&quot;, Model.Action, Model.Controller, new { page = (Model.PageIndex - 1).ToString() }, Model.AjaxOptions)%&gt;

&lt;% } %&gt;

&lt;% if (Model.GetFirstPageToLink() != 1) { %&gt;...&lt;% } %&gt;

&lt;%for (var page = Model.GetFirstPageToLink(); page &lt;= Model.GetLastPageToLink(); page++) {
    if (page == Model.PageIndex) { %&gt;
        &lt;%=page.ToString()%&gt;
    &lt;% } else { %&gt;

&lt;%= Ajax.ActionLink(page.ToString(), Model.Action, Model.Controller, new { page = page.ToString() }, Model.AjaxOptions)%&gt;

&lt;% } if (page != Model.GetLastPageToLink()) { %&gt; | &lt;% } } %&gt;

&lt;% if (Model.GetLastPageToLink() != Model.PageCount) { %&gt;...&lt;% } %&gt;

&lt;% if (Model.HasNextPage) { %&gt;

&lt;%= Ajax.ActionLink(&quot;Next&quot;, Model.Action, Model.Controller, new { page = (Model.PageIndex + 1).ToString() }, Model.AjaxOptions)%&gt;

&lt;% } %&gt;
</pre>
<p>The big difference here is the way that the links are generated. The original control simply creates an anchor tag and passes in the url generated by the Model. The AJAX control uses AJAX.ActionLink() instead, so we can have the link support AJAX.</p>
<p>So knowing how the control looks, this is the Model for the AJAX control itself:</p>
<pre class="brush: csharp; title: ; notranslate">

public class AjaxPaginationViewData
{
    public int NumberOfPagesToEachSide { get; set; }
    public int PageIndex { get; set; }
    public int PageSize { get; set; }
    public int TotalCount { get; set; }

    public string Action { get; set; }
    public string Controller { get; set; }

    public AjaxOptions AjaxOptions { get; set; }

    public int PageCount
    {
        get
        {
            return (int)Math.Ceiling((double)TotalCount / PageSize);
        }
    }
    public bool HasPreviousPage
    {
        get
        {
            return (PageIndex &gt; 1);
        }
    }

    public bool HasNextPage
    {
        get
        {
            return (PageIndex * PageSize) &lt;= TotalCount;
        }
    }

    public int GetFirstPageToLink()
    {
        return (PageIndex - NumberOfPagesToEachSide &gt; 1 ? PageIndex - NumberOfPagesToEachSide : 1);
    }

    public int GetLastPageToLink()
    {
        return (PageIndex + NumberOfPagesToEachSide &lt; PageCount ? PageIndex + NumberOfPagesToEachSide : PageCount);
    }
}
</pre>
<p>That pretty much explains how the control is built.</p>
<p>The only thing left is how the interaction with PagedList happens.  For that we look at the action that the control calls.  In this example, we’re calling SomeAction in SomeController, and it would look something like this:</p>
<pre class="brush: csharp; title: ; notranslate">

public ActionResult SomeAction(int page)
{
    CachedPage = page;
    var query = GetSearchQuery(CachedSearchParameters);
    var model = query.ToPagedList(page, DefaultPageSize);
    return PartialView(&quot;AjaxResults&quot;, model);
}
</pre>
<p>The ToPagedList performs the functionality that is included with the PagedList classes which you can find <a href="http://pagedlist.codeplex.com/" target="_blank">here</a>.</p>
<p>Let me know what you think, and if you’d like some demo source to see this in action I can happily provide, just let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/creating-an-pagedlistt-that-uses-ajax/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Concept for Business Card</title>
		<link>http://josephbulger.com/consulting/concept-for-business-card/</link>
		<comments>http://josephbulger.com/consulting/concept-for-business-card/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 17:23:15 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Consulting]]></category>
		<category><![CDATA[concept]]></category>

		<guid isPermaLink="false">http://josephbulger.com/consulting/concept-for-business-card/</guid>
		<description><![CDATA[Is this hard to understand? What is the email address on this card? Maybe this is more understandable? or I could swap the email and the site, maybe that makes it easier to read. I’m getting there! This was suggested by Steven, and I think he’s completely correct.]]></description>
			<content:encoded><![CDATA[<p>Is this hard to understand?</p>
<p>What is the email address on this card?</p>
<p><a href="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="businesscardmockup" border="0" alt="businesscardmockup" src="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup_thumb.png" width="243" height="369" /></a> </p>
<p>Maybe this is more understandable?</p>
<p><a href="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="businesscardmockup2" border="0" alt="businesscardmockup2" src="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup2_thumb.png" width="244" height="371" /></a> </p>
<p>or I could swap the email and the site, maybe that makes it easier to read.</p>
<p><a href="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="businesscardmockup3" border="0" alt="businesscardmockup3" src="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup3_thumb.png" width="247" height="375" /></a> </p>
<p>I’m getting there! This was suggested by Steven, and I think he’s completely correct.</p>
<p><a href="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="businesscardmockup4" border="0" alt="businesscardmockup4" src="http://josephbulger.com/wp-content/uploads/2010/01/businesscardmockup4_thumb.png" width="249" height="379" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/consulting/concept-for-business-card/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a Reputation System</title>
		<link>http://josephbulger.com/technology/building-a-reputation-system/</link>
		<comments>http://josephbulger.com/technology/building-a-reputation-system/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 01:53:57 +0000</pubDate>
		<dc:creator>Joseph</dc:creator>
				<category><![CDATA[Church]]></category>
		<category><![CDATA[Consulting]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[linkedIn]]></category>
		<category><![CDATA[reputation system]]></category>
		<category><![CDATA[serve and trade]]></category>

		<guid isPermaLink="false">http://josephbulger.com/general/building-a-reputation-system/</guid>
		<description><![CDATA[I’m working on a reputation system for a site I’ve been recently working on (http://www.serveandtrade.com).  I’m going through some ideas so I thought I’d post them on here and see what people think. Let’s start buy throwing up what we currently have so we can see where we’re trying to go.  Here’s a mockup of [...]]]></description>
			<content:encoded><![CDATA[<p>I’m working on a reputation system for a site I’ve been recently working on (<a href="http://www.serveandtrade.com">http://www.serveandtrade.com</a>).  I’m going through some ideas so I thought I’d post them on here and see what people think.</p>
<p>Let’s start buy throwing up what we currently have so we can see where we’re trying to go.  Here’s a mockup of what a user will see when they search for trades right now.</p>
<p><a href="http://josephbulger.com/wp-content/uploads/2009/09/currentsearchconcept1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="currentsearchconcept" src="http://josephbulger.com/wp-content/uploads/2009/09/currentsearchconcept_thumb1.png" border="0" alt="currentsearchconcept" width="539" height="309" /></a></p>
<p>I have a couple problems with how it works right now.</p>
<ol>
<li>I don’t like that it’s in a grid/table format.  I have to fix that first.  I’m moving more towards something like a list layout.</li>
<li>There are some things missing that I would like to be able to do.  For instance, if I just searched for “can of soup”, and I see that Michelle has the one I want, I would like to have a button/link/something to click on that says “I want that!”  Right now the only thing you can do is go look at the trade, or ask a question.</li>
<li>Clicking on the owner’s link takes you to their profile, but it doesn’t show you what other trades they have, or trades they are looking for.  That information could really be useful.</li>
</ol>
<p><span style="color: #eeeeee;">I’m sure there are other things I could think of, but for now I’m going to start focusing on these three and build some mockups to illustrate these workflows.</span></p>
<p>First, getting rid of the grid.</p>
<p><a href="http://josephbulger.com/wp-content/uploads/2009/09/newsearchconcept1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="newsearchconcept" src="http://josephbulger.com/wp-content/uploads/2009/09/newsearchconcept_thumb1.png" border="0" alt="newsearchconcept" width="539" height="309" /></a></p>
<p>This search list looks a lot better I think.  There are some more features on here then the other one, but we’ll go over those in subsequent posts.</p>
<p>So at this point I’m looking for any feedback.  ANY feedback, good or bad… I’ll take it all.  I really haven’t made up my mind at this point yet, but I think I’m heading in the right direction.</p>
<p>Next post will be about the “I want it!” feature.  Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://josephbulger.com/technology/building-a-reputation-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

