Monday, January 31, 2011

User Interfaces And The Fools Who Love Them

I love beautiful user interfaces. I tend to like interfaces that match these descriptors: minimal, functional, efficient, clean, simple, and obvious. How about some examples?

My blog editor, Windows Live Writer, is pretty good:

image

Nice and simple. Even with the ribbon extended, it’s pretty clean:

image

This really lets me focus on the content of the post which is important because I have a hard time focusing on anything. Browsers have certainly underscored this notion, though Google’s Chrome seems to stand out of from the pack here as it does in most areas:

image

If I had to pick one thing a UI should be to make it good, I think it should be obvious. The UI should be painfully clear about how to do things. For example, in the above image it’s pretty clear how you open a new tab or how you go forwards/backwards when browsing. This goal is supported by Steve Krug’s excellent book Don’t Make Me Think:

“Your objective should always be to eliminate instructions entirely by making everything self-explanatory, or as close to it as possible. When instructions are absolutely necessary, cut them back to the bare minimum.”

It’s less obvious how you’d find out what versions we’re looking at. That’s typically in “Help > About” but none of these browsers have the typical “File Edit View Help” menu anymore.

Opera buries all of its secrets under the “File” menu as I think people call it, which is fine:

image

Firefox does something similar but they introduce a new style of dropdown which is a little confusing:

image

vs.

image

I like where they’re going but they’re not quite there yet. Office 2007 handles this better by showing you more options under the dropdown when you hover anywhere on the button:

image

IE8 and Chrome handle this well by hiding things behind the Help bubble and the wrench, though they drift into waters I don’t like: inventing your own controls. What I mean is, inventing a new way of doing something in the UI when well-understood, perfectly acceptable solutions already exist. If you decide to invent something, it better be good, because it’s coming at a user cost of potential confusion.

Let me tell you a story about a control I invented for a project a while back. I had a requirement that users be able to enter an unlimited number of attributes under several different categories. Like this (Foos and Bars are unlimited):

image

This was part of a large complicated form and there were several sections like “Foo and “Bar” above that could have an unlimited number of items entered. My super clever idea was to have the form automatically add empty boxes as users filled things in. In this way, there’d always be at least one empty box and the user wouldn’t have to bother with annoying insert/edit/delete buttons.

I loved this design. LOVED IT. Coding it was a challenge, but with some jQuery magic it all came together and it really did work great.

Except it was confusing as hell to my users! I did some accidental usability tests where I observed people using the system for the first time. They were so uncomfortable with what was happening that they were nearly paralyzed. A quick tip from me and they were happily plugging away but without my guidance they were baffled. Why? They’d never seen a UI dynamically append inputs like this before so they had no expectation that it would just happen when they started typing. And once it did happen they weren’t really sure what was going on. Further, the usual data entry metaphor was further broken when they couldn’t figure out how to delete data.

I thought I was being so clever by letting users “just type away as quickly as they want” (actual quote)—adding, editing, or removing data at any time but I was wrong. I had taken too much away in the name of minimalism. The UI was technically great, but practically not.

So what did I do? Nothing. My hallway usability tests didn’t detect anything wrong because I was asking for opinions from developers who watched the UI be born—its behavior was obvious to them. The people paying for the software loved it, too, because I taught them how to use it each week I demoed my team’s progress—they never experienced a confused moment. The voiceless victims in this game are the end-users and they’re justice sits as an aging, cosmetic, low-priority, never-fix ticket in the bug tracker.

Here’s what I’d try given the chance. I’d add the familiar (+), (-) buttons to add new rows and remove existing rows. I’d keep the auto-append behavior exactly the same, but I’d add the buttons to help guide the user’s thinking about what’s going on, and to give them something familiar to fall back on if needed. I’d also shade the empty input just slightly to acknowledge that it’s empty. Like this:

image

Then I’d conduct a real usability test with someone who hasn’t seen any part of this to see what they think and iterate until it stopped confusing people.

Sunday, January 30, 2011

Google’s Subtly Personalized Search Results

Google has some killer data on me. It has thousands of emails, chats, tweets, etc. that I’ve exchanged with hundreds of people. Thousands of internet searches. Thousands of search result clicks. And this is one subtle way it uses it at the moment: reordering my search results.

image

My top seven results are identical, but in a very slightly different order. That is, my top result for “yield” is the programming definition on MSDN (Microsoft’s developer network). This is absolutely appropriate for me. It is so appropriate that it surprised me into opening the adjacent window in “Incognito Mode” (Chrome’s anonymous mode) to see what normal people see.

Thankfully I can report that most people probably see something ordered more appropriately for them with the C# term falling to the bottom.

This is pretty awesome and something that I bet few realize is happening.

HT: @clipperhouse

How To Cook Occasionally Alongside a Wife Who Cooks Often

The responsibility of cooking rarely rests with me. For the sake of my family’s health, this is a good thing. It’s not that I am unwilling to help and more that I don’t bring a lot to the table. If meal prep were left to me, I’d dig out my third grade lunch calendar and we’d have the same ten awful meals in rotation. Soy burgers, tots, and “salad”! Yum!

That’s probably my greatest weakness: meal planning. Wife once told me in college that a meal must include a side. Up to that point, when I’d say I was “making hamburgers” this is what you’d get on your plate:

image

Aside from a short, tired menu of only simple entrées (easily solved by making whatever Wife tells me to make), another weakness is meal execution (i.e. the actual cooking). I’m great at following recipes so long as I don’t have to deviate from the instructions or make substitutions. Actually, a few substitutions are OK—I can look things up on the ol’ internet or check covers of the cookbooks. I can’t handle some of Wife’s mental recipes, though.

I have a final, challenging problem: I have to focus when I’m cooking (or doing anything for that matter).

These issues lead right into the root cooking-related problem in our house right now: I can’t cook with Wife. Either we get to talking and then I screw up whatever it was I was supposed to be doing, or she has so many changes to a recipe that we no longer really have a recipe on paper (it’s in her head) and I can’t cook it.

But I have a solution.

I plan and prepare to the point that it’s almost silly. This means I refuse to make anything unless I have a recipe. I read the recipe. I understand the recipe. I am one with the recipe. We’re BFFs.

Then I get a ridiculous number of bowls and measure out everything. Spices, water, flour—everything. Then I put it in order of when it’s going to be needed.

Then while I’m actually cooking I make a conscience effort to avoid talking to anyone or doing anything else.

That’s how I make something simple like drop biscuits. If I’m responsible for an entire dinner—entrée and side—I do one more critical planning step: I make a timeline.

This is the completely overkill part that I’m most proud of. By making a timeline, I can have each element of food on the table at the right temperature at the right time. This is something that is apparently second nature to some people but I have to be deliberately systematic about it. Here’s an example.

Suppose we’re having steak and baked potatoes. This is a cake walk for most people but here’s what I actually did last time I made this meal:

  1. Find and study a steak recipe. Check!
  2. Find and study a baked potato recipe. Check!
  3. Make sure we have everything. Check!
  4. Make a timeline like this (working backwards from Go Time):
    image
  5. Execute timeline

This approach yields one other awesome benefit aside from helping dinner hit the table on-time and at the right temperature: it’s stress free. I just follow my timeline and don’t worry about what I might be missing. When I finish a task, I just set a timer to go off for when I need to start the next step so I can safely zone out on something else (e.g. after “set table”, set timer for “7:40”).

In summary: plan, portion, plan, execute.

Oh, and I drink while I cook. Happy eating.

Monday, January 24, 2011

Thing2 Explodes, Laundry Ensues

IMG_20110124_123322Poor Thing2 came down with some sort of stomach bug on Sunday. How do I know? Well I’m no doctor, but when my precious little toddler starts losing her breakfast a red flag goes up.

We first knew something was wrong when kids were coloring and Sister reported that Thing2 had “spit up”. Thing2 never spits up. Head cocked to one side I investigated and discovered slimy oatmeal where oatmeal isn’t supposed to be (everywhere).

Even though she wasn’t actually very upset we consoled her anyway and cleaned her up. In the process I think we got more muck on us than on she had on her.

Result: laundry (clothes)

While a tad apprehensive with Thing2’s request, Wife agreed to nurse her. The reasoning was something along the lines of this: maybe it was a fluke, maybe some miracle food will calm her stomach, and certainly nourishment is needed. Before nursing could commence, but immediately after someone said something regrettable like “we should probably put down the waterproof pad on the bed before…” exactly what you’d expect to happen at this point happened. All over the bed.

Result: more laundry (clothes, blanket, comforter, mattress cover)

Now we were getting a little concerned about dehydration (Thing2’s tiny and can’t afford to lose too much) so drinking or nursing is becoming a priority. Luckily she is all for it and nurses to sleep on the couch. Sometime later, missing the signs (a suddenly awake, burpy toddler), it happens again.

Result: more laundry (clothes, blanket)

IMG_20110123_173436We cleaned up Thing2 and got her back to sleep while Wife dealt with the concentrated evil that was soaking in to her clothes. After some work, she went down for a nice nap. Until she did the most obvious thing ever: threw up again.

Result: more laundry (clothes, blanket)

We cleaned her up again and she fell back asleep. I was still holding her a while later when I recognized the signs. I managed to help Thing2 lose another helping of food on the nonporous wood floor.

Result: more laundry (just towels—a relative victory!)

We rinsed her mouth out again and changed her diaper for the fifteenth time and our stinky day began to improve. Thing2 managed to keep her food down and, manifested her sickness mostly by being especially cuddly and passive – traits I’m sure she inherited from me.

We were feeling a bit worn out so we indulged in a family nap. It was an epic three hours of amazing sleep for all of us. We were waking up gradually with the kiddos. They tumbled around playfully when we realized that Thing2 was smelly in a new way. She has filled her diaper with something sinister and it hadn’t been…contained.

Result: more laundry (comforter #2, sheets, clothes)

Fortunately, though, vomit was no more. She was apparently keeping down her food and producing the most vial, awful, incredibly toxic diapers I’ve ever changed; the kind that go straight to the outdoor can. I’m contemplating a sympathy card to the sanitation department.

It’s now been more than 24 hours since the last incident and we’re almost caught up on laundry. She’s pretty much back to normal and I’m rejoicing as she rests beside me:

shot_1295925990794

Parenting: the happiest you’ll ever be, even as you pretend not to notice vomit running down your arms or (OMG)-puke-breath.

Thursday, January 20, 2011

Automating Minitab with C#

My job takes me a lot of different places and I work with a lot of different technologies along the way. Recently my team and I were tasked with a sort of ETL/reporting project involving some bizarrely formatted flat files, an Oracle database, and a couple Minitab macros. It was actually very straight forward except for one piece: automating Minitab.

I’m sharing the core piece of our development below in hopes that this will save a future dev some grief. I know that this looks very simple, and it is. Getting down to these few lines was not, I assure you, easy. A shout out to @xover9000 for doing pretty much all of this:

// the basic pieces
var MtbApp = new Mtb.Application();
var MtbProj = MtbApp.ActiveProject;
var MtbUI = MtbApp.UserInterface;

// We want this to run completely without user interaction
// Don't display messages or dialogs or anything
// (learned about the last couple here the hard way...)
MtbUI.DisplayAlerts = false;
MtbUI.Interactive = false;
MtbUI.UserControl = false; 

// Do the work
// I don't know why we preface this with a percent sign but that's how mtb rolls
MtbProj.ExecuteCommand(@"%C:\Path\To\YourMacro.mac");

// Macro run complete. Do whatever else you want or just quit
// Note: .Quit is asynchronous which means if you really need Mtb closed
// before you continue (e.g. before you run another macro), you need to 
// add your own logic to wait for it (also learned that one the hard way...)
MtbApp.Quit();

Through those objects you do have access to all kinds of functionality if you need, but just for running macros those eight lines ought to cover it.

If you’re using a recent version of .NET, any errors that occur while running the above snippet will be raised as COMExceptions. The Application object has some error-related properties on it but in my experience their contents are copied into the COMException for you so that’s probably all you really need.

Wednesday, January 19, 2011

Dear Michael (Response from Once Upon A Child)

My silly letter sent to the operator of my local Once Upon A Child received the following response:

Dear Michael,

Thank you for the email and customer input is always considered. I apologize for the delay in response. If you have further questions or comments my new email for the location is; (removed).

Regarding our bathroom, I do empathize with the potty training parents and the pregnant mothers shopping. I can tell you the story behind this as the decision to make our bathroom facilities private was one that was made over many years after several different attempts to monitor usage.

We used to open the bathroom for use and to try on clothing. We had so much theft that we built a dressing room and put a lock on the bathroom. Customers would then have to ask for the key. Well, unfortunately I don't staff enough girls to wait at the door (due to finances). This became a problem all over with theft and destruction. The deciding factor was the theft issue. Generally we do not discuss this as not everyone is bad and unfortunately they have to pay the price for those that are. Once the decision was made we did use the bathroom as storage, making it not under code for the public. I tried not to make this decision over a 5yr. period.

I am a small independent business owner. My store is one of the smallest in the system. Both my husband and I do work and have a family and retail is always a risky business with high operating expenses. I apologize for your inconvenience with the bathroom and sincerely wish it was different. Theft loss became too high of an expense.

I am sometimes on shift, and work almost every night after close. I usually see most of the girls on a daily or every other day basis. We definitely had an issue with clothing over the summer that had been addressed. We had to make a list of "NO's" that was very specific.

I am not sure when you were last in the store. We do have days that we get slap happy and discuss things and joke around. We are all close as a staff as many of my girls have worked for me for a very long time.

I do have a food lover on staff and we rarely get time to go out for lunch the way our business is and the girls have to eat behind the counter and are paid through lunch.  Part of this is due to retail safety as 1 person should never be left in the store alone. I think we have made several people hungry. Certainly if this is offensive we can quiet that down a bit.

I don't think we have addressed that issue yet from a customer complaint?

I will re-look at the clothing situation as not everyone sees the same thing in the mirror that someone else may. Please know that the business means a lot to me as I have struggled through this for 13 yrs. and started the business as a single mother. My child was 6yrs. old when I opened the doors and is now in college.  I take every criticism to heart and address as I see fit. I hope this has helped in some way, we would love for you to continue to shop us as a source to help with managing our high cost of living and raising children. They cost us money for life and we are always parents not matter what the age.

Please let me know that you have received my email, since I am late in my response. I will leave the email again that is most frequently checked.  Oh, and I am glad your kids aren't wearing grocery bags, although I will say that my sons favorite thing to play with were pots n pans in the kitchen and boxes he could make things out of. You have quite the sense of humor!  Thanks again!

Annie Weddle
Once Upon a Child/ Stow
Owner

I’m very impressed with how Annie responded to my letter. She addressed both of my concerns with a thoughtful and candid explanation. I now understand why the bathroom no longer exists but regret that it will continue to be an issue for us. No hard feelings though.

When Thing1 masters this whole potty thing we will reconsider. Hopefully she doesn’t grow too fast, though, we only have those fancy reusable shopping bags now and I’ll be in big trouble if I cut those up for clothes.

Sunday, January 16, 2011

Dear Once Upon A Child

Once Upon A Child
4272 Kent Road Suite 10
Stow, OH 44224
aaw@neo.rr.com

Dear Once Upon A Child,

I’d like to share a little feedback with you that’s been acquired over several visits to your Stow location.

What happened to your bathroom? Where’d it go!? I appreciate that running a business must be difficult and expensive. I also realize upon consideration of other public bathrooms I’ve visited that people are disgusting. The problem is, however, that when my three year-old needs to go, she needs to go.

I know what you’re thinking: we should just ask if she needs to go before we leave home. If only we were so foolish! Unfortch, we do encourage her to go but she says that she doesn’t need to. For our part, I admit that she’s a liar…well, actually, she’s just a child, and sometimes children don’t understand things like the future and planning for it. If they did, my bribes of cookies and milk for things like using the bathroom, avoiding sibling squabbles, or eating vegetables would work so much better! (Now that I think about it, adults aren’t very good at planning for the future either, but that’s another story.)

I request that you reconsider your public bathroom policy. Even if it was open only to children, our last visit would have ended much better. And by “much better”, I mean that we wouldn’t have had to run like maniacs through the arctic (i.e. Northeast Ohio) to Bed Bath and Beyond across the way. The only saving grace of the day was that their bathroom was in the front of the store—not two miles away, hidden among 85 million future wedding presents, shake weights, Snuggies, and that cooler you can float in your pool that looks like fishing tackle.

Of course if you actually don’t have a bathroom at all anymore, then I guess you’ve got bigger problems than me! What is your poor staff to do? Speaking of the staff…

Everyone I’ve ever talked to at your business hasn’t been overly rude or anything, but they certainly could be more helpful. It’s possible that I always come at “break”, too, but if not, why are they always chatting about the latest in Facebook drama and ordering food, eating food, or talking about food. Now I’m hungry (dammit!). I’m also not one to encourage unnecessary, silly policies like dress codes (after all, I sometimes wear a brown belt with black shoes and white socks. For shame!), but a little guidance might be in order…particularly in the…uh…boobage department. This comment is made only more appropriate by the fact that you’ll know what I mean. If not immediately, then the next time you stop into work, you’ll smack yourself on the forehead with recognition of this problem and you’ll never be able to not see it.

If I’ve still got your attention, I’d like to also mention that I’ve enjoyed finding great deals and occasionally selling back items these past few years. Without consignment stores like Once Upon A Child, my kids would probably be playing with paint buckets and sticks in a barren front yard wearing nothing but plastic grocery bags.

Please do let me know if these problems are addressed so I can resume patronizing your business.

Sincerely,
Michael Haren

Monday, January 10, 2011

Blurry Shapes: Unleashing the Bokeh

While browsing the excellent photography Stack Exchange site and learning lots about bokeh, I came across the awesome idea that led to this shot:

DSC_0417

The effect here is in the Christmas lights—they’re regular lights—and by adding this lens filter, stuff that’s normally blurry goes crazy:

DSC_0445

With this in place, the image on the left turns into the image on the right (similar focus distance):

DSC_0441 DSC_0440

Putting things farther out of focus yields more dramatic results:

DSC_0411DSC_0419

As I noted above, this was certainly not my idea—this is just my 10-minute take on it. Be sure to check out the other site’s comments for some really impressive comps.

I put these together in haste so I could impress my wife with my mad skillz (the real photography) but she’d seen the same site as me and pointed me to this spiffy snap-on filter (touché):

bokeh-Kit-d47c.0000001289362640

Windows 7 Tip: Check Box-Based File Selection

The Tip:

I just stumbled across this handy feature of Windows 7 (apparently introduced in Vista): multiple file selection without holding down the control key via check boxes:

image

They show up when you hover. Clicking the check box behaves exactly as if you were holding down the control key. If you click anywhere else on the file, it clears the existing selection and chooses only the file you clicked on—it’s really all very intuitive.

How:image

  1. Open Explorer (Winkey+E)
  2. Press Alt+T to bring up the tools menu and choose Folder Options
  3. Choose the View tab
  4. Scroll to the bottom and check “Use check boxes to select items”

Sunday, January 9, 2011

Presenting: The Parental Anger Scale

IMG_20110107_164257Parenting is usually a lovely, rewarding profession. This post is not about those parts. Instead, this is about the frustrating moments anyone who is in close company to children has certainly experienced. There’s just something about the persistent “whys” of a three-year-old, or the I’ll-just-dump-this-yogurt-on-the-floor dining technique that triggers weak parenting.

These things affect us to different degrees as I’ll attempt to describe via the Parental Anger Scale:

Level 1: Amused Parent

Frequency: 150x/day

Triggers: child is whining, often preceded by confusion

Child’s Grievance: something trivial like being presented a wrong-colored cup or dish, a meal not served immediately upon child realizing she is hungry and hasn’t eaten in four seconds, or child asked to share one Lego from a collection of thousands

Parental Response: smile, chuckle, or eye-roll

Level 2: Annoyed Parent

Frequency: frequent

Triggers: child is whining excessively, playing the why-why-why-why game, or refusing to play nice with others

Child’s Grievance: been awake for three hours, stolen toy, lost toy, toy too far away, toy no longer entertaining, or hungry

Parental Response: polite explanation (“teaching moments”), snacks, bribery or redirection

Level 3: Angry Parent

Frequency: occasional

Triggers: child maintains persistent level 2 activity, performs are-you-kidding-me actions like dumping glitter all over the place, or perpetrates hitting/violence or outright malicious speech toward others

Child’s Grievance: who knows?

Parental Response: timeout, loss of privileges, or early termination of activities (the car is turned around, as they say), insists that parent cannot understand children who don’t use their words because all they can hear is “quack quack quack” (implying child is a duck)

Level 4: Frazzled Parent

Frequency: rare

Triggers: child maintains persistent level 3 activity which is preceded by parent’s sleepless night, commits truly dumbfounding errors like painting the dog in the house and thereby causing thousands of dollars of damage

Child’s Grievance: the world (if for only a moment) doesn’t seem to revolve around her, left unsupervised for 12 seconds while parent goes to the bathroom, or most treasured toy wasn’t in hand while parent is strapping child into safety seat

Parental Response: most treasured toy is thrown from car window at highway speed by parent, hands off child to spouse upon arrival and leaves, or locks self away in bathroom to cry


Of course most of the things that lead to parental anger start as child anger. They get a scale, too:

Level 1: The world is over

That is all.