<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Chuck Durfee: fiancé, father of 3+4, son, brother. Lifelong learner, code wizard, taekwon-do black belt, agile evangelist, cook. Enjoyer of science fiction, writer, gamer, photographer, hiker, sketcher, polyglot, geocacher, tapir admirer. Native Denverite, erstwhile Portlander. Bachelor’s in math, certified scrum master.</description><title>Clickings of the Neon Tapir</title><generator>Tumblr (3.0; @agiletapir)</generator><link>http://agiletapir.tumblr.com/</link><item><title>Case Study: Release Planning using Theme Estimation</title><description>&lt;p&gt;This is a story about how I applied my CSM experience and training to help a mid-sized project get off the ground.&lt;/p&gt;

&lt;h1 id="beginnings"&gt;Beginnings&lt;/h1&gt;

&lt;p&gt;When I came onto the project, the company was struggling with agile. They had been doing software engineering for a while, but in the context of controlling hardware. This project, an item state management system, was a departure for them. They already had a product in this space which they were essentially reselling from a consulting firm. The existing product was awkward to use, its feature set was limited, and the consulting firm did not wish to re-write the product to scale.&lt;/p&gt;

&lt;p&gt;So, the company decided to write a replacement. They chose C# and .NET as the language. “Mason”, the principal engineer on the project, was a Java programmer by trade, so they needed some help. I was hired onto the team as a senior .NET engineer who could help mature Mason’s technical capabilities in .NET, and they had already hired a mid-level .NET engineer who started a few weeks before I did. It quickly became apparent that my CSM knowledge would be just as valuable. &lt;/p&gt;

&lt;p&gt;The team had the desire but not the field experience. Mason had written a prototype, and after quick examination of the code, it was clear that his architecture would not support the ambition of the product. &lt;/p&gt;

&lt;p&gt;The project manager, “Jason”, had chosen Scrum as the delivery methodology, yet he had no experience with it. He was on the right track with sprint-level work management, but he was having trouble with release-level planning. he asked me if I could help get the project back on track. The product owner, “Kathy”, already had a comprehensive set of use cases outlined. While they were not fully-baked, they contained enough meat to discuss in detail what the project is trying to accomplish.&lt;/p&gt;

&lt;h1 id="themesizing"&gt;Theme Sizing&lt;/h1&gt;

&lt;p&gt;I introduced the idea of themes. Kathy had already grouped the use cases into broad categories, so it seemed natural to think of these categories as themes. Jason and the product owner went off and grouped the use cases. They did it more fine-grained than I’d anticipated, putting them into a couple dozen smaller categories that I’d call epics.&lt;/p&gt;

&lt;p&gt;I then introduced the idea of T-shirt sizing for themes. The goal of this was to talk about which parts of the application contained the greatest effort. Some use cases have some risk — we as a team aren’t sure how we’ll tackle them. Others don’t have enough definition. Still others represent a lot of work.&lt;/p&gt;

&lt;p&gt;Over the course of a couple of afternoons, the team got them sized. The challenge remained, how do you use T-shirt sizes to create something that resembles the Gantt chart the project sponsors were comfortable with?&lt;/p&gt;

&lt;h1 id="themepoints"&gt;Theme Points&lt;/h1&gt;

&lt;p&gt;It hit me, these T-shirt sizes were a scale, just not a numeric scale. I needed to quantify T-shirt sizes.&lt;/p&gt;

&lt;p&gt;Mike Cohn has an article about &lt;a href="http://blog.mountaingoatsoftware.com/how-do-story-points-relate-to-hours"&gt;relating story points to hours&lt;/a&gt; in which he shows story points graphed as Bell curves. So I wrote a scale like this on the whiteboard:&lt;/p&gt;

&lt;pre&gt;
Onesie  |  Small  |  Medium  |   Large  |     XL
&lt;/pre&gt;

&lt;p&gt;I picked an arbitrary number to represent a Medium. I wanted it to be on a scale that couldn’t be mistaken for user story points, so I chose 500.&lt;/p&gt;

&lt;pre&gt;
Onesie  |  Small  |  Medium  |   Large  |     XL
                      500    
&lt;/pre&gt;

&lt;p&gt;Of course, a Medium is not exactly 500 points. These represent a broad range, so I declared that a Medium was 500±50%, or 250-750.&lt;/p&gt;

&lt;pre&gt;
Onesie  |  Small  |  Medium  |   Large  |     XL
                  |   500    |
                 250        750
&lt;/pre&gt;

&lt;p&gt;I extrapolated to determine the rest of the scale.&lt;/p&gt;

&lt;pre&gt;
Onesie  |  Small  |  Medium  |   Large  |     XL
  60    |   180   |   500    |   1500   |    5000
       125       250        750        2500
&lt;/pre&gt;

&lt;p&gt;This worked out to roughly powers of 3.&lt;/p&gt;

&lt;pre&gt;
Onesie  |  Small  |  Medium  |   Large  |     XL
   1        x3         x8         x25        x83
&lt;/pre&gt;

&lt;p&gt;Jason took these ranges and our commentary during sizing that Theme X seemed bigger than Y and assigned values to each theme.&lt;/p&gt;

&lt;h1 id="sowhenwillthatbereadyagain"&gt;So When Will That Be Ready Again?&lt;/h1&gt;

&lt;p&gt;By this time, we had already completed a sprint or two, enough that we had an idea that our velocity was going to be somewhere near 30. We had enough information to try to correlate these themes against a calendar. Projecting when we’d complete the epic’s functionality and armed with our velocity, Jason threw the numbers into a spreadsheet and started trying out numbers.&lt;/p&gt;

&lt;p&gt;Our current epic was rated at 800 theme points. We thought we’d be done with it in 6-7 ideal days, which means 3 developers can get through about 750 theme points in an ideal week. This became 250 points/dev/week, a velocity of sorts.&lt;/p&gt;

&lt;p&gt;Thanks to the spreadsheet, we were immediately able to see that calculated out to about 12 months to write the application. &lt;/p&gt;

&lt;p&gt;Better yet, we were able to forecast what general area of the application we’d be working on months from now, which allowed us to project some milestones. We need to have this epic done by Halloween to be on track, that set of themes by Thanksgiving, and so on.&lt;/p&gt;

&lt;p&gt;Of course, these numbers had a high margin of error. We communicated it would be more like 6-18 months to write it. We reasoned that as the team got a epic or two under our belts, Jason and I should have been able to refine the conversion rate and get a more realistic idea.&lt;/p&gt;

&lt;h1 id="whatif..."&gt;What If…&lt;/h1&gt;

&lt;p&gt;The real fruits of this exercise were that we now had a few variables that we could experiment with. &lt;/p&gt;

&lt;p&gt;For example, that velocity of 30 was measured while we were storming as a team and 2/3 of us were new to the domain. Maybe we could expect the work would get easier as we learned the domain. This would be expressed as an increased velocity. If you increase the conversion rate from 250 to 300 after a month, you gain about a month over the life of the project.&lt;/p&gt;

&lt;p&gt;A similar gain would be realized if a 4th developer is added after a couple of months. Other projections were made about the impact of adding a QA engineer early, which the project didn&amp;#8217;t have until much later.&lt;/p&gt;

&lt;h1 id="coursecorrection"&gt;Course Correction&lt;/h1&gt;

&lt;p&gt;Of course, the project sponsors wanted it faster. To them, time to market was crucial. The company saw a dwindling market for their current offerings and were looking for ways to increase their reach. Their goals were compelling — it seemed like a good opportunity. This product would do things that others don’t. &lt;/p&gt;

&lt;p&gt;Management needed a product that was feature-compatible with its competitors in the marketplace before the venture capital expired, so we were asked to come up with a plan that might possibly work. &lt;/p&gt;

&lt;p&gt;We were able to use the spreadsheet to estimate how much of the application we’d have to de-scope to get it done in the timeframe we want, and Kathy was able to identify several themes as not mission critical to beta testing. The idea was that development would continue while the product was in beta, which I had discarded as too risky but Jason felt was viable. &lt;/p&gt;

&lt;h1 id="presentation"&gt;Presentation&lt;/h1&gt;

&lt;p&gt;We presented the plan. It was, in the parlance of a senior company executive, a “success-oriented plan”. No one was comfortable with it, so some difficult conversations followed. The project was in a bad position.&lt;/p&gt;

&lt;p&gt;There were two senior executives who vied for control of the project. One felt that the company should continue to sell their poor solution until the new one was ready. The other felt that the poor solution could not be maintained, should not be sold, and the new one needed to be rushed to market.&lt;/p&gt;

&lt;p&gt;The second executive won and demanded a crushing work pace, complete with extended work hours. I knew from experience that such a pace was not sustainable and was prone to error on a product whose core had to be solid the first time. The customers in that market would not forgive a poor first showing.&lt;/p&gt;

&lt;p&gt;I could not in good conscience proceed with the project as outlined, so I left. I don’t know exactly how the story ends. The other experienced .NET engineer on the team left for similar reasons. I have spoken to Mason, and he told me the project is very behind the schedule Jason and I laid out.&lt;/p&gt;

&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;I think the exercise was worthwhile. Although the schedule Jason and I concocted was wildly speculative, it provided a frame of reference so that valuable conversations could take place. It got prompt and appropriate management attention to the project. The technique allowed us to do the analysis in a timeframe where its recommendations could be acted on. &lt;/p&gt;

&lt;p&gt;Many of you reading this article have probably already formed opinions. It’s clear the project is in trouble. For me, it was that no project plan could overcome the fact that the delivery team did not have enough technical experience nor the business knowledge to rapidly develop such a complex product. &lt;/p&gt;

&lt;p&gt;Without doing the analysis we did, I don’t think the errors in the original project plan would have surfaced until much later.&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/17833554043</link><guid>http://agiletapir.tumblr.com/post/17833554043</guid><pubDate>Sat, 18 Feb 2012 11:44:50 -0700</pubDate><category>agile</category><category>scrum</category><category>theme</category><category>project-management</category></item><item><title>Revenge of the Secret Santa Code Kata - F#</title><description>&lt;p&gt;Here&amp;#8217;s another solution to the &lt;a href="http://www.rubyquiz.com/quiz2.html"&gt;Secret Santa code kata&lt;/a&gt;, this time a scouting mission into functional programming with F#.&lt;/p&gt;

&lt;p&gt;To recap:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;My &lt;a href="http://agiletapir.tumblr.com/post/16507339374/secret-santa-code-kata-in-powershell"&gt;first solution&lt;/a&gt;, written in PowerShell, relied on selecting random pairs of people and using a &amp;#8220;hill-climbing&amp;#8221; algorithm to avoid getting stuck. &lt;/li&gt;
&lt;li&gt;My &lt;a href="http://agiletapir.tumblr.com/post/16853106692/secret-santa-code-kata-redux-in-c"&gt;second solution&lt;/a&gt; I constrained to be deterministic &amp;#8212; no randomness.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This one was more about trying to write something meaningful in F# using a problem I&amp;#8217;m by now familiar with. Take a look at the code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;open System
open System.IO

// TODO: what's the accepted way to configure an F# program at runtime, App.config?
let lines = File.ReadAllLines(@"C:\temp\names_santa.txt") |&amp;gt; List.ofArray

let surname (x : string) = (x.Split ' ').[1]

// TODO: how do I make this generic enough to use in both cases below?
let lastItem (a : string[]) = a.[a.Length - 1]

let randomizer = new Random(DateTime.Now.Millisecond)

let swap (a: _[]) x y =
    let tmp = a.[x]
    a.[x] &amp;lt;- a.[y]
    a.[y] &amp;lt;- tmp

// shuffle an array (in-place), borrowed from a code snippet site
let shuffle a = 
    let len = Array.length a
    Array.iteri (fun i _ -&amp;gt; swap a i (randomizer.Next(i, len))) a

let linesArray = Array.ofList lines

// TODO: this "do-while" loop, I should be able to rewrite it as a recursive function, but how?
shuffle linesArray 
while surname linesArray.[0] = surname linesArray.[(Array.length linesArray) - 1] do shuffle linesArray

let rec pairings = linesArray
                    |&amp;gt; Seq.windowed 2
                    |&amp;gt; Seq.choose (fun (x:string[]) -&amp;gt; 
                                        match x with
                                        | x when surname x.[0] &amp;lt;&amp;gt; surname x.[1] -&amp;gt; Some(x)
                                        | _ -&amp;gt; None
                                   ) 

let pairingsList = List.ofSeq pairings

List.append pairingsList [[|pairingsList.[pairingsList.Length - 1].[1]; pairingsList.[0].[0]|]] |&amp;gt; 
    Seq.iter (fun (x:string[]) -&amp;gt; printfn "%s gives a gift to %s" x.[0] x.[1])

Console.WriteLine "Done, press Enter to exit"
Console.ReadLine() |&amp;gt; ignore
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, I left myself a few to-do items. I boxed the effort at three hours, which is why I went ahead and borrowed the shuffle logic from the internet.&lt;/p&gt;

&lt;p&gt;The first hour was learning to speak F# again, especially the method signatures. I played with F# when it was in beta, so I didn&amp;#8217;t go into the kata stone cold. However, it took me a while to troubleshoot why my methods didn&amp;#8217;t have the signature I expected.&lt;/p&gt;

&lt;p&gt;I spent the most time writing the &lt;code&gt;pairings&lt;/code&gt; function. Once I had the insight of using the match operator, the algorithm came together very quickly. I decided that I wasn&amp;#8217;t happy with it being deterministic. I found that if I provided a file that was already in an appropriate order, &lt;code&gt;pairings&lt;/code&gt; regurgitated the list. Dissatisfied, I went about trying to shuffle the array. Not being familiar with unit testing in F#, I used the F# Interactive console. I got frustrated with trying to implement the shuffle algorithm, so I decided to study a working copy.&lt;/p&gt;

&lt;p&gt;The hard part came in integrating it with my code. I resorted to using a while loop, which I know from reading about functional programs means that I&amp;#8217;m not thinking of the problem through. I believe I couldn&amp;#8217;t convert this into a recursive function because &lt;code&gt;shuffle&lt;/code&gt; returns a &lt;code&gt;unit&lt;/code&gt; (that is, it does the work inline). If it returned an array, I bet I&amp;#8217;ve have more luck. I&amp;#8217;ll have to experiment further.&lt;/p&gt;

&lt;p&gt;My attempts to rewrite the loop badly broke the program. I used comments as poor man&amp;#8217;s source control, and I got lucky. I really should have check in the first working version into my local Subversion repository.&lt;/p&gt;

&lt;p&gt;Some time passed. I managed to look at the do-while problem again, and after about 90 minutes, I solved both it and another issue that bugged me.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the second revision:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;open System
open System.IO

let randomizer = new Random(DateTime.Now.Millisecond)

let surname (x : string) = (x.Split ' ').[1]
let lastItem (a : 'a list) = a.[a.Length - 1]

let shuffle items =
    let upperBound = (List.length items) * 100
    let randomlyWeightedItems = List.map (fun item -&amp;gt; item, randomizer.Next(0, upperBound)) items
    let sortedByWeight = List.sortWith (fun (_, leftWeight) (_, rightWeight) -&amp;gt; leftWeight - rightWeight) randomlyWeightedItems
    List.map (fun (item, _) -&amp;gt; item) sortedByWeight

let shuffleUntilEndsDiffer theList =    
    let rec loop a =        
        let shuffled = shuffle a        
        if surname shuffled.Head = surname (lastItem shuffled) then             
            loop shuffled    
    loop theList

// Main part of the program, need to find out how to separate code into files

let lines = List.ofArray (File.ReadAllLines(@"names_santa.txt"))

shuffleUntilEndsDiffer lines

let rec pairings = lines
                    |&amp;gt; Seq.windowed 2
                    |&amp;gt; Seq.choose (fun (x:string[]) -&amp;gt; 
                                        match x with
                                        | x when surname x.[0] &amp;lt;&amp;gt; surname x.[1] -&amp;gt; Some(x)
                                        | _ -&amp;gt; None
                                    )
                    |&amp;gt; List.ofSeq 

let veryFirstPerson = pairings.Head.[0]
let veryLastPerson = (lastItem pairings).[1] 

List.append pairings [[|veryLastPerson; veryFirstPerson|]] 
    |&amp;gt; Seq.iter (fun (x:string[]) -&amp;gt; printfn "%s gives to %s" x.[0] x.[1])

Console.ReadLine() 
    |&amp;gt; ignore
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The do-while loop was solved by making the shuffling function return the shuffled contents instead of unit (void in C# parlance).&lt;/p&gt;

&lt;p&gt;The second change was to get away from arrays. Arrays in F# are mutable, and I wanted to only use immutable data structures as much as possible.&lt;/p&gt;

&lt;p&gt;The shuffler was the main barrier. Once I hit upon the idea to associate each person with external data, in this case a random weighting, the rest fell into place. You may also notice some language usage improvements, such as using &lt;code&gt;a.Head&lt;/code&gt; instead of &lt;code&gt;a.[0]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Questions? Comments?&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/17391733734</link><guid>http://agiletapir.tumblr.com/post/17391733734</guid><pubDate>Fri, 17 Feb 2012 10:11:10 -0700</pubDate><category>code kata</category><category>f-sharp</category></item><item><title>Secret Santa Code Kata Redux in C#</title><description>&lt;p&gt;Here&amp;#8217;s another solution to the &lt;a href="http://www.rubyquiz.com/quiz2.html"&gt;Secret Santa code kata&lt;/a&gt;, this time in my &amp;#8220;native&amp;#8221; programming language of C#. This is the second solution I&amp;#8217;ve written this week to this problem. Code katas are about experimenting with different approaches to simple but not trivial problems.&lt;/p&gt;

&lt;p&gt;My &lt;a href="http://agiletapir.tumblr.com/post/16507339374/secret-santa-code-kata-in-powershell"&gt;first solution&lt;/a&gt;, written in PowerShell, relied on selecting random pairs of people and using a &amp;#8220;hill-climbing&amp;#8221; algorithm to avoid getting stuck. This time, I gave myself the constraint that the solution had to be deterministic &amp;#8212; no randomness. I had been toying with the idea of using an Abelian &lt;a href="http://en.wikipedia.org/wiki/Ring_(mathematics)"&gt;ring&lt;/a&gt;. A couple of common examples are the hours on a clock or the modulus (remainder) operator in math. But I couldn&amp;#8217;t decide how I&amp;#8217;d handle iterating through the members of that ring without duplicates. I determined that I&amp;#8217;d need to re-sort the list.&lt;/p&gt;

&lt;p&gt;I wrote this solution using test-driven development (TDD), meaning I wrote my tests before implementation &amp;#8212; I won&amp;#8217;t show all of those tests today. As it turned out, I didn&amp;#8217;t need to code a Ring class. I find when I do TDD, I often don&amp;#8217;t end up writing half the code I thought I&amp;#8217;d need!&lt;/p&gt;

&lt;p&gt;Unlike my PowerShell solution which just used strings, I knew I wanted to create a data object to store the incoming rows of data in, which I named the Participant class:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using System;

namespace SantaKataApp
{
    public class Participant
    {
        private Participant(string firstName, string lastName, string email)
        {           
            FirstName = firstName;
            LastName = lastName;
            Email = email;
        }

        public string FirstName { get; private set; }
        public string LastName { get; private set; }
        public string Email { get; private set; }

        public static Participant Create(string descriptor, int id)
        {
            var parts = descriptor.Split();
            var email = parts[2].Replace("&amp;lt;", "").Replace("&amp;gt;", "");
            return new Participant(parts[0], parts[1], email);
        }

        public override string ToString()
        {
            return string.Format("{0} {1} &amp;lt;{2}&amp;gt;", FirstName, LastName, Email);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For a while, I thought I might need to implement &lt;code&gt;IEquatable&amp;lt;Participant&amp;gt;&lt;/code&gt;, &lt;code&gt;Equals()&lt;/code&gt;, and &lt;code&gt;GetHashCode()&lt;/code&gt; in order to compare Participants, but again, TDD proved me wrong.&lt;/p&gt;

&lt;p&gt;The plan for this approach was to:
1. Parse the incoming list
2. Resort the list
3. Display the results&lt;/p&gt;

&lt;p&gt;The act of resorting took the majority of the development time. I created a &lt;code&gt;ListResorter&lt;/code&gt; class to do the work.&lt;/p&gt;

&lt;p&gt;I started by writing tests&amp;#8230;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SantaKataApp;

namespace SantaKataTests
{
    [TestClass]
    public class ListResorterTests
    {
        [TestMethod]
        public void SwapItemsInList_Succeeds()
        {
            var list = new List&amp;lt;int&amp;gt;(new[] { 3, 2, 1 });
            var listResorter = new ListResorter&amp;lt;int&amp;gt;(list, null);
            listResorter.Swap(0, 1);
            CollectionAssert.AreEqual(list.ToArray(), new[] { 2, 3, 1 });
        }

        [TestMethod, ExpectedException(typeof(InvalidOperationException))]
        public void SwapWithInvalidIndex_Throws()
        {
            var list = new List&amp;lt;int&amp;gt;(new[] { 3, 2, 1 });
            var listResorter = new ListResorter&amp;lt;int&amp;gt;(list, null);
            listResorter.Swap(74, 1);
        }

        [TestMethod]
        public void CanAdjoin_WithTwoItems_DeterminesIfTheyCanAdjoin()
        {
            var list = new List&amp;lt;int&amp;gt;(new[] { 3, 1, 2 });
            var listResorter = new ListResorter&amp;lt;int&amp;gt;(list, (x,y) =&amp;gt; x % 2 != y % 2);
            Assert.IsTrue(listResorter.CanAdjoin(1, 2)); // list[1] = 1, list[2] = 2
            Assert.IsFalse(listResorter.CanAdjoin(0, 1));
        }

        // ... and so on ...
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;These are the first two tests I wrote. I decided the simplest operation I needed to resort a list was the ability to swap two items in that list. Once I had that working, I picked the next piece, the ability to decide if two things can adjoin (&amp;#8220;to be close to or in contact with&amp;#8221;), and I proceeded from there.&lt;/p&gt;

&lt;p&gt;Notice that the &lt;code&gt;LineResorter&amp;lt;T&amp;gt;&lt;/code&gt; constructor takes a list to operate against, and a function that compares two instances of type T and determines if they can be adjoining in the list. In the case of my unit tests, I used &lt;code&gt;(x,y) =&amp;gt; x % 2 != y % 2&lt;/code&gt;, which is a fancy way of saying that two odds or two evens can&amp;#8217;t be next to each other in the list. I wanted to use a different type (int) than I&amp;#8217;d be using in my real use case to make sure I didn&amp;#8217;t make any assumptions about the nature of type T. This comparison was the first one for two numbers that came to mind.&lt;/p&gt;

&lt;p&gt;Each time I needed functionality out of the &lt;code&gt;ListResorter&lt;/code&gt;, I wrote a test. I watched it fail, then I made all the tests pass. If I saw opportunities to refactor, I took them whenever all my tests were green (passing). By the time I was done, I had about a dozen tests and this class:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;

namespace SantaKataApp
{
    public class ListResorter&amp;lt;T&amp;gt;
    {
        private readonly List&amp;lt;T&amp;gt; _list;
        private readonly Func&amp;lt;T, T, bool&amp;gt; _canAdjoin;

        public ListResorter(List&amp;lt;T&amp;gt; list, Func&amp;lt;T, T, bool&amp;gt; canAdjoin)
        {
            _list = list;
            _canAdjoin = canAdjoin;
        }

        internal void Swap(int index1, int index2)
        {
            ThrowIfIndexesAreInvalid(index1, index2);
            T temp = _list[index2];
            _list[index2] = _list[index1];
            _list[index1] = temp;
        }

        private void ThrowIfIndexesAreInvalid(int index1, int index2)
        {
            if (_list.Count &amp;lt; index1 - 1 || _list.Count &amp;lt; index2 - 1)
                throw new InvalidOperationException("An index is beyond the length of the array");
        }

        internal bool CanAdjoin(int index1, int index2)
        {
            ThrowIfIndexesAreInvalid(index1, index2);
            return _canAdjoin(_list[index1], _list[index2]);
        }

        public int GetNextIndex(int i)
        {
            if (i &amp;gt;= _list.Count)
                throw new InvalidOperationException("Invalid index");
            if (i == _list.Count - 1)
                return 0;
            return i + 1;
        }

        internal bool CanAllAdjoin()
        {
            return !_list.Where((t, i) =&amp;gt; !CanAdjoin(i, GetNextIndex(i))).Any();
        }

        public List&amp;lt;T&amp;gt; Resort()
        {
            var list = _list;

            while (! CanAllAdjoin())
            {
                for (int i=0; i &amp;lt; list.Count; i++)
                {
                    int j = GetNextIndex(i);
                    int k = GetNextIndex(j);
                    if (! CanAdjoin(i, j) &amp;amp;&amp;amp; CanAdjoin(i, k))
                        Swap(j, k);
                }
            }
            return list;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This class has two public methods, &lt;code&gt;GetNextIndex()&lt;/code&gt; and &lt;code&gt;Resort()&lt;/code&gt;. That Abelian ring idea still lives in the &lt;code&gt;GetNextIndex()&lt;/code&gt; method, which says that the next member after the last in the list is the first, making the list circular. &lt;code&gt;Resort()&lt;/code&gt; does what you would expect.&lt;/p&gt;

&lt;p&gt;The other methods in the class are marked internal, so that my TDD tests can access them via the &lt;code&gt;[Assembly:InternalsVisibleTo()]&lt;/code&gt; attribute in the &lt;code&gt;Assembly.cs&lt;/code&gt; code file. After design is done, I would consider rewriting the test methods that talk to internal methods so that they are exercised through the public method. I don&amp;#8217;t want my unit tests to be break should someone decide to change the internal implementation of these methods. You can see a bit of this thinking in the &lt;code&gt;ThrowIfIndexesAreInvalid()&lt;/code&gt; method. I pulled this method out to avoid duplication of code during refactoring, where I already had unit tests in place and thus I didn&amp;#8217;t need to write new ones.&lt;/p&gt;

&lt;p&gt;Once I had &lt;code&gt;ListResorter&lt;/code&gt; working, writing a console wrapper was easy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace SantaKataApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] fileContents = File.ReadAllLines(args[0]);
            Func&amp;lt;Participant, Participant, bool&amp;gt; surnamesDontMatch = (x, y) =&amp;gt; x.LastName != y.LastName;
            List&amp;lt;Participant&amp;gt; names = fileContents.Select(Participant.Create).ToList();

            var listResorter = new ListResorter&amp;lt;Participant&amp;gt;(names, surnamesDontMatch);
            List&amp;lt;Participant&amp;gt; sorted = listResorter.Resort();

            DisplayParticipants(listResorter, sorted);
        }

        internal static void DisplayParticipants(ListResorter&amp;lt;Participant&amp;gt; listResorter, IList&amp;lt;Participant&amp;gt; sorted)
        {
            for(int i=0; i &amp;lt; sorted.Count; i++)
                Console.WriteLine(Display(sorted[i], sorted[listResorter.GetNextIndex(i)]));
        }

        internal static string Display(Participant name, Participant giveToName)
        {
            var giveTo = giveToName != null ? giveToName.ToString() : "NONE";
            return string.Format("{0} gives a gift to {1}", name, giveTo);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Most of the work done in the console app is formatting the output for display. The heavy lifting is done by the &lt;code&gt;ListResorter&lt;/code&gt; class.&lt;/p&gt;

&lt;p&gt;This program outputs data like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;PS C:\temp&amp;gt; .\SantaKataApp.exe .\names_santa.txt
Luke Skywalker &amp;lt;luke@theforce.net&amp;gt; gives a gift to Toula Portokalos &amp;lt;toula@manhunter.org&amp;gt;
Toula Portokalos &amp;lt;toula@manhunter.org&amp;gt; gives a gift to Leia Skywalker &amp;lt;leia@therebellion.org&amp;gt;
Leia Skywalker &amp;lt;leia@therebellion.org&amp;gt; gives a gift to Gus Portokalos &amp;lt;gus@weareallfruit.net&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I met my goal: the output is the same every time given the same input file.&lt;/p&gt;

&lt;p&gt;I time-boxed the effort at two hours and I came close to reaching my limit. I initially began by writing an iterator, but abandoned it when I realized that I only wanted to traverse the collection once.&lt;/p&gt;

&lt;p&gt;There is more that could be done to this program, of course. For example, I&amp;#8217;m not happy about &lt;code&gt;DisplayParticipants&lt;/code&gt; using &lt;code&gt;GetNextIndex()&lt;/code&gt;. The only reason that &lt;code&gt;DisplayParticipants()&lt;/code&gt; needs a &lt;code&gt;ListResorter&lt;/code&gt; is to use its ring-like &lt;code&gt;GetNextIndex()&lt;/code&gt; method. This functionality should have been extracted into its own class.&lt;/p&gt;

&lt;p&gt;Comments? Questions?&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/17346538232</link><guid>http://agiletapir.tumblr.com/post/17346538232</guid><pubDate>Fri, 10 Feb 2012 22:03:27 -0700</pubDate><category>code kata</category><category>c-sharp</category></item><item><title>"Secret Santa" Code Kata in Powershell</title><description>&lt;p&gt;The team at work is doing a Code Kata, &lt;a href="http://www.rubyquiz.com/quiz2.html"&gt;the Secret Santa kata from Ruby Quiz&lt;/a&gt;. In it, you are given a list of names and emails and need to pair givers with receivers, with the only constraint being that a giver and receiver can&amp;#8217;t have the same surname.&lt;/p&gt;

&lt;p&gt;I wrote my solution in PowerShell. I wanted to use native PowerShell functionality, so I didn&amp;#8217;t import any .NET libraries. I know this post is brief, but I wanted to get my solution posted with a little commentary while it was still fresh in my mind.&lt;/p&gt;

&lt;p&gt;When run like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;PS&amp;gt; .\santa.ps1 .\names.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It gives output like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Giver                                                Receiver
-----                                               ---------
John Smith &amp;lt;jsmith@example.com&amp;gt;         Jane Doe &amp;lt;jdoe@example.com&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here&amp;#8217;s the code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; param($file)

 function ConvertTo-Array($hashtable) 
 {   
     $result = @()
     $hashtable.GetEnumerator() | % {
         $object = New-Object PSObject   
         Add-Member -inputObject $object -memberType NoteProperty -name Giver -value $_.Name 
         Add-Member -inputObject $object -memberType NoteProperty -name Receiver -value $_.Value 
         $result += $object
     }   
     $result
 }

 $none = "NONE"
 $names = @{}
 gc $file | % { $names.Add($_, $none) }
 $namesToMatch = $names.Keys.Count
 if ($namesToMatch -lt 2) {  throw "Need at least two names to match" }

 while (($names.Keys | ? { $names.$_ -eq $none }).Length -gt 0) 
 {
     $from = $names.Keys | ? { $names.$_ -eq $none } | Get-Random
     $to = $names.Keys | ? { $_ -ne $from -and $names.Values -notcontains $_ } | Get-Random
     #"DEBUG: $from, $to"
     if ($from -ne $null -and $to -ne $null -and $from.split()[1] -ne $to.split()[1]) 
     {
         $names.$from = $to
     }
     else
     {
         $undoMatch = $names.Keys | ? { $names.Values -ne $none `
             -and $from.split()[1] -ne $_.split()[1]} | Get-Random
         #"DEBUG: unset $undoMatch"
         if ($undoMatch -ne $null) 
         {
             $names.$undoMatch = $none
         }
     }
     $percentComplete = 100 * ($names.Values | ? { $names.$_ -ne $none }).Length / $namesToMatch
     Write-Progress -activity "Match in Progress" -status "% Complete:" -percentcomplete $percentComplete
 }
 $results = ConvertTo-Array $names
 $results | ft  
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(I apologize in advance for the formatting. I will look into another solution like Pastebin if I do this more often. Please comment if you have recommendations.)&lt;/p&gt;

&lt;p&gt;It reads the contents of the file and writes each line to a hashtable, where all the receivers are $none (a special value I created which I used like $null).&lt;/p&gt;

&lt;p&gt;As long as there are unmatched people, I go through an algorithm to select a random gift giver who doesn&amp;#8217;t have a receiver ($from) and a receiver who doesn&amp;#8217;t have a giver ($to). The split(&amp;#8221; &amp;#8220;)[1] yields a person&amp;#8217;s surname.&lt;/p&gt;

&lt;p&gt;I used a variant on the &amp;#8220;Hill Climbing&amp;#8221; algorithm mentioned on the site. If I run into a situation where there are no more matches, I take a random person who could have been a match and throw them back into the pool of candidates. In this way, the algorithm never gets stuck.&lt;/p&gt;

&lt;p&gt;At the end, I call my &lt;code&gt;ConvertTo-Array&lt;/code&gt; function to beautify the output. Without it, the hashtable columns are labeled &amp;#8220;Name&amp;#8221; and &amp;#8220;Value&amp;#8221;, and that didn&amp;#8217;t satisfy me. (I couldn&amp;#8217;t get &lt;code&gt;Format-Table&lt;/code&gt; to help.)&lt;/p&gt;

&lt;p&gt;I added a progress bar to see how often this part of the code is invoked, and it gets called once or twice per run on average. However, the script itself has decent performance. It takes a second or so to match 40 names.&lt;/p&gt;

&lt;p&gt;Please let me know what you think or ask questions. I&amp;#8217;m happy to go into more detail.&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/16507339374</link><guid>http://agiletapir.tumblr.com/post/16507339374</guid><pubDate>Wed, 25 Jan 2012 21:36:48 -0700</pubDate><category>code kata</category><category>powershell</category></item><item><title>Getting off the Ground</title><description>&lt;p&gt;&lt;em&gt;&amp;#8220;You don&amp;#8217;t need more time, you just need to decide&amp;#8221; - Seth Godin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At work, there are a lot of things that I&amp;#8217;ve identified for improvement.&lt;/p&gt;

&lt;p&gt;Where I work is largely a Java shop, but there are a couple of large applications that are .NET and a growing group of .NET developers. And there are a lot of amazing opportunities here.&lt;/p&gt;

&lt;p&gt;The company has a good track record of agile delivery using Scrum. However, I see areas for improvement also. The job of scrum master has become institutionalized as just a meeting facilitator. The responsibility of the scrum master as team coach has been lost in translation from training done there a few years ago.&lt;/p&gt;

&lt;p&gt;Our current scrum master wanted the team to attend introductory scrum training. As a certified scrum master, I was anxious to hear what the agile coach on staff would say, and I was gratified to agree with his curriculum. It&amp;#8217;s a matter of practice in our group.&lt;/p&gt;

&lt;p&gt;Fortunately, I am well-suited to help move the team toward a steady cadence of delivery. We need to get our product owner away from firefighting mode and to get what he and our customers need within the confines a fixed sprint backlog. Having a strong scrum master will help.&lt;/p&gt;

&lt;p&gt;And we need to get beyond our large estimates for small projects due to fear of the unknown with this application &amp;#8212; turnover has left most of the delivery team new to the code base.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s a desire for a .NET community of practice. I&amp;#8217;ve started the ball rolling with a book club. The first book we&amp;#8217;ll read together is &lt;em&gt;Working Effectively with Legacy Code&lt;/em&gt; by Michael Feathers, which is all about getting pre-written systems under unit test. We&amp;#8217;re also starting our first code kata this week, an old &lt;a href="http://www.rubyquiz.com/quiz2.html"&gt;Ruby Quiz about Secret Santas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Both the book club and katas are exercises to start talking about software design in a simpler context. These .NET applications grew organically and were written by developers who were more comfortable with SQL than .NET. The application has shortcomings that you might expect: lots of logic in stored procedures, poor separation of concerns between SQL and .NET, and a presentation layer (ASP.NET web forms) that&amp;#8217;s highly coupled to the database.&lt;/p&gt;

&lt;p&gt;And the application has a lot of room to grow. It is ripe for becoming a data warehouse solution. I have some mixed experience setting up data warehousing from a previous position, but this time, the team is blessed with a talented database developer onboard to guide us through the tough parts. I can&amp;#8217;t wait!&lt;/p&gt;

&lt;p&gt;The concern I have is being spread too thin. As you can see, there are a number of vectors to pursue. I need to choose one, maybe two of these and drive them to completion before taking on others. I haven&amp;#8217;t talked about the nine months of architecture changes that are needed to get the application able to scale to handle the desired demand or some of the expanded features they want for this application this year.&lt;/p&gt;

&lt;p&gt;If I have learned anything over the past couple of years, it is that I cannot be all things to all people. I need to pace myself and be ready for some false starts. I also find a way to handing off these projects when (if?) they get off the ground. Here&amp;#8217;s where having a good manager will help me, and I am blessed to have one.&lt;/p&gt;

&lt;p&gt;I feel energized, and excited about the possibilities!&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/16348130373</link><guid>http://agiletapir.tumblr.com/post/16348130373</guid><pubDate>Mon, 23 Jan 2012 07:07:00 -0700</pubDate><category>work</category><category>agile</category><category>scrum</category><category>big data</category><category>data warehouse</category></item><item><title>Parsing large files using PowerShell</title><description>&lt;p&gt;At work, I had the need to parse through a large pipe-delimited file to count the number of records whose 5th column meets and doesn&amp;#8217;t meet my criteria.&lt;/p&gt;

&lt;pre&gt;
PS C:\temp&amp;gt; gc .\items.txt -readcount 1000 | `
  ? { $_ -notlike "HEAD" } | `
  % { foreach ($s in $_) { $s.split("|")[4] } } | `
  group -property {$_ -ge 256} -noelement | `
  ft -autosize

&lt;/pre&gt;

&lt;p&gt;This command does what I want, returning output like this:&lt;/p&gt;

&lt;pre&gt;
  Count Name
  ----- ----
1129339 True
2013703 False

&lt;/pre&gt;

&lt;p&gt;Here&amp;#8217;s some explanation in English, for those of you who don&amp;#8217;t know PowerShell.&lt;/p&gt;

&lt;p&gt;The first command is &lt;strong&gt;gc&lt;/strong&gt; (Get-Content), which reads the file in 1000 (readcount) lines at a time.&lt;/p&gt;

&lt;p&gt;The second command is &lt;strong&gt;?&lt;/strong&gt; (Where-Object), which filters out the HEAD row.&lt;/p&gt;

&lt;p&gt;The next command &lt;strong&gt;%&lt;/strong&gt; is an alias for Foreach-Object, where object in this case is a 1000-line chunk. The inner loop is another foreach loop, which is slightly different from Foreach-Object in ways that are unimportant to the matter at hand. Point is, you can’t nest % blocks. The block of the foreach loop splits each line by pipe delimiter and returns just the 5th column (first column is numbered 0).&lt;/p&gt;

&lt;p&gt;The next command in the chain is &lt;strong&gt;group&lt;/strong&gt;, an alias for Group-Object, in this case we’re grouping by a calculated property, whether the output of the previous command is greater than or equal to 256. By saying “-noelement”, I’m saying I don’t need an enumerated list of the values, which in this case are unimportant.&lt;/p&gt;

&lt;p&gt;Finally, we get to &lt;strong&gt;ft&lt;/strong&gt; (Format-Table). It is necessary because the Count column may be over 99999, in which case the value is truncated. The option “-autosize” causes PowerShell to make it fit instead.&lt;/p&gt;

&lt;p&gt;However, for a 500&amp;#160;MB test file, this command takes about 5.5 minutes to run as measured by Measure-Command. A typical file is over 2&amp;#160;GB, where waiting 20+ minutes is undesirably long.&lt;/p&gt;

&lt;p&gt;I posted a query to StackOverflow for some ideas.&lt;/p&gt;

&lt;p&gt;While I waited, I discovered that 2500 was the optimum value for -ReadCount, getting the command execution time down to about 3.5 minutes.&lt;/p&gt;

&lt;p&gt;Within minutes, I got a helpful hint from Gisli to look into using the .NET StreamReader. Here&amp;#8217;s what that script looks like:&lt;/p&gt;

&lt;pre&gt;
=== begin Show-SourceCounts.ps1 ===
param($file = $(Read-Host -prompt "File"))
$fullName = (Get-Item "$file").FullName
$sr = New-Object System.IO.StreamReader("$fullName")
$trueCount = 0; 
$falseCount = 0; 
while (($line = $sr.ReadLine()) -ne $null) {
      if ($line -like 'HEAD|') { continue }
      if ($line.split("|")[4] -ge 256) { 
            $trueCount++
      }
      else {
            $falseCount++
      }
}
$sr.Dispose() 
write "True count:   $trueCount"
write "False count: $falseCount"
=== end file ===

&lt;/pre&gt;

&lt;p&gt;This script yields the same results as the first command, but in about a minute. Quite an improvement!&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/16027425866</link><guid>http://agiletapir.tumblr.com/post/16027425866</guid><pubDate>Tue, 17 Jan 2012 15:54:00 -0700</pubDate><category>powershell</category></item><item><title>PowerShell to the rescue!</title><description>&lt;p&gt;I encountered a situation today at work that lent itself to PowerShell. One of the developers asked for some information about the PowerShell line I wrote to diagnose this problem, and I thought it might make a good blog post.&lt;/p&gt;

&lt;p&gt;There was a pipe-delimited file that was failing to import into a database via our program, and the QA person was having trouble figuring out why. The process yielded a stack trace, which pointed to a certain stored procedure and a SQL error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;System.Data.SqlClient.SqlException: Error during [stored procedure]: [stored procedure]; 4; 
  String or binary data would be truncated. at System.Data.SqlClient.SqlConnection.OnError
  (SqlException exception, Boolean breakConnection)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The stack trace clearly suggests that an input is exceeding a field length. Question was which one. As it turned out, there was only one column being inserted by this procedure. I did a quick schema lookup and found out that the column in question allows 50 characters.&lt;/p&gt;

&lt;p&gt;So, I wrote:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gc failing_input_file.txt | % {$_.split("|")[4] } `
  | ? { $_.Length -gt 50 } | select –unique | measure –line
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The query yielded 255 offending rows, and led to an alteration of the INSERT stored procedure to truncate the value from the flat file.&lt;/p&gt;

&lt;p&gt;The rest of this post is copied wholesale from that email.&lt;/p&gt;

&lt;p&gt;Let me restate it a command at a time, and expand the aliases.&lt;/p&gt;

&lt;p&gt;Most common PowerShell commands have an alias, which you can look at via &lt;strong&gt;Get-Alias&lt;/strong&gt;. In general, if you want to know about a command, you type “&lt;strong&gt;Get-Help&lt;/strong&gt; command-name”. I put a backtick after each line to continue the line, as is the PowerShell custom.&lt;/p&gt;

&lt;p&gt;Many cmdlets (read: “command-lets”) do pipeline processing, which if you haven’t seen it means that the previous command’s output is handed to the next piece as input. The special variable $_ is the current whatever &amp;#8212; in this case, the current line. With most commands like with select and measure, $_ is inferred.&lt;/p&gt;

&lt;p&gt;PowerShell offers full access to .NET. The strings it returns are .NET strings, which is why Split() just works.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Get-Content failing_input_file.txt `      
| ForEach-Object {$_.split("|")[4] } `    
| Where-Object { $_.Length -gt 50 } `     
| Select-Object –unique `                 
| Measure-Object –line                    
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first line with &lt;strong&gt;Get-Content&lt;/strong&gt; reads in the contents of the file.
For each line of the file, the second part with the &lt;strong&gt;Foreach-Object&lt;/strong&gt; splits that line by &amp;#8220;|&amp;#8221; and grabs the 5th item.
The &lt;strong&gt;Select-Object&lt;/strong&gt; command omits duplicates.
The &lt;strong&gt;Measure-Object&lt;/strong&gt; command counts the number of lines.&lt;/p&gt;

&lt;p&gt;If you want the contract names themselves, leave off the Measure-Object call:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gc failing_input_file.txt `
| % {$_.split("|")[4] } ` 
| ? { $_.Length -gt 50 } `                                                       
| select –unique
&lt;/code&gt;&lt;/pre&gt;</description><link>http://agiletapir.tumblr.com/post/14248781755</link><guid>http://agiletapir.tumblr.com/post/14248781755</guid><pubDate>Wed, 14 Dec 2011 20:55:00 -0700</pubDate><category>powershell</category><category>troubleshooting</category></item><item><title>Ubiquitous Capture</title><description>&lt;p&gt;The idea behind ubiquitous capture is that you can dump things on your mind into a storage medium (notebook, what have you) so that you don&amp;#8217;t have to tie up attention re-remembering things to keep them fresh in your mind. I have David Allen and Merlin Mann to thank for convincing me this is a good idea.&lt;/p&gt;

&lt;p&gt;Today, after listening to Brett Terpstra on Mac Power Users, I&amp;#8217;m trying a new (to me) ubiquitous capture workflow. It&amp;#8217;s slightly different than what&amp;#8217;s discussed on the show.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;lingua franca&lt;/em&gt; is &lt;a href="http://daringfireball.net/projects/markdown/syntax"&gt;Markdown&lt;/a&gt;. The more I use it, the more I like it.&lt;/p&gt;

&lt;h3&gt;Software&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;&lt;em&gt;nvALT&lt;/em&gt; 2.1, Brett Terpstra&amp;#8217;s fork of Notational Velocity&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Byword&lt;/em&gt; 1.4, a minimalist and sexy Markdown-friendly text editor ($9.99)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dropbox&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Nocs&lt;/em&gt; for iPhone, a Markdown-friendly editor with Dropbox support&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Setup&lt;/h3&gt;

&lt;ul&gt;&lt;li&gt;Change the note storage location for nvALT to a Dropbox folder&lt;/li&gt;
&lt;li&gt;Add .md as a text extension in nvALT (see &lt;a href="https://skitch.com/jesmithiv/fpk26/md-ext"&gt;this Skitch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Tell nvALT to store and read notes on disk as Plain Text Files&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Let me know what you think.&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/11969675211</link><guid>http://agiletapir.tumblr.com/post/11969675211</guid><pubDate>Wed, 26 Oct 2011 18:02:24 -0600</pubDate><category>markdown</category><category>software</category><category>workflow</category></item><item><title>Quotes From Some Folks</title><description>&lt;a href="http://www.timelessinformation.com/quotes-from-some-folks/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+TimelessInformation+%28Timeless+Information%29"&gt;Quotes From Some Folks&lt;/a&gt;: Quotes From Some Folks Timeless Information &lt;div style="float: right; margin-left: 10px;"&gt;
			&lt;a href="http://bit.ly/t75Hyp"&gt;&lt;br/&gt;&lt;img src="http://bit.ly/rZlBx0" height="61" width="50"/&gt;&lt;br/&gt;&lt;/a&gt;
		&lt;/div&gt;
&lt;p&gt;Hey all.  It is me, Armen, also known as the coolest guy on and off the internet, back with another post~.  I do it for the people.  This one is about quotes some fellow bloggers(I might as well use that term for a change, but I’m not a blogger, I’m a site-writer) use on a regular basis in their thoughts, or that they use as a motto, or that they are quite fond of.&lt;/p&gt;
&lt;p&gt;As you read these quotes, you might want to think about a quote that you have running in your thoughts at regular times.  It could be a short one like “Just do it” that you use to get things started or completed, or “what goes around comes around” to deal with someone wronging you.  Whatever it may be, it can be good to know what quotes are in your thoughts on a regular basis.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img style="float: right; padding: 4px; margin: 0 0 2px 7px;" title="mike-king-business-216x250" src="http://bit.ly/tttxBz" alt="" width="196" height="226"/&gt;My first quote is from Mike King, writer at &lt;a href="http://learnthis.ca/"&gt;Learn This&lt;/a&gt;, and his quote of usage is:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;You miss 100% of all the shots you never take. -  Wayne Gretzky&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Mike knows what’s up.  Are you a guy?  Did you not talk to that girl at the coffee shop?  Guess what.  That was a shot and you missed it.  Are you a girl?  Did you not talk to that guy at the coffee shop?  Guess what.  Well, society expects him to talk to you so I guess this doesn’t relate to the quote so well.  Are you a student?  Did you leave something out of your essay because you thought it might not be well-received, even though you had an inkling it might make it one of the top essays?  That shot was missed folks.  Are you a parent?  Did you not sign your daughter up for the musical instrument class because you weren’t sure they could handle it?  That shot was also missed.&lt;/p&gt;
&lt;p&gt;As we go through our day, we see shot after shot.  Even people that do barely anything see opportunities they can take advantage of, but instead, they miss out on them.  Who wants to miss a shot?  Noone, that’s who.  22% is higher than 0% most days of the week.  31% is also higher than 0%.  I can do more of these math problems but my calculator will run out of ink if I keep using it here.&lt;/p&gt;
&lt;p&gt;A doctor might be wavering between two methods of treatment for a patient, with one having 40% chance of success and the other having a 15% chance of success.  However, if he keeps deciding for hours until the patient is no longer functional, he now has a 0% chance of successful treatment, and that’s a fact you can take to the bank or your local credit union if you aren’t a fan of the recent big bank monthly fee additions.&lt;/p&gt;
&lt;p&gt;Onto the next blogger and their quote—&lt;/p&gt;
&lt;p&gt;&lt;img style="float: left; padding: 4px; margin: 0 7px 2px 0;" title="Photo_on_2009-12-02_at_23.52" src="http://bit.ly/utT3KY" alt="" width="200" height="150"/&gt;Used by Bud Hennekes, writer at &lt;a href="http://bit.ly/rVaHL0"&gt;A Boundless World&lt;/a&gt;  we have:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;This too shall pass.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This quote is a useful one for many different situations that can come up.  It is more for the hard times than for the good times(I think it is almost only for the hard times).  Let’s say you are in a period of unemployment, or lack a partner, or have an illness, or have just experienced grief.  Then, this quote fits your situation.  You must remember that terrible things have come and gone for all people through all of history.  Thinking that your ‘thing’ is the end-all is about as realistic as thinking that teen singers are going to bring forth a powerful voice.&lt;/p&gt;
&lt;p&gt;This quote is not one you should use during a good time.  Actually, it is.  At that time, it will remind you that your good time will pass, and that you need to make sure you take care of the foundational parts so that you can return to a regular mood in a stable fashion.  Sometimes, when you are in a good mood, you do things that would not make sense if you knew the good mood would just last another 10 minutes.&lt;/p&gt;
&lt;p&gt;Let’s say you start a new job.  The first two weeks might be tough because you know so little about the environment and other people and requirements.  That is the harder period.  That period shall pass, and you will then be in a position and have competency in it, so here is another example where you should use this quote.&lt;/p&gt;
&lt;p&gt;To the third quote–&lt;/p&gt;
&lt;p&gt;&lt;img style="float: right; padding: 4px; margin: 0 0 2px 7px;" title="Farnoosh_Brock_Twitter" src="http://bit.ly/uAfw3m" alt="" width="209" height="193"/&gt;This one is used by Farnoosh Brock of &lt;a href="http://bit.ly/sRxQ8o"&gt;Prolific Living&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The lust for comfort kills the passions of the soul. – Khalil Gibran&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Let’s first discuss the lust for comfort.  Who is looking for comfort?  Most people are.  You’re probably looking for comfort.  We seek that feel-good feeling of safety, relaxation, and well-being.  While this is great, it is actually terrible.  When you strive for that boring comfort that we all know is the comfort most people are thinking of, you give up risk-taking, and risk-taking is necessary for the “passions of the soul” that is present in the 2nd half of this quote.  To see that lounge chair in the sun with no worries type of comfort, one sets aside the roughness and toughness required to have enough of a thick skin to follow one of those passions of the soul.  Find me some person who followed one of their passions who had an easy time with it.  Whether this is Eminem, Tony Hawk, Sheryl Swoops, or J.K. Rowling, following your passion basically requires you to walk around with a big piece of armor across your chest, to protect from stupid people trying to cut away at your self-confidence, so that you quit making them look weak in comparison.&lt;/p&gt;
&lt;p&gt;I hope you liked that last line.&lt;/p&gt;
&lt;p&gt;So, therefore, we have to cut away those weak thoughts of comfort-seeking when we have them.  It’s that simple.  When the thought of some idealistic future comfort comes in your mind, tell yourself “this is stupid”, and move on.&lt;/p&gt;
&lt;p&gt;Speaking of the passions of the soul, it is sort of interesting how so many people have them.  We sometimes think only 5% of people have big passions because they are the only ones who make it, but there are a huge chunk of people, possibly like yourself, who have big passions and don’t touch them out of fear of whatever.  They have big passions too, but they just don’t act on them.  Near the end of people’s lives, they could care less how much money they have in the bank, or other stupid things, but people do regret not following their passion.&lt;/p&gt;
&lt;p&gt;&lt;img style="float: left; padding: 4px; margin: 0 7px 2px 0;" title="019s" src="http://bit.ly/rFzS3a" alt="" width="225" height="225"/&gt;Our next quote comes from Peter Clemens, creator of &lt;a href="http://bit.ly/vkOW6D"&gt;The Change Blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;In matters of style, swim with the current; in matters of principle, stand like a rock. -  Thomas Jefferson&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Let me tell you.  Rocks are great.  They are like the symbol of stability and strength.  We will get back to that.&lt;/p&gt;
&lt;p&gt;First, let’s discuss the first half of this quote by the honorable Thomas Jefferson.  Regarding style, swim with the current, and be as others are.  This means to wear red if that is the thing that is happening, or to add some extra tone to your voice if that is what people are doing.  Style is something you bring for others, because the clothes you wear are for others to see, and the style you put in your craft is for others to enjoy and get fulfillment from.  This is why style is to be maintained in according with what people are currently doing and wanting to see.&lt;/p&gt;
&lt;p&gt;Now, as far as the second part of this quote, principle is something you don’t mess with.  Various folks have said “if you don’t stand for something, you’ll fall for anything.”  This is quite true.  Your principles have to remain whether times are good or bad.  That is why they are principles.  If you toss them away at the first sign of difficulty, what was the point of maintaining the charade of having them up until then?  If your principles involve being a strong family person, but you forget your family when some emergency occurs, how is that the case?  If you are against drug usage, and allow a peer to influence you into using one, what are you really against?  This list goes on and on.  If you are a person who speaks about environmental protection, but who starts bending the rules when it costs a little bit, why put up an act?  You’re not fooling anyone if you don’t live up to a principle you’ve set forth.&lt;/p&gt;
&lt;p&gt;It can get pretty heated up in here.&lt;/p&gt;
&lt;p&gt;&lt;img style="float: right; padding: 4px; margin: 0 0 2px 7px;" title="Vincent-Tan" src="http://bit.ly/vvLzzu" alt="" width="174" height="247"/&gt;The next quote is used by Vincent Tan, who writes over at &lt;a href="http://bit.ly/uS49zA"&gt;Health Money Success&lt;/a&gt;(one of the most direct site names you will see):&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Reaching your destination is all about taking one step at a time.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This quote reminds me of my one audio post about taking the first step for whatever you are working on.  Smart people break things into steps.  Giving a speech to 100 people might be a 12 step process involving steps for writing the speech, steps for acquiring the audience, steps for securing a venue, and steps for follow-up.  Big things get small real quickly when you break them apart.  A tree can have 100 branches and seem huge, but if they are cut off one at a time, the task is not so difficult.  Steps are the way we go from the first floor of our complex item to the second floor of the process.&lt;/p&gt;
&lt;p&gt;Now, if you take one step at a time, that means you aren’t try to ‘cheat the system’ or skip ahead.  Trying to speed by or find some secret faster path is a good way to lose time.  You do things one by one, one step at a time, and you pass the people who are either try to cheat their way through, or who aren’t doing anything.&lt;/p&gt;
&lt;p&gt;Making a great salad is as easy as some 10 steps that are done one by one, and the end result is healthy food you can eat for days.&lt;/p&gt;
&lt;p&gt;&lt;img style="float: left; padding: 4px; margin: 0 7px 2px 0;" title="celestine-chua" src="http://bit.ly/tUYNHI" alt="" width="199" height="261"/&gt;Our last quote here is one used by Celestine Chua from &lt;a href="http://bit.ly/vHIZfX"&gt;The Personal Excellence Blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If you want to get something you have never gotten before, you have to do something you’ve never done before.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Now, Celes has done a lot of things she’d never done before, and now she has gotten a lot of things she had not gotten before, so this quote certainly fits her.&lt;/p&gt;
&lt;p&gt;We have to understand this quote and then absorb it.  Let’s say what you are doing is called X, and it gives you Y.  Doing more X is going to give you more Y.  That is how the world works.  If you want M, you are going to need to do something different, like Z.  X is not going to get you M.  This makes life seem more appropriate and fair.  Instead of thinking doing more X will get you Y, and also M, and also whatever else, you will know that doing more X will just get you more Y, whatever that Y is.&lt;/p&gt;
&lt;p&gt;It is when you do or create something different that you get something different, and that you learn something new about yourself.&lt;/p&gt;
&lt;p&gt;If you are wanting to get a new client, you are going to need to reach out to potential clients in a new way.  Sitting there like you may have been will get you a new client as much as buying a lemon will help you make orange juice.&lt;/p&gt;
&lt;p&gt;I hope you all enjoyed these various quotes and my commentary upon them.&lt;/p&gt;
&lt;p&gt;Maybe I will hear from some of you folks/readers in the comments.  Which quote did you like best?  What is your own quote of usage?  Your feedback is cool and also gets you to learn more for yourself.&lt;/p&gt;
&lt;img src="http://bit.ly/rMwabb" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11896954338</link><guid>http://agiletapir.tumblr.com/post/11896954338</guid><pubDate>Mon, 24 Oct 2011 22:30:27 -0600</pubDate><category>Quotes From Some Folks Armen</category></item><item><title>The difference between management and leadership</title><description>&lt;a href="http://sethgodin.typepad.com/seths_blog/2011/10/the-difference-between-management-and-leadership.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+typepad%2Fsethsmainblog+%28Seth%27s+Blog%29"&gt;The difference between management and leadership&lt;/a&gt;: The difference between management and leadership Seth’s Blog &lt;div&gt;
&lt;p&gt;Managers work to get their employees to do what they did yesterday, but a little faster and a little cheaper.&lt;/p&gt;
&lt;p&gt;Leaders, on the other hand, know where they’d like to go, but understand that they can’t get there without their tribe, without giving those they lead the tools to make something happen.&lt;/p&gt;
&lt;p&gt;Managers want authority. Leaders take responsibility.&lt;/p&gt;
&lt;p&gt;We need both. But we have to be careful not to confuse them. And it helps to remember that leaders are scarce and thus more valuable.&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;a href="http://bit.ly/rLO81E"&gt;&lt;img src="http://bit.ly/i0sYkt" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/vncgyG"&gt;&lt;img src="http://bit.ly/g03ARQ" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/uxViYp" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11896953464</link><guid>http://agiletapir.tumblr.com/post/11896953464</guid><pubDate>Mon, 24 Oct 2011 22:30:25 -0600</pubDate><category>The difference between management and leadership Seth Godin</category></item><item><title>The new frontier</title><description>&lt;a href="http://sethgodin.typepad.com/seths_blog/2011/10/the-new-frontier.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+typepad%2Fsethsmainblog+%28Seth%27s+Blog%29"&gt;The new frontier&lt;/a&gt;: The new frontier Seth’s Blog &lt;div&gt;
&lt;p&gt;What, exactly, is wrong with the old frontier?&lt;/p&gt;
&lt;p&gt;When Google + launched, millions of formerly optimistic people became optimistic again. Maybe this was going to be the one, the social network with just the smart people and none of the lame stuff, none of the spam or the pitches or the people we’re trying to avoid.&lt;/p&gt;
&lt;p&gt;And the same thing is true when the pack runs to the new nightclub, the new technology, the new suburban subdivision. Maybe this will be the one…&lt;/p&gt;
&lt;p&gt;Of course, it rarely is. So much disappointment and so much bitterness. It’s never as great as you hoped it would be. Ennui and then, eventually, waiting for yet another new frontier.&lt;/p&gt;
&lt;p&gt;It’s the old frontier that actually presents the most interesting opportunities, because the shine has worn off. This is your platform for real innovation, innovation in a place or a market or a situation that truly is ready for it.&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;a href="http://bit.ly/nNzUa5"&gt;&lt;img src="http://bit.ly/i0sYkt" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/rhxXyg"&gt;&lt;img src="http://bit.ly/g03ARQ" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/oA9Ash" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11627823540</link><guid>http://agiletapir.tumblr.com/post/11627823540</guid><pubDate>Tue, 18 Oct 2011 16:31:14 -0600</pubDate><category>The new frontier Seth Godin</category></item><item><title>When Not to Use Scrum</title><description>&lt;a href="http://scrumcrazy.wordpress.com/2011/10/17/when-not-to-use-scrum/"&gt;When Not to Use Scrum&lt;/a&gt;: When Not to Use Scrum The Scrum Crazy Blog &lt;p&gt;Don’t get me wrong, people! I am CRAZY about Scrum. Just ask my wife(she gets sick of hearing about it sometimes)! I’m probably the biggest Scrum fan on the planet!&lt;/p&gt;
&lt;p&gt;However, I’ve encountered certain situations where it doesn’t seem like Scrum works well. They all pretty much boil down to two generic cases:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Applying Scrum to a problem domain it was not designed for, or&lt;/li&gt;
&lt;li&gt;Applying Scrum where people or processes actively or passively work against Scrum principles.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;IMO, Scrum may not be the best fit for:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Companies who will actively or passively work against Scrum and its major principles.
&lt;ul&gt;&lt;li&gt;This includes companies that do &lt;a href="http://bit.ly/nk85Mp"&gt;Faux Scrum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If the Company doesn’t care what process is used at the team level, and won’t constantly act against Scrum, then Scrum is fine at the team level.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Companies who are expecting a lot of benefits from Scrum but cannot commit to doing Scrum in a good faith, holistic, way.
&lt;ul&gt;&lt;li&gt;How does one do Scrum in a holistic way? &lt;a href="http://bit.ly/ofA55S"&gt;Look to the Scrum Guide first&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Companies that like to matrix numerous people into numerous projects.
&lt;ul&gt;&lt;li&gt;Matrixing at the Product Owner or ScrumMaster level *may* be ok(but probably not optimum) if the people are experienced/highly knowledgeable in those roles.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Teams who cannot commit to a week of fairly fixed scope (say, where &lt; ~70-80% of the scope is fixed for a week).
&lt;ul&gt;&lt;li&gt;Examples of teams that sometimes cannot hold to this are generally interrupt driven type organizations, like network support, production support, software operation support, etc. A Kanban type of approach can be considered with such highly variable scope, but I’m not a fan of the Kanban movement yet because it is still incubating IMO.&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Be careful on this one.  If your team experiences high scope churn, it may just be a really bad dysfunction that needs rectifying.  Look closely before discarding Scrum here.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Teams where members and/or leaders will actively or passively work against Scrum and its major principles.
&lt;ul&gt;&lt;li&gt;This includes companies that do &lt;a href="http://bit.ly/nk85Mp"&gt;Faux Scrum&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Stealth approaches are fine, but if there isn’t enough consensus to work within the Scrum framework(especially from team leaders), then results will probably be mediocre.&lt;/li&gt;
&lt;li&gt;I have seen some team leads(or functional managers) who embrace the principle of self organization (always to a point, especially if the team lead has more command and control responsibility from above), and I have seen team leads who just can’t let go of the authority. In cases where a team leader cannot let go of the authority, Scrum may be a disaster, especially for those advocating for it. If you’re in one of these situations and you really love Scrum, find a new team or organization to work for that truly embraces Scrum.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Something other than software development.
&lt;ul&gt;&lt;li&gt;It’s my personal view that true Scrum is for software development. One can adapt Scrum to other domains, but then it’s not really Scrum any more. One can certainly use “adapted pseudo Scrum” effectively, but that’s only if the person guiding the adaptations is a Scrum and/or process expert. I strongly believe that many Scrum concepts can be “lifted out” and used very successfully elsewhere — but again, that’s not really Scrum any more IMO.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Again, please don’t take this the wrong way and use these scenarios as an excuse to “give up on Scrum.” Scrum is about the “art of the possible,” and the only time it doesn’t work is when it is not ‘possible.’ I believe the situations above to be when Scrum *may* not be possible (or at least very difficult). In pretty much any other situations than the ones described above, I will defend Scrum heavily as possible and potentially highly beneficial.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Below are some examples of interesting situations where I didn’t think Scrum was the best fit.&lt;/p&gt;
&lt;h3&gt;Example #1&lt;/h3&gt;
&lt;p&gt;I had a company call me once for advice on Scrum. In short, they were doing the typical consulting firm thing where everyone works on ~3+ projects at once, which meant ~3+ different teams for each team member. I told her they either need to re-org into teams that work as teams, or forget about Scrum and find something else. I love Scrum, but matrix hell is Scrumbut City and it won’t work.&lt;/p&gt;
&lt;h3&gt;Example #2&lt;/h3&gt;
&lt;p&gt;(in this one I didn’t recommend against Scrum per se)&lt;/p&gt;
&lt;p&gt;I interviewed to be a Scrum Coach(as a consultant) with a company. They had a couple of major Scrumbuts that they were unwilling to change, yet they expected to obtain significant productivity gains from using Scrum and wanted me to make that happen. An hour or so after the interview, I called the person who set up the interview and I told them I didn’t believe they would reap the benefits they sought because they weren’t really willing to embrace Scrum. As such, since I didn’t think it would be a successful engagement, I politely declined.&lt;/p&gt;
&lt;br/&gt;&lt;a rel="nofollow" href="http://bit.ly/r50RSX"&gt;&lt;img alt="" border="0" src="http://bit.ly/pdO9BB"/&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://bit.ly/nfcSNH"&gt;&lt;img alt="" border="0" src="http://bit.ly/nj9WoS"/&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://bit.ly/n2gEQs"&gt;&lt;img alt="" border="0" src="http://bit.ly/o3waNC"/&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://bit.ly/qfaazh"&gt;&lt;img alt="" border="0" src="http://bit.ly/qUmZx0"/&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://bit.ly/rhmR5h"&gt;&lt;img alt="" border="0" src="http://bit.ly/qtDUsV"/&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://bit.ly/remurV"&gt;&lt;img alt="" border="0" src="http://bit.ly/nF9rrV"/&gt;&lt;/a&gt; &lt;a rel="nofollow" href="http://bit.ly/pxdt8t"&gt;&lt;img alt="" border="0" src="http://bit.ly/q3RdSb"/&gt;&lt;/a&gt; &lt;img alt="" border="0" src="http://bit.ly/p7chBh" width="1" height="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11627822892</link><guid>http://agiletapir.tumblr.com/post/11627822892</guid><pubDate>Tue, 18 Oct 2011 16:31:13 -0600</pubDate><category>When Not to Use Scrum charlesbradley</category></item><item><title>Oct 7, 2011 - Ten Years Later</title><description>&lt;a href="http://www.calamitiesofnature.com/archive/?c=594&amp;utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+calamitiesofnature+%28Calamities+of+Nature+-+RSS+Feed%29"&gt;Oct 7, 2011 - Ten Years Later&lt;/a&gt;: &lt;p&gt;Oct 7, 2011 - Ten Years Later Calamities of Nature &lt;a href="http://bit.ly/okvAdr"&gt;&lt;img src="http://bit.ly/pNgZQ6" border="0"/&gt;&lt;/a&gt;
	&lt;br/&gt;&lt;a href="http://bit.ly/okvAdr"&gt;Home&lt;/a&gt; | &lt;a href="http://bit.ly/q38saH"&gt;About&lt;/a&gt; | &lt;a href="http://bit.ly/qqeypB"&gt;Archive&lt;/a&gt; | &lt;a href="http://bit.ly/ncvQWw"&gt;Random&lt;/a&gt; | &lt;a href="http://bit.ly/qpSzKX"&gt;Store&lt;/a&gt; | &lt;a href="http://on.fb.me/oHa3Bh"&gt;Facebook&lt;/a&gt; | &lt;a href="mailto:calamitiesofnature@gmail.com"&gt;Contact&lt;/a&gt;
	&lt;br/&gt;&lt;br/&gt;&lt;a href="http://bit.ly/quc9uG"&gt;&lt;img src="http://bit.ly/qXuqXV"/&gt;&lt;/a&gt;
	&lt;br/&gt;
	You can see more graphs and plots &lt;a href="http://bit.ly/oofGpk"&gt;here&lt;/a&gt;.
	&lt;br/&gt;&lt;br/&gt;&lt;a href="http://bit.ly/p71TZX"&gt;&lt;img src="http://bit.ly/pkWNgT" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/reEMyp"&gt;&lt;img src="http://bit.ly/mTsQk9" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/nd5PPj"&gt;&lt;img src="http://bit.ly/r7qkYu" border="0" width="16" height="16"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/oUqTud"&gt;&lt;img src="http://bit.ly/nzDzDl" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/pYCe97"&gt;&lt;img src="http://bit.ly/qDcIw3" border="0"/&gt;&lt;/a&gt; &lt;a href="http://on.fb.me/nZvlUx"&gt;&lt;img src="http://bit.ly/qsSrQI" border="0"/&gt;&lt;/a&gt; - &lt;a href="http://bit.ly/ofWQ8Z"&gt;Steal this comic&lt;/a&gt; - &lt;a href="http://bit.ly/q3tmXy"&gt;Buy original art&lt;/a&gt; - &lt;a href="http://bit.ly/o5iyCZ"&gt;Comment&lt;/a&gt;
	&lt;br/&gt;&lt;br/&gt;&lt;img src="http://bit.ly/o9YDuR" height="1" width="1"/&gt;&lt;/p&gt;</description><link>http://agiletapir.tumblr.com/post/11345267360</link><guid>http://agiletapir.tumblr.com/post/11345267360</guid><pubDate>Tue, 11 Oct 2011 23:15:52 -0600</pubDate><category>Oct 7</category><category>2011 - Ten Years Later (author unknown)</category></item><item><title>Open conversations (or close them)</title><description>&lt;a href="http://sethgodin.typepad.com/seths_blog/2011/10/open-conversations-or-close-them.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+typepad%2Fsethsmainblog+%28Seth%27s+Blog%29"&gt;Open conversations (or close them)&lt;/a&gt;: Open conversations (or close them) Seth’s Blog &lt;div&gt;
&lt;p&gt;A guy walks into a shop that sells ties. He’s opened the conversation by walking in.&lt;/p&gt;
&lt;p&gt;Salesman says, “can I help you?”&lt;/p&gt;
&lt;p&gt;The conversation is now closed. The prospect can politely say, “no thanks, just looking.”&lt;/p&gt;
&lt;p&gt;Consider the alternative: “That’s a [insert adjective here] tie you’re wearing, sir. Where did you buy it?”&lt;/p&gt;
&lt;p&gt;Conversation is now open. Attention has been paid, a rapport can be built. They can talk about ties. And good taste.&lt;/p&gt;
&lt;p&gt;Or consider a patron at a fancy restaurant. He was served an old piece of fish, something hardly worth the place’s reputation. On the way out, he says to the chef,&lt;/p&gt;
&lt;p&gt;“It must be hard to get great fish on Mondays. I’m afraid the filet I was served had turned.”&lt;/p&gt;
&lt;p&gt;If the chef says, “I’m sorry you didn’t enjoy your meal…” then the conversation is over. The patron has been rebuffed, the feedback considered merely whining and a matter of personal perspective.&lt;/p&gt;
&lt;p&gt;What if the chef said instead, “what kind of fish was it?” What if the chef invited the patron back into the kitchen to take a look at the process and was asked for feedback?&lt;/p&gt;
&lt;p&gt;Open conversations generate loyalty, sales and most of all, learning… for both sides.&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;a href="http://bit.ly/nDAxL0"&gt;&lt;img src="http://bit.ly/i0sYkt" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/o4xIBT"&gt;&lt;img src="http://bit.ly/g03ARQ" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/qbdP1p" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11344723684</link><guid>http://agiletapir.tumblr.com/post/11344723684</guid><pubDate>Tue, 11 Oct 2011 22:45:44 -0600</pubDate><category>Open conversations (or close them) Seth Godin</category></item><item><title>Event Sourcing as a strategic advantage</title><description>&lt;a href="http://lostechies.com/jimmybogard/2011/10/11/event-sourcing-as-a-strategic-advantage/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+GrabBagOfT+%28Jimmy+Bogard%29"&gt;Event Sourcing as a strategic advantage&lt;/a&gt;: Event Sourcing as a strategic advantage Jimmy Bogard’s Blog &lt;p&gt;Very often you hear Domain-Driven Design recommended as an approach that should not be applied except in a few key strategic scenarios. The reasons for this are quite simple: DDD is expensive. Not in the time it takes to code the patterns (typing is cheap), but in the time it takes to build an understanding of the domain, form a model, and refine that model over time. The code is cheap, the conversations leading up to the code are expensive.&lt;/p&gt;
&lt;p&gt;That said, DDD is an effective approach when the system you’re building is part of the strategic advantage of the business. If the system is important to the company because its revenue depends on how well the system aligns with the company’s short- and long-term objectives, then it will probably (hopefully) receive enough investment to realize that strategic advantage.&lt;/p&gt;
&lt;p&gt;If you’re already going the DDD route, you’ll eventually come to a choice on what mechanism you’d like to use to model your domain. Currently, you have two major choices:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Persisting current state&lt;/li&gt;
&lt;li&gt;Persisting as a stream of events&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The first approach is the “traditional” DDD approach, most thoroughly explained in the “&lt;a href="http://bit.ly/oSCpr5"&gt;Applying Domain-Driven Design and Patterns&lt;/a&gt;” book. This is where you’ll find technical discussions on entities, aggregates, repositories and so on.&lt;/p&gt;
&lt;p&gt;If you’ve already taken the plunge to “do DDD”, then &lt;a href="http://bit.ly/qM0mEd"&gt;Event Sourcing&lt;/a&gt; as a means of enhancing the strategic advantage that DDD brings is something that should be seriously considered.&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;Strategic advantages of event sourcing&lt;/h3&gt;
&lt;p&gt;Event sourcing is simply a mechanism of realizing state by capturing a stream of events. The final picture of state is available by replaying sequence of events that led to that final state.&lt;/p&gt;
&lt;p&gt;In television crime drama shows, the investigators walk into a crime scene, which represents the final state of a system. Then there’s some sort of flashback where the crime is replayed as the series of events that led to that final result. Without the television magic of replaying the events, it’s difficult to deduce why the current state is where it is. &lt;strong&gt;But if you’re trying to understand &lt;em&gt;why&lt;/em&gt; the current state is what it is, the final state is not nearly as useful as the series of events that led to that endpoint.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In critical business systems, state is often not nearly as important as the behavior that led to that current state. This behavior could be users purchasing items, orders being shipped, etc. These events are what reflect the health of the business, as they represent activities that actually result in revenue for the business.&lt;/p&gt;
&lt;p&gt;As a business matures, you often see that in order to promote growth of the business, their strategic advantage lies in how well they understand the &lt;em&gt;why&lt;/em&gt; of where their revenue comes from. It’s not enough that we sold 10000 widgets. Why did we sell that many? How can we sell more? &lt;strong&gt;Events provide insight into how the system came to be in its current state&lt;/strong&gt;. It’s replaying the crime scene to determine the guilty. Without replaying, we can only make an educational guess.&lt;/p&gt;
&lt;p&gt;Because businesses care so much about why the current state is what it is, explicitly modeling state as a stream of events aligns with the business’s goals.&lt;/p&gt;
&lt;h3&gt;Event sourcing in the enterprise&lt;/h3&gt;
&lt;p&gt;As the business grows, more and more areas want to react more quickly to changes happening in the system. Instead of being fed a daily feed of data, they want to be fed events. Don’t give me a feed of users every day, give me a list of new users, users who have moved, users who have cancelled their account. Don’t force me to reverse-engineer the crime scene, just tell me what happened.&lt;/p&gt;
&lt;p&gt;In order for ancillary services in the enterprise to most effectively react to changes, they need to be aware of the business-level events that have happened. Just having access to data doesn’t describe what has happened. With events, individual services can determine how they want to react to business-scoped events, like “UserRegistered” or “AccountCancelled”. &lt;strong&gt;A single feed that tries to capture all this information in a single stream then puts the burden on the consumer to try to figure out what actually happened.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With event sourcing, our events are explicit in the system, and much more easily exposed to the enterprise. Furthermore, for historical purposes, it’s also much easier to perform data mining of business events when we capture events explicitly.&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;Event sourcing as an investment&lt;/h3&gt;
&lt;p&gt;Modeling state as a stream of events means you’re committing to capturing behavior explicitly, instead of capturing state. It’s an investment, not because it’s hard to capture events, but because of the conversations required to surface what the events and behavior should be. &lt;strong&gt;State is easy to figure out. Behavior is not.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;However, if the business isn’t making an investment in a system that you believe needs event sourcing/DDD, it’s likely because:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Ignorance of the strategic investment these approaches bring&lt;/li&gt;
&lt;li&gt;Lack of capital to actually make the investment (cart before the horse scenario)&lt;/li&gt;
&lt;li&gt;The system isn’t as important as you think it is&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Be careful that you’re not falling into the last one. Sometimes the system you’re working on just isn’t a part of the business’s strategic goals, and it’s just a tactical response. Otherwise, it’s just a matter of having a conversation with the business to see if they’re more interested in the current picture, or the sequence of events and behaviors that led to the current state. Current state is easy with event sourcing, it just matters if the business is interested in how they got there.&lt;/p&gt;
&lt;div&gt;
&lt;a href="http://bit.ly/nKBLWY"&gt;&lt;img src="http://bit.ly/oqz66d" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/p6zPe3"&gt;&lt;img src="http://bit.ly/oRjG6V" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/pOmymy"&gt;&lt;img src="http://bit.ly/qfvbjj" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/o3wFq2" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11344543598</link><guid>http://agiletapir.tumblr.com/post/11344543598</guid><pubDate>Tue, 11 Oct 2011 22:31:10 -0600</pubDate><category>Event Sourcing as a strategic advantage Jimmy Bogard</category></item><item><title>Steve Jobs (1955-2011)</title><description>&lt;a href="http://www.presentationzen.com/presentationzen/2011/10/steve-jobs-1955-2011.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+PresentationZen+%28Presentation+Zen%29"&gt;Steve Jobs (1955-2011)&lt;/a&gt;: Steve Jobs (1955-2011) Presentation Zen &lt;div&gt;
&lt;p&gt;&lt;span style="color: #111111;"&gt; &lt;a href="http://bit.ly/dOmtSd" style="float: right;"&gt;&lt;img alt="Steve_jobs" src="http://bit.ly/psnU9R" style="width: 220px; margin: 0px 0px 5px 5px;" title="Steve_jobs"/&gt;&lt;/a&gt; Steve Jobs passed away today. He was just 56. Steve often talked about changing the world, and &lt;em&gt;he did&lt;/em&gt; change the world in a huge way. His incredible dedication to detail and to simplicity and aesthetics raised the bar for technology, business, and design, and beyond. He even raised the bar for presentations. He was a true master. He was a true sensei. All his presentations were great, but my favorite one of Steve’s is not his usual Apple presentation, but rather a short 15-minute speech delivered from behind a lectern at Stanford University in the spring of 2005. There is nothing I can say that has not been said before about this legendary man. I have no words. I hope you’ll have a chance to listen to Steve’s Stanford speech once again.&lt;/span&gt; (&lt;a href="http://bit.ly/qeqJ9Y"&gt;日本語 version&lt;/a&gt;.)&lt;span style="color: #111111;"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #111111;"&gt;Steve’s words are inspiring. Steve Jobs was—and will long remain—an inspiration for so many. Good bye, Sensei. We miss you.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p style="text-align: left;"&gt;&lt;em&gt;&lt;span style="color: #111111;"&gt;“Your time is limited, so don’t waste it living someone else’s life. Don’t be trapped by dogma — which is living with the results of other people’s thinking. Don’t let the noise of others’ opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.”&lt;br/&gt;&lt;/span&gt;                                &lt;br/&gt;&lt;span style="color: #111111;"&gt;                                                         — Steve Jobs&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align: left;"&gt;&lt;em&gt;&lt;span style="color: #111111;"&gt;&lt;br/&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;&lt;div&gt;
&lt;a href="http://bit.ly/rir7PS"&gt;&lt;img src="http://bit.ly/ncx7hN" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/ovWFhj"&gt;&lt;img src="http://bit.ly/qOgNnE" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/pRjiPs" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11092630975</link><guid>http://agiletapir.tumblr.com/post/11092630975</guid><pubDate>Wed, 05 Oct 2011 23:30:45 -0600</pubDate><category>Steve Jobs (1955-2011) Garr</category></item><item><title>Creativity</title><description>&lt;a href="http://agileconsortium.blogspot.com/2011/09/creativity.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+blogspot%2FCdKs+%28Agile+%26+Business%29"&gt;Creativity&lt;/a&gt;: Creativity Agile &amp; Business &lt;div dir="ltr" style="text-align: left;"&gt;
&lt;div style="clear: both; text-align: center;"&gt;
&lt;a href="http://bit.ly/nj1CSX" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="206" src="http://bit.ly/nCEv2N" width="320"/&gt;&lt;/a&gt;
&lt;/div&gt;
A friend was reading Daniel Pink’s book called Drive. And so I started reading it.&lt;br/&gt;&lt;br/&gt;
I had this series of thoughts.&lt;br/&gt;&lt;br/&gt;
First, I have for a long time thought that the key thing about our jobs is creativity.  Takeuchi and Nonaka call it knowledge creation, but to me it remains essentially the same thing.  And it covers many domains: business, technical, people, customer, marketing, etc, etc.  We must be, as a team at least, creative in all these different domains. Innovative, inventive, combining things in a new and interesting way, just coming up with something that seems weird at first, seeing something new that is elegant.&lt;br/&gt;&lt;br/&gt;
I find that there are, in overly simple terms, two types of people I run into.&lt;br/&gt;
People who are ok with creativity and chaos, and people who are not.&lt;br/&gt;&lt;br/&gt;
The people in that second group do not create much in the exercises we do in the Scrum classes.  They tend to want to ‘edit’ or restrict work too soon. They tend to both give and take restrictions on the ‘scope’ far too soon. They tend to ask me to restrict or define the exercise, as though they were afraid of chaos. &lt;br/&gt;&lt;br/&gt;
And Daniel Pink’s book makes me think that they (those in the second group) have not realized how their own internal thoughts and feelings inhibit their creativity. They &lt;i&gt;want&lt;/i&gt; to be too orderly, too soon.  They want to &lt;i&gt;edit&lt;/i&gt; themselves before they have gotten a useful body of ideas out on the table to play with. They &lt;i&gt;fear&lt;/i&gt; that play is not real work.  They worry much too soon about ‘are we &lt;i&gt;on target&lt;/i&gt;’. They fear the &lt;i&gt;subconscious&lt;/i&gt;, and want everything to be arrived at logically.&lt;br/&gt;&lt;br/&gt;
In other words, they have told themselves a bunch of lies about their own motivation (to focus on the subject of Daniel Pink’s book).  They are not inherently less creative, at least according to this (my) hypothesis.  They just have ‘rewarded’ themselves so wrongly that less creativity comes out.&lt;br/&gt;&lt;br/&gt;
Now, it may be that some teams are just less creative. Period.&lt;br/&gt;&lt;br/&gt;
But before deciding that, let’s give them dance lessons.  Let’s have them play.  Let’s ask them to break their own mental boundaries in some meaningful way.  And see what they can really do once the blinders come off.&lt;br/&gt;&lt;br/&gt;
If you run into a team that basically is in the second category, I would work with them to identify their ideas and concerns about creativity.  My hope is that by talking it through, they can start to allow themselves more chaos and creativity.  And also more fun!&lt;br/&gt;&lt;br/&gt;
In closing, let me repeat here what Jeff Sutherland has often said: If they are not having more fun, then they are not playing Scrum the right way.&lt;br/&gt;&lt;br/&gt;
I think he means this in two ways;&lt;br/&gt;
- only by having fun will their best come out&lt;br/&gt;
- fun, serious fun, is a value for human beings in and of itself.  It does not need to be justified in any other way.&lt;br/&gt;&lt;br/&gt;
Note: I do not think Jeff would condone ‘trivial fun’.  My example of that might be: eating a whole bowl of candy on Halloween.  Fun in a certain use of the word, but not good for you.  I mean, and I think he means, fun that gives deeper satisfactions than that.&lt;br/&gt;&lt;br/&gt;
Note: The picture or mindmap above comes from this page:&lt;br/&gt;&lt;a href="http://bit.ly/nDZpld"&gt;&lt;a href="http://bit.ly/nDZpld"&gt;http://bit.ly/nDZpld&lt;/a&gt;&lt;/a&gt;&lt;br/&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="http://bit.ly/nIqG6S" rel="alternate"&gt;&lt;img src="http://bit.ly/qV2DnH" alt="" style="vertical-align: middle; border: 0;"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/nIqG6S" rel="alternate"&gt;Subscribe in a reader&lt;/a&gt;&lt;/p&gt;
&lt;img width="1" height="1" src="http://bit.ly/rcUvIn" alt=""/&gt;&lt;/div&gt;&lt;div&gt;
&lt;a href="http://bit.ly/pYVCpF"&gt;&lt;img src="http://bit.ly/qkkYMW" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/r2KIe0"&gt;&lt;img src="http://bit.ly/r19zUU" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/qf2kZ2"&gt;&lt;img src="http://bit.ly/qmj9tE" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://agiletapir.tumblr.com/post/11092307597</link><guid>http://agiletapir.tumblr.com/post/11092307597</guid><pubDate>Wed, 05 Oct 2011 23:16:15 -0600</pubDate><category>Creativity noreply@blogger.com (Joe Little)</category></item><item><title>Crop Guidelines for Portrait Photography</title><description>&lt;a href="http://www.petapixel.com/2011/09/29/crop-guidelines-for-portrait-photography/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+PetaPixel+%28PetaPixel%29"&gt;Crop Guidelines for Portrait Photography&lt;/a&gt;: Crop Guidelines for Portrait Photography PetaPixel &lt;p&gt;&lt;img src="http://bit.ly/r22Saj" alt="" title="guidelines" width="223" height="330"/&gt;&lt;/p&gt;&lt;p&gt;Here’s a helpful illustration that shows acceptable places to crop when shooting portraits. Cropping at green lines should be fine, while cropping at red lines might leave you with an awkward looking photograph.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;i&gt;&lt;strong&gt;Image credit&lt;/strong&gt;: &lt;a href="http://bit.ly/p6Zqjk"&gt;Don’t Chop at the red&lt;/a&gt; by &lt;a href="http://bit.ly/nqnp3Q"&gt;J. Southard Photography&lt;/a&gt;&lt;/i&gt;&lt;/p&gt; &lt;div&gt;
&lt;a href="http://bit.ly/qoqkvC"&gt;&lt;img src="http://bit.ly/dOXBCG" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/nsJdJD"&gt;&lt;img src="http://bit.ly/oFyVo8" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/pOXhc5"&gt;&lt;img src="http://bit.ly/fa80Pc" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/o10CUo"&gt;&lt;img src="http://bit.ly/qytFCJ" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/pjSQF4"&gt;&lt;img src="http://bit.ly/pvrYB2" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/pIW12l"&gt;&lt;img src="http://bit.ly/r6DGnF" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/nU13Mm" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11092307127</link><guid>http://agiletapir.tumblr.com/post/11092307127</guid><pubDate>Wed, 05 Oct 2011 23:16:14 -0600</pubDate><category>Crop Guidelines for Portrait Photography Michael Zhang</category></item><item><title>The forever recession (and the coming revolution)</title><description>&lt;a href="http://sethgodin.typepad.com/seths_blog/2011/09/the-forever-recession.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+typepad%2Fsethsmainblog+%28Seth%27s+Blog%29"&gt;The forever recession (and the coming revolution)&lt;/a&gt;: The forever recession (and the coming revolution) Seth’s Blog &lt;div&gt;
&lt;p&gt;There are actually two recessions:&lt;/p&gt;
&lt;p&gt;The first is the cyclical one, the one that inevitably comes and then inevitably goes. There’s plenty of evidence that intervention can shorten it, and also indications that overdoing a response to it is a waste or even harmful.&lt;/p&gt;
&lt;p&gt;The other recession, though, the one with the loss of “good factory jobs” and systemic unemployment—I fear that this recession is here forever.&lt;/p&gt;
&lt;p&gt;Why do we believe that jobs where we are paid really good money to do work that can be systemized, written in a manual and/or exported are going to come back &lt;em&gt;ever&lt;/em&gt;? The internet has squeezed inefficiencies out of many systems, and the ability to move work around, coordinate activity and digitize data all combine to eliminate a wide swath of the jobs the industrial age created.&lt;/p&gt;
&lt;p&gt;There’s a race to the bottom, one where communities fight to suspend labor and environmental rules in order to become the world’s cheapest supplier. The problem with the race to the bottom is that you might win…&lt;/p&gt;
&lt;p&gt;Factories were at the center of the industrial age. Buildings where workers came together to efficiently craft cars, pottery, insurance policies and organ transplants—these are job-centric activities, places where local inefficiencies are trumped by the gains from mass production and interchangeable parts. If local labor costs the industrialist more, he has to pay it, because what choice does he have?&lt;/p&gt;
&lt;p&gt;No longer. If it can be systemized, it will be. If the pressured middleman can find a cheaper source, she will. If the unaffiliated consumer can save a nickel by clicking over here or over there, then that’s what’s going to happen.&lt;/p&gt;
&lt;p&gt;It was the inefficiency caused by geography that permitted local workers to earn a better wage, and it was the inefficiency of imperfect communication that allowed companies to charge higher prices.&lt;/p&gt;
&lt;p&gt;The industrial age, the one that started with the industrial revolution, is fading away. It is no longer the growth engine of the economy and it seems absurd to imagine that great pay for replaceable work is on the horizon.&lt;/p&gt;
&lt;p&gt;This represents a significant discontinuity, a life-changing disappointment for hard-working people who are hoping for stability but are unlikely to get it. It’s a recession, the recession of a hundred years of the growth of the industrial complex.&lt;/p&gt;
&lt;p&gt;I’m not a pessimist, though, because the new revolution, the revolution of connection, creates all sorts of new productivity and new opportunities. Not for repetitive factory work, though, not for the sort of thing ADP measures. Most of the wealth created by this revolution doesn’t look like a job, not a full time one anyway.&lt;/p&gt;
&lt;p&gt;When everyone has a laptop and connection to the world, then everyone owns a factory. Instead of coming together physically, we have the ability to come together virtually, to earn attention, to connect labor and resources, to deliver value.&lt;/p&gt;
&lt;p&gt;Stressful? Of course it is. No one is trained in how to do this, in how to initiate, to visualize, to solve interesting problems and then deliver. Some see the new work as a hodgepodge of little projects, a pale imitation of a ‘real’ job. Others realize that this is a platform for a kind of art, a far more level playing field in which owning a factory isn’t a birthright for a tiny minority but something that hundreds of millions of people have the chance to do.&lt;/p&gt;
&lt;p&gt;Gears are going to be shifted regardless. In one direction is lowered expectations and plenty of burger flipping… in the other is a race to the top, in which individuals who are awaiting instructions begin to give them instead.&lt;/p&gt;
&lt;p&gt;The future feels a lot more like marketing—it’s impromptu, it’s based on innovation and inspiration, and it involves connections between and among people—and a lot less like factory work, in which you do what you did yesterday, but faster and cheaper.&lt;/p&gt;
&lt;p&gt;This means we may need to change our expectations, change our training and change how we engage with the future. Still, it’s better than fighting for a status quo that is no longer. The good news is clear: every forever recession is followed by a lifetime of growth from the next thing…&lt;/p&gt;
&lt;p&gt;Job creation is a false idol. The future is about gigs and assets and art and an ever-shifting series of partnerships and projects. It will change the fabric of our society along the way. No one is demanding that we &lt;em&gt;like&lt;/em&gt; the change, but the sooner we see it and set out to become an irreplaceable linchpin, the faster the pain will fade, as we get down to the work that needs to be (and now can be) done.&lt;/p&gt;
&lt;p&gt;This revolution is at least as big as the last one, and the last one changed everything.&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;a href="http://bit.ly/mVZiHJ"&gt;&lt;img src="http://bit.ly/i0sYkt" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/pOk2yp"&gt;&lt;img src="http://bit.ly/g03ARQ" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/pbePsF" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11092306540</link><guid>http://agiletapir.tumblr.com/post/11092306540</guid><pubDate>Wed, 05 Oct 2011 23:16:12 -0600</pubDate><category>The forever recession (and the coming revolution) Seth Godin</category></item><item><title>What to do next</title><description>&lt;a href="http://sethgodin.typepad.com/seths_blog/2011/10/what-to-do-next.html?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+typepad%2Fsethsmainblog+%28Seth%27s+Blog%29"&gt;What to do next&lt;/a&gt;: What to do next Seth’s Blog &lt;div&gt;
&lt;p&gt;This is the most important decision in your career (or even your day).&lt;/p&gt;
&lt;p&gt;It didn’t used to be. &lt;em&gt;What next&lt;/em&gt; used to be a question answered by your boss or your clients.&lt;/p&gt;
&lt;p&gt;With so many opportunities and so many constraints, successfully picking what to do next is your moment of highest leverage. It deserves more time and attention than most people give it.&lt;/p&gt;
&lt;p&gt;If you’re not willing to face the abyss of choice, you will almost certainly not spend enough time dancing with opportunity.&lt;/p&gt;
&lt;/div&gt;&lt;div&gt;
&lt;a href="http://bit.ly/q7Mkrg"&gt;&lt;img src="http://bit.ly/i0sYkt" border="0"/&gt;&lt;/a&gt; &lt;a href="http://bit.ly/q9spz3"&gt;&lt;img src="http://bit.ly/g03ARQ" border="0"/&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://bit.ly/qWS7bM" height="1" width="1"/&gt;</description><link>http://agiletapir.tumblr.com/post/11082397632</link><guid>http://agiletapir.tumblr.com/post/11082397632</guid><pubDate>Wed, 05 Oct 2011 19:01:21 -0600</pubDate><category>What to do next Seth Godin</category></item></channel></rss>
