Critical Path

A colleague of mine recently asked what I meant by "critical path." I gave her the following example, which she suggested I share:

Critical path is a project management term. It represents the longest running sequence of tasks required to complete a project.

For example, given the following tasks:

    • Task A takes 1 hour.
    • Task B takes 2 hours.
    • Task C takes 30 minutes.
    • Task D takes 45 minutes.

If the tasks must be completed in alphabetical order, then the critical path is A-B-C-D. And, the project will be complete in about 4.25 hours.

But, if you have a helper, and the tasks only need to start in alphabetical order, then the critical path is A-C-D. And, the project will be complete in about 2.25 hours. 

    • Elapsed Time 0:00 - You start task A. Your helper starts task B.
    • Elapsed Time 1:00 - You finish task A. You start task C
    • Elapsed Time 1:30 - You finish task C. You start task D.
    • Elapsed Time 2:00 - Your helper finishes task B.
    • Elapsed Time 2:15 - You finish task D.

But, what does an agile software developer need with an antiquated term like critical path? I was using it in the context of removing engineering work from a broader business process that could be completed faster if the other department involved could execute their tasks in parallel with engineering. So, there!


It’s 10:15pm. I woke up at 3:30am to catch my 6:15 flight to San Francisco. I should be in bed. But, I want to get something up on the blog about what’s going on.

For those of you who don’t know already, I accepted a software engineer position with last month. The job is in San Francisco. So, I’m traveling back and forth this month to help Jill with the move. I fly down Monday morning and home Thursday evening. It’s a bit frenetic. But, it’s worth it.

I’m too tired to write more right now. Suffice to say that I’m enjoying myself immensely and I’m learning an incredible amount of cool new stuff!


A garden's for life...

Portia Tung:

And no matter how much we try to hurry the seed along, Nature will run its course. Assigning ten gardeners won’t make the seed grow faster. In fact, fussing about with the seed could put it in peril.


As my father says, “A garden’s for life. And it needs you.” Given this commitment, it’s natural to want to make repetitive tasks, like weeding, as effective and efficient as possible so you have time to “grow” things.

I couldn’t have put it better myself.

Banishing the Inner Critic...

Denise Jacobs on A List Apart:

Why be concerned with your inner critic? In essence, an overactive inner critic acts as a deterrent between the seedlings of great ideas and the fruits of accomplishment. Don’t think you have an inner critic? Think again. The question is not if the troll is there, but rather how big, loud, and disarmingly influential and persuasive it is.

The article is targeted at web creatives. But, I think it’s equally applicable to my last post about courage. The inner critic is what you need the courage to overcome most of the time.

A lesson in courage...

Kent Beck in Extreme Programming Explained (first edition, page 31):

We will be successful when we have a style that celebrates a consistent set of values that serve both human and commercial needs: communication, simplicity, feedback, and courage.

Of all the agile values, courage is the one that doesn’t translate directly into specific practices. Communication is fostered by sitting together in an open space. Simple design pushes the simplicity meme, as does refactoring out duplication and YAGNI. And, feedback is built into the processes with things like Sprint Reviews and Retrospectives. But, courage? Which one of the practices embodies courage?

This is not a question I was asking myself. It wasn’t even on my mind until my test-obsessed friend and mentor, Elisabeth Hendrickson, offered to let me pair program with her on Entaggle this week. You see, Entaggle is written in Ruby using Rails, rSpec and Cucumber – tools I’ve never used. And, I have (as Elisabeth so delicately put it) “competence issues” – meaning that I have a fear of incompetence.

So, I was fairly aware that it was going to take some courage to overcome my fear of not knowing the tools in order to just sit next to Elisabeth in front of a keyboard. But, it wasn’t until we were sitting there and Elisabeth was muttering on about how she couldn’t believe she was showing me the code in such a sorry state – in need of multiple refactorings – that I realized that pairing with me took as much courage from Elisabeth as pairing with her took from me.

Suffice to say that the next time I sit down to pair program with someone, I’m going to be cognizant of the courage it took to bring both of us together with the code. I might even go so far as to recognize it before we begin pairing, just to get the fears out in the open so we can move past them.

I also think the next time I pair with Elisabeth, I’m going to muster the courage to write at least one test. (I can’t believe we didn’t write one!)

CSS: Taking control of the cascade

CSS: Taking control of the cascade – by Jason Z. at the always excellent Signal to Noise blog by 37signals – contains the single best articulation I’ve seen on how to implement HTML5 in this example:

We began to see a relationship between our mark-up and the underlying data structure in our app’s models. HTML5’s section came to represent the model, article the individual records. For example:

        <section class="todolists">
            <article class="todolist">
                <header>Launch list</header>
                    <li>Get final sign-off</li>
                    <li>Deploy to production</li>
                    <li>Publish launch post</li>

And, when combined with compiled CSS frameworks like LESS or SASS, your CSS can have the same structure, like this:

article.todolist {
    > header { 
        > h1 {color: red; font-weight: bold;} 
        > a {color: blue;} 
    > ul { 
        margin: 10px 0; 
        padding: 0; 

        > li {font-size: 13px;} 

Note the use of the CSS child selector (>). This selector prevents the cascading of the styles beyond the specific nodes specified. But, I’ve said enough. Go read the article already.


Technical Debt is Something to be Managed

Paul Dyson in Technical Debt and the Lean Startup (via @KentBeck):

In a startup, technical debt is something to be managed, not minimised. We make sure we understand how much debt we have and which bits of the system it affects. We make sure we have the ability to pay down that debt as and when we need to. And, we make sure we work the time and money required to pay down the debt into any timescales or budgets we agree.

The whole piece is great. Worth a read. If I would change anything, I might apply the same thinking more broadly: “Technical debt is something to be managed, not minimised.”


Roles on Agile Teams

Elisabeth Hendrickson, in Testing is a Whole Team Activity:

Testing is an activity. Testers happen to be really good at it. We need testers on Agile teams. But, if we want real agility, we need to see that completing testing as part of the sprint is the responsibility of the whole team, not just the testers.

To which my brain immediately responded:

Programming is an activity. Programmers happen to be really good at it. We need programmers on Agile teams. But, if we want real agility, we need to see that completing programming as part of the sprint is the responsibility of the whole team, not just the programmers.

Thing is, you could put any traditional software development role (e.g. “planner”, “builder”, etc.) into that paragraph and it would work. Try it. It really works.

Kent Beck's Ideal Job Description

From Kent Beck’s Idea Job Description (written as a letter of recommendation 3 years from now):

We brought Kent on board with the premise that he would help our existing and new engineers be more effective as a team. He has enhanced our ability to grow and prosper while hiring at a sane pace.

Sounds like future Kent had fun on that assignment! But, he also tweeted this:

just wrote my ideal job description. now i’m terrified I won’t get it.


Internet Tools for Small Business

I met a small businessman seeking advice regarding his website the other day. After discussing his needs for a few minutes, I discovered several potential pain points with his existing infrastructure. In this post, I’ll describe the problems I saw and dole out some free advice.

What issues did I see?

  • The company was unable to obtain it’s desired .COM domain name; so it purchased the same name under the .NET domain. This would be fine ordinarily. But, it turns out that the .COM domain name actually belongs to another company in the same industry. So, anyone who mistakenly types .COM rather that .NET will end up on the other company’s website.
  • Next, in order to put on a more professional face, the company also purchased a .COM domain for email. Both domains were purchased through the same hosting company. But, the .COM domain is used exclusively for email, while the .NET domain is used for hosting their website. So, now, if someone tries to navigate to the website at the email address on the fellow’s business card, they are presented with a generic “Under Construction” page, rather than their existing web site.
  • Maintaining the existing web site requires technical skills that don’t exist at the company. 
  • Finally, the company’s email system is not meeting their needs. Inboxes are limited to 100 MB, or 80 times less space than GMail. And, large file transfers are particularly problematic.

So, what would I do about these issues?

  1. First things first: Move the web site to the .COM domain and redirect the .NET domain to it. Now, it doesn’t matter which address people use, they’ll end up on the more prestigious .COM domain. That solves both 1 and 2, above. This would likely not cost a dime.
  2. Next, I’d move the site to a content management platform, like WordPress or TypePad, that would allow non-technical staff to make changes to the content of the site without requiring the assistance of a programmer. This might cost a few dollars a month. (I’d also highly recommend redesigning the site in the process, which would cost more than simply porting the existing site, but would pay off in improved retention of customers.)
  3. Third, I’d recommend moving the company’s email over to either Google Apps for Business, or Microsoft Office 365 – both of which can be used with a custom domain name. This would cost $5 (Google) or $6 (Microsoft) a month per user. 4 And, for the extra large file transfers, I’d probably recommend something like
  4. I might also recommend transferring the domains to a new DNS host like, allowing them to turn off their now superfluous web host.
  5. Finally, if the company chose to redesign their web site, I would also recommend a business card redesign, using the same motif as the web site to bring some consistency to the brand. I’ve used to do exactly this for Code Gardener.

Yes, these changes will likely raise the cost of the company’s web infrastructure, possibly even by as much as an order of magnitude (from $10 to $100 per month.) But, overall, the administration will be simpler, and they won’t need to hire developers to make simple changes to their website. So, in the long run, the company will likely save money.

Full disclosure: Those links are referrals. If you follow them and sign up for an account, I get Moo Money from Moo, more free space from Dropbox or a month of free service from DNSimple. But, there’s something in it for you, too: Both Dropbox and DNSimple will give you the same thing they give me when you sign up.