Red Pen and Comments in the Margin for your UI

Do you remember how your High School English teacher graded your papers?  Mine all used red pen and circled things and wrote comments in the margin.  I still do this today when I write something important.  I print a copy, grab a red pen, and turn into a ruthless editor on the lookout for just a few simple things, like using fewer words.

But red pen and comments in the margin doesn’t only apply to writing.  You can apply the same principles and concepts to a user interface.  Take a screenshot of your application, print it out, and find yourself a red Bic.  There’s something special about writing on and drawing over an image of your application because it’s something you probably never do.  Editing a screenshot in Photoshop is good, too, though sometimes not as satisfying.

Working example

Below is a before and after screenshot of a single sidebar in FoodHub Pro that shows my Red Pen and Comments in the Margin thinking.  My software is constantly evolving and improving, and there’s no need to let ego get in the way of a great UI.  It might be that this sidebar could be refined further if we find that users don’t actually need all of the widgets.

The “After” image has fewer words, fewer lines, no distracting headers, and is shorter overall with no loss of functionality.

Use a Red Pen and Comments in the Margin and let me know how your UI turns out.  I’d love to see more before/after examples.

sidebar-side-by-side

FoodHub Pro sidebar with "red pen and comments in the margin" editing

#1:  Use fewer words

How many times have you heard someone explaining something and they said “What that means is …”  These words don’t say anything.  Just say what it means, don’t preempt.

What that means is be thrifty with words.”

The first four words mean nothing and the last four mean everything.  Take your red pen and cross through half of that sentence.

What words can I cut from my sidebar?  ”New Purchase Order” and “Choose a grower …” can be concisely written as “New PO for grower …”  That’s a 33% word discount!

#2:  Avoid clutter

Don’t make me think, don’t make me read, and especially don’t hide the few words I must read beneath words I want to ignore.

The headers in my sidebar have no purpose other than to be bigger and bolder than the words that have meaning, like the “From” and “to” labels and “Show only” which implies filtering capability.

#3:  Remove stuff

Do we really need headers?  Headers are generally meant to delineate blocks of stuff, which I think it particularly well suited by wells.  Headers are big, bold words that aren’t important.  They are too tall.  Wells, on the other hand, provide excellent delineation of things and implies depth on a page.   With fewer meaningful words remaining in a well, the purpose of the widget becomes obvious and you don’t need a header to explain what it is.

Are there any form fields that aren’t really needed?  Our customers don’t change business models very often (read: never), which means the type of Purchase Order created never changed.  We tucked that option away on a config screen and dropped it from our form.  It simply wasn’t needed.

The Results Have Been Measured

Without any loss of functionality and with an immeasurable increase in clarity and simplicity, we can measure results by counting what remains.

  1. 30% of words removed
  2. 100% of tall and bold headers removed
  3. 100% of bold form field headers removed
  4. 0% change in distinct widgets with wells replacing horizontal lines
  5. 0% loss of functionality
  6. Increased clarity and simplicity:  immeasurable

Red Pen and Comments in the Margin works as well for interface design as it did for my old English teacher.  It cuts through clutter and simplifies by eliminating anything that doesn’t directly and succinctly address the task at hand.  Everything in the design is subject for removal, from redundant or unnecessary words to unused elements to the use of white space.  Each item in a design should fight for its life because a good editor always has a red pen handy.

It’s simple math

Gardening and edible landscaping serves up some incredible meals.

dinner-montage

edible landscaping gardening local seafood

How to send asynchronous requests in PHP

It’s easy to make asynchronous calls in PHP with just a little bit of HTTP header knowledge and some library code around PHP sockets.

This technique is useful when posting requests to your own server for bits of logic you’d like to run in the background.  If you don’t control the endpoint, you might not be comfortable with some of the limitations, such as the inability to read anything from the response.  So, you couldn’t post data to a webservice and receive an HTTP 200 OK response and certainly not an ID for an object newly created by the service call. Any bad IP address would give you an error and you’d also get an error if your socket couldn’t connect. This level of error handling might be sufficient for what you need.

For best performance, use IP addresses instead of DNS entries to prevent the need for look-up and resolution.

For fire and forget stuff, this is the bees knees:

(Please ignore my class definition and Controller superclass. This is actual working code from my CodeIgniter application where I scratched this out as a proof of concept)

class Scratch extends SQ_Controller {

    function Scratch() {
        parent::SQ_Controller();
    }

    function index() {

        echo "PHP Async Test...
";

        $params = array(
            "one" => "111111",
            "two" => "22222",
            "three" => "33333",
            "four" => "44444",
        );
        $this->curl_post_async("http://127.0.0.1/sq/scratch/longone", $params);
    }

    function longone(){

        $one = $_POST["one"];
        $two = $_POST["two"];
        $three = $_POST["three"];
        $four = $_POST["four"];

        echo uniqid("You won't see this because your PHP script isn't waiting to read any response");

        // put some long delay in here, so you can see how quickly the async requests returns
        sleep(5);

        // and the proof that something actually happens...  write out the HTTP params that were sent over the wire
        $fp = fopen('/PATH/TO/YOUR/DIR/FOR/OUTPUT/data.txt', 'w');
        fwrite($fp, $one);
        fwrite($fp, $two);
        fwrite($fp, $three);
        fwrite($fp, $four);
        fclose($fp);

    }

    function curl_post_async($url, $params = array()){

        $post_params = array();

        foreach ($params as $key => &$val) {
              if (is_array($val)) $val = implode(',', $val);
                $post_params[] = $key.'='.urlencode($val);
            }
            $post_string = implode('&', $post_params);

            $parts=parse_url($url);

            $fp = fsockopen($parts['host'],
                isset($parts['port'])?$parts['port']:80,
                $errno, $errstr, 30);

            $out = "POST ".$parts['path']." HTTP/1.1\r\n";
            $out.= "Host: ".$parts['host']."\r\n";
            $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out.= "Content-Length: ".strlen($post_string)."\r\n";
            $out.= "Connection: Close\r\n\r\n";
            if (isset($post_string)) $out.= $post_string;

            fwrite($fp, $out);
            fclose($fp);
    }
}

A few rules of business and travel

Business Rule #17432: When travelling on business, work!  There are no interruptions.  There are no kids demanding attention.  It is quiet and it’s the perfect time to focus.  There is no one to answer to about anything, so open the laptop, turn off the TV (why it is even on?), and get to work.

Business Rule #9813: Unless your job requires you to schmooze clients and ply them with liquor, don’t drink.  Not only does it impede Business Rule #17432 above, but the last thing you need is to be hungover during the big conference the next day or not as quick as you’d like to be.  Get to bed early and hit a home run while you’re away.  You’re away from your family, you are sacrificing something, so make it worthwhile!

And this is just a suggestion, but try to get the elite hotel room: 1337 (for hackers only)

leet

Never let a consultant handle your core business

From I, Cringley:

In Minneapolis, Best Buy is known as a body shop.  While they have something like 1000 IT workers, most of them are temporary contractors.  They come and go.  The number of IT people who are Best Buy employees is very small.  Too few to effectively set direction or do things well.  Best Buy depends on an army of consulting firms to do its IT planning and projects.  They do what they are asked to.  Unfortunately there is a big disconnect between what the business really needs and what IT is doing.

Never let a consultant handle your core business.  Every retailer needs to be in the IT business.  Walmart pioneered IT for retailers, what, 40 years ago?  All Best Buy had to do is follow.

Braintree’s customer support is 1st class

Braintree — an online payments processor — aims to have a developer-friendly API for integration and touts excellent customer service as one of their strengths.

I have been on the phone with these guys several times this week as I integrate our subscriptions at GreenWizard more tightly with Braintree for better reporting. Every interaction with the support staff at Braintree has been quick, pleasant and helpful, and each episode left me happy to have chosen Braintree as our payment gateway.

BT guys, if you’re reading this, feel free to use this as a happy customer testimonial. Keep up the good work. Your sandbox is also a pleasure to work with (unlike a major gateway who’s name rhymes with paypal).

Get the latest subversion revision number with Bash

Here’s  a quick one-liner you can use in Bash to get the latest subversion revision number from your present working directory:

sed -n '4p' .svn/entries

Use backticks to assign it to a local variable you can use when making a build (say, a zip archive of a website or other type of artifact you might want to create):

version=`sed -n '4p' .svn/entries`

“I just want to get started”

“I just want to get started.”   How commonly uttered is this phrase in the life of a new project?

My wife is tiling our bathroom and she’s carefully laying out tiles, measuring, preparing to make cuts that accommodate the cabinets, and various other tasks that are required before anyone can lay a single tile on grout and have it stay there forever. She lamented to me, “I just want to get started.”

“You’ve started!” I replied. “You’re doing this project. This is what it takes.”

“Yeah, I know, but I just want to get to it already.”

It’s the same thing with any software project. Coders are always saying they just want to get started. Writing code is fun. Figuring out what code to write or how to write it … not so much fun.

Visual progress on a bathroom with newly laid tiles is fun. Planning, measuring, cutting, and laying it out before grouting … not so much fun.

It’s all part of the project. In fact, it’s the essential part. Fred Brooks, Steve McConnell, and other software luminaries have already demonstrated that actual construction (coders writing code) represents a minority of time for a well-run software project. Requirements, design, and testing the fidelity of the implementation is the bulk of software development costs.

But we all just want to get started.

Make your own seedling pots from newspaper

This How-To article shows how you can make your own seedling starter pots from newspaper!  Very cool idea.  My plastic trays are getting crumpled from continuous reuse and buying new peet pots is expensive.  I’m going to try using newspaper as described in the article.  Cheap new pots in perptuity!

http://whipup.net/2007/05/21/raising-seedlings-using-recycled-newspaper/

Signs of life

image

Spring is officially here and the growing season has begun! I have high hopes for these pole bean sprouts.

Switch to our mobile site