Missing my sister

Kim and me in a young pose

Today Kim would've turned 41. I would've teased her about another year over 40, "it's all downhill from here" and other expected small talk. I would've asked her what she was doing today and she'd respond: "Going out to sushi with Crystal" and then "I'm driving up to Dad's this weekend."

And I'd get Ella on the phone so we could sing "Happy Birthday" to her. Kim would ask Ella about kindergarten, and about her trip to Kennywood and riding the roller coasters for the first time, and the latest Magic Tree House book she's read, and princesses and jewelry and other girl things.

But none of that is going to happen, because she's gone.

So instead we'll go out for sushi this evening and talk about Aunt Kim and how much we miss her. And, inside, I'll get a little mad at her again for not taking care of herself better and leaving us. And I'll steel that resolve to keep going to the gym, keep riding my bike, keep leaving a little food behind.

And then, late tonight, I'll think about us growing up and how we always had each other -- through my dad being gone on cruise, and moving all the time to new schools and new neighborhoods and new kids. And just soak in memory for a little while, even though they're ringed with sadness. Because that's what we have.

Permalink

Impressions of Pittsburgh TechFest

Saturday saw Pittsburgh's first TechFest, a day-long set of sessions with seven (!) tracks covering a number of different technologies and disciplines. I wound up getting there about 15 minutes after lunch ended[1] and ran into a former co-worker, and instead of going to the current session we chatted. Despite the environment (school halls aren't the best place for a hallway track) that's probably the best reason to attend an event like this. Sure, you learn things here and there -- and some of the sessions were long enough to get meaty -- but having a bunch of motivated people around each other is the real payoff.

The two sessions I did see appeared to be pretty different but wound up being quite similar in scope. The first was on Scala and Actors from Josh Suereth. Josh is both super nice and super smart, but that's not always a great combination for a presentation. The last time I saw him speak was in October 2010 for an overview of Scala, which (referring back to my notes) was jam packed with information but unfocused, which is a problem with a lot of technical presentations, including my own.

This was much different. Josh started by demoing in a shell the amount of Scala you needed to know for the presentation, and then moved on. It's so easy to get wrapped up in language intro because it's easy and I'm sure he could riff on Scala nuts and bolts for hours. But while it would be easier for Josh -- no preparation needed! -- that's not going to be as useful for the audience.

The main point of the talk was to discuss actors and some ways that they shape your solutions, to get you thinking in actors and appreciate some core differences as to how they'd shape design. A key point he mentioned multiple times is that you need to think topologically, not lexically (when thinking of error handling) or even in objects. To show what that meant he took a real-world problem (document indexing and searching with scatter-gather) and broke the system down into the important components, pointing out trade-offs and the reasons for doing things like creating temporary actors to hold the state (because the aggregating actor can only process a message at a time, you don't want it to wait).

He went pretty quickly through the material, but he covered a useful patch of ground in enough depth to provide lots of grist for your mill. And he also left enough time at the end to answer some substantive questions, even referncing deep detail (interaction with the Java memory model) about the Akka implementation of actors in response to a question about whether they could be ported to the CLR. It was exactly what I was hoping for.

The second talk I went to was on Hypermedia APIs from Steve Klabnik. I probably shouldn't have gone because (a) I've talked on this myself, and (b) pretty much knew what to expect from Steve. I also figured I'd agree with everything he said. (Which I did.)

But it was still very much a worthwhile talk. Steve knows this material backwards and forwards, and needed no notes to talk cogently and in depth about subjects as varied as his "favorite" RFCs, history of REST and its back-and-forth in the internet arena, and post-structuralism as it applies to decentralized networks of data and people. And while he referenced that it's hard to talk about REST without using its terms, he was able to explain things to newcomers clearly and concisely. The talk was an hour and a half, but it certainly didn't feel that way.

A couple thoughts I had during the talk:

  • It would be interesting to see a concrete example of a media type that could be interpreted different ways depending on its definition. (For example a 'screens' attribute in a media type describing a film's distribution vs 'screens' in a TSA report.) But, as he said, this is also as much art as it is science and to be done well would probably be another many minute talk. Which I look forward to hearing from Steve.
  • He referenced that we keep repeating the mistakes of distributed objects. Another great talk (which might go along with this presentation from Steve Vinoski) might go over why we keep doing so. Why do we keep repeating this? Is it because of the never-ending tension between management who wants interchangeable programmers and repeatable processes (e.g., creating clients through code generation) rather than craftspeople? (Simplistic, but still.)
  • Hashing over media types winds up being a lot of the work done by domain experts so they can talk to each other, or create systems that talk to each other. Think HL7 or any of the X12 domains. It's incredibly hard work for non-trivial domains to get people to talk and understand one another, much harder to get computers to understand one another as well.

So a short, but great day. Looking forward to the next one.


[1] In addition to hanging out with Ella, the entry to Laroche is marked quite sparsely and I drove past it once. Seriously.

Permalink

Goodbye Kim

Silly one

On Tuesday my sister Kim collapased at Pittsburgh Airport. The cause turned out to be a massive hemorrhage in her brain stem. She never regained consciousness.

With such a diagnosis there's very little that can be done. But with her age (she would have been 41 in September) the staff performed a number of minor activities to give her every chance to recover. But nothing changed her state, no recognition but no pain or discomfort.

On Thursday, after being tested for viability of organ donation, we had her breathing tube removed and after a short while she died peacefully with my dad, stepmother, and me by her side.

Kim was going home after visiting us for a few days, timed to catch Ella's dance recital on Saturday. You can see from most of my recent photos of her plain and special love for Ella, and she got on a plane whenever possible to come see her. While this was an incredible shock, we'll always be grateful for the chance we had to spend time with her before it happened.

There will be a memorial service in the Tampa area, but I don't know yet when. It will likely happen at her workplace, which has reached out with deep compassion and offers of help. Her job put her with people all over the world, both physically (Manilla and Mexico City) and virtually, and they're all grieving.

Goodbye Kim. We'll miss you terribly.

Permalink

Charlotte's Web and the blur of nostalgia

Without forethought I've seen three versions of Charlotte's Web in the last few months:

  1. The live-action 2006 movie,
  2. The animated 1973 film, and
  3. The recent Pittsburgh Childrens Theater production (I won't talk about this one though: it was okay and fun for Ella)

Charlotte's Web cover from Wikipedia

This all happened after reading the book to Ella for the first time this summer. While it was one of my favorite books as a kid I never really thought about why that was so . Re-reading it with Ella brought it into new light: it's direct and doesn't talk down to kids or sugarcoat death or pain or rejection or heartbreak. But it moves on from those things as well. It's also remarkably free of self-awareness, unlike a lot of modern kids media.

So when Ella said she wanted to watch the movie, I figured she'd seen something about the animated version somewhere. Which I thought was fine: I didn't remember it very well, but I had a vague feeling of nostalgia around it.

But when I heard it was a recent production, and had a CG spider with Julia Roberts doing the voice, I feared the worst: lots of singing and probably dancing, cute animals, pop culture references for the adults, and maybe Charlotte wouldn't even die. Grumble gumble. Surely it wouldn't be as faithful as the barely remembered version from my youth?

So when we watched it that nagging feeling of nostalgia pulled me into playing an internal cranky old man monologue for a while ("Julia Roberts doesn't sound right", "That guy was a jerk-off in Rising Sun", "Where did those crows come from?"). But then... then I stopped, and it worked. Really well. And I got why the crows were there. And the CG was good but spare. And just about everything that was great about the book was in the movie, including the most important part: the tone.

My sister got Ella the animated verion for Christmas. And when she visited over New Year's we all sat down to watch it. I was keenly interested in how much better it would be than the new version.

And it wasn't. At all. In fact, it was much worse. Lots of singing, very little character development, almost no tension between the characters at all. And there was a modern feeling adult-oriented camp having Paul Lynde voice Templeton. It added a layer of snark without much else. Nostalgia lied to me, and I'm glad I was able to see through it.

So, here are a few more reasons why the new version is much better than the old:

The biggest one: why did Charlotte do this for Wilbur?
Old version: Who knows? She comes up with the idea so soon after meeting him that it seems she was bored and looking for a project.
New: They took time to establish the friendship between Wilbur and Charlotte (just them talking, really) and, crucially, made Charlotte an object of disgust among the other animals. The idea that Wilbur's exuberance (for life in general and for Charlotte in particular) wins over the other animals and make her an equal to them is central. It gives reason and weight to her decision to go to the fair, which the movie brings out explicitly when (I think) one of the cows tells her she can't do it because of her babies.

Charlotte's appearance in the two is instructive as well. In the animated version she's almost elegant: like a bug who's got a classy hat on. But in the new version she's... well, gross. All her eyes are looking at you and she's got bits sticking out here and pincers chomping there. And over time, just like for the animals, that falls away for you, and you see her swaying in the breeze, weaving and talking to herself. Or gathering the animals together for a pow-wow, or telling Wilbur she can't make it back to the barn, and it's her voice that rivets you. (Sorry I doubted you Julia.)

Templeton in the new version is more complicated. In the old version he protests when asked to do something, but it's so weak and short that you know he's still going to do it. In the new one you're not really sure. Actual tension. Plus I think Steve Buscemi was the perfect voice.

The old version has a dumb, completely unproductive relationship between Wilbur and the 'runt' of the geese, who had such an annoyingly cute name that I've wiped it from my brain. In its place the new version brought out the characters of the pompous sheep (especially Samuel -- John Cleese), the dumb but faithful horse (Robert Redford), and the wise slow cows (Kathy Bates and Reba McIntyre).

Fern's development gets short shrift in the old version. In the new one she not only spends more time at the barn, but how her mother reacts to her is played out more. (Beau Bridges makes a brief but great appearance as the wise country doctor.) Her worries about Fern being antisocial/tomboy are carried forward later in her surprise that she's wearing a dress to the fair. This idea that kids grow up while you're worrying about them is one that I think resonates pretty powerfully with parents.

There's a voice-over line -- Sam Sheppard, nice! -- after the fair and when the winter comes about a spring pig seeing snow for the first time. Hugely poignant, completely missing from the animated.

I didn't like how present Henry Fussy was in the old one -- they tried to introduce a "mom's keeping him away" theme, then he went away for a while to his grandfather's and came back more "natural". In the new one it's much more subtle, a hint here and there and then at the fair he's got a ticket for her to ride on the ferris wheel. Smooth operator.

And when the new movie deviated from the book it did so in elegant ways. The two crows ( Elwyn and Brooks, nice homage) provided comic relief, Ella loved them. Even now whenever we see a crow we caw and say, "Corn!"

Permalink

Next and previous JavaScript months

The date/time libraries shipping with some languages I've used are just awful -- e.g., Perl, Java, JavaScript. Fortunately, the first two have great libraries available DateTime for Perl and Joda-Time for Java.[1] For JavaScript, it's slim pickings. There is DateJS which provides some parsing and fluent interface functionality, but seems to be lacking in other concepts (e.g., durations and intervals). But AFAICT there's nothing of the comprehensiveness or extensibility of either of the Java or Perl alternatives.

While DateJS allows you to do math, there's also a nice little hack you can do for at least one simple use case: given a date, what are the next and previous months?

In good APIs this is handled with ease:

 
Java: 
  DateTime now    = new DateTime(); 
  DateTime future = now.plusMonths(1); 
  DateTime past   = now.minusMonths(1); 
  System.out.println( "Future: " + future + "\nPast: " + past ); 
 
  ==> Future: 2012-02-09T22:31:55.656-05:00 
  ==> Past: 2011-12-09T22:31:55.656-05:00 
 
Perl: 
  my $now    = DateTime->now( time_zone => 'America/New_York' ); 
  my $future = $now->clone->add( months => 1 ); 
  my $past   = $now->clone->subtract( months => 1 );  
  print "Future: $future\nPast: $past\n"; 
 
  ==> Future: 2012-02-09T22:36:01 
  ==> Past: 2011-12-09T22:36:01 
 
Ruby:[2] 
  now    = DateTime.now 
  future = now.advance( :months => 1 ) 
  past   = now.advance( :months => -1 ) 
  puts "Future: #{future}\nPast: #{past}" 
 
  ==> Future: 2012-02-09T22:55:26-05:00 
  ==> Past: 2011-12-09T22:55:26-05:00 

In JavaScript you can't do that. But you can find the previous/next months pretty easily. The Date constructor takes a series of values for defining the date. If you specify a day '0' for the day of month, you'll get the last day of the previous month, and if you specify a day '32' you'll get somewhere around the first day of the following month:

 
JavaScript: (using Rhino 1.7R3) 
  var now    = new Date(); 
  var future = new Date( now.getFullYear(), now.getMonth(), 32 ); 
  var past   = new Date( now.getFullYear(), now.getMonth(), 0 ); 
  print( "Future: " + future + "\nPast: " + past + "\n" ); 
 
  ==> Future: Wed Feb 01 2012 00:00:00 GMT-0500 (EST) 
  ==> Past: Sat Dec 31 2011 00:00:00 GMT-0500 (EST) 

It's not the same result, but that's okay because the day is unnecessary. I've tested it in Rhino and a few browsers (FF, Chrome, IE 8) and all had the same result. Hope it helps.


[1] JDK 8 will vastly improve the default, taking it from terrible to awesome -- see JSR 310.

[2] The 'advance' function is not in the core Ruby Date/DateTime library, but it is added by Rails. I had a devil of a time getting this to run as a standalone script so just ran it in the rails console. The interplay between the names of Ruby libraries, the classes, and the documentation is very confusing to an outsider -- for example, 'ri DateTime' gives you methods monkeypatched into the class by ActiveSupport.

Permalink

Ella's latest

Christmas smile

I've been pretty quiet this year and haven't chronicled much about Ella. But I'll just pop up to say that she had her yearly checkup today and is tall (almost 4 feet!) and healthy and beaming and reading and talking your ear off and dancing and... I love being a dad to this kid.

Permalink

Pittsburgh Ruby Talk: Software process, the good parts

Who? Andrew Clay Shafer, @littleidea (puppet, conferences, involved/writing on devops)

When? 5-January-2012

What? Great, inspiring talk on software process, different types of agile and their core meanings (rather than the headlines people echo, often mindlessly) coming from someone who has obviously thought about these for quite a long time and internalized some deep lessons.

(these are my minimally translated notes from the meeting, they won't all necessarily make sense out of context)

Agile

  • first impression: hated it
  • scrums: felt like lots of STUFF, not much getting done
  • beware the expert
  • some people say 'agile', they mean 'scrum'
  • Salt Lake Agile Roundtable: Alistair Cockburn (!!!) runs it, 2-5 on the first thursday every month (during work, it's serious!)
    • mix of companies (novell, motorola, startups) and people
    • went there to get ammunition, but what he found was more interesting (smart people discussing ideas)
    • image from Crystal Clean (context for everything) (size vs criticality)

Crystal

  • frequent delivery
  • reflective improvement
  • close/osmotic communication (speed with which ideas can move thru organization)
  • personal safety (willingness to put yourself out there)
  • focus
  • easy access to expert users (your customer!)
  • automated tests, configuration management, frequent integration

Context matters

  • criticality
  • size
  • scope
  • schedule
  • contractors (interfaces and coupling; who does the interfaces? -- how big is your tribe? ==> conway's law)
  • distributed

MVP: Mimimally viable process

  • XP: Jedi of agile (if only Kent Beck would come out of the swamp)
  • Lean: Mary Poppendeck (first person to bring lean into software; mostly about building businesses and building pipelines of value)
  • Kanban: (feel it's the most useful way to build software right now)
    • focus on quality
    • reduce WIP
    • deliver often
    • balance demand against throughput
    • prioritize
    • attack sources of variability to improve predictability
    • visualize the flow: if you see a bottleneck, you can stop the line and get the whole team involved
  • Lean startup: read "Four Steps to the Epiphany" before "Lean Startup"

Reflect

  • hardest thing to do: inspect and adapt
  • cargo culting: all ceremony, no substance
  • ARxTA (Brian Marick): We believe Agile software development is being dumbed down... (full quote)
  • Working software is the primary measure of progress (like from the Agile Manifesto)
  • OODA loop: Observe, Orient, Decide, Act; Building vs Planning: but why are we building it?
  • David Hussman, Dude's Law: Value = Why / How
  • @ salt lake thing: moratorium on talks on estimation, it's too hard

Vision

  • hardest thing in software is capturing the vision
  • Antoine de St Exupery quote ("...vast and endless sea")
  • user story is a promise to have a conversation, not a spec!
  • backlog is a ghetto... where stories go to die
  • story mapping: write stories that capture the whole value (embrace the epics, we need to know this stuff!); what's the minimal span of those stories? this is the 'walking skeleton' => do enough to get the skeleton moving

Teams

  • we design systems, why don't we design teams?
  • different strokes (meh)
  • CAP theorem: applies to people, too! -- if you require consistency, you give up availability: meeetings are global locks (is P related to co-location vs distributed?)
  • Six laws of reliability (Joe Armstrong, Erlang): isolation, concurrency, failure detection, fault identification, live upgrade, stable storage => apply this to process (live upgrade => bringing on new people)
  • FSOP cycle (flying by the seat of our pants):
    smart people FSOP >
    successful patterns emerge >
    patterns recognized and adopted as process >
    structures created to drive/moniotor process >
    process becomes painful >
    smart people reject the process >
    (start from beginning)

Advocate

  • really like kanban
  • like XP tech practices
  • focus on quality
  • everything depends on context, but in context make policies explicit (this is fuzzy to me -- true that everything depends on context, but there's a tension with too much +/or the right kind of policy, e.g. "what's in your coding standard doc?")
  • if something doesn't feel right, you're doing something wrong; might be that thing, might also be you...
  • if you aren't getting results, change something
  • if you're changing too much too often, you won't get good results
  • measure (but don't get caught up in vanity)
  • process is a competitive advantage, passion is a competitive advantage, but don't let process kill passion
  • smart people solve problems

Q + A

Q: heard it said that scrum is kind of training wheels for kanban/lean, true?
A: more reason for people to sell scrum; kanban is easier!

Comment: Agile manifesto says "people over process", but agile people are obsessed with process!

Permalink

Physical precision

The new physicality brought an unexpected element into the act: precision. My routines wove the verbal with the physical and I found pleasure trying to bring them in line. Each spoken idea had to be physically expressed as well. My teenage attempt at a magician's grace was being transformed into an awkward comic grace. I felt as through every part of me was working. Some nights it seemed that it wasn't the line that got the laugh, but the tip of my finger. I tried to make voice and posture as crucial as jokes and gags....Finally, I understood the cummings quote I had puzzled over in college: "Like the burlesque comedian, I am abormally fond of that precision which creates movement." Precision was moving the plot forward, was filling every moment with content, was keeping the audience engaged.

Steve Martin, Born Standing Up

Permalink

Consistent work

The consistent work enhanced my act. I learned a lesson: It was easy to be great. Every entertainer has a night when everything is clicking. These nights are accidental and statistical: Like lucky cards in poker, you can count on them occurring over time. What was hard was to be good, consistently good, night after night, no matter what the abominable circumstances.

Steve Martin, Born Standing Up

Permalink

That reminds me...

...I need to watch Spinal Tap again. Who are you people who pretended to see it but didn't actually? The mind boggles. That film doesn't age for me as many comedies do (Strange Brew for instance -- still love it, not the same experience). Other Guest + Co. productions are similar in their longevity. May they continue.

Permalink