November 12, 2010

Forms of Forms

How many forms do you fill out on the Web? Lots and lots, I'd bet. Do some of them make you want to tear your hair out? Indubitably.

How do you make a good form? With the current (HTML 4) tools available to you, you make a simple form with a lot of text input fields, do some JavaScript validation, and make it pretty with CSS 2. With the upcoming HTML 5 features, you make a simple form with different types of input fields, make use of the browser for validation (possibly in addition to JavaScript), and make it pretty with CSS 3.

Making a form is easy!

"Wait a minute," you say. "There's got to be more to it than that. I heard that if you put your form interspersed in a paragraph, for example, the percentage of people who fill it out goes up dramatically. There's got to be more to it than input fields, JavaScript, and CSS. Where's the magic?"

I'm glad you asked.
  • Make it appealing without sacrificing usability. Set off the form from the surrounding elements through the strategic use of pictures, borders around the form, or a different background color. Also, use enough whitespace (but don't float your label on the left edge of the screen and your text field on the right – that's too much whitespace).
  • Take advantage of the HTML5 form validation as soon as it's widely implemented. The less you have to rely on server-side validation, the less load you'll put on the servers and the happier your customers will be.
  • Speaking of HTML5, start using the new form input types and placeholder text now. They degrade gracefully to regular text input fields in older browsers, and they provide advanced functionality to people using modern desktop browsers and Mobile Safari.
  • Only collect the information you absolutely have to. Why ask about a user's favorite color in a form to sign up for a mailing list? (Okay, that's an extreme example, but you get the point.)
Abracadabra!

November 09, 2010

Why Web Designers Should Like IE 6

Cascading Style Sheets are what makes the Web not boring. CSS is descended from SGML (Standard Generalized Markup Language), which was created in the 1970s. The first version of the CSS standard was published in 1996, with version 2 being finalized in 1998. Version 3 is still under development.

The first browser to fully support CSS1 was a browser that only one person remembers: Internet Explorer 5 for the Mac. You read that right: The first CSS standards-compliant browser was created by Microsoft. That was in 2000, four years after the standard was first published and two years after CSS2 was released. Other browsers played catch-up in the months following.

The problem with the Internet in the time leading up to the adoption of the CSS standards was that no one had been willing to wait for the standards body to, well, standardize, and so they implemented horrible proprietary things like <blink> and <marquee>. Each new version fought to not only include the newfangled tags that its competitors had introduced, but also to create new features of its own. "Best viewed on <browser x, version y> at <designer's screen resolution>" became all too common.

So who was our knight in shining armor who delivered us from this? Internet Explorer 6.

Indirectly, of course. IE 6 in and of itself was not particularly revolutionary, except for the fact that its Standards Mode hewed more closely to the standards than any other major browser at the time (sorry, Opera, even back then you weren't a major browser). The revolution was its competitors.

See, IE 6 had something called Quirks Mode. Basically, if your HTML document had a certain doctype (or no doctype declared at all), the browser would fall back and render the page like IE 5 would have. This was to keep old pages from breaking. One consequence of this was that the infamous "whitespace bug" was perpetuated. CSS2 support was also not as good as it could have been. Mozilla and others jumped into the fray at this point, reigniting the browser wars. The result? Today, because IE 6 was so bad, we have Firefox, Opera, Chrome, and IE 9 (which will supposedly implement the standards way better than any previous version of IE).

Thank you, IE 6.

November 01, 2010

Instant Results and Spin

After reading the transcript of the SpoolCast episode Luke Wroblewski and Innovations in Web Input, I decided to write about two subjects they brought up. It's a double post! What does it mean?!*

*Yes. This joke is stale.

Isn't Google Instant Awesome?


I mean, really! You start typing and (as long as you're not using Opera) results just pop up (unless your connection's too slow)! It's like magic! It makes Amazon's search suggestions look quaint and your public library's catalog search look positively archaic! Why can't they do magic like that, too?

Well, Google has approximately one quadrillion times the resources of your public library, for one thing. Something like Google Instant takes a lot of resources. If a company tries to implement something like that without the required resources, the resulting performance hit (and probably downtime) is as bad as or worse than not having search at all. Yahoo! actually tried to implement something similar to this in 2005, but they ended up ditching it because they were concerned about server load.

This does put smaller organizations at a bit of a disadvantage, because if people get used to seeing results instantaneously, they start expecting it everywhere. Why should I have to type my entire search query, hit enter, and wait for another page to load? (I guess you could argue that Google is aiding Twitter's nefarious plot to shorten the attention span of the world's population.) Unfortunately, though, businesses have to allocate resources to the activities that will provide them with the most benefit, so Google Instant-esque capabilities are probably going to be fairly low on the list.

Their Numbers Don't Mean As Much As You Think They Do.
I used this analogy recently…there's 160 million iTunes users, and within 48 hours they announce that one million of them were on Ping. So the metaphor I used there was, well if 160 million people are driving down a road, and I put a pile of dog poo on that road, chances are one million will drive through it. — Luke Wroblewski
In a world where Apple can do no wrong, their music social network Ping is a fledgling feature that hasn't yet reached its full potential. In the real world, well, it's been compared to a pile of dog poo. "One million" is a useless measure without context. I'd love if one million people read my blog. Facebook would probably kill a new feature that only attracted one million users. For the iTunes Store, one million is less than 0.7% of their users.

On the other hand, one could argue, for the time period mentioned in this anecdote, maybe 160 million users isn't the metric we should use to judge Ping's success. Surely, not all 160 million people are trying to buy music at the same time. Maybe only half of them are typically online at any given time. That makes Ping's user base…just over 1%. The point is, a company can spin numbers in a multitude of ways to make themselves sound better.

(Wroblewski goes on to suggest that the reason for Ping's disappointing adoption rate is an uncharacteristic lack of attention to detail on Apple's part. Version 2 might be better.)

October 31, 2010

Usability In The Rainforest

On the web, usability refers to the ability of users to find and use stuff on a website. (How's that for a circular definition?) According to Mel Pedley on Accessites.com, there are five core components of usability:
  1. Learnability: On a first visit, can users find what they're looking for?
  2. Effectivity: Can users do stuff quickly?
  3. Memorability: If it's been a while since a user was on the site, can s/he still use the site?
  4. Reliability: How error-prone are users while using the site?
  5. Enjoyability: Do users like using the site (or, at least, do they not hate it with the burning passion of a thousand suns)?
Let's explore these concepts with a site we're all familiar with: Amazon.com. Sarah has been living in a rural area with ridiculously slow dial-up for the past several years, and has just discovered that you can buy products online. She needs to order a new DVD burner so she can mail her mom some home movies. She types "buy stuff online" into Google.


She sees that Amazon is the first result, and decides to click on it. (Hey, bonus points for findability!) She is then dumped onto Amazon's main page.


Okay, not a problem. Amazon's apparently a big site, which makes sense since her search query was very general. She looks around for "DVD Burners", or "Computer Components", or anything that looks like it could be what she's after. There's "Computers & Office" in the sidebar, and voila! There's "Computer Components" right there.


Lots of computer components to choose from. She remembers now why she asked her nephew for help the last time she needed to buy computer parts. Where are the DVD burners?


She scrolls down and – oh, there they are! Her nephew told her once that optical drives are the same as CD/DVD drives, so she clicks there.


She's still looking in the upper-left corner when the next page loads, so she immediately sees the link for "DVD Burners" in the navigation and clicks on it, too. No use in seeing all that other stuff she's not after.


Now that Sarah has found the DVD burners, let's evaluate how Amazon has been doing so far.
  • Sarah could find what she was after with relative ease, so they get a point for learnability. (On the other hand, if she had been looking for something more obscure, she probably would have had a harder time of it.)
  • She didn't have to waste a lot of time to get to where she was going, but she had the benefit of already knowing that "optical drives" and "DVD burners" were synonymous. Therefore, Amazon's effectivity was mediocre.
  • This is a first-time visit, so we're not analyzing memorability.
  • Sarah could easily have missed the link she needed to click on a few different times, because it was not necessarily put in a place that made the most sense. Reliability may or may not be an issue.
  • So far, Sarah doesn't have a problem with using the site, so its initial enjoyability is not an issue.
What could Amazon do better? This is a hard question. One's first inclination might be to say that they should make it easier to find what people are looking for. The problem with that in this case is that because Amazon carries so many products, if they tried to make it easy to find everything, that would make their site too complex and cluttered to find anything. Burying some things three or four levels deep may be the best way to organize the information. Sometimes you have to make compromises to create the best site possible.

October 17, 2010

Accessibility Is The Path To Awesomeness

Accessibility in the context of a Web site is the degree to which that Web site is usable by people with disabilities. Web pages often have access issues for the following groups of people:

That's one definition of accessibility in an online context. A simpler definition might be: A web site that everyone can use. That's a touch simplistic and idealistic, but it gets closer to what accessibility truly is.

There are a lot of resources out there devoted to helping web designers make their sites more accessible. The University of Minnesota, for example, has a long list of resources and tools related to accessibility. It's pretty overwhelming. About.com also has several articles about accessibility.

There's a simpler method, though, and while it's not 100% foolproof, it will get you fairly close to an accessible website. It is this: Use common sense and well-formed HTML code.

"But," you protest, "what about access keys, and alt text, and all those other things they talk about?" Remember what I said about well-formed HTML code. Images are required to have alt attributes in order for a page to validate. (Pages will still validate with blank alt attributes, though. That's where using common sense comes in: does the page still make sense without the image and without any alt text?)

Access keys (alt+[key]) are slightly different, as they are not required in valid HTML code. It also doesn't always make sense to use them. Using too many on a page can be overwhelming for a user. You also have to be careful not to use keystroke combinations that are already used for browser menus or other similar functions.

The WAVE report for the main page of Wikipedia reveals the access keys that are in use there. By my count, there are 14 different access keys, which make varying degrees of sense. Alt-F might make sense if the search field were labeled "Find articles", but it is not. Alt-U for "Upload file" does make sense, but Alt-K for "Related changes"? Another problem with using Alt-F to get to the search field is that that combination is used in nearly every Windows program to access the File menu. Firefox gets around this by adding Shift to the access key combination (Alt-Shift-F), but Safari overrides the default (Alt-F always brings up the search field).

Wikipedia does do something right, though. If you disable styles on the page, the navigation drops down to the bottom of the page. This makes it easier for people with text-only browsers or screen readers to get to the content.

Another important aspect is the color scheme. If you're planning on designing a Christmas website with red text on a green background, remember that about 5-7% of people suffer from red-green color blindness, or protanopia/deuteranopia, which would make it extremely difficult or even impossible for them to even see that there's text there. Tritanopia is another type of color blindness that affects a person's ability to see blue. One of my friends in college suffered from monochromacy and could only see shades of gray. When choosing colors, you might try using a graphics editor to convert them to grayscale and see if there is enough contrast there even without any "real" coloration.

Finally, organizing content in a way that makes sense is probably the most important step towards accessibility. Remember, you're not designing just for someone with a disability. You're designing for everyone.

September 26, 2010

Beauty In Type

@font-face {
font-family: "FontinSansRegular";
src: url('fonts/fontinsans.eot');
src: local('?'), url('fonts/fontinsans.woff') format('woff'), url('fonts/fontinsans.ttf') format('truetype'), url('fonts/fontinsans.svg#webfontn8vXGJ0x') format('svg');
font-weight: normal;
font-style: normal;
}
Do you know what this is?

It's the future.

Okay, maybe it's not quite that dramatic. However, it does represent a huge step forward in web design. It's a web font declaration in CSS.

Let's go back to the dark ages, when Internet Explorer and Netscape Navigator ruled the Internet. In those days, text online was rendered in whatever fonts you had on your system. Running Windows 95? You got Arial and Times New Roman. Running a Macintosh? Default fonts were Chicago and New York.

Then came CSS, Internet Explorer 3, and the core fonts for the Web project.

The core fonts project aimed to provide a set of fonts that would be widely downloaded and used, which was supposed to ensure that websites looked the same across platforms. The downside to this was that the fonts had to be present on the user's system, not just on the web server. Granted, due to Windows' near-complete domination of the computer market, the vast majority of people probably did have the fonts installed. With the new (partial) CSS implementation in IE 3, you could specify typefaces. Yes, that's a choir of angels you hear singing "Hallelujah".

It still wasn't perfect, not by a long shot. You were still limited to whatever fonts your users had on their systems. You could be reasonably sure, however, that the fonts included in the core package were going to be present for the vast majority of your users. I mean, I could design a page using Footlight MT Light, but it might fall back to Times New Roman on your system.

With the introduction of the @font-face declaration in CSS 2, you could finally reference fonts that weren't stored on the user's computer! In the example above, I'm telling the browser to grab the Fontin Sans file, which is stored in the subfolder fonts. On my server. Not your computer. As long as you're using a browser that's at least as new as Internet Explorer 4, you'll see Fontin Sans on this webpage.

"Wait!" you say. "It displayed your fancy-schmancy new font after a minute, but when it first loaded, [it was in Times New Roman/I couldn't see any of the text]! What gives?"

Yeah, that's the problem with using @font-face. Pingdom says that fontinsans.ttf is one of the last things to load, and it takes a comparatively long time to load on top of that. Until it loads, the page is in limbo. Different browsers handle this limbo time in different ways. Firefox and Opera temporarily fall back to the next font in the font stack. Safari completely hides the text (though not the underline on hyperlinks, interestingly enough; if you load that page in Safari, you can see random lines going across the screen). Internet Explorer, for me at least, takes so long to load the entire page that it renders in Fontin Sans when it finally displays.

When the page is finished loading, though, the typeface is so beautiful that it makes Michelangelo weep.

(Again, maybe not quite that dramatic.)

Want to learn more?

September 13, 2010

I Have A Canvas And A JavaScript Paintbrush

One of the biggest problems of the Internet today is an over-reliance on proprietary plugins. Mac users will be especially familiar with the feelings of abject rage as a Flash game bogs down their system, takes over a chunk of memory, and causes the fans in their laptop to whir consistently, due to the lack of hardware acceleration in the Mac version of Flash Player (which was only recently remedied). There's Flash, Silverlight, Java, and whatever proprietary single-use plugin TV networks' websites make you install to watch their shows.

"So what?" you say. "I just install the plugins when I need them. No big deal." Yeah...except each one requires a download, an installation, and a browser restart. It's a hassle. (And we won't get into cross-platform issues.)

Better than that, each plugin introduces its own set of security holes. Flash is notorious for this, but it is not alone in that regard.

Plugins used to be the only way to provide interactivity to a website. Something better is looming on the horizon, though: HTML5, and with it, <canvas>, <video>, and <audio>.

The video and audio tags are fairly self-explanatory. As long as the browser properly implements them, they provide plugin-free playback for videos and sound, respectively. Canvas is an HTML tag that essentially gives you a blank area that you draw on using JavaScript. The code required is fairly similar to creating graphics in a Java applet, for those of you who are familiar with that.

Java Applet Code:
g.setColor(new Color(0x5E, 0x2F, 0x00));
g.fillRect(0, 180, 200, 50);

JavaScript Canvas Code:
ctx.fillStyle = "#5E2F00";
ctx.fillRect(0, 180, 200, 50);

Canvas/JavaScript provides no easy way, however, to draw ovals or rounded shapes. Compare the two methods for drawing a rectangle with rounded corners:

Java Applet Code:
g.setColor(Color.white);
g.fillRoundRect(45, 35, 50, 35, 10, 10);
g.setColor(Color.black);
g.drawRoundRect(45, 35, 50, 35, 10, 10);

JavaScript Canvas Code:
ctx.fillStyle = "#FFFFFF";
ctx.strokeStyle = "#000000";
ctx.beginPath();
ctx.moveTo(45, 45);
ctx.quadraticCurveTo(45, 35, 55, 35);
ctx.lineTo(85, 35);
ctx.quadraticCurveTo(95, 35, 95, 45);
ctx.lineTo(95, 60);
ctx.quadraticCurveTo(95, 70, 85, 70);
ctx.lineTo(55, 70);
ctx.quadraticCurveTo(45, 70, 45, 60);
ctx.lineTo(45, 45);
ctx.fill();
ctx.stroke();
ctx.closePath();

Even with that convoluted code, I still saved approximately 60 lines of code generating this image in JavaScript with canvas than it took to do the same thing in a Java applet. Most of this savings probably came from the fact that JavaScript has both a fillStyle and a strokeStyle, while Java uses setColor() for everything, necessitating more color changes. Plus, the user doesn't have to install a plugin to make it work, it renders pretty much instantaneously in the browser window, and you could copy the generated image and save it if you wanted to, which would be useful if you wanted to code a drawing web app of some sort.

Want to learn more about drawing with <canvas>?

September 05, 2010

The Standards Are There, So Use Them

Imagine a scenario.

Kate has just been hired by Widgets Ltd., a start-up company that is being run in a garage outside Madison, Wisconsin, to create a website for their products. She has no web design experience outside of Comp Sci 101, back in the bad old days of freshman year. "No problem," she thinks to herself. "I've got an old copy of Microsoft FrontPage here. I'll just draw some tables and drop the content in. Easiest money I ever made."

Of course, we, as web developers ourselves, can imagine the hideous code that will result from this misguided approach:
<html><head>
<meta http-equiv="Content-Language" content="en-us">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Welcome to Widgets, Ltd.!</title>
</head>

<body bgcolor="#00FFFF" link="#00FFFF" vlink="#00FFFF">
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="100%" id="AutoNumber1" height="59">
So much for separating organizational and display functions. Kate's work failed to adhere to (or even consider, for that matter) web standards. Without boring you with the details, the above code snippet contains four errors when run through the W3C HTML Validator — and we haven't even made it to any of the actual content yet.

What are web standards, you may be asking? They are a set of guidelines codified by the World Wide Web Consortium (and Ecma International, which standardizes ECMAScript/JavaScript). They define the elements, the syntax, the attributes, the doctypes, everything. Browser developers then take these standards and program their browsers to properly render web pages based on these standards. Opera generally leads the pack as far as standards compliance, with Firefox and Safari following and Internet Explorer trailing in a distant fourth.

Now, designing with web standards does not mean making your website look exactly the same across all browsers. Someone looking at it in Firefox on Windows XP is going to get a slightly different look than someone looking at it in Safari on Snow Leopard. Is that wrong? Is that bad? Not at all. Very few people will even notice without you pointing it out to them. They're different, not wrong — if you coded the site correctly, that is.

So, in summary, my argument for designing to web standards is this. Internet Explorer 6 (and prior versions) didn't care about abiding by web standards, and complications stemming from that caused much wailing and gnashing of teeth. Why would you want your website to even have a possibility of inspiring a response like that? Design to the standards. It will cause many fewer problems.

*The problems described herein are not unique to Microsoft products by any means. However, every time I bash Microsoft, Canonical and Red Hat send me a tenth of a penny. I look forward to being able to afford a gumball.

August 28, 2010

Architecture, Latches, and Taxes

Information architecture is the confluence of context, content, and users. What does that mean? It means you design your website around your content, while keeping in mind usability, the perspective from which your audience is coming, and any relevant "stuff" (for lack of a better term) from your business.

Richard Saul Wurman first coined the term information architect in the mid-1970s. He explains his choice of words as the following:
Unfortunately, design, which used to be a perfectly good word, means to make something look better for most people....The designer is called in to make a magazine article look better, or an illustrator is asked to make a picture look arresting, or a photographer is asked to take an interesting view of an author or a subject. Nowhere are any of these designers used in the fundamental sense of creating meaning or understanding.

That's why I've chosen to call myself an Information Architect....I mean architect as in the creating of systemic, structural, and orderly principles to make something work--the thoughtful making of either artifact, or idea, or policy that informs because it is clear. I use the word information in its truest sense. Most of the word information contains the word inform, so I call things information only if they inform me, not if they are just collections of data, of stuff (qtd. in Wyllys, 2000).
So an information architect's job is pretty much all-encompassing: figure out what you're displaying, and present it in the best manner possible. Organizing the information is a big part of that. Wurman lays out the five LATCH methods of organizing:
  • Location
  • Alphabet
  • Time
  • Category
  • Hierarchy
An example of information arranged by category and hierarchy is Jess Bachman's Death and Taxes poster, which divides the federal budget by department and uses a proportionally-sized icon to indicate the relative size of that department's chunk of the budget. (As a side note, it should come as no surprise to anyone that the Office of Governmental Ethics' icon is visible only with a microscope.)

Web designers should be concerned with information architecture. Website content is divided into multiple pages, of course. How do you organize them? This is where the context comes in. Is this a large e-commerce site? Organize by product type. Is this a site dedicated to the history of Elbonian widgets? Organize by year. What are your users going to be looking for? Figure out how to get them to what they need, as effortlessly as possible. You are an architect. Construct your virtual building.

August 21, 2010

Web Writers: "You Have A Short Attention Span"

My conclusion is this. Write short, grammatical sentences and have other people edit them.

I probably should have broken that into more sentences. Let's review what isn't acceptable in web writing:
  • Semicolons
  • Long paragraphs
  • Long headers
  • Complex sentences
  • Sentences that aren't stuffed with keywords
  • Formal writing style
  • Exclamation points
  • Excessive bold and italics
  • "To be"
Some of this is common sense, carried over from print writing. Others were developed to work within the constraints of screen real estate. (Remember 640x480? Those were the days.) Killing semicolons, however, is advice I find odd. How else would you punctuate a list that has items requiring commas? "Mr. John Doe, Esq., Dr. Ibee Grumpy, MD, and Mrs. Jane Smith" is not as readable as "Mr. John Doe, Esq.; Dr. Ibee Grumpy, MD; and Mrs. Jane Smith".

Whoops, I exceeded the sixty-word-per-paragraph guideline. Take a deep breath.

How many words should there be in a paragraph? Let's take a look. Ask a Manager's most recent post will serve as an example. Excluding the introductory "A reader writes" paragraph, she averages 77 words per paragraph. Even a web writer's blog occasionally exceeds 60 words per paragraph. The paragraphs that don't are often one sentence long or sound choppy. I think paragraph length will follow from your writing style and your topic.

The next web writing tip is a short paragraph. Don't make grammatical mistakes. Proofread your text. Have someone else proofread your text.

Yes, make your content engaging. Yes, remember that websites aren't in order like a book. Yes, make your stuff easy to read and navigate.

The most important point to remember? Good web writing is good writing.

April 25, 2010

A Library for IT Folks

ITIL is the Information Technology Infrastructure Library, a collection of documents describing IT best practices. ITIL was first developed in the late 1980s by the UK's Central Computer and Telecommunications Agency The ITIL philosophy is centered around a Service Strategy, which supports the areas of Service Design, Service Transition, and Service Operation; these processes are continually being improved (image from SUBnet.192):



ITIL has had 3 versions: v1, encompassing 30 books on various aspects of the IT process; v2, with 8 books; and v3, simplified to 5 books. ITIL is in the process of transitioning from version 2 to version 3, though both versions are still widely used by IT companies.

One of the aspects included in v2 -- specifically, the Service Support category of v2 -- is the Service Desk. It is pretty much what it sounds like: the company's tech support function. There are three descriptors for a Service Desk, each with differing levels of actual tech support provided.
  • A Call Center is essentially a relay station for taking customer problems and forwarding them to the appropriate support department. While Call Center employees can solve some basic problems, most of the time they just get information and forward customers to another department that is better equipped to solve their problem.
  • A Help Desk solves problems as quickly as possible. They provide support, but don't handle maintenance-type activities.
  • A Service Desk handles tech support, maintenance, change requests, etc. Pretty much, if it has to do with their system, they handle it.
The Service Desk activity is categorized under the Service Operation banner in ITIL v3.

There are many software solutions for ITIL, spanning programs that cover the entire breadth of ITIL activities and programs that focus on one aspect of it. One more focused product is ServiceDesk Plus, "a web-based help desk software that...[manages] all your communications from a single point". It takes requests via different methods (phone, email, etc.), applies the necessary rules and/or conditions, and routes them to a technician for fulfillment. (Workflow image from ManageEngine.)



There are also several companies that provide ITIL consulting services. One such company is Enterprise Consulting Services, "a boutique consulting firm specializing in IT Service Management consulting, implementation and outsourcing, using the ITIL framework". ECS focuses on translating ITIL best practices into concrete implementations based on a company's needs.

One such client with whom they have worked is Iberdrola USA (formerly Energy East), a multi-state energy corporation. ECS provided training for employees, allowing them to become certified in ITIL. They also redesigned the support and security systems and upgraded their computers (Windows XP, Office 2003, and McAfee security -- in related news, Iberdrola probably just had svchost.exe disappear for a while). These moves resulted in annual savings for Iberdrola of about $1.4 million. That's what applying optimized practices will do for a company.

Quote of the Day:
The Tech Support Glossary:
ID-Ten-T error: the user has just done something inane, like use their DVD drive tray as a cupholder. (Also known as ID10T.)

PEBKAC error: there is nothing wrong with the computer; the problem exists between keyboard and chair.

Layer 8: in the OSI Model, the user layer above the application. (See also ID-Ten-T.)

(from Wikipedia)

April 14, 2010

Buildings, Triangles, and Big Balls of Mud

Christopher Alexander had a problem. Actually, all architects had a problem. There they were, being hired to design buildings, and their clients understood the buildings more than they did. The problem, essentially, was translation. How could an architect take what the client described and turn it into what the client wanted?

Simple, Alexander said. Clients want basic variations of a set of buildings. We need a language that describes basic stuff (that's a technical term) in our problem domain, building buildings, that is simple enough to be understood and used by our clients: a pattern language. "The elements of this language are entities called [design] patterns. Each pattern describes a problem that occurs over and over again in our environment, and then describes the core of the solution to that problem, in such a way that you can use this solution a million times over, without ever doing it the same way twice."

Design patterns are not one-size-fits-all, cookie-cutter solutions. Instead, they are skeletons, templates, general descriptions of how one might solve a type of problem. For example, it has been determined that people like rooms where natural light comes in from two directions. That's a design pattern. Notice that the pattern does not say, "Put one 16"x30" window on the north wall, and one 24"x30" window on the west wall." It says, "The optimal room has natural light coming in from two directions."

Alexander came up with this concept in 1977. To this day, it has had a mixed reception in architecture. In 1987, however, Kent Beck and Ward Cunningham got the idea of applying the principles of design patterns to software. The "Gang of Four" (Gamma, Helm, Johnson, and Vlissides) popularized that usage in their 1994 book, Design Patterns: Elements of Reusable Object-Oriented Software (Wikipedia).

Good design patterns, in computer science, are classified in four categories: creational patterns, structural patterns, behavioral patterns, and concurrency patterns. Creational patterns define how an object is created. Structural patterns define relationships between entities. Behavioral patterns define methods and patterns of communication between entities. Concurrency patterns define how to deal with multiple threads in a program. Wikipedia has some good descriptions of software patterns.

An example of a good design pattern is the creational pattern abstract factory. An example of an abstract pattern is the AbstractCollection class in Java. This class provides the basic skeleton required to create a collection of objects. It has methods to add items to the collection, remove items from the collection, get the size of the collection, etc. Individual methods in the class can be overridden in subclasses to provide functionality specific to that implementation. Several classes implement AbstractCollection in a more specific way. ArrayList, by way of AbstractList, implements the methods so that they work with a resizable, sortable list of objects of a specified type. List implements them to work with a list of specifiable, but fixed, size.

To put it in simpler terms, an abstract factory pattern is like the definition of a triangle. The abstract definition of a triangle is that it is a shape with three sides. The abstract methods would be implemented in the classes RightTriangle, ObtuseTriangle, and AcuteTriangle, which would place restrictions on the angles of the triangle, as shown below (Wikipedia).


Bad design patterns are called antipatterns. While good patterns have dry names like "abstract factory", "composite", and "chain of responsibility", antipatterns have been given such monikers as "spaghetti code", "God class", and (my favorite) "big ball of mud". The big ball of mud starts out as a relatively simple piece of software, then through the addition of bits of throwaway code, quick fixes, and piecemeal growth, becomes an unwieldy, mutant program that would take a good deal more time and money to fix than it would have taken to properly maintain it in the first place. By leveraging all of my considerable artistic talent, I leave you with this insightful look into big balls of mud:

February 06, 2010

Norway, Ireland, and Redmond

Microsoft has a hand in everything, it seems. One of their current ongoing projects is SQL Server Modeling, formerly known as Oslo. (If you're interested, it has been released as a Community Technology Preview.) According to Douglas Purdy, this consists of:
  • M, a language for defining queries, schemas, etc. (like MySQL);
  • Quadrant, a tool for interacting with SQL databases (like Access); and
  • Repository, the back-end that communicates between applications and systems and stores data (SQL Server).
It was originally conceived as a sort of broad cross-platform modeling solution. M is open-source, but MS's implementation ties it to SQL Server. (Parts of the original Oslo project were split off into Dublin, .NET Services, and WF/WCF 4.0, while the modeling bits listed above stayed with Oslo.)

M has three specifications: T-SQL (Transact-Structured Query Language, Microsoft's proprietary extensions to SQL), grammar (originally called MGrammar), and EDMX (an XML file defining an Entity Data Model) (source). M is a domain-specific language (DSL). Its purpose, according to Microsoft, is to make it easier for users to interact with the database.

It's kind of difficult, as someone who has never heard of SQL Server Modeling before this week, to determine what, precisely, is its purpose. On first glance, it appears to be a set of data manipulation tools. However, Microsoft's aim seems to be more all-encompassing than that. It doesn't help that their aim has changed drastically in the three years they've been working on it. Time will tell if it catches on, and in what capacity.

Quote of the Day:
Beckman: Your country is calling you, Mr. Bartowski.
Chuck: Uh, well, then I think my country might have the wrong number.
--Chuck, "Chuck Versus the Ring"

January 16, 2010

Google AdWords

Google ads are everywhere. They appear on searches and websites, usually identified as "Sponsored Links" (since that sounds so much classier than "Ads"). Google's ad programs are more useful than some other ad services, since they are driven by context - instead of getting a random "You are the 1,000,000th visitor to this site! Click here to claim your prize!" you will see something related to what you're reading. This, in theory at least, provides a better return on investment for the advertising company.

There are two sides to the Google advertising platform: AdWords and AdSense. AdWords is for companies or individuals wishing to purchase ads based on certain keywords, while AdSense is for companies or individuals willing to place ads on their website. I'm going to discuss AdWords and how it works from the customer's perspective. Here's a flowchart giving a basic overview of making the decision to use AdWords. It's much easier to read if you click to enlarge it.

Our company - we'll call it Fabulous Widgets - has limited marketing funds, so Marketing requests the budget from Accounting to verify how much they can spend. Once they know that, they can start researching keywords. The keywords for which they purchase ad placement will dictate the searches on which their ad will appear. Google's Keyword Tool provides information about, and suggestions for, keywords. In this case, the Marketing Department wants to purchase ads for searches that are as relevant as possible to their core product - widgets.

After typing "widget", "widgets", and "fabulous widgets" in the keyword box, the Marketing employee is presented with a list of possible search terms, along with popularity, search trends over time, and (optionally) the average cost per click, or CPC, for each term. The top matches include "widget", "dashboard widget", and "web widget". Well, Fabulous Widgets is a purveyor of only the finest dashboard widgets, so "web widget" is not really an applicable search term. Marketing decides, based on their budget, to purchase ads for "widget" and "dashboard widget".

Periodically, Marketing will need to review the performance of the ads they've purchased. How much more business is Fabulous Widgets getting from the new ads? Maybe AdWords is providing them with more profit than a different marketing campaign, and therefore needs more money allotted to it. Maybe the keyword choices should be tweaked. The Internet is a fluid place, and so, by necessity, must Fabulous Widgets' marketing efforts.

Quote of the Day:
I need subtitles walkin' in here.
--Booth, Bones, "The Man in the SUV"

December 06, 2009

Enterprise 2.0

Facebook, wikis, blogs, YouTube...what do these have in common? They are all examples of Web 2.0.

Web 2.0 is not like HTML5. It's not a new specification, it's not a specific way of formatting or configuring anything online, it is defined by the behavior of the users interacting with the sites. It is community-driven, dynamic, extendable. It's also everywhere.

So it follows logically that business would want to capitalize on that community, and so Enterprise 2.0 was...well, perhaps "born" isn't the right word; "coined", then. Enterprise 2.0 is merely taking the ideas inherent in the Web 2.0 model and applying them to business situations. (Forrester Research begs to differ slightly; according to them, Enterprise 2.0 does not include anything aimed at consumers. I personally disagree with that statement: how else are businesses going to reach consumers, if they're not using Facebook and Twitter-type technologies?)

Are you in the engineering department and you need to collaborate with your coworkers in design? Set up a wiki to provide a centralized place to put mock-ups, specifications, etc. Need quick bursts of promotion? Fire off Tweets about discounts or product launches.

Sounds great, right? So why aren't all businesses Tweeting and Facebooking and blogging and wiki-ing? Dion Hinchcliffe has compiled a list of 14 reasons why Enterprise 2.0 initiatives fail. In essence, most of the problems boil down to the fact that some managers treat Enterprise 2.0 as an afterthought, something that doesn't need to have many resources allocated to it. After all, one may think, how much effort does it take to Tweet "14-inch widget on sale for 20% off, limited time offer"?

But it's not just about Tweeting, or wikis, or any one thing. It's about collaboration across the organization, destroying barriers to communication, and paying attention to the customers. Only by gaining the acceptance of the entire organization can Enterprise 2.0 initiatives succeed.

Extra reading:

Quote of the Day:
Booth: A prodigy violinist disappears and a month later his skull ends up bouncing off a garbage truck?
Cam: Obviously, we are looking for someone who really, really hates classical music.
--Bones, "The Widow's Son in a Windshield"

November 29, 2009

Yay for Holidays...

...when I have way too much time on my hands. Here's some of the stuff I've been doing.
  1. Installed Firefox 3.6 beta 4. I can't begin to describe the joy my nerdy little heart felt when I discovered the Zelda persona. Now my browser is complete with the Triforce, Sages' Medallions, and some Rupees thrown in for good measure. (Personas are skins for Firefox. Chrome supports something similar, but none of their themes appeal to me.) The beta has also changed the behavior for opening links in new tabs: instead of opening all the way to the right, like in Firefox 3.5, they open right next to the parent tab. I still cannot stress enough how much I dislike the Awful Bar, but other than that, I can't complain about anything. Firebug and the Web Developer Toolbar still work, so I'm happy.
  2. Downloaded the source code for Chrome OS. I successfully followed the instructions to build a working version of the OS, but neither my bootable flash drive nor the .vmdk image would work in VirtualBox. For some reason, the OS refuses to log in with my Gmail account, my other Google account, or the default chronos login. Sigh.
  3. Tinkered with some Java. A (non-programming) friend of mine was trying to write a Java program that would display information in some arrays and perform some basic calculations, but didn't know how to get the program to pull individual values out of the array. I helped her figure out how to do that and write a while loop that would perform the calculations on all five sets of values. Yes, perhaps there are greater things to get excited about, but I love the smell of success on a Saturday morning, no matter what form it comes in.
  4. Stayed up way too late on Thursday night/Friday morning to snag all those amazing Black Friday deals. </sarcasm> The best deal came today, when I got Firefly: The Complete Series for $10.99.
  5. Did some video editing. Nothing like a little editing to tell you that your awesome system that scores 5.2 and above on all aspects of the Windows Experience Index is really just an underpowered piece of junk. But I'm happy with the output...quite happy, in fact.
And in the spirit of Thanksgiving, here are some programs I'm thankful for:
  1. Foxit Reader. It does everything Adobe Reader does, only faster and without all the bloat. In addition, Foxit has paid programs for editing and creating PDFs, like Adobe, but their programs are cheaper.
  2. Parallels. I've got a WinXP and a Ubuntu Linux VM with this. The sad thing is that some of my older Windows games function better on the VM with a fourth of the memory that's on my Win7 computer. Some things I just don't understand.
  3. GoldWave. This is the best audio editing software ever. True, it isn't open-source like Audacity, but it just feels more intuitive to me. Plus, it has a very generous trial period -- you'll have plenty of opportunities to decide whether you like it. The Noise Reduction feature is the best thing since cotton candy.
  4. TextWrangler. This far outstrips Notepad. It has (limited) code highlighting, and it preserves indents when you hit Enter.
  5. Tap Tap Revenge 2. I can't afford Guitar Hero, so this is the next best thing. I only wish it had more songs that I like.
Well, I mentioned Firefly, so I have to have another quote from there today!

Quote of the Day:
Take my love, take my land,
Take me where I cannot stand;
I don't care, I'm still free,
You can't take the sky from me.
--Firefly theme song

November 15, 2009

More iPhone!

As a follow-up to "iPhones, the Web, and Dashcode, Oh My!", it is possible to mimic the look and feel of a native app/Dashcode-generated web app without using Dashcode. There are several WebKit-specific CSS stylings that will generate native-like gradients, rounded corners, etc. My favorite (because I like shiny stuff) is -webkit-gradient, which allows you to have a light color gradate to a dark color without having to create a separate image in another program and load it in. Here's the correct syntax for the gradient:
background-image: -webkit-gradient(linear, left top, left bottom, from(#ccc), to(#999));
Explanation from left to right. background-image is the CSS property for, well, displaying a background image. Instead of specifying a URL as a value, though, in this case we're specifying a -webkit-gradient. The gradient requires several values:
  1. Type of gradient. There are two types: linear and radial. Linear gradates in a straight line from Point A to Point B. Radial gradates in a circle from a specified point for a specified radius. An example of the two types is at webkit.org (only viewable on a WebKit-based browser like Safari or Chrome).
  2. One or more points. Point values accepted are coordinates, percentages, or the keywords "left", "right", "top", and "bottom".
  3. Starting color. Colors can be specified in hex values or RGBA (red, green, blue, alpha).
  4. Finishing color. Colors can be specified in hex values or RGBA (red, green, blue, alpha).
Moving on to rounded corners. This is slightly more annoying to code. Each corner must be coded separately. Assuming the rounded corners are being applied to a list, the code to generate rounded corners is as follows:
#header ul li:first-child a {
-webkit-border-top-left-radius: 8px;
-webkit-border-top-right-radius: 8px;
}
#header ul li:last-child a {
-webkit-border-bottom-left-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
}
In the first CSS declaration, the CSS code is looking for an anchor tag within the first instance of a list item within an unordered list within the header div. In the second declaration, the code is looking for an anchor tag within the last instance of a list item. The corner radius has to be applied to the first and last li tags separately, instead of applying it to the entire list, because if it's applied to the entire list the li's style will override the list's.

There are many more things you can do with JavaScript, Ajax, and CSS to approximate the feel of a native app on the iPhone. Check out Building iPhone Apps with HTML, CSS, and JavaScript to learn more.

Quote of the Day:
Jayne: Testing, testing. Captain, can you hear me?
Mal: I'm standing right here.
Jayne: You're coming through good and loud.
Mal: 'Cause I'm standing right here.
--Firefly, "The Train Job"

November 06, 2009

Get A Job In One Hour Or Less!

Well, okay, maybe not, but there's no denying the fact that PivotTable experience is a sought-after skill in today's job market. In fact, the demand for PivotTable people has gone up even as demand for just plain Excel folks has gone down (source: Pivot Table Guy).

It isn't that hard to learn how to use PivotTables, either. If you have an Excel spreadsheet with rows and columns, you already have the source data necessary to generate a PivotTable. The table I was working with had 6 columns: Date, Location, Product, Channel, Quantity, and Revenue. To generate the PivotTable, select a cell anywhere in your table, go to Data > PivotTable and PivotChart Report (Insert > PivotTable in Excel 2007), and complete the wizard. This will create an empty PivotTable. Into the PivotTable you can drag and drop fields to create the final product. My table used Location for its rows, Date for its columns, and Revenue for its comparison data.

The main limitation of PivotTables is they only take up to 255 column values. That means that if you have sales figures for every day of the year, you can't display all of them at once. To fix that, right-click on the appropriate field (in this case, Date), select Group, and choose how you want to group the data. When dealing with dates, you can group by years, quarters, months, or days.

Want more detail than just revenue by location and date? Just drag and drop another field into the appropriate section. I added Channel to the columns, which breaks out the revenue by channel and then by date (which I've grouped by quarter to avoid exceeding the 255-column limit). Excel automatically calculates totals on all rows and columns, as well.

That's not quite good enough for me. I'm the sort of person that color-codes everything. That's where upgrading to Office 2007 finally has a benefit. There are the obvious formatting options (Home > Format as Table), which make the headers, footers, and totals different colors. In addition to that, however, you can add data bars to cells. Data bars are horizontal shadings in cells that show relative quantities according to the range of cells you select, allowing you to gauge at a glance which cells have high or low values. To add data bars, select the cells you want to compare to each other (all first-quarter sales by location, for example), go to Home > Conditional Formatting > Data Bars, and select the color you want. There are menu options (More Rules) to allow you to fine-tune the formatting. Voila, we have color.

Quote of the Day:
'Cause I get a thousand hugs
From ten thousand lightning bugs
As they try to teach me how to dance.
A foxtrot above my head,
A sock-hop beneath my bed,
A disco ball is just hanging by a thread...
--Fireflies, Owl City

November 02, 2009

All Kinds of 'bilities

Findability is the quality of being able to be located by potential users. You may have the greatest website about (insert favorite subject here), but if it's buried, unorganized and unlinked, in the depths of Angelfire, nobody will ever know about it. Findability != SEO; it is focused on humans, not search engines. If findability efforts benefit search engine rankings, that is good, but it is not its primary aim. Findable websites not only facilitate initial visits, but they encourage visitors to return and to recommend the website to friends.

Findability does not exist in a vacuum. It is a part of SEO, but it is not a bunch of keywords stuffed in a page. It is useful content, organized for people to find, read, and use. Once people find your website, they have to be able to use it. Usability describes how easy it is to, well, use the website. Usability is different from accessibility: usability is more about organization and ease of use, while accessibility is about making sure that the website is available to the maximum number of people.

Members of Aarron Walter's Findability class at the Art Institute of Atlanta came up with the following definitions for findability, accessibility, usability, and SEO:
Findability: The quality of being able to be navigated or located.

Accessibility: The general term used to describe the degree to which a product (e.g. device, service environment) is accessible by as many people as possible. Usability and accessibility are often confused. See Also: http://www.w3.org/WAI/

Usability: The term that describes the quality of a website that determines how well tasks can be accomplished and how easy the website can be used. This can be broken down into many qualities, such as learnability, memorability, and efficiency. See also: http://www.useit.com/alertbox/20030825.html

SEO:Search optimization is a hyper-competitive endeavor that requires intense focus and a thorough, up-to-date understanding of how the search engine algorithms and robots operate.

(source)
Resources:
Quote of the Day:

iPhone Web Development Resources

Yay, time for List Monday. Today's list: sites about iPhone web development.

General:
Working with the viewport:
CSS on the iPhone:
Using WebKit:
  • 6 WebKit Tricks, revealing the secrets behind some (rather gimmicky, but pretty cool) tricks to enhance the display of content
iUI: