June 24, 2010
A Closer Look at Hierarchy in Web Design

Many times designers will depend on other great designs for inspiration, trends, or ‘tricks of the trade’ to get by. However, learning the basic design principles and getting a feel for how they are applied to web design is essential for the career of any designer. In this post, we’re going to take a close look at one of those basic design principles, and how it applies specifically to web design.

Hierarchy Web Design

Hierarchy is the element that makes users look where they do and when they do it. The top hierarchical element on a web page will be the first thing the user sees, and the lowest will be the last. It’s easy to see why hierarchy has such a profound effect on web design — it’s all about the user experience, and any website’s presentation to the user. In this post, we’ll cover some of the basics of working with correct hierarchy, and how it specifically applies to web design.

What Exactly is Hierarchy?

Hierarchy is the division of ranks; the order of things from most important to least important. While hierarchy can be applied to a number of situations — social class, grades, religion — in the design world it applies to the user experience. It is the rank of what is most important in a design, and what is least important. Using correct hierarchy is also knowing how to create designs where the highest ranked item stands out the most.

Hierarchy Applied to Web Design

Just like with all other forms of design, hierarchy is an essential feature to web design and the whole user experience. Hierarchy is a way for us, as web designers to create the user’s experience by showing them where to go, and when to do certain things. It is one major piece of the user experience puzzle.

Web Design Hierarchy

By planning out for hierarchy and the user’s flow, whether for a client web design or personal project, web visitors will be happier because they will be finding things easier. Also, conversions will likely increase, which will of course make clients happier. Hierarchy is one of those design elements that can make a design go from just aesthetically pleasing, to functional and useful.

Planning Out the User Experience

Before one should ever begin the design phase, a planning stage is essential. Planning out a wireframe, or set of wireframes, is a huge step in the overall design process. The wireframe sets up the navigation structure, determines how a user will use the website, and plans out for the best visual hierarchy to get the desired results.

Define Website Goals

Remember: All websites have one main goal. It is your job as a designer to accomplish this goal.

For an online store, it may be to increase sales. For an informational website, it may be to create contacts. Or, for an online app, it may be to create more signups — free or paid. Know what this main goal for the website is, and it can be easy to create a correct wireframe with excellent hierarchy.

It is likely that there are other goals for a website as well, on top of the main one. For example, psd2html (below)obviously has a main goal to get more sales of their service. However, psd2html also has some other ‘sub’ goals: gaining repeat customers, being memorable, and gaining attraction as a premium service. All of these goals can aid in helping the business grow.

PSD2html

In their new redesign above, we can see these goals being called into action via visual hierarchy. The #1 place our eyes go is to the Order Now button. Because of its size, contrast, and surrounding whitespace (exclusion from everything else), we can see that it is important. There is also some additional polishing imagery around the button for a greater standout. Remember, this website’s #1 goal is to increase sales, so the relevant call to action button is given the top rank in the websites visual hierarchy. It’s how they survive in the business world, after all.

Visitors immediately know it’s a service type of website, and only need to look slightly above at the logo and tagline to see what type of service. Based on the placement, size, and again surrounding whitespace, this is the second ranked hierarchical spot.

There’s also a huge focus on customer service and their work towards recognizable brands. By providing top brands and putting focus on the company phone number, we begin to see one of our sub-goals taking shape: being able to recognize psd2html as a premium service. This directly affects their prices and can gain repeat visitors. Working with a reputable company always feels more secure.

Before we get into the best practices of how to make things stand out, organize in plain English what the goals of a design are, and their order of importance. Then, plan out what the ‘calls to action’ will be. For example, the call to action for getting more customers above was an Order Now button. Then, we can finally focus on the design elements that will surround these web page elements to stick out in the rank they’re intended to.

Create a User Flow

So we’ve laid out what we’ll need to highlight, but we still need to define in what order we’ll need the users to see this information. Half of it is already done for us: we should follow the importance of the goals to determine what should be given the most importance and what should be given the least. However, are there other elements that come into play?

For example, what’s the best way to make a sale to a not-so-convinced customer? Answer: to create a flow, a layout, of information that will convince them.

Freshbooks

Note how Freshbooks has done this. Above we’ve laid out the intended flow of information for the user. At the top are the main attention grabbers, and the primary call-to-action. For those who are not convinced, further down lists features and testimonials, arranged in a way for the user to quickly scan and get the most information. After some more convincing with these pieces of content, the same call-to-action links are applied.

The Art of Making things Noticeable

So we’ve already mentioned a few ways to make things more noticeable in our examples above. Now let’s look though, with more detail, at how we can achieve correct hierarchy. After planning out a web design’s user experience, use these design techniques to create the right effect.

Color

The use of color is one of the most powerful visual elements. It immediately draws attention, and is often times the primary practice to bring attention to the top ranking hierarchical element. Try using contrast (seen below), or just a pop of color on an otherwise evenly-toned web design.

Color

Dimension

We live in a 3D world, and can naturally be attracted to elements with more depth in visual design. To add depth, use gradients, drop-shadows, highlights, letterpress, etc.

Dimension

Size

Bigger equals more important and smaller equals less important. Our eyes naturally pick out the big pieces first, and use them to help guide us to the smaller pieces later on. One example used most often in web design is typography and size. Bigger header tags are larger, while lesser header tags are smaller. Then, paragraphs, blockquotes, etc. are the next size down, and captions or footnotes are the smallest. This creates a ranking system that allows the user to see the content in the correct order, and organize it according to important points (headings).

Size

Placement

Where things are placed has a huge impact on when it will get noticed, and also how important the thing is. Generally, hierarchy uses the F pattern. (Imagine a large “F” across the screen.) Top left, then to the right, then down a bit and to the right again. By following this placement pattern, we can estimate the first and last places a user will look.

Placement

Contrast

This was briefly mentioned above under color, but the same can also be applied to other forms of contrast beyond color opposites. Think black and white, dark and light. The higher the contrast, the more attention an element gets; the lower the contrast, the less attention.

Contrast

Great Examples in the Community

Below are a few great examples right here within our design community. Notice that we’ve labeled the hierarchical labels in right on the image. Each label represents a rank area of the web page, in the order the user sees it, and in the order of its importance. See if you can tell how we came up with these ranks; was it color, imagery, contrast, whitespace, or something else?

Made By Sofa
Sofa

Josh Tilton
Joshtilton

Ten24Media
Ten24

Jeff Sarmiento
Jeffsarmiento

Zee The Designer
Zee

Conclusion

Hopefully this quick guide can help those who are new to design, or those who could improve their application of the basic principles in their everyday designs. Be sure to take a look at the above designs for better understanding, and look elsewhere in web design for other examples. To truly understand hierarchy, study other great designs, and perhaps even some poor designs. Design your own mockups with hierarchy in mind, and get feedback or find another way to improve upon its order of elements.

Hierarchy can be a powerful tool in the user experience and in design overall. Often times, it can be the one thing that makes a design ‘pop.’ It can also be the one thing that makes a design effective, for your clients or for yourself. By understanding hierarchy as a designer, one can better understand how to place things on a web page, or within any design. Never just place things wherever — have a plan that will focus on the best possible outcome.

—- http://www.onextrapixel.com/2010/06/24/a-closer-look-at-hierarchy-in-web-design

June 24, 2010
Website Response Times

Users really care about speed in interaction design. 13 years ago, I wrote a column called “The Need for Speed,” pointing out how much users hated slow-loading Web pages. Back then, big images were the main cause of response-time delays, and our guideline recommended that you keep images small.

Today, most people have broadband, so you might think that download times are no longer a usability concern. And yes, actual image download is rarely an issue for today’s wireline users (though images can still cause delays on mobile devices).

Still, response times are as relevant as ever. That’s because responsiveness is a basic user interface design rule that’s dictated by human needs, not by individual technologies. In a client usability study we just completed, for example, users complained that “it’s being a little slow.

Speed Matters

Responsiveness matters for two reasons:
  • Human limitations, especially in the areas of memory and attention (as further discussed in our seminar on The Human Mind and Usability). We simply don’t perform as well if we have to wait and suffer the inevitable decay of information stored in short-term memory.
  • Human aspirations. We like to feel in control of our destiny rather than subjugated to a computer’s whims. Also, when companies make us wait instead of providing responsive service, they seem either arrogant or incompetent.
A snappy user experience beats a glamorous one, for the simple reason that people engage more with a site when they can move freely and focus on the content instead of on their endless wait.

In a recent study for our seminar on Brand as Experience, we asked users what they thought about various websites they had used in the past. So, their responses were based not on immediate use (as in normal usability studies), but on whatever past experiences were strong enough to form memories. Under these conditions, it was striking to hear users complain about the slowness of certain sites. Slowness (or speed) makes such an impact that it can become one of the brand values customers associate with a site. (Obviously, “sluggish” is not a brand value that any marketing VP would actively aim for, but the actual experience of using a site is more important than slogans or advertising in forming customer impressions of a brand.)

Indeed, we get findings related to website speed almost every time we run a study. When sites shave as little as 0.1 seconds off response time, the outcome is a juicy lift in conversion rates. Today or the 1990s? Same effect.

Response-Time Limits

The 3 response-time limits are the same today as when I wrote about them in 1993 (based on 40-year-old research by human factors pioneers):
  • 0.1 seconds gives the feeling of instantaneous response — that is, the outcome feels like it was caused by the user, not the computer. This level of responsiveness is essential to support the feeling of direct manipulation (direct manipulation is one of the key GUI techniques to increase user engagement and control — for more about it, see our Principles of Interface Design seminar).
  • 1 second keeps the user’s flow of thought seamless. Users can sense a delay, and thus know the computer is generating the outcome, but they still feel in control of the overall experience and that they’re moving freely rather than waiting on the computer. This degree of responsiveness is needed for good navigation.
  • 10 seconds keeps the user’s attention. From 1–10 seconds, users definitely feel at the mercy of the computer and wish it was faster, but they can handle it. After 10 seconds, they start thinking about other things, making it harder to get their brains back on track once the computer finally does respond.
A 10-second delay will often make users leave a site immediately. And even if they stay, it’s harder for them to understand what’s going on, making it less likely that they’ll succeed in any difficult tasks.

Even a few seconds’ delay is enough to create an unpleasant user experience. Users are no longer in control, and they’re consciously annoyed by having to wait for the computer. Thus, with repeated short delays, users will give up unless they’re extremely committed to completing the task. The result? You can easily lose half your sales (to those less-committed customers) simply because your site is a few seconds too slow for each page.

Fancy Widgets, Sluggish Response

Instead of big images, today’s big response-time sinners are typically overly complex data processing on the server or overly fancy widgets on the page (or too many fancy widgets).

Here’s an example from a recent eyetracking study we conducted to generate new material for our seminar on Fundamental Guidelines for Web Usability. The following gaze plots show 2 different users’ behavior on the same page, which contained a slideshow widget in the top yellow box that required 8 seconds to download:

Eyetracking gaze plots of two different users viewing the same page. 
Gaze plots from 2 different users: 
the blue dots indicate where users looked (one fixation per dot).

The test participant in the top gaze plot fixated a few times within the big empty color block before the content downloaded, then spent the remaining time looking at the rest of the page. This user never looked at the big promotional space after it had rendered.

The second user (bottom gaze plot) happened to be looking away from the screen during the 8 seconds when the promotional content downloaded. Thus, the first time he looked at the page he saw it as intended, complete with the entire promo.

The slideshow occupies 23% of the page, not counting a footer that’s not shown here. The user who had to endure the download delay spent only 1% of her total viewing time within this space. In contrast, the user who in effect received instantaneous page rendering (because he didn’t look until it was done), spent 20% of his viewing time within the slideshow area.

Although 8 seconds might not seem like a big delay, it’s enough to kill this big promo that the company’s Web team probably spent weeks designing. If they had allocated the space to something that rendered in 1 second instead of 8, they would have achieved much better results.

Different Causes, Same Effect

Response times are a matter of user experience: How much time does it take before the computer is ready to serve the user? The reasons behind delays don’t matter to users. All they know is that they’re getting poor service, which is annoying.

Big images in 1997. Slow servers or overly fancy widgets in 2010. Same effect. Make it snappy, and you’ll have a big leg up on the competition and their slow sites.

—- http://www.useit.com/alertbox/response-times.html - by Jakob Nielson

June 19, 2010
The march to a more client-centric Web; Will the mobile Web, HTML5, and Chrome Web Apps be the tipping point?

Progressive enhancement.

Disconnected offline applications.

There is a tension brewing in how we deliver applications on the Web. This isn’t a new tension. It has been around ever since we started to do more than just throw HTML down the pipe for the hypertext document runtime to render.

With the Ajax revolution we talked a lot about “Web applications”. Gmail. Google Maps. Those are written in a very different manner. The architecture isn’t one of: client asks for a URL…. server does all of the work: business logic, and view logic, since it sends back the entire view as HTML. A popular Ajax pattern was that of still keeping the client kinda dumb, and having the server return interface elements and behaviour in the form of HTML/CSS/JS that the client would eval/innerHTML/etc. This continues to be used a lot as it is flexible (especially if the bulk of the team is on the server side) and sometimes easier to do (chop up the functionality on the backend into more discrete tasks). This is a progressive enhancement style of richer Web applications.

When I was working with Gears I saw first hand how reluctant developers were to move from the progressive enhancement style into a more aggressive client server-esque style of Web application development. The Gears APIs themselves are trivial. Nicely implemented. Simple APIs. We get to use them these days in the form of App Cache, SQL database API, Web Workers, GeoLocation, etc. Taking your application and sprinkling a GeoLocation API is very simple and fits into progressive enhancement easily. Even doing what the Wordpress guys did early on, and using App Cache as an aggressive fast cache is easy.

The harder sell to developers was: If you want to have your Web application work offline, you need to re-architect it to enable that. Instead of having your PHPs firing down interfaces, you need the client to coordinate the work and just speak REST to services that give you the data, and then have a layer of abstraction that can get the data locally etc. Then you can look at handling sync and the like. This is real work. This is moving code from point A to point B. It is a big deal. Many developers didn’t see the value proposition. Do they REALLY care about the offline use case? Getting some performance improvements by taking out latency is nice (hit cache first etc) but is that worth the rework?

For many people, it just wasn’t worth it.

As I look at what is changing in the world, I see a few things that may add up collectively to a tipping point:

“HTML5” hype

HTML5 has a lot of great functionality. There will be pressure for developers and sites to raise the bar. Expectations of what a Web application “can do” is drastically going to change, and as soon as that change happens you don’t want to be left behind. MapQuest was fantastic. Until Google Maps came out. Then, on that day forth, it felt archaic. All of that with XHR++….. what will happen with all of the HTML5 functionality available? A lot of code we will be rewritten and changed for “HTML5ication”, which is an opportunity for a change in how things are done.

“Apps” and the Web as a unified device platform

I haven’t been quiet with my concern at the rise of the proprietary app platforms. The Web needs to fight back, and it has the opportunity to actually solve developer problems (rather than just rant about how the world should be more open damn it!).

As a developer, do you want to port experiences between incredibly varied platforms such as Web, iPhone, Android, WinPho 7, RIM, Kindle SDK, [insert many others!]? No. The Web has the opportunity to share a lot of that code and development. It has to compete with the native platforms on features, performance, and the like…. but I would argue that it is doing a great job and getting better FAST.

Within the apps ecosystem there are some very interesting things happening:

  • Chrome Web Store: The Chrome Web Store is happening. I know of other Web store efforts in various stages of life too. A lot of developers want to get into the app distribution bandwagon, and will be looking at the notion of a “web app” in a new light because of this. This will give a lot of momentum, along with the fact that HTML5 is the first real spec envisioned for “app” functionality versus documents, to the web app movement
  • Mobile Web: As developers want to get applications to as many devices as possible, they are finding that the Mobile Web is an attractive development platform. But, how do you do it? If you think about Web distribution, then you have the progressive enhancement world again (device and layout tweaks via CSS, JS, etc) all the way up to a mobile framework. We see the two worlds withjQTouch on one side and Sencha Touch on the other.

    Take a look at how an app looks in Sencha Touch:

    templates in HTML

    <div class=”legislator-brief”> <div class=”legislator-tnail” style=”background-image: url(http://www.govtrack.us/data/photos/{govtrack_id}-50px.jpeg)”></div> <h3>{title} {firstname} {middlename} {lastname} ({party})</h3> {state} {district:this.ordinal} </div>


    OO app framework with layout and components

    Geo.App = Ext.extend(Ext.Panel, {
        cls: 'app',
        fullscreen: true,
        layout: 'card',
        activeItem: 0,
    
        initComponent: function() {
            this.startScreen = new Geo.views.StartScreen({
                flex: 1
            });
            this.splash = new Ext.Container({
                cls: 'splash',
                layout: {
                    type: 'vbox',
                    align: 'stretch',
                    pack: 'end'
                },
                listeners: {
                    deactivate: this.onSplashDeactivate,
                    scope: this
                },
                items: [this.startScreen]
            });
            this.detail = new Geo.views.LegislatorDetails();
    
            this.items = [this.splash, this.detail];
            Geo.App.superclass.initComponent.call(this);
    
            this.startScreen.on('legislatorselect', this.onLegislatorSelect, this);
        },
    
        afterRender: function() {
            Geo.App.superclass.afterRender.apply(this, arguments);
            Ext.getBody().on(Ext.isChrome ? 'click' : 'tap', this.onLinkTap, this, {delegate: 'a.goOutside'});
        },
    
        onLinkTap: function(e, t) {
            e.stopEvent();
            Geo.Util.openUrl(t.href);
        },
    
        onSplashDeactivate: function() {
            this.startScreen.list.clearSelections();
        },
    
        onLegislatorSelect: function(govtrack_id) {
            this.setCard(this.detail, Geo.defaultAnim);
            this.detail.update(govtrack_id);
        }
    });
    

    This looks similar to how we build apps on webOS with Mojo and other frameworks like Jo. Rich full featured mobile frameworks.

    Once you have built your Web application, technology such as PhoneGap and Appcelerator Titanium can package it for the various app distribution platforms.

    So, when I put this all together, I see the opportunity for the growth of Web applications through both progressive enhancement, but also via rich client frameworks. The tension will be there between the two, and I am sure that there will be more solutions that blend the best of both worlds.

    What do you think? What are you seeing as you build richer Web applications for a variety of devices and form factors?

—- http://ajaxian.com/archives/the-march-to-a-more-client-centric-web-will-the-mobile-web-html5-and-chrome-web-apps-be-the-tipping-point

June 7, 2010
The Principles of Design - by Lucas Cobb

Starting with the Basics

This column is about Web design—really, it is—though it may at times seem a bit distant and distracted. In my opinion, any good discussion about design begins with the fundamentals. Almost by definition, the primary tenets around which any field is based are universal: they can be applied to a variety of disciplines in a variety of ways. This can cause some confusion as principle is put into practice within the unique constraints of a particular medium.

We can group all of the basic tenets of design into two categories: principles and elements. For this article, the principles of design are the overarching truths of the profession. They represent the basic assumptions of the world that guide the design practice, and affect the arrangement of objects within a composition.

Web design is a relatively new profession compared to other forms of design, due to the youth of our medium. As with any design discipline, there are aspects of the Web design process that are unique to the medium, such as screen resolution, additive color spaces and image compression. But too often these more unique details override our sense of the bigger picture. We focus on the fact that it is Web design and push aside core design concepts—concepts that can that make any project stronger without interfering in the more technical considerations later on.

How Does Web Design Fit In?

I tend to define Web design as being one of many disciplines within the larger field of design (a peer to print design, industrial design, interior design, etc.). To step back even further, I see design as a discipline within the field of art (a peer to painting, illustration, sculpture, etc.) The point is that in order to start with a discussion about the fundamentals of design as they relate to Web design we need to understand that there is a good degree of inheritance that design has received over the years from other art forms. These art forms, such as lithography, typography, painting/illustration and industrial design, evolved over many centuries, and a number of basic ideas have emerged as providing universal guidance to any artistic endeavor. When talking about fundamental concepts we inevitably look outside our discipline and adopt a slightly larger perspective.

The Principles of Design

There are many basic concepts that underlay the field of design. They are often categorized differently depending on philosophy or teaching methodology. The first thing we need to do is organize them, so that we have a framework for this discussion.

We can group all of the basic tenets of design into two categories: principles and elements. For this article, the principles of design are the overarching truths of the profession. They represent the basic assumptions of the world that guide the design practice, and affect the arrangement of objects within a composition. By comparison, the elements of design are the components of design themselves, the objects to be arranged.

Let’s begin by focusing on the principles of design, the axioms of our profession. Specifically, we will be looking at the following principles:

  • Balance
  • Rhythm
  • Proportion
  • Dominance
  • Unity

Balance

Balance is an equilibrium that results from looking at images and judging them against our ideas of physical structure (such as mass, gravity or the sides of a page). It is the arrangement of the objects in a given design as it relates to their visual weight within a composition. Balance usually comes in two forms: symmetrical and asymmetrical.

Balance

Symmetry

Symmetrical balance occurs when the weight of a composition is evenly distributed around a central vertical or horizontal axis. Under normal circumstances it assumes identical forms on both sides of the axis. When symmetry occurs with similar, but not identical, forms it is called approximate symmetry. In addition, it is possible to build a composition equally around a central point resulting in radial symmetry1. Symmetrical balance is also known as formal balance.

Asymmety

Asymmetrical balance occurs when the weight of a composition is not evenly distributed around a central axis. It involves the arranging of objects of differing size in a composition such that they balance one another with their respective visual weights. Often there is one dominant form that is offset by many smaller forms. In general, asymmetrical compositions tend to have a greater sense of visual tension. Asymmetrical balance is also known as informal balance.

Rhythm

Rhythm is the repetition or alternation of elements, often with defined intervals between them. Rhythm can create a sense of movement, and can establish pattern and texture. There are many different kinds of rhythm, often defined by the feeling it evokes when looking at it.

  • Regular: A regular rhythm occurs when the intervals between the elements, and often the elements themselves, are similar in size or length.
  • Flowing: A flowing rhythm gives a sense of movement, and is often more organic in nature.
  • Progressive: A progressive rhythm shows a sequence of forms through a progression of steps.

Proportion

Proportion is the comparison of dimensions or distribution of forms. It is the relationship in scale between one element and another, or between a whole object and one of its parts. Differing proportions within a composition can relate to different kinds of balance or symmetry, and can help establish visual weight and depth. In the below examples, notice how the smaller elements seem to recede into the background while the larger elements come to the front.

Dominance

Dominance relates to varying degrees of emphasis in design. It determines the visual weight of a composition, establishes space and perspective, and often resolves where the eye goes first when looking at a design. There are three stages of dominance, each relating to the weight of a particular object within a composition.

  • Dominant: The object given the most visual weight, the element of primary emphasis that advances to the foreground in the composition.
  • Sub-dominant: The element of secondary emphasis, the elements in the middle ground of the composition.
  • Subordinate: The object given the least visual weight, the element of tertiary emphasis that recedes to the background of the composition.

Unity

The concept of unity describes the relationship between the individual parts and the whole of a composition. It investigates the aspects of a given design that are necessary to tie the composition together, to give it a sense of wholeness, or to break it apart and give it a sense of variety. Unity in design is a concept that stems from some of the Gestalt theories of visual perception and psychology, specifically those dealing with how the human brain organizes visual information into categories, or groups.

Unity

Gestalt theory itself is rather lengthy and complex, dealing in various levels of abstraction and generalization, but some of the basic ideas that come out of this kind of thinking are more universal.

Closure

Closure is the idea that the brain tends to fill in missing information when it perceives an object is missing some of its pieces. Objects can be deconstructed into groups of smaller parts, and when some of these parts are missing the brain tends to add information about an object to achieve closure. In the below examples, we compulsively fill in the missing information to create shape.

Continuance

Continuance is the idea that once you begin looking in one direction, you will continue to do so until something more significant catches your attention. Perspective, or the use of dominant directional lines, tends to successfully direct the viewers eye in a given direction. In addition, the eye direction of any subjects in the design itself can cause a similar effect. In the below example, the eye immediately goes down the direction of the road ending up in the upper right corner of the frame of reference. There is no other dominant object to catch and redirect the attention.

Similarity, Proximity and Alignment

Items of similar size, shape and color tend to be grouped together by the brain, and a semantic relationship between the items is formed. In addition, items in close proximity to or aligned with one another tend to be grouped in a similar way. In the below example, notice how much easier it is to group and define the shape of the objects in the upper left than the lower right.

Similarity

Related concepts

There are many additional concepts that are related to the principles of design. These can include specific terms and/or techniques that are in some way based on one or more of the above tenets. In they end, they add to the collection of compositional tools available for use by the designer.

Contrast or Opposition

Contrast addresses the notion of dynamic tension – the degree of conflict that exists within a given design between the visual elements in the composition.

Positive and Negative Space

Positive and negative space refers to the juxtaposition of figure and ground in a composition. The objects in the environment represent the positive space, and the environment itself is the negative space.

Rule of Thirds

The rule of thirds is a compositional tool that makes use of the notion that the most interesting compositions are those in which the primary element is off center. Basically, take any frame of reference and divide it into thirds placing the elements of the composition on the lines in between.

Rule of Thirds

Visual Center

The visual center of any page is just slightly above and to the right of the actual (mathematical) center. This tends to be the natural placement of visual focus, and is also sometimes referred to as museum height.

Color and Typography

Many would place color and typography along side the five principals I have outlined above. I personally believe both to be elements of design, so I’ll give them some attention in my next column. In addition, both topics are so robust that I plan on writing an entire article about each of them in the future.

Conclusion

In Web design it is too easy to get engrossed in the many unique constraints of the medium and completely forget some of the underlying concepts that can strengthen any design. To better discuss such concepts, we need to step back from our specific discipline and look to the history of the field. It is here we find the axioms of our profession.

In this article we looked at half of those axioms, the principles of design. The principles of design are the guiding truths of our profession, the basic concepts of balance, rhythm, proportion, dominance and unity. Successful use of these core ideas insures a solid foundation upon which any design can thrive.

In the next column, I will discuss the elements of design—the basic components used as part of any composition including point, line, form (shape), texture, color and typography. Comments or suggestions are welcome and appreciated.

—- http://www.lucascobb.com/the-principles-of-design/

June 3, 2010
Frontend SPOF

My evangelism of high performance web sites started off in the context of quality code and development best practices. It’s easy for a style of coding to permeate throughout a company. Developers switch teams. Code is copied and pasted (especially in the world of web development). If everyone is developing in a high performance way, that’s the style that will characterize how the company codes.

This argument of promoting development best practices gained traction in the engineering quarters of the companies I talked to, but performance improvements continued to get backburnered in favor of new features and content that appealed to the business side of the organization. Improving performance wasn’t considered as important as other changes. Everyone assumed users wanted new features and that’s what got the most attention.

It became clear to me that we needed to show a business case for web performance. That’s why the theme for Velocity 2009 was “the impact of performance on the bottom line”. Since then there have been numerous studies released that have shown that improving performance does improve the bottom line. As a result, I’m seeing the business side of many web companies becoming strong advocates for Web Performance Optimization.

But there are still occasions when I have a hard time convincing a team that focusing on web performance, specifically frontend performance, is important. Shaving off hundreds (or even thousands) of milliseconds just doesn’t seem worthwhile to them. That’s when I pull out the big guns and explain that loading scripts and stylesheets in the typical way creates a frontend single point of failure that can bring down the entire site.

Examples of Frontend SPOF

The thought that simply adding a script or stylesheet to your web page could make the entire site unavailable surprises many people. Rather than focusing on CSS mistakes and JavaScript errors, the key is to think about what happens when a resource request times out. With this clue, it’s easy to create a test case:

<html>
<head>
<script src="http://www.snippet.com/main.js" type="text/javascript">
  </script>
</head>
<body>
Here's my page!
</body>
</html>

This HTML page looks pretty normal, but if snippet.com is overloaded the entire page is blank waiting for main.js to return. This is true in all browsers.

Here are some examples of frontend single points of failure and the browsers they impact. You can click on the Frontend SPOF test links to see the actual test page.

Frontend SPOF testChromeFirefoxIEOperaSafariExternal Scriptblank belowblank belowblank belowblank belowblank belowStylesheetblank belowflashblank belowflashblank belowinlined @font-facedelayedflashflashflashdelayedStylesheet with @font-facedelayedflashtotally blankflashdelayedScript then @font-facedelayedflashtotally blankflashdelayed

The failure cases are highlighted in red. Here are the four possible outcomes sorted from worst to best:

  • totally blank – Nothing in the page is rendered – the entire page is blank.
  • blank below – All the DOM elements below the resource in question are not rendered.
  • delayed – Text that uses the @font-face style is invisible until the font file arrives.
  • flash – DOM elements are rendered immediately, and then redrawn if necessary after the stylesheet or font has finished downloading.

Web Performance avoids SPOF

It turns out that there are web performance best practices that, in addition to making your pages faster, also avoid most of these frontend single points of failure. Let’s look at the tests one by one.

External Script
All browsers block rendering of elements below an external script until the script arrives and is parsed and executed. Since many sites put scripts in the HEAD, this means the entire page is typically blank. That’s why I believe the most important web performance coding pattern for today’s web sites is to load JavaScript asynchronously. Not only does this improve performance, but it avoids making external scripts a possible SPOF.
Stylesheet
Browsers are split on how they handle stylesheets. Firefox and Opera charge ahead and render the page, and then flash the user if elements have to be redrawn because their styling changed. Chrome, Internet Explorer, and Safari delay rendering the page until the stylesheets have arrived. (Generally they only delay rendering elements below the stylesheet, but in some cases IE will delay rendering everything in the page.) If rendering is blocked and the stylesheet takes a long time to download, or times out, the user is left staring at a blank page. There’s not a lot of advice on loading stylesheets without blocking page rendering, primarily because it would introduce the flash of unstyled content.
inlined @font-face
I’ve blogged before about the performance implications of using @font-face. When the @font-face style is declared in a STYLE block in the HTML document, the SPOF issues are dramatically reduced. Firefox, Internet Explorer, and Opera avoid making these custom font files a SPOF by rendering the affected text and then redrawing it after the font file arrives. Chrome and Safari don’t render the customized text at all until the font file arrives. I’ve drawn these cells in yellow since it could cause the page to be unusable for users using these browsers, but most sites only use custom fonts on a subset of the page.
Stylesheet with @font-face
Inlining your @font-face style is the key to avoiding having font files be a single point of failure. If you inline your @font-face styles and the font file takes forever to return or times out, the worst case is the affected text is invisible in Chrome and Safari. But at least the rest of the page is visible, and everything is visible in Firefox, IE, and Opera. Moving the @font-face style to a stylesheet not only slows down your site (by requiring two sequential downloads to render text), but it also creates a special case in Internet Explorer 7 & 8 where the entire page is blocked from rendering. IE 6 is only slightly better – the elements below the stylesheet are blocked from rendering (but if your stylesheet is in the HEAD this is the same outcome).
Script then @font-face
Inlining your @font-face style isn’t enough to avoid the entire page SPOF that occurs in IE. You also have to make sure the inline STYLE block isn’t preceded by a SCRIPT tag. Otherwise, your entire page is blank in IE waiting for the font file to arrive. If that file is slow to return, your users are left staring at a blank page.

SPOF is bad

Five years ago most of the attention on web performance was focused on the backend. Since then we’ve learned that 80% of the time users wait for a web page to load is the responsibility of the frontend. I feel this same bias when it comes to identifying and guarding against single points of failure that can bring down a web site – the focus is on the backend and there’s not enough focus on the frontend. For larger web sites, the days of a single server, single router, single data center, and other backend SPOFs are way behind us. And yet, most major web sites include scripts and stylesheets in the typical way that creates a frontend SPOF. Even more worrisome – many of these scripts are from third parties for social widgets, web analytics, and ads.

Look at the scripts, stylesheets, and font files in your web page from a worst case scenario perspective. Ask yourself:

  • Is your web site’s availability dependent on these resources?
  • Is it possible that if one of these resources timed out, users would be blocked from seeing your site?
  • Are any of these single point of failure resources from a third party?
  • Would you rather embed resources in a way that avoids making them a frontend SPOF?

Make sure you’re aware of your frontend SPOFs, track their availability and latency closely, and embed them in your page in a non-blocking way whenever possible.

—- http://www.stevesouders.com/blog/2010/06/01/frontend-spof/

June 1, 2010
Git Vs SVN

My Common Git Workflow

recent post that was highly ranked on Hacker News complained about common git workflows causing him serious pain. While I won’t get into the merit of his user experience complaints, I do want to talk about his specific use-case and how I personally work with it in git.

Best I can tell, Mike Taylor (the guy in the post) either tried to figure out a standard git workflow on his own, or he followed poor instructions that tried to bootstrap someone from an svn background while intentionally leaving out importantinformation. In any event, I’ll step through my personal workflow for his scenario, contrasting with subversion as I go.

Cloning the Repository

The very first step when working with a repository is to clone it. In subversion, this is accomplished via svn checkout svn://url/to/repo/trunk. This retrieves the most recent revision of the trunk branch of the repository.

In git, this is accomplished via git clone git://url/to/repo (the http protocol is also possible). This retrieves the entire repository, including other branches and tags.

Making the Change

In both git and subversion, you make the change using a normal text editor.

After Making the Change

In git, you make a local commit, marking the difference between the most recent pulled version (master) and the changes you made. In subversion, the normal workflow does not involve making a change, but apparently some people make manual diffs in order to have a local copy of the changes before updating from the remote. Here’s an example comment from the Hacker News post:

I’ll tell you what happens when I use svn and there’s been an upstream change: I never update my local tree with local modifications. Instead, I extract all my local changes into a diff, then I update my local tree, and then I merge my diff back into the updated tree and commit.

When I need three-way merging, which isn’t often – usually patch can resync simple things like line offsets – it’s handled by a file comparison tool. I have a simple script which handles this

My personal process for making the commit in git almost always involves the gitx GUI, which lets me see the changes for each individual file, select the files (or chunks in the files) to commit, and then commit the whole thing. I sometimes break up the changes into several granular commits, if appropriate.

Updating from the remote

Now that we have our local changes, the next step is to update from the remote. In subversion, you would run svn up. Here, subversion will apply a merge strategy to attempt to merge the remote changes with the local ones that you made. If a merge was unsuccessful, subversion will tell you that a conflict has occurred. If you did not manually save off a diff file, there is no way to get back to the status from before you made the change.

In git, you would run git pull. By default, git applies the “recursive” strategy, which tries to merge your current files with the remote files at the most recent revision. As with subversion, this can result in a conflict. You can also pass the --rebase flag to pull, which is how I usually work. This tells git to stash away your commits, pull the remote changes, and then reapply your changes on top one at a time.

If you use --rebase, you may get a conflict for each of your local commits, which is usually easier to handle than a bunch of conflicts all at once.

I definitely recommend using --rebase which also provides instructions for dealing with conflicts as they arise.

In either case, in my experience, git’s merging capabilities are more advanced than subversion’s. This will result in many fewer cases where conflicts occur.

Resolving Conflicts

From here on, I am assuming you followed my advice and used git pull --rebase.

If a conflict has occurred, you will find that if you run git status, all of the non-conflicting files are already listed as “staged”, while the conflicting files are listed outside the staging area. This means that the non-conflicting files are already considered “added” to the current commit.

To resolve the conflicts, fix up the files listed outside the staging area and git addthem. Again, I normally use gitx to move the resolved files into the staging area.

Once you have resolved the conflict, run git rebase --continue. This tells git to use the fixed up changes you just made instead of the original commit it was trying to put on top of the changes you got from the remote.

In subversion, if you got a conflict, subversion will create three files for you:file.minefile.rOLD, and file.rNEW. You are responsible for fixing up the conflicts and getting back a working file. Once you are done, you run svn resolved.

NOTE: If you had not used git pull --rebase, but instead did raw git pull, you would fix up the files, add the files using git add or gitx, and the rungit commit to seal the deal

Yikes! Something went wrong!

In git, if something goes wrong, you just run git reset --hard, which will bring you back to your last local commit.

In subversion, it’s not always possible unless you manually stored off a diff before you started.

Pushing

Now that you’re in sync with the remote server, you push your changes. In git, you run git push. In subversion, you run svn commit.

One Glossed-Over Difference

Subversion allows you to commit changes even if you haven’t svn uped and there have been changes to the remote, as long as there are no conflicts between your local files and the remote files.

Git never allows you to push changes to the remote if there have been remote changes. I personally prefer the git behavior, but I could see why someone might prefer the subversion behavior. However, I glossed over this difference because every subversion reference I’ve found advises running svn up before a commit, and I personally always did that in my years using subversion.

Comparison

Here’s a workflow comparison between git and subversion:

OperationgitsvnClone a repositorygit clone git://github.com/rails/rails.gitsvn checkout http://dev.rubyonrails.org/svn/rails/trunkPreparing changesgit commit (using gitx)nothing or create a manual diffUpdate from the remotegit pull --rebasesvn upResolving conflictsgit add then git rebase --continuesvn resolveResolving conflicts without –rebasegit add then git commitN/AYikes! Rolling backgit reset –hardsvn up -rOLD then apply diff (only if you manually made a diff first)Pushinggit pushsvn commit

Note that I am not attempting to provide an exhaustive guide to git here; there are many more git features that are quite useful. Additionally, I personally do a lot of local branching, and prefer to be able to think about git in terms of cheap branches, but the original poster explicitly said that he’d rather not. As a result, I didn’t address that here.

I also don’t believe that thinking of git in terms of subversion is a good idea. That said, the point of this post (and the point of the original poster) is that there are a set of high-level version control operations that you’d expect git to be able to handle in simple cases without a lot of fuss.

—- http://yehudakatz.com/2010/05/13/common-git-workflows/

May 24, 2010
Better JavaScript Minification

In the past few years, performance research has become more prevalent thanks to research by the Yahoo! Exceptional Performance Team and Google’s Steve Souders. Most of that research studies not the individual HTML page, but the resources the page requires to display or behave correctly.

Although both CSS and JavaScript may be included within an HTML page, best practices encourage storing CSS and JavaScript in external files that can be downloaded and cached separately. Performance research asks: How can these external resources be downloaded and applied most efficiently? The first approach is to limit the number of external requests since the overhead of each HTTP request is high. The second approach? Make your code as small as possible.

The history of JavaScript byte savings

Douglas Crockford introduced JSMin in 2004 as a way to shrink JavaScript files before placing them into a production environment. His simple tool removed spaces, tabs, and comments from JavaScript files, effectively decreasing the size compared to the original source file. His rationale was sound: decreasing the size of JavaScript code results in faster downloads and a better user experience.

Three years later, Yahoo! engineer Julien Lecomte introduced the YUI Compressor. The YUI Compressor’s goal was to shrink JavaScript files even further than JSMin by applying smart optimizations to the source code. In addition to removing comments, spaces, and tabs, the YUI Compressor also safely removes line breaks, further decreasing the overall file size. The biggest byte savings, though, come from replacing local variable names with one- or two-character names. For example, suppose you have the following function:

function sum(num1, num2) {
    return num1 + num2;
}

YUI Compressor changes this to:

function sum(A,B){return A+B;}

Note that the two local variables, num1 and num2, were replaced by A and B, respectively. Since YUI Compressor actually parses the entire JavaScript input, it can safely replace local variable names without introducing code errors. The overall function continues to work as it did originally since the variable names are irrelevant to the functionality. On average, the YUI Compressor can compress files up to 18% more than JSMin.

These days, it’s common to use a minification tool plus HTTP compression to further reduce JavaScript file size. This results in even greater savings than using either method alone.

Boosting minification

A couple of years ago, as I started debugging large amounts of production code, I realized that the YUI Compressor didn’t apply variable replacement to a fairly significant portion of my code. Bothered by what I considered a lot of wasted bytes, I explored coding patterns to boost the YUI Compressor’s minification powers. I presented my results, Extreme JavaScript Compression with YUI Compressor, internally at Yahoo!.

In my investigation, I discovered coding patterns that prevented YUI Compressor from performing variable name replacement. By modifying or avoiding these coding patterns, you can improve the YUI Compressor’s performance.

JAVASCRIPT’S EVIL FEATURES

Anyone who has followed Douglas Crockford’s writing or lectures knows about the “evil” parts of JavaScript: The parts that are confusing and/or that prevent us from writing clean code that performs well. The eval()function and the with statement are the two most egregious examples of evil JavaScript. Though there are other considerations, both of these features force YUI Compressor to stop replacing variables. To understand why, we need to understand the intricacies of how each works.

WORKING WITH EVAL()

The eval() statement’s job is to take a string and interpret it as JavaScript code. For example:

eval("alert('Hello world!');");

The tricky part of eval() is that it has access to all of the variables and functions that exist around it. Here’s a more complex example:

var message = "Hello world!";

function doSomething() {
    eval("alert(message)");
}

When you call doSomething(), an alert is displayed with the message, “Hello world!”. That’s because the string passed into eval() accesses the global variable message and displays it. Now consider what would happen if you automatically replaced the variable name message:

var A = "Hello world!";

function doSomething() {
    eval("alert(message)"); 
}

Note that changing the variable name to A results in an error when doSomething() executes (sincemessage is undefined). YUI Compressor’s first job is to preserve the functionality of your script, and so when it sees eval(), it stops replacing variables. This might not sound like such a bad idea until you realize the full implications: Variable name replacement is prevented not only in the local context where eval() is called, but in all containing contexts as well. In the previous example, this means that both the context inside ofdoSomething() and the global context cannot have variable names replaced.

Using eval() anywhere in your code means that global variable names will never be changed. Consider the following example:

function handleJSONP(object) {
    return object;
}

function interpretJSONP(code) {
    var data = eval(code);
    
    //process data
}

In this code, pretend that handleJSONP() and interpretJSONP() are defined in the midst of other functions.JSONP is a widely used Ajax communication format that requires the response to be interpreted by the JavaScript engine. For this example, a sample JSONP response might look like this:

handleJSONP({message:"Hello world!"});

If you received this code back from the server via an XMLHttpRequest call, the next step is to evaluate it, at which point eval() becomes very useful. But just having eval() in the code means that none of the global identifiers can have their names replaced. The best option is to limit the number of global variables you introduce.

You can often get away with this by creating a self-executing anonymous function, such as:

(function() {
    function handleJSONP(object) {
        return object;
    }

    function interpretJSONP(code) {
        var data = eval(code);
    
        //process data
    }
})();

This code introduces no new global variables, but since eval() is used, none of the variable names will be replaced. The actual result (110 bytes) is:

(Line wraps marked » —Ed.)

(function(){function handleJSONP(object){return object}function »
interpretJSONP(code){var data=eval(code)}})();

The nice thing about JSONP is that it relies on the existence of just one global identifier, the function to which the result must be passed (in this case, handleJSONP()). This means that it doesn’t need access to any local variables or functions and gives you the opportunity to sequester the eval() function in its own global function. Note that you also must move handleJSONP() outside to be global as well so its name doesn’t get replaced:

//my own eval
function myEval(code) {
    return eval(code);
}

function handleJSONP(object) {
    return object;
}

(function() {
    function interpretJSONP(code) {
        var data = myEval(code);
    
        //process data
    }
})();

The function myEval() now acts like eval() except that it cannot access local variables. It can, however, access all global variables and functions. If the code being executed by eval() will never need access to local variables, then this approach is the best. By keeping the only reference to eval() outside of the anonymous function, you allow every variable name inside of that function to be replaced. Here’s the output:

function myEval(code){return eval(code)}function handleJSONP »
(a){return a}(function(){function a(b){var c=myEval(b)}})();

You can see that both interpretJSON()code, and data were replaced (with ab, and c, respectively). The result is 120 bytes, which you’ll note is larger than the example without eval() sequestered. That doesn’t mean the approach is faulty, it’s just that this example code is far too small to see an impact. If you were to apply this change on 100KB of JavaScript code, you would see that the resulting code is much smaller than leavingeval() in place.

Of course, the best option is not to use eval() at all, as you’ll avoid a lot of hoop-jumping to make the YUI Compressor happy. However, if you must, then sequestering the eval() function is your best bet for optimal minification.

The with statement

The with statement is the second evil feature that interferes with the YUI Compressor’s variable replacement technique. For those unfamiliar, the with statement is designed (in theory) to reduce the size of code by eliminating the need to write the same variable names over and over again. Consider the following:

var object = {
    message: "Hello, ",
    messageSuffix: ", and welcome."
};
object.message += "world" + object.messageSuffix;
alert(object.message);

The with statement allows you to rewrite this code as:

var object = {
    message: "Hello, ",
    messageSuffix: ", and welcome."
};
with (object) {
    message += "world" + messageSuffix;
    alert(message);
}

Effectively, the with statement avoids the need to repeat “object” multiple times within the code. But these savings come at a cost. First, there are performance implications from using the with statement, as local variables become slower to access. This happens because variables inside of a with statement are ambiguous until execution time: They may be properties of the with statement’s context object or they may be variables from the function or another execution context. To understand this ambiguity better, take a look at the code when the local variable message is added and the definition of object is removed:

var message = "Yo, ";

with (object) {
    message += "world" + messageSuffix;
    alert(message);
}

When the identifier message is used inside of the with statement, it could be referencing the local variablemessage or it could be referencing a property named message on object. Since JavaScript is a late binding language, there is no way to know the true reference for message without completely executing the code and determining if object has a property named message. Witness how late binding affects this code:

function displayMessage(object) {
    var message = "Yo, ";

    with (object){
        message += "world" + messageSuffix;
        alert(message);
    }
}

displayMessage({ message: "Hello, ", messageSuffix: ", and welcome." });
displayMessage({ messageSuffix: ", and welcome." });

The first time that displayMessage() is called, the object passed in has a property named message. When the with statement executes, the reference to message is mapped to the object property and so the displayed message is, “Hello, world, and welcome.” The second time, the object passed in has only themessageSuffix property, meaning the reference to message inside of the with statement refers to the local variable and the message displayed is therefore, “Yo, world, and welcome.”

Since the YUI Compressor doesn’t actually execute the JavaScript code, it has no way of knowing whether identifiers in a with statement are object properties (in which case, it is not safe to replace them) or local variable references (in which case, it is safe to replace them). The YUI Compressor treats the with statement the same as eval(): when present, it will not perform variable replacement on the function or any containing execution contexts.

Unlike eval(), there is no way to sequester the with statement in such a way that it doesn’t affect most of the code. The recommendation is to avoid using the with statement at all. Even though it appears to save bytes at the time of code writing, you actually end up losing bytes by forfeiting YUI Compressor’s variable replacement feature. The displayMessage() function gets minified like this:

function displayMessage(object){var message="Yo, ";with(object) »
{message+="world"+messageSuffix;alert(message)}};

This result is 112 bytes. If the function is rewritten to avoid the with statement, displayMessage() looks like this:

function displayMessage(object) {
    var message = "Yo, ";

    object.message += "world" + object.messageSuffix;
    alert(object.message);
}

When minified, this new version of the function becomes:

function displayMessage(a){var b="Yo, ";a.message+="world"+ »
a.messageSuffix;alert(a.message)};

The size of this result is 93 bytes, so even though the original source code is larger. The minified source code becomes smaller because we used variable replacement.

Conclusion

YUI Compressor’s variable replacement functionality can give big byte savings while minifying your JavaScript. Since the YUI Compressor tries to avoid breaking your code by incorrectly replacing variable names, it will turn off variable replacement when the eval() function or with statement is used. These “evil” features alter how JavaScript code is interpreted and prevent the YUI Compressor from safely replacing variable names, which costs you a large amount of byte savings. Avoid this penalty by steering clear of eval() or sequester it away from the rest of your code. Also, avoid the with statement. These steps will ensure that your code doesn’t get in the way of optimal minification. 

— http://www.alistapart.com/articles/better-javascript-minification/

May 20, 2010
I ducked. I waited. And it worked.

Those Aren’t Fighting Words, Dear

By LAURA A. MUNSONPublished: July 31, 2009

LET’S say you have what you believe to be a healthy marriage. You’re still friends and lovers after spending more than half of your lives together. The dreams you set out to achieve in your 20s — gazing into each other’s eyes in candlelit city bistros when you were single and skinny — have for the most part come true.

Two decades later you have the 20 acres of land, the farmhouse, the children, the dogs and horses. You’re the parents you said you would be, full of love and guidance. You’ve done it all: Disneyland, camping, Hawaii, Mexico, city living, stargazing.

Sure, you have your marital issues, but on the whole you feel so self-satisfied about how things have worked out that you would never, in your wildest nightmares, think you would hear these words from your husband one fine summer day: “I don’t love you anymore. I’m not sure I ever did. I’m moving out. The kids will understand. They’ll want me to be happy.”

But wait. This isn’t the divorce story you think it is. Neither is it a begging-him-to-stay story. It’s a story about hearing your husband say “I don’t love you anymore” and deciding not to believe him. And what can happen as a result.

Here’s a visual: Child throws a temper tantrum. Tries to hit his mother. But the mother doesn’t hit back, lecture or punish. Instead, she ducks. Then she tries to go about her business as if the tantrum isn’t happening. She doesn’t “reward” the tantrum. She simply doesn’t take the tantrum personally because, after all, it’s not about her.

Let me be clear: I’m not saying my husband was throwing a child’s tantrum. No. He was in the grip of something else — a profound and far more troubling meltdown that comes not in childhood but in midlife, when we perceive that our personal trajectory is no longer arcing reliably upward as it once did. But I decided to respond the same way I’d responded to my children’s tantrums. And I kept responding to it that way. For four months.

“I don’t love you anymore. I’m not sure I ever did.”

His words came at me like a speeding fist, like a sucker punch, yet somehow in that moment I was able to duck. And once I recovered and composed myself, I managed to say, “I don’t buy it.” Because I didn’t.

He drew back in surprise. Apparently he’d expected me to burst into tears, to rage at him, to threaten him with a custody battle. Or beg him to change his mind.

So he turned mean. “I don’t like what you’ve become.”

Gut-wrenching pause. How could he say such a thing? That’s when I really wanted to fight. To rage. To cry. But I didn’t.

Instead, a shroud of calm enveloped me, and I repeated those words: “I don’t buy it.”

You see, I’d recently committed to a non-negotiable understanding with myself. I’d committed to “The End of Suffering.” I’d finally managed to exile the voices in my head that told me my personal happiness was only as good as my outward success, rooted in things that were often outside my control. I’d seen the insanity of that equation and decided to take responsibility for my own happiness. And I mean all of it.

My husband hadn’t yet come to this understanding with himself. He had enjoyed many years of hard work, and its rewards had supported our family of four all along. But his new endeavor hadn’t been going so well, and his ability to be the breadwinner was in rapid decline. He’d been miserable about this, felt useless, was losing himself emotionally and letting himself go physically. And now he wanted out of our marriage; to be done with our family.

But I wasn’t buying it.

I said: “It’s not age-appropriate to expect children to be concerned with their parents’ happiness. Not unless you want to create co-dependents who’ll spend their lives in bad relationships and therapy. There are times in every relationship when the parties involved need a break. What can we do to give you the distance you need, without hurting the family?”

“Huh?” he said.

“Go trekking in Nepal. Build a yurt in the back meadow. Turn the garage studio into a man-cave. Get that drum set you’ve always wanted. Anything but hurting the children and me with a reckless move like the one you’re talking about.”

Then I repeated my line, “What can we do to give you the distance you need, without hurting the family?”

“Huh?”

“How can we have a responsible distance?”

“I don’t want distance,” he said. “I want to move out.”

My mind raced. Was it another woman? Drugs? Unconscionable secrets? But I stopped myself. I would not suffer.

Instead, I went to my desk, Googled “responsible separation” and came up with a list. It included things like: Who’s allowed to use what credit cards? Who are the children allowed to see you with in town? Who’s allowed keys to what?

I looked through the list and passed it on to him.

His response: “Keys? We don’t even have keys to our house.”

I remained stoic. I could see pain in his eyes. Pain I recognized.

“Oh, I see what you’re doing,” he said. “You’re going to make me go into therapy. You’re not going to let me move out. You’re going to use the kids against me.”

“I never said that. I just asked: What can we do to give you the distance you need … ”

“Stop saying that!”

Well, he didn’t move out.

Instead, he spent the summer being unreliable. He stopped coming home at his usual six o’clock. He would stay out late and not call. He blew off our entire Fourth of July — the parade, the barbecue, the fireworks — to go to someone else’s party. When he was at home, he was distant. He wouldn’t look me in the eye. He didn’t even wish me “Happy Birthday.”

But I didn’t play into it. I walked my line. I told the kids: “Daddy’s having a hard time as adults often do. But we’re a family, no matter what.” I was not going to suffer. And neither were they.

MY trusted friends were irate on my behalf. “How can you just stand by and accept this behavior? Kick him out! Get a lawyer!”

I walked my line with them, too. This man was hurting, yet his problem wasn’t mine to solve. In fact, I needed to get out of his way so he could solve it.

I know what you’re thinking: I’m a pushover. I’m weak and scared and would put up with anything to keep the family together. I’m probably one of those women who would endure physical abuse. But I can assure you, I’m not. I load 1,500-pound horses into trailers and gallop through the high country of Montana all summer. I went through Pitocin-induced natural childbirth. And a Caesarean section without follow-up drugs. I am handy with a chain saw.

I simply had come to understand that I was not at the root of my husband’s problem. He was. If he could turn his problem into a marital fight, he could make it about us. I needed to get out of the way so that wouldn’t happen.

Privately, I decided to give him time. Six months.

I had good days, and I had bad days. On the good days, I took the high road. I ignored his lashing out, his merciless jabs. On bad days, I would fester in the August sun while the kids ran through sprinklers, raging at him in my mind. But I never wavered. Although it may sound ridiculous to say “Don’t take it personally” when your husband tells you he no longer loves you, sometimes that’s exactly what you have to do.

Instead of issuing ultimatums, yelling, crying or begging, I presented him with options. I created a summer of fun for our family and welcomed him to share in it, or not — it was up to him. If he chose not to come along, we would miss him, but we would be just fine, thank you very much. And we were.

And, yeah, you can bet I wanted to sit him down and persuade him to stay. To love me. To fight for what we’ve created. You can bet I wanted to.

But I didn’t.

I barbecued. Made lemonade. Set the table for four. Loved him from afar.

And one day, there he was, home from work early, mowing the lawn. A man doesn’t mow his lawn if he’s going to leave it. Not this man. Then he fixed a door that had been broken for eight years. He made a comment about our front porch needing paint. Our front porch. He mentioned needing wood for next winter. The future. Little by little, he started talking about the future.

It was Thanksgiving dinner that sealed it. My husband bowed his head humbly and said, “I’m thankful for my family.”

He was back.

And I saw what had been missing: pride. He’d lost pride in himself. Maybe that’s what happens when our egos take a hit in midlife and we realize we’re not as young and golden anymore.

When life’s knocked us around. And our childhood myths reveal themselves to be just that. The truth feels like the biggest sucker-punch of them all: it’s not a spouse or land or a job or money that brings us happiness. Those achievements, those relationships, can enhance our happiness, yes, but happiness has to start from within. Relying on any other equation can be lethal.

My husband had become lost in the myth. But he found his way out. We’ve since had the hard conversations. In fact, he encouraged me to write about our ordeal. To help other couples who arrive at this juncture in life. People who feel scared and stuck. Who believe their temporary feelings are permanent. Who see an easy out, and think they can escape.

My husband tried to strike a deal. Blame me for his pain. Unload his feelings of personal disgrace onto me.

But I ducked. And I waited. And it worked.

Laura A. Munson is a writer who lives in Whitefish, Mont.

May 11, 2010
Do it Fucking Now

When it comes to building your business, there are 4 words that should be echoing in your mind throughout the day; they are “Do it Fucking Now.”

We’re not talking about checking your stats or chatting with your buddies on Instant Messenger. We’re not talking about checking your RSS reader incessantly throughout the day. And we’re not talking about surfing MySpace, Digg, Fark, Television or some other time waister.

We’re talking about developing your online properties. We’re talking about creating new campaigns to drive links and revenue. When we say “Do it Fucking Now”, we’re talking about those tasks that you keep putting off which, when completed, will start putting more money in the bank.

Do it Fucking Now.

Don’t wait. Don’t procrastinate. The winners in this world are not the ones who find the greatest excuses to put off doing what they know will make them more money. The winners are the ones that prioritize and seize the day.

Create a list of action items to make sure your important tasks get accomplished. Every project you’re working on should be in action. If you’re not moving, you’re standing still. Your next step towards making money must not be “something I’ll take care of maybe sometime next week.” If it’s going to help make you money: Do it Fucking Now.

Some of you may think that you don’t need the “fucking” in “do it fucking now”. You do. You need that impact, that force, that call to action and mostly, that kick in the ass to get you moving. Otherwise, you’ll end up another loser that had a great idea a long time ago but never did anything about it. Dreamers don’t make money. Doers make money. And doers “Do it Fucking Now.”

This passage is truer today than when it was written more than 400 years ago:

There is a tide in the affairs of men
Which, taken at the flood, leads on to fortune;
Omitted, all the voyage of their life
Is bound in shallows and in miseries.
On such a full sea are we now afloat;
And we must take the current when it serves,
Or lose the ventures before us.

– William Shakespeare, Julias Ceasar

Cliffnotes of quote for the Shakespearean impaired

Try it. Next time you have an inclining to procrastinate on a task that you know will make you money, say those magic words out loud and get inspired!

Do it Fucking Now!

— http://seoblackhat.com/2007/01/29/do-it-fucking-now/

April 29, 2010
10 Steps To A More Usable Ecommerce Website

The ecommerce marketplace is a very competitive one and a rival site is never more than a click away. If you want to attract and retain customers, you need to make sure that your site is as usable as possible.

You could be selling the best products in the world, at unbelievably low prices, but if shoppers can’t find them or get confused along the way, you’re never going to reach your full potential in terms of sales.

Improving usability is all about making the buying process on your site as quick and easy as possible. The smallest of changes can have the most dramatic effect on conversion rates. The 10 steps explored below will all help to improve both sales and customer satisfaction. It’s not necessarily a case of employing all 10 of these steps on your site- some smaller merchants will find this nearly impossible. Pick the ones that you think will work best for you and don’t be afraid to try something new.

1. Let Shoppers Buy without Registering

Let Shoppers Buy without Registering
Every company wants shoppers to register for an account, but the lengthy registration process is a real turnoff for many visitors, especially those who believe (rightly or wrongly) that what they want from you is a one-off purchase.

It’s a good idea to allow ‘guests’ to add items to their carts and checkout without the hassle of registration. Once they’ve committed to their purchase, they should be given the option to ‘Sign Up’ to save time on their next visit. This method has been shown to increase sales, improve customer retention and lower cart abandonment. Remember, in many cases, a sale is more valuable than an email address.

2. Keep the Signup Simple

Keep the Signup Simple
How much information do you need from a customer when they sign up on your site? You might want as much as you can get, but in reality you need very little. Avoid lengthy signup forms which customers are likely to run a mile from as soon as they open. All you really require is an email address and a password.

Many sites ask for a username rather than an email address, but this can be a source of more confusion – usernames are easy to forget, email addresses are memorable; usernames are common, email addresses are unique.

3. Tell Users Where They Are

Tell Users Where They Are
Breadcrumb navigation is a must for all major ecommerce sites. When placing an order, customers need to know exactly where they stand in the purchase process – how many steps they’ve completed and how many are yet to come. Without such navigation, customers easily get bored, think the process is going to go on forever and abandon their purchase halfway.

Using breadcrumb navigation, customers can easily skip back to a previous step if they think they’ve made a mistake, rather than giving up altogether. If breadcrumb navigation is beyond your capabilities, numbering each step – e.g. Enter delivery address (step 1 of 4) – is the next best thing.

4. Make Shoppers Feel Safe

Make Shoppers Feel Safe
Quite rightly, lots of people worry about giving out credit card numbers and personal details online. Shoppers need to feel completely confident when they buy from you. You need to reassure your customers at every stage that your site is safe and that you are a reputable merchant who will protect their privacy and not share their information.

A great way to do this is to get a trust certificate from somewhere like Hacker Safe or VeriSign. You should also ensure that you have an updated SSL certificate.

5. Confirmation

Confirmation
Confirmation is an absolute necessity if you want to make your site as usable as possible. Not only does it reassure shoppers, it saves you time by reducing the number of queries you get from confused customers.

Effective confirmation should be split up into three parts:

  1. The last step in the order process should ask the customer to confirm their order. They should be presented with all the necessary information- order summary, total cost, delivery and tracking information etc. as well as an easy way to cancel their order if they’ve made a mistake.
  2. Once the order has been confirmed, the customer should be presented with an official order confirmation complete with order number, which can either be saved or printed.
  3. A copy of this confirmation should be emailed to the customer for their records.

6. Search Function

Search Function
Every ecommerce site needs a high visibility search box, preferably located in a clearly marked spot above the fold, which should allow customers to easily filter and refine their results to find what they want.

Search functionality reduces the time customers spend searching for items, making their shopping experience a happier one.

If your site offers a wide variety of products, you should strongly consider adding a search by category refinement, which not only quickens the search process, but reminds customers of the wide range of items you have for sale.

Letting shoppers search by colour, size etc (if applicable) is also a good idea. In addition, you might want to give your visitors the power to customise their search results, by letting them choose how many items are visible per page.

7. Specify Related Items

Specify Related Items
Nobody wants to feel pressured into buying more than they really want when they visit a website, but if used properly, specifying related items and cross-selling can prove very helpful for customers and very profitable for merchants.

If a shopper’s looking at a coat on a clothing site, for instance, they can be provided with suggestions for other items to complete the look. If they’re buying an electronic gadget, additional necessities like batteries and cables can be made easily available. Amazon’s method for suggesting related items has been shown to increase revenue and retention massively.

8. Call-to-Action Buttons

Call-to-Action Buttons
Never underestimate the power of the call-to-action button. Effective ‘add to cart’, ’sign up’ and ‘proceed to checkout’ buttons can push your conversion rates through the roof and vastly improve your site’s usability.

To make these buttons stand out you need to think carefully about their size, colour, font, wording and positioning. They need to be large, clear and in a colour that will stand out against your site’s background. ‘Add to cart’ should be used instead of ‘buy now’, which can scare away some people. Local language should be taken into consideration when designing call-to-action buttons. For example, Americans are more accustomed to ‘add to cart’, while a British shopper would be more familiar with ‘add to basket’. If possible, use IP delivery to serve custom versions based on the customer’s geographic location.

9. Avoid Hidden Charges

Avoid Hidden Charges
If there’s one thing that angers customers more than anything else, it’s hidden costs. Make sure that you display prices, taxes, shipping charges (and money saved if applicable) as early in the purchase process as possible. People tend to shop on a budget and want to know their genuine totals before adding other items to their cart.

If they’re presented with a load of extra costs when they finally come to pay, they’re more than likely to abandon ship, trust will be broken and repeat orders lost.

10. Keep the Cart Accessible

Keep the Cart Accessible
The cart should be visible to a customer at all times, on every page. It should appear above the fold, at the top or on the right, so that customers need not navigate away to view their cart contents and the total order cost. To increase usability further, customers should be able to edit their cart, adding and removing items, at any stage, on any page, without having to update or refresh.

A ‘proceed to checkout’ button should be positioned inside the cart, making the order process that little bit quicker.

—- http://spyrestudios.com/usable-ecommerce-website/

Liked posts on Tumblr: More liked posts »