Wednesday, April 30, 2014

Pain-Driven Prioritization

How do you decide what's top on the priority list?

There's lots of methods, to be fair. I've always been a big fan of looking for the items with the largest Return on Investment (ROI).  The idea with this method of prioritization is that you have a portfolio of possible projects, and you figure out how much each will cost and what dollar value you could assign to the benefits of doing the project.

In the CFA curriculum, this is all discussed in the context of investments.  You want to figure out what a project is worth, so you make a few assumptions about the benefits, tot up what you know about the costs, net them out and project them back into today's dollars.  You end up either calculating the Net Present Value, or the Internal Rate of Return on investment, sort by that, and then make the biggest one your priority (to first order).  The discussion of these concepts is bigger than this little blog, but let me simplify.

All these things come down to always doing projects first that will give you the biggest bang for your buck.

And that's all good.  Figure out which project is the best spend of today's dollar to net you solid expected returns.  Some projects fold, estimations can be off, but if you have a diverse portfolio of projects and you're honest about your costs and benefits, these techniques can really work for you in the long run.

But what if you can't do that?  Some companies can't do this.  They either lack the talent of estimation, or the future is too murky to do projections, or all projects they look at have the same return, or even the organization is such a mess that any form of planning never really happens.  What can an organization like that do?

Well, one tech department I've worked with used, in part at least, a technique I always called Pain-Driven Prioritization.  Let's take the case of a very manual development process.  If you have three things that might possibly help the process along and only finite resources, what do you do?

You figure out what hurts the most and fix that.  If you can spend a few hours automating your build process, or your deployment mechanism, or how you manage tickets, it's time that will be saved down the road. Sometimes it's not the time savings, it's the friction savings.  If you can cost your developers fewer packet drops due to context switching and keep them focused on adding the business value that matters, you come out ahead.

You may be correctly thinking, "Well, this is still nothing more than bang for your buck, right?"

Precisely.

So why does this work, and why does it feel like such a different perspective to me?  Because it allows you to interview people and say, "Okay, this process is painful.  Where does it hurt?"  I've found, that if confronted with a question about how to improve their day, the response is usually about removal of roadblocks, or getting rid of annoyances.  It's hard for me to overestimate the power of improving people's days by removing the annoyances they face.

Ask any team, "Where is your pain?"  They can tell you.  Why have they not done what it takes to be out of pain?  Because they have goals, deadlines, business requirements to implement.  And they're not automatically wrong in doing this.

You can't sharpen your saw after every stroke, but you can't let it dull for years either.  Somewhere in there is the right responsible moment to pull out the rasp.

So take an assessment with your team.  Or extend it beyond the team to the business customers you serve. Where is the pain?  Let the pain be your guide.

I guess there's another name for this type of prioritization.  It's triage, and maybe we should begin using that term more in our communities when it comes to setting priorities.

How to Know You're on the Right Track

I noticed recently that whenever I'm trying to find a solution to a problem, I feel as if I can tell I'm going in the right direction by the amount of obstacles I run into while solving.  I'm not suggesting I've found my internal compass for coming to good solutions, nor am I suggestions that my solutions are the best.  Far from it.

Whenever there's a technical issue with a problem I'm tackling, my first and only thought is, "I can't be the only one to have ever come across this problem before."  And then I ask the Google who has conquered this hill already, and it tells me that some user on StackOverflow.com happens to have done this exact thing. Hopefully.  This single guiding thought is what gets me through most days.

And sometimes, it's not so easy to find someone facing your particular issue.  I've actually met teams whose technical hubris is so great that they believe their personal genius is indicated by the fact that no one has solved their problem.  That they are a unique flower solving problems in the most awesome way.  So often, however, it's because they've gone so far off the beaten path that they can find no one else in their situation to help them.

Let me talk through a hypothetical:

I have a web site I've built.  I need to get it deployed to a place where someone can see it.  I could manually build the solution, and copy the files to a server.  That's easy.  But then I start deploying more often.  And because I want to push changes so frequently, I end up spending a larger percentage of my time deploying instead of delivering business value.

So I have a couple options.  I can either grab a COTS (Commercial, Off-The-Shelf) solution that can build and deploy my software, or I could write a batch file that does a dos xcopy and be done with it.  There's a learning curve associated with the former solution, and almost none for the latter, so I go for the xcopy script.

Now I'm a couple years down the road.  I never wanted to take on the learning curve of TFS or Team City or Octopus or any of the other build/deploy solutions there were out there.  It doesn't take long, except now I might have four environments across many different products.  What was one xcopy batch file has grown to many nicely refactored batch files, and the parameters passed in correctly build and deploy my solutions across my enterprise.

All I've done is spent the cost of learning and purchase of the COTS system over a much longer period of time.  And who knows, maybe because it does what I want and only what I want, I've done it for cheaper. And it works.  What's wrong with that?

Well, nothing really.  Except you've committed to this solution, and every time something new comes up, it's a new problem that has to be solved.  Need to deal with restarting application pools, services, change configs, it's a new problem.  You have to spend time figuring out how it works in your framework.  When anyone new joins the team, there's a non-trivial learning curve to it.

Now let's rewind time and take the other path:

Say at that critical juncture, I went with a COTS solution.  When I need to do something new, because there's a larger body of people using the same solution, the likelihood that any particular problem you face has been solved goes way up.  With communities like StackOverflow out there, it's easy to find the information you need.  Not how to cobble a solution together from duct tape and baling wire, but to leverage the tool in the ways it was intended.

So with my home-grown solution, every problem I have compounds, and it gets harder to find a solution to my singular little problem.  Every patch to my system becomes hand-crafted.  And involving anyone else to aid gets harder.  With the COTS solution, every time I need an answer, there's more likely to be someone that's already solved my problem.

This is not to argue for build/deploy systems, or make a case for buy vs. build.  This discussion is only to illustrate the point: one way of knowing you're on the right track is when answers to your questions get easier and easier, not harder and harder.  This whole concept seems to be related to the Pit of Success, or even Stacking Functions, but that's a discussion for another day.

Also, I want to point out that these arguments all go out the window if you're intentionally trying to innovate. For lots of solutions, including build/deploy, that's probably not you.  If you're writing a bunch of custom devops tools to work around your solutions, for instance, that can be a smell that you're not going in the right direction.  If you are a small company who wants to build the best new build/deploy system out there, however, then being off the beaten path may be a sign that you're going in the right direction.

I've often heard it said, "buy commodity, build competitive advantage."  This advice is intertwined, I think. If you're working on commodity problems, pick up commodity solutions so the answers are out there.  Save your energy to innovate on the tough problems your business faces. They truly need you, and they trust you to make these decisions.

Travel Notes - Haikus Through Colorado

Why the heck did I do it?  Why the heck do I do anything?  Because it's fun.  All my trip notes were posted on FB in haiku form.  I decided to collect them here for convenience.

I am going to 
Make all my Denver trip notes
Vacation haiku.

Airport people rude. 
TSA? A-OK day. 
Very early flight.

Today's flight theme should be:
Middle aged women go pee.
They all brush past me.

Stewardess must rest
The flight is not very full
N keeps magazines

So many plane snacks!
We're on the way to Denver
Do not have munchies

Marijuana ha.
If I had it could I say
Vituperously?

Prep for baggage claim
I have to remember this:
To stay baggage calm

Plane is on descent
Can't describe how excited
Let the fun begin!

Happy Birthday N
Hope you have a great weekend
Rocky Mountain "Huh"?

We have just landed
No head shop in the airport?
Denver, WTF?

The crisp mountain air.
At the passenger pickup
Is so refreshing!

Say hello to the
Devil horse with orange eyes.
Bids farewell to you.

Denver Biscuit Co
Biscuit Cinnamon Roll yum
Denver is awesome

Only 10 a.m.
Two sandwiches already.
Delicious Denver.

Haha too much food.
I will need to run it off.
Time for food coma?

Amphitheatre:
Red Rocks. Am I out of shape?
Or just short of breath?

Photo: Uh oh where's Nicole.  I need to get a picture.  Oh shit - a selfie!
Uh oh where's Nicole. 
I need to get a picture. 
Oh shit - a selfie!

Girl walking up the
Red Rocks trail barefoot. "Good for
You, little hippie."

Thirsty Lion closed.
They open next Tuesday ... But...
Today lunch is free...

Photo: From the thirsty lion, 16th St Market - training day. We sure lucked out.
From the thirsty lion, 
16th St Market - training 
Day. We sure lucked out.

Got back in the car. 
Time on car is 4:20.
Ironic, ain't it?

Just chill and get Thai.
After long, wonderful day.
Now is time for sleep.

If you do not know,
And an argument will blow,
Google that shit, yo.

Nikki is sleeping
But I am not tired enough.
She is so adorbs.

Oh how I love a
Raucous round of Cards Against
Humanity. Good times.

Just so you all know.
Nicole's birthday tomorrow.
In case she forgets.

BeauJo's Pizza place
Has pizza with Mountain crust.
Dip that in honey.

Photo: This is mountain crust.  Chicken cordon bleu pizza. First bite amazing!
This is mountain crust. 
Chicken cordon bleu pizza. 
First bite amazing!

A beautiful day
In a tiny mountain town.
With beautiful girls.

Seem to be fighting
Constant battery issues.
Jeez. Seriously.

Photo: Kourtnie likes pictures.
So we took us a selfie.
While we were waiting.
Kourtnie likes pictures.
So we took us a selfie.
While we were waiting.

Off to see Boulder.
"A bunch of dirty hippies."
I can't wait to see.

Looking forward to
Seeing Odd 13 Brewing 
Out in Lafayette.

I got my first whiff
Of earthy B.O. just now
In downtown Boulder.

Pearl St. In Boulder.
Far more girls wearing bras than
I had expected.

50/50 is
Male to female ratio.
Odds good but goods odd.

Black IPA yum
At Odd 13 Brewing Co.
In Lafayette yeah.

Photo: Yep, that's filet mignon.  With bleu cheese on crostini.  Fucking amazeballs.
Yep, that's filet mignon. 
With bleu cheese on crostini. 
Fucking amazeballs.

Ok, so anyone
Want to buy our roomy house?
Moving to Denver....

Okay I get it.
Howl at the Moon not for dudes 
Just the drunk bridesmaids.


Oh dear God I'm old.
Those are not dresses ladies.
They're hotdog casings!

Oh the things you see
Muffin tops on strapless dress.
Oh no! Can't unsee!

Photo: Somehow I managed... To be part of someone's night... Farewell, Felicia?
Somehow I managed
To be part of someone's night.
Farewell, Felicia?

Apparently I won't
"Live dat shit down" says Nicole.
Goddamn weirdo, yeah.

Oh it's my liver 
Had enough? It says to me.
Fucking pansy-ass.

Mmm, smell that bacon.
Kevin Anderson cooking.
Om nom nom nom nom.

Hey Nicole Davis!
Just got one thing to ask you.
Did you sleep alright?

Tommyknockers pub.
Tundrabeary summer ale.
Simply refreshing.

Photo: Notice something odd? Weird place for power outlet.  It's GFCI...
Notice something odd? 
Weird place for power outlet. 
It's GFCI...

Some fine Grecian food.
Final dinner of the trip.
Yummy baklava.

Two minutes twenty
Seconds is too long for a
Wall sit. My poor thighs!


This somehow, somehow,
Reminds me of our weekend.
Too much food and drink?

Haiku, like Twitter,
Creates beauty solely from 
Brute force brevity.

Is not here this morning. Please
Leave a message. Beeeeeeep!

Relaxing morning.
Some internets and email.
Back to reality...

Photo: Tattered Cover Books - A reminder of how I ... Don't read anymore.
Tattered Cover Books - 
A reminder of how I 
Don't read anymore.

Photo: I found a book that ... I might like, but I do not ... Feel that suburban.
I found a book that 
I might like, but I do not 
Feel that suburban.

Horrible person:
Cards Against Humanity...
This shit writes itself...

Unisex bathrooms.
What an awesome idea
For single seaters.

What's pane Bianco?
Really? For shame on Udi's!
We call it white bread.

Last Comic Standing 
Winner Josh Blue also ate
Lunch here at Udi's.

Our flight is delayed.
Probably the Midwest storms.
Don't wait up for us.

Alley sale behind
Says they sell "Furn tools" there. Might 
As well say "Turn fools."

At Denver Airport
Chilling with my lovely wife.
Ahhhh, what a great trip.

Dyson Airblade fine
But XLerator is
Better at drying.

In Denver Airport
You can now come in for a
Bikini waxing.

Wheels down Chicago.
Roughest descent in ever.
Hooray almost home!

Finally at home.
The haiku has to end now.
Bet you are relieved...

Tuesday, April 29, 2014

All of It - It's All Been About Communication

Last night, my son was struggling with his homework.  He was really upset about it.  He kept lamenting, begging me to answer, "Why, why do I have to do this over and over again?"

What he was working on was a punctuation worksheet.  I think he was putting semicolons with conjunctive adverbs (e.g. however, therefore) and commas with coordinate conjunctions (e.g., and, but) and working to avoid the dreaded run-on sentences and comma splices.  He said they'd been working on them for weeks, and that he got them, but was sick of typing or rewriting the sentences because they're boring and repetitive.

He was lamenting rhetorically, of course, but an answer came to me so clearly that it shames me that it never dawned on me before.

The point of grammar...

The point of punctuation...

The point of handwriting and typing...

The point of spelling...

The point of literature and reading and interpretation...

It's all about communication.  That's all it is.  Boiled down to its basic, it's all about communication.  And you will, of course, look and me and say, "Well, duh, Batman... Of course, it's about communication."

But I never made the connection.

See, everything I learned about clearly communicating in my life came from self-help books.  "Getting to Yes", "How to Win Friends and Influence People", "Crucial Conversations", and "Year to Success" are a handful that come to mind.

None of them had anything to do with spelling and grammar.  None of them had anything to do with interpreting the works of Shakespeare.  None of them had anything to do with comma splices and conjunctive adverbs or future perfect tense.  Not one word was offered on how spelling well helps you communicate in the business world.

Yet that's what we teach.  Why?  All these rote rules and reading of "classic" literature all point me in the direction of one thing: we teach that way because it's easy. Now don't get your underpants in a twisty bunch.  I'm not bagging on teachers.  Well, not all of them.

They teach a discipline.  They teach what they're taught to teach.  They teach what they see.  They're not teaching the why.  Teachers may eventually (maybe) get around to teaching Critical Thinking.  For me, that class wasn't available until college.  But in my university, critical thinking was a separate course.  For Honors Students.  As if that's not the most basic course everyone should take before all others.

Why didn't we see that before?  How could this simple truth be so opaque to me?

Because so many teachers can't communicate.

Monday, April 14, 2014

Get Rid of Useless Keys

Oh, I suppose we all do it.  Struggle with little stupid things that bug me, without even thinking about ways to solve them.  They are little problems in daily life whose frustrations don't even compound enough to make you think twice about them.

While trying to get something done this morning, I realized that I had accidentally hit the insert and caps lock key more than once this morning.  I'm a touch typist, so it didn't occur to me that something was amiss until I looked up at the screen to see that there was an issue.

I realized that in my entire adult life, I have never hit one of those keys intentionally.  Not once.  To the point that I wondered who still used these abominations and why they were still on the keyboard.  I wondered if there was an easy way to disable them.  Google gave me several answers, some of which were very outdated, but one that hit me as an industry standard way was to use AutoHotKey (AHK).

You can read about AHK at their site, but it basically is a little script that runs in the background and intercepts keystrokes, allowing you to do something when a certain hotkey is pressed.  On Windows-P, run some program, let's say.

So I downloaded it and with the following snippets I got from the AHK forums, I disabled both the Insert and the Caps Lock key.

CapsLock::SetCapsLockState, alwaysoff
!CapsLock::SetCapslockState, On

$Insert::return
!Insert::Send, {Insert} ; Alt+Insert toggles 'Insert mode'

Friday, April 4, 2014

DVCS and the Pinocchio Test

I know in this day and age there are still folks out there not using source control systems.  I can't help that. This post isn't for you.  Sorry.

I also know that there are some folks out there still using VSS.  Stop.  Do you not listen to your architects? Do you like having to deal with exclusive check-in/check-out locks?  What's the matter with you?

Even TFS, with its central hub, seems a bit quaint to anyone not stuck in a Corporate IT gig where you're forced to go with an on prem solution.  Sheez, at least move that stuff to TFS online.  But whatever.  At least you can merge and have simultaneous editing.

Yeah, I feel all the cool kids tell me they're using DVCS systems.  Cori Drew got me excited about git (though I don't use the powershell command line personally), and I've since used it for both part time work and my personal projects.  In my new organization, we're using Mercurial, so I'm getting to see this side of things now. My only personal regret is that I missed the Subversion era.

And for the most part, these DVCS systems are awesome.  There are some hassles, and you can get yourself in a real twist if you're not careful with branches, but overall, I quite like the experience.
One of the biggest issues I have with using DVCS systems (doesn't matter, Git and Hg have the exact same issues) with .NET is that the .csproj files are so fragile.  Two people want to add files and/or references to the project at the same time, and Visual Studio seems less than consistent about where it puts stuff, often leading to merge conflicts.  And get that merge wrong, and whoo, you are in for some rollbacks.

you're gonna have a bad time guy - Two people want to change a .csproj  file at the Same Time in a DVCS... You're gonna have a bad merge

So here's my recipe on how to handle this.
  1. if you're going to add a file or reference, do that first.  Add the empty file and the reference and check that in immediately.  You're adding an empty file or reference, so generally you're not going to break the build.  The point is to keep that .csproj file change open and out there for the minimum amount of time.
  2. I like to make sure that my tests are picked up and running, so I'll often write a Pinocchio test.  What's that?  Goes like this:
  3. namespace MyNamespace
    {
        [TestFixture]
        class MyTests
        {
            [Test]
            public void PinocchioTest()
            {
                //I wish I were a real test
            }
        }
    }
    
This cracks me up every time I see it, too.  I read it in the voice of Pinocchio from Shrek.

Tuesday, April 1, 2014

From an Empty Workspace to a Work of Art

Ok, so I've been working at this awesome new company for a month now.  In that month, I have worked from home a lot of times.  I think I was only downtown for six or seven days in March.

Much has been written about setting up your remote workspace to feel official, and more like you're working, as opposed to sitting on the sofa on your laptop in your PJs.  Remote work requires incredible discipline, and part of that is mentally partitioning your home life from your work life.

But mental partitioning is hard.  It is handy to have some sort of physical partition.  We do have a den with a computer in it, but it's not a dev machine, and that's where Nicole works.  I decided a while ago that I'd make my space in my basement.  But it's an unfinished basement, and there are no physical partitions.

So I decided to physically partition my space.  Not just for separation, but so that when I was on webcam, I wouldn't have an unfinished space as my backdrop.

But I'm not really in position to do a basement remodel at the moment.  So I figured I'd do what they do in the movies and stage shows.  I'd create a set.

I have a couple old stands that I once built for a garage sale.  They were originally meant to last two days and to allow me to hang some rigid 3/4" metal conduit between them to use as a clothes rack.  Instead I've used these two supports over the intervening years for all kinds of things.

For example, I have used them as something for Gamble to paint on.  One day out of the blue, I opened up some cans of old house paint, deck-screwed a plank of plywood onto the uprights and let Gamble go at it. You can clearly see the uprights here.  And this was seven years ago.  And these were repurposed then. Also, this video has one of the best punch lines of any I've ever shot.


I dragged these scraps of wood to our new place.  Since then I've used them as temporary uprights, laid down as a stand for when I'm bottling homebrew (it's perfect for the bottling bucket to sit on), and a number of other things.

As I mentioned earlier, I don't have the ability to do a full room in my basement just yet, but I need something to make it appear I'm in an office, so I repurposed those uprights by hanging a leftover 4x8 sheet of drywall on them.  And then painting it green.

It's leftover green paint from our living room, so it's quite a responsible shade.  I figured it would look very office-y, and it did.  I even hung a plaque and a That Conference camp sign on it.  And then I put casters on it, so that I could roll it in and out of frame as needs dictated.  And it was perfect.

But it was missing... something.   That certain je ne sais quoi that makes it me.  It was boring.

I will be damned if I can find the original art that inspired this project.  I have searched and searched and cannot find it, but if I ever do, I'll link to it here.  I'd seen a beautifully masked wall that was lovingly done up in geometric designs and then painted.  It was a phenomenal piece of wall art, and I figured that if I was going to have a little partial wall, I'd do something like that.

Because when you're presence is mostly online, your backdrop becomes part of your personality.  It's part of the setting.  Ze Frank has his steady backgrounds, and so does John Green, Ray William Johnson, iJustine.  Now, I'm not a vlogger, but if I'm going to spend a decent amount of time online, I'm going to need something immediately identifiable.  It's all about branding.

So I started with the wall, all by itself.  Here's a shot of it by itself from the back.  It's there in place in front of my dev rig.  Yes, I'm using the Peavey amp that I've had for about 25 years as a stand for my third monitor. That's the same amp I rocked out on for Random the other night, so it still sees use.

Here you can see the back of the wall. I've already started masking it.
And here's a closeup of the feet.  They weren't designed to be super stable.  They weren't designed for what I'm trying to do with it.  Yet do it, I have.

The little feet.  They weren't designed for this.  I'm no damned engineer, though I should have consulted with my stepbrothers, who both are.
And here you can see how I got started with the masking.  Gamble helped me at first, because my wingspan just wouldn't support it.  We put the first piece of tape on, then marked some dots an inch from the first piece of tape, put another piece of tape on with those lines, and so on.  The image wasn't really planned, only that I intended for it to evolve organically.
Some of the lines.  The first line placed was the leftmost long "forward slash."
Finished masking and ready for round 2.
So the idea was to paint this, but a single paint color is boring, and two is still kinda boring.  I've always been fascinated by street artists that do spraypaint work.  They get some incredibly realistic and sweet looking paintings from a few minutes of work and a few cans of spray paint.  There's some beautiful randomness here, and some beautiful order.

After all these years, he's still painting on these two uprights.
My vision here was for something nebulous.  Literally like the beautiful pictures you see of faraway space dust. My instructions to Gamble were, "Yeah, put some heavy blue paint there, but make it kinda random, and don't cover the green up completely, so that we get a cloud effect."

So here are all the colors of spray paint that I had and wanted to include.  I can't believe I had so much paint.  I'm sure Home Depot thinks I'm out taggin' and saggin'.
I admit I was skeptical at this point.  I look at the muddle of color there and think, Hooboy, what have I done?  That little random arc of red?  The shades of green and teal in the bottom right?  But I was confident that this was going to work, so I pressed on.  The next step was to add stars.  

Gamble and I had done this before, for a presentation he'd done on Exoplanets, planets beyond our solar system.  We took black poster board, sprayed white spray paint on our hands, and flicked the paint toward the board.  I did this here, too.  I flicked white paint as a star field over every part of the board.

Then I removed the tape.  This reveal was awesome.

This was just amazing when I saw it with the tape off.  
A closeup.  From faraway, you can see the blotchy color from the original, but close up, this really is a thing of beauty.  the strips of tape I took off the wall were as cool as the wall itself.
And of course, one more for the road.  I'm not explaining this shirt, though.  That's a story for another day.
BEAST MODE!
Well, that's how I got my new background.  Nicole insists that I need something more low key for the other side, so I can turn the wall 180 degrees and have a professional setting, so I'll probably do that, too. Anyone have a 4x8 sheet of drywall they can drop off?