<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vleerkat Creations &#187; Design</title>
	<atom:link href="http://www.vleerkatcreations.com/category/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vleerkatcreations.com</link>
	<description>Creating is living</description>
	<lastBuildDate>Fri, 04 Nov 2011 14:47:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Serious Kids Stuff</title>
		<link>http://www.vleerkatcreations.com/2010/11/22/serious-kids-stuff/</link>
		<comments>http://www.vleerkatcreations.com/2010/11/22/serious-kids-stuff/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 08:32:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.vleerkatcreations.com/?p=171</guid>
		<description><![CDATA[Past months I was working in my sparetime on a website for a foundation called: Serious Kids Stuff. A foundation which has been initiated by Evolve9. It supports children in slums by letting them play tennis. It&#8217;s nice to support this foundation and it&#8217;s projects, you should do too!]]></description>
			<content:encoded><![CDATA[<p>Past months I was working in my sparetime on a website for a foundation called: <a href="http://www.seriouskidsstuff.com/">Serious Kids Stuff</a>. A foundation which has been initiated by <a href="http://www.evolve9.com/">Evolve9</a>.<br />
It supports children in slums by letting them play tennis.</p>
<p>It&#8217;s nice to support this foundation and it&#8217;s projects, you should do too!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vleerkatcreations.com/2010/11/22/serious-kids-stuff/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Less is Better</title>
		<link>http://www.vleerkatcreations.com/2009/12/02/less-is-better/</link>
		<comments>http://www.vleerkatcreations.com/2009/12/02/less-is-better/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 08:37:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Inspiration]]></category>
		<category><![CDATA[Webdev]]></category>

		<guid isPermaLink="false">http://www.vleerkatcreations.com/?p=106</guid>
		<description><![CDATA[Less is Better: &#8220; A fascinating conversation with 37Signals&#8217; David Heinemeier Hansson. David Heinemeier Hansson is one of the most influential voices on the Internet. He is the author of the immensely popular Ruby on Rails programming framework, is a noted blogger and media figure, and is elegantly opinionated when it comes to the best <a href="http://www.vleerkatcreations.com/2009/12/02/less-is-better/"> read more <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://feedproxy.google.com/~r/UXM-Articles/~3/ihbWmn7QQIU/less-is-better">Less is Better</a>: &#8220;
<div>
<div>
<div>
<p>A fascinating conversation with 37Signals&#8217; David Heinemeier Hansson.</p>
</p></div>
</p></div>
</div>
<p><a href="http://www.loudthinking.com">David Heinemeier Hansson</a> is one of the most influential voices on the Internet. He is the author of the immensely popular <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails programming framework</a>, is a noted blogger and media figure, and is elegantly opinionated when it comes to the best ways to make great software.  People follow David&#8217;s lead in droves, and for good reason: as a partner in the multi-million dollar company <a href="http://www.37signals.com/">37signals</a>, David is one of the most successful young entrepreneurs in today&#8217;s <a href="http://uxmag.com/archive/web">Web</a> economy.</p>
<p>Creators of <a href="http://www.basecamphq.com/">Basecamp</a>, <a href="http://www.campfirenow.com/">Campfire</a>, <a href="http://www.highrisehq.com/">Highrise</a>, and <a href="http://www.backpackit.com/">Backpack</a>, and authors of the widely read <em><a href="http://www.37signals.com/svn">Signal vs. Noise</a></em> blog, <a href="http://www.37signals.com/">37signals</a> is an advocate for all things simple and beautiful. We are delighted to share this interview with David about a range of topics—from software development to the productivity gains associated with making people happy.</p>
<p><em>Audio clips of the interview are included throughout the interview transcript.</em></p>
<p><span id="more-106"></span>
<dl>
<dt><strong>Umbaugh:</strong> David, thanks for calling in today. It&#8217;s wonderful to have you with us.</dt>
<dd><strong>DHH:</strong> Happy to be here.</dd>
<dt><strong>Umbaugh:</strong> Your company <a href="http://www.37signals.com/">37signals</a> is really successful, you have got an <a href="http://www.37signals.com/svn">enormously popular blog</a> and you&#8217;ve written <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.com%2Fs%3Fie%3DUTF8%26field-language%3D%26field-title%3D%26field-binding_browse-bin%3D%26Adv-Srch-Books-Submit.y%3D9%26node%3D%26field-dateyear%3D%26field-publisher%3D%26redirect%3Dtrue%26sort%3Drelevancerank%26search-alias%3Dstripbooks%26field-isbn%3D%26ref%255F%3Dsr%255Fadv%255Fb%26unfiltered%3D1%26field-feature%255Fbrowse-bin%3D%26field-subject%3D%26Adv-Srch-Books-Submit.x%3D47%26field-datemod%3D%26field-dateop%3D%26field-keywords%3D%26field-author%3DDavid%2520Heinemeier%2520Hansson%26url%3D&#038;tag=uxma-20&#038;linkCode=ur2&#038;camp=1789&#038;creative=390957">several books</a>. You built a great <a href="http://uxmag.com/archive/open-source">open source</a> programming framework that people just love, and you&#8217;re actually making money selling software on the <a href="http://uxmag.com/archive/web">Web</a>. Why are your ventures so successful?</dt>
<dd><strong>DHH:</strong> Well, I think the biggest reason is because we don&#8217;t identify ourselves too much with the whole notion of the <a href="http://uxmag.com/archive/web">Web</a> world. We identify ourselves more with the notion of a small business operating under proven approaches—like the crazy idea of charging money for products, which seems like a lost art for a lot of <a href="http://uxmag.com/archive/web">Web</a> <a href="http://uxmag.com/archive/startups">startups</a> out there.</dd>
<dd>The best example of how we try to be just like a regular business is that we try to maximize our profits and minimize our expenses. No news there. The wonderful thing about working with the <a href="http://uxmag.com/archive/web">Web</a> is that it&#8217;s in some ways easy to do both things. It&#8217;s much easier for us as a 10-person company to reach a huge audience than it is in the traditional world where small companies have a hard time getting heard. With our <a href="http://www.37signals.com/svn">blog</a> and our <a href="http://gettingreal.37signals.com/">book</a>, the <a href="http://uxmag.com/archive/web">Web</a> really gives us a platform to present our products.</dd>
<dd>In many ways, it&#8217;s very productive, easy and cheap to build new applications if you have a good idea and an eye for what you want that you can actually accomplish with a small team. Our whole approach is to stay as small as we possibly can and have an influence through other means than just throwing a ton of software out there.</dd>
<dt><strong>Umbaugh:</strong> <a href="http://www.37signals.com/">37signals</a> had several successful products on the market. Were you ever tempted to give products away for free and use advertising to generate revenue?</dt>
<dd><strong>DHH:</strong> No, never. I don&#8217;t think that that&#8217;s an attractive business model at all. There are a lot of people who focus on creating an audience and just get users for the sake of getting users. To me, that just isn&#8217;t interesting.</dd>
<dd>For me, it&#8217;s interesting to get users who like your stuff so much that they&#8217;re actually seeing real value from it, and thus are willing to pay for it. That&#8217;s much more of an affirmation that you&#8217;re doing something worthwhile rather than just getting a lot of users who want to use your stuff for free.</dd>
<dd>Most of the people at <a href="http://www.37signals.com/">37signals</a> have been involved with other businesses and have seen what happens when companies don&#8217;t charge for their products or services. If you don&#8217;t start out charging money for your products, then you have to do something else. That usually means taking venture capital money or taking some sort of investment to fund your growth. That typically doesn&#8217;t lead to a healthy happy work environment. I mean it certainly can. There definitely are companies out there who made it work, but I&#8217;d say the majority of the VC-funded companies I&#8217;ve talked to—their practices, their lives in the workplace—are pretty far removed from what I would call an ideal situation.</dd>
<dd>Companies too often merely try to please users and get them to pay for stuff just to satisfy investors, satisfy the three to five-year exit window, and satisfy other external demands. Those are just distractions. For us at 37signals, we&#8217;ve managed to create a good situation in large part because we&#8217;ve been able to cut out distractions.</dd>
<dt><strong>Umbaugh:</strong> Your book, <a href="http://gettingreal.37signals.com"><em>Getting Real</em></a>, outlines your software development process and your business philosophy in general. What are some of the core values you put forth in <a href="http://gettingreal.37signals.com"><em>Getting Real</em></a>, and how do you think software developed using that philosophy ends up benefiting the end user?</dt>
<dd><strong>DHH:</strong> One of the big themes in <a href="http://gettingreal.37signals.com"><em>Getting Real</em></a> is the notion of less software. I think way too many companies and teams try to overachieve by building a ton of software, by building tons of flexibility into their software, including tons of features and by imagining all the things that somebody out there might need in some way, some day. I think that&#8217;s a really hard way to develop software because it&#8217;s so much fumbling in the dark.</dd>
<dd>What we try to do and what we advocate in <a href="http://gettingreal.37signals.com"><em>Getting Real</em></a> is focus more on needs that are closer to you, things that you can directly relate to, things that will directly determine the quality of something. For us, on both the business side and the software side, our approach is simplicity.  Simple alone is a huge feature that&#8217;s often vastly overlooked. When people compare software products, they often compare checklists of features. In other words, the product that has the longest checklist appears to be the best.</dd>
<dd>Well we try to do exactly the opposite. We try to &#8216;under-do&#8217; our competition by doing less than they do, by having the shortest feature list. That is, in essence, our biggest feature.</dd>
<dd>When we do customer surveys every few months, the number one thing that everybody says that they like the most about our products is the fact that they&#8217;re simple. Simple sounds in some ways, like a cliché. Nobody would say, &#8216;I want to make complex software.&#8217; But they do say things that amount to the same thing. &#8216;I want my software to have tons of features. I want my software to have endless flexibility.&#8217; Well, all these things are in essence saying, &#8216;I want complex software.&#8217;  We&#8217;re willing to take a stand for simplicity in software. We&#8217;re willing to say, &#8216;You aren&#8217;t going to get all the features you think you might need some day, you&#8217;re just going to have the basics executed beautifully. You&#8217;re not going to get all the flexibility you might imagine that you could need, but we&#8217;ll give you some.&#8217; We&#8217;re going to have opinions and we&#8217;re going to instill defaults and we&#8217;re going to package it up.</dd>
<dd>We keep comparing ourselves to the notion of chefs. When you walk into a high-end restaurant, you really don&#8217;t get a whole lot of choice. Usually, the hallmark of a high-end restaurant is the chef&#8217;s menu. The chef prepared courses of a dinner in advance where he made all the choices. You eat there because you trust the chef&#8217;s judgment and want his taste. Well, we try to do the same thing. Instead of just giving you a super-long menu, we&#8217;ll just give you this set course of plates and you&#8217;ll have to trust our judgment on it, and I think you&#8217;ll end up with a much tastier meal in the end.</dd>
<dd>That&#8217;s one way we describe how we&#8217;re trying to be different from people out there, and we&#8217;re trying to convince others that they can do the same thing. There&#8217;s so much software out there that&#8217;s just endlessly complex, that has too many features, that has too much flexibility, and it ends up not being used because users can&#8217;t relate to it; they can&#8217;t get into it. It feels too complex. It feels intimidating when what they really need is just a small subset of what they&#8217;re given.</dd>
<dd>But most companies out there are afraid to give them just that small subset because everybody we&#8217;re talking to is saying, &#8216;We want more features; request this, that and the other thing.&#8217; It&#8217;s actually funny—in our customer surveys, everybody says the number one feature they like about our products, our approach and our company is that we keep things simple. Then in the very same breath, they say, &#8216;Oh, I love all this simple stuff. By the way, please add A, B and C.&#8217;</dd>
<dd>It&#8217;s incredibly hard to help people realize that if we added their A, B and C, and everyone else&#8217;s D, E and F, they wouldn&#8217;t like the software anymore. It wouldn&#8217;t be simple any more. In some ways, we are in constant conflict and we just have to be willing to embrace that conflict. On one hand, you get to please users by doing something that&#8217;s simple and that doesn&#8217;t have a lot of features. On the other hand, we have to constantly push back against the very same people saying, &#8216;I want this, I want that, and I want the other thing.&#8217;</dd>
<dd>That&#8217;s a rough outline of the approach that we&#8217;re preaching in <a href="http://gettingreal.37signals.com"><em>Getting Real</em></a> on pretty much all levels. It&#8217;s not just about the software. It&#8217;s also about your policies, your pricing—this whole notion of keeping things simple so that you can have a simple team, so you can execute simply, so you don&#8217;t need a lot of money upfront, so you need fewer software developers, so you can do it with less marketing. In many ways it feel likes we&#8217;re stating the obvious, but I don&#8217;t think it&#8217;s so obvious after all, because most companies are not doing it this way.</dd>
<dt><strong>Umbaugh:</strong> Software developers add features under the assumption that customers choose software based on its feature set. How would you convince developers that less software is a competitive advantage?</dt>
<dd><strong>DHH:</strong> Exactly as you&#8217;re saying, everybody out there is doing the opposite of what we&#8217;re doing. Thus, if you&#8217;re doing the opposite of what everybody else is doing, you&#8217;re actually unique.</dd>
<dd>When you talk to anybody who&#8217;s used a computer for any period of time, the number one thing they typically say is how much they hate it because it&#8217;s too complex; it&#8217;s too hard to use. They can&#8217;t get their stuff done. So it&#8217;s not like users aren&#8217;t already predisposed to wanting something simple. I think this is true all over the place and people are selecting the simple stuff whenever they can.</dd>
<dd>I can think of two other examples not necessarily in the software world, but look at the <a href="http://store.apple.com/us/browse/home/shop_ipod">iPod</a>. There have been so many other MP3 players out there—a lot of them had FM tuners, they had voice recorders, they have laundry lists of features—but the <a href="http://store.apple.com/us/browse/home/shop_ipod">iPod</a> just successfully executed on a few basics really well and it&#8217;s overwhelmingly won the market.</dd>
<dd>Another more recent example, which I really like, is the <a href="http://www.amazon.com/gp/product/B0023B14TK?ie=UTF8&#038;tag=uxma-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=B0023B14TK">iFlip portable video recorder</a>. It has pretty much one feature—a big red button that says, &#8216;record.&#8217; When you push that, it records video in not especially good quality, but it&#8217;s just incredibly simple to use and they&#8217;re selling these by the boatload.</dd>
</p>
<p><strong>Audio clip: Don&#8217;t underestimate simplicity – 2:25 min</strong></p>
<dd>So I think that oftentimes companies underestimate their customers. They underestimate how willing their customers are to sacrifice features in return for getting something that&#8217;s actually usable. Well of course the hard thing is to communicate this because everybody&#8217;s saying they&#8217;re simple even when they&#8217;re very much not. So in some ways this is just a slow steady build. But that&#8217;s pretty much how all business building is—very, very few businesses out there go from zero to multimillion in short order. Pretty much all businesses out there are grown slowly but surely, and I think that that&#8217;s what we&#8217;ve done as well. <a href="http://www.basecamphq.com/">Basecamp</a> wasn&#8217;t this blasting success on the second week of operation. It actually took a full year for <a href="http://www.basecamphq.com/">Basecamp</a> to be able to pay all the bills at <a href="http://www.37signals.com/">37signals</a>.</dd>
<dd>Today of course it&#8217;s a fantastic business. It&#8217;s a multimillion-dollar business. We&#8217;ve bee doubling our revenues for the past many years and it&#8217;s doing very well, but  it&#8217;s built into that. The reason it built into that is that this simplicity really works best as a word of mouth thing. You have somebody using <a href="http://www.basecamphq.com/">Basecamp</a> or another product of ours, it&#8217;s simple and they can actually get something done and they&#8217;ll tell their friends and so on and so forth. The checklist-driven or the feature list-driven approach is much more a shove it down their throats approach because people will perhaps get initially impressed by this long list of features. But when they actually start using it they probably won&#8217;t like it that much, thus their word of mouth will not be very good, thus you need to keep shoving it down new people&#8217;s throats who haven&#8217;t heard about your product from somebody else. That&#8217;s, in my mind, generally not a very viable long-term strategy. It&#8217;s very expensive, and it&#8217;s just not very satisfying. So in my mind, I think companies in general are underestimating their customers. They&#8217;re underestimating the importance and the success that simple has in the marketplace and could have for them and they&#8217;re kind of expecting that they&#8217;ll be success overnight, which is not going to happen in any case so… </dd>
<dt><strong>Umbaugh:</strong> I think simplicity sometimes is easier in theory than it is in practice. If a team commits to writing a piece of really simple software, how do they go about deciding what features to include and which features to cut out? Do they perform <a href="http://uxmag.com/archive/user-feedback">user testing</a>, or do they just decide on their own? What approach does <a href="http://www.37signals.com/">37signals</a> take and how would you extrapolate that outward?</dt>
<dd><strong>DHH:</strong> Sure. So the first thing you do is you don&#8217;t talk about it that much. You don&#8217;t try to write it down into functional specs. You don&#8217;t try to envision your entire product upfront because we simply cannot hold all these things in our head. If you try to write it all down on paper, the easiest thing to do is to add one more feature. One more feature when you&#8217;re writing it down on a piece of paper is just a single line. It&#8217;s a bullet point. How long does it take to write a bullet point?  Not very long at all. So every single idea whether good or bad, has a tendency to make it into the declaration of what this product should be. In our minds, the only way, for us at least, to arrive at usable software is to build it and use it at the same time.</dd>
<dd>I&#8217;ll tell you about how we built <a href="http://www.basecamphq.com/">Basecamp</a>. We started building <a href="http://www.basecamphq.com/">Basecamp</a> by building one feature. What is the one thing that <a href="http://www.basecamphq.com/">Basecamp</a> must do for it to have any value at all? For us, that was the Messages section. If we don&#8217;t have the Messages section in <a href="http://www.basecamphq.com/">Basecamp</a>, we don&#8217;t have <a href="http://www.basecamphq.com/">Basecamp</a>. So we start building the Messages section and we started using it very shortly thereafter. Once you get rolling with that ball, it becomes almost self-evident what you should be working on next because when you&#8217;re using your software, there&#8217;s just one or two features that&#8217;ll keep popping up as next most important thing to work on.</dd>
<dd>For us, I believe that was Milestones. So after we got going with communications in <a href="http://www.basecamphq.com/">Basecamp</a>, the next thing we wanted was this impromptu or really easy planning tool in the Milestones. Once we had that, we went on to do the Files section, and the To-do list and so on.</dd>
<dd>But the great thing about building software one feature at the time is that:</p>
<ol>
<li>You can pretty much stop at anytime. If we had stopped <a href="http://www.basecamphq.com/">Basecamp</a> just after we built the Messages section, we would still have a usable piece of software. We would have had the Messages section, which is usable piece of software in itself. It definitely would not have been as useful as <a href="http://www.basecamphq.com/">Basecamp</a> is today, but it still would be a useful piece of software.</li>
<li>Project participants build an immense amount of confidence to see running software that does something useful. People typically approach building software where you write it all down in a functional spec, then a team of programmers goes away for nine months (or year and a half) and they come back with software you don&#8217;t want anymore. This is that constant struggle of change requests of saying, &#8216;Well, this is not what I want,&#8217; says the customer; and the developer says, &#8216;Well, this is what you asked for.&#8217;</li>
<li>There&#8217;s just no way of successfully describing software in the abstract on any sizeable project. The only way for us, and I believe for pretty much anyone, to arrive at a workable usable good software is to build it and plan it at the same time.</li>
</ol>
</dd>
<p><strong>Audio clip: Functional specs are relics – 3:46 min</strong></p>
<dt><strong>Umbaugh:</strong> Okay, so functional specs, they&#8217;re everywhere. So I think a lot of people think of a functional spec as something that keeps a piece of software organized during the development phase. You just don&#8217;t agree with that notion?</dt>
<dd><strong>DHH:</strong> I think of functional spec as one of the worst inflictions that has ever happened to the software development world. I think functional specs are a relic of a time when building features was a very, very hard and long process and you had to do all of this upfront planning because once you wrote anything in software, it was pretty much impossible to change it. I don&#8217;t think that functional specs is a technique that&#8217;s any longer relevant. To me functional spec is a dead document. It&#8217;s an illusion of agreement. It&#8217;s very, very easy for people to sit around a table and just try to hash out what the program should do on a piece of paper.</dd>
<dd>As we were talking about before, the cost of adding another feature when you&#8217;re working with a functional spec is the price of a bullet point in Word, which means incredibly inexpensive. It&#8217;s also a point where you really don&#8217;t want that much contention. It&#8217;s hard to make decisions because when it&#8217;s so easy to add something else in, why wouldn&#8217;t you just do that? Would you really want that big debate at the table right now, or are you just trying to please everybody who sits around the table? Usually you try to please everybody who sits around the table, and that&#8217;s really bad way of building good software because you can&#8217;t please all the people all the time. You&#8217;re going to end up with something that pleases nobody at any time.</dd>
<dd>I think this illusion of agreement is especially dangerous in the sense that we can both agree on what a paragraph of text says. Customers and developers do this all the time. Yes, the system will have a Milestone section, and everybody nods their heads and agrees. The developer goes off and builds that Milestone section, takes it back to the customer, and the customer says, &#8216;This is not at all what I wanted,&#8217; because this illusion of agreement when you&#8217;re working with abstracts (such as paragraphs and words and bullet points) are just so far removed from software that is almost useless, if not outright dangerous. So I think functional specs are a really bad way of developing software because they have all the illusions of agreement.</dd>
<dd>They try to plan a piece of software into a most unique detail at the point in time where you know absolutely the least about what that piece of software should do. On day one when you&#8217;re planning some software, you have no idea on how it&#8217;s all going to fit together. Nobody can hold a complete piece of software in their head and imagine something good. Instead just planning piece-by-piece or inadvertently working small chunks to try to finish something, you get the benefit of doing planning for stuff that&#8217;s very immediate. You&#8217;re planning for next week or two weeks from now. It&#8217;s so much harder to try to plan what you&#8217;re going to do six months from now to the point where it&#8217;s at it&#8217;s downright useless, in my mind. People and programmers and designers are just not good enough to do that. The only way you can do successful job, in my mind—the only way you can create useful good features that people will actually appreciate—is by designing them in very unique detail as you&#8217;re going along as they&#8217;re needed right now. So these things kind of have to go hand-in-hand and I see the functional spec is just a really poor way of doing this. </dd>
<dt><strong>Umbaugh:</strong> So what do you instead? If you don&#8217;t have functional specs, doesn&#8217;t the process turn into chaos?</dt>
<dd><strong>DHH:</strong> No, I don&#8217;t think so. What we do is we do the user interface first. So when we&#8217;re starting a project like <a href="http://www.basecamphq.com/">Basecamp</a>, we&#8217;ll have a rough idea of what we want—project collaboration—and that will be the banner for this piece of software, and we&#8217;ll start with the most important feature.</dd>
<dd>Where do we go from there?  We start designing the screens. Instead of trying to write and own a paragraph and imagine what the software should do, we go straight to the elements. We go directly to the core and we start working in it, start cutting in the materials until we find something that looks like what we want. That&#8217;s exactly the point in time when we can have a real meaningful discussion about how the software should work.</dd>
<dd>Developers know this instinctively. When they go to their customer and show them that piece of software that the customer told them to make, well, first of all the software&#8217;s not going to be what the customers want. But when the developers show customers that piece of software, the customer all of a sudden has a very, very specific explanation for exactly what they want because you&#8217;re working with something concrete now. They can say, &#8216;Well, we don&#8217;t want this screen here or this is actually not how it&#8217;s supposed to be. If you move these things around, you understood it wrong and so on.&#8217; Once you arrive at that point, everything becomes so much easier.</dd>
<dd>So we try to do the user interface screens upfront. We then move from the user interface screen to the implementation part, which is always a back and forth process when the developers push back: &#8216;If you move this piece of the UI a little bit down…if we use a checklist instead of radio buttons…or if we did this, that and the other thing, it would makes more sense.&#8217; You hash it out as you go. Then when you&#8217;re done with, say, the Messages section, you try to use it and you tweak it and then you go on to the next thing.</dd>
<dd>When you have a functional spec, you have the blueprints upfront, which is really an illusion that you have all the answers right away. But we can never design software like that, even on a feature we&#8217;re working on right now—we&#8217;ll change it many times over. We would end up with really terrible software if we only got one shot at it. Nobody can make perfect decisions off the top of their head in abstract terms laid out in paragraphs and bullet points. Everybody needs something concrete. Everybody needs something tangible for the mind work at its best.</dd>
<dt><strong>Umbaugh:</strong> When your follow this iterative method of software development, how do you conform to schedules and budgets?</dt>
<dd><strong>DHH:</strong> So two things. First of all, how many of your customers actually receive what they asked for? How often have you done the functional specs, got a budget in on time, delivered the software on time and—most importantly—delivered a piece of software that you actually liked that actually solved your problems to the fullest of its ability? Most people will say pretty much never, because the fact is that the process doesn&#8217;t seem to work very often.</dd>
<dd>The software world is ridden with this stigma that we can never deliver anything on time. We can never deliver what the users want, and tons of projects end up canceled. So I say the predominant development process has shown itself to be broken. Once something is truly broken, it&#8217;s a lot easier to face facts and try something else.</dd>
<dd>Second thing: There are a lot of techniques you can use to control your costs at the same time you control what the software is going to be like. I&#8217;d actually say that the iterative approach is a much safer bet, a much easier way to control costs. When you build something from a functional spec, there&#8217;s no real sense of priority in the sense of how this software is going to be implemented. When greeted by a functional spec, very rarely do developers start with the feature most important to the business right away. They&#8217;ll start with the features that they like best, implement that feature to 90 percent, and they will move on to something else. At the end of the cycle, they&#8217;ll be 90 percent done and they&#8217;ll have 90 percent left. That&#8217;s usually how these things go.</dd>
<dd>Instead, when you work in short bursts time—the boxed development approach, one or two or three weeks at a time—you can sprint during those weeks to develop some features. After three weeks, you&#8217;re going to have a piece of software that does something. So it&#8217;s much safer. You can see after three weeks if you don&#8217;t like the direction this is going, you can now cancel the project. You only spent three weeks of development learning that, well, this is just not the right thing, let&#8217;s cancel it, instead of waiting the nine or the 18 months for somebody to come back with a complete implementation of your functional spec and have the customer tell you it&#8217;s not what they wanted anyway.</dd>
<dd>Now you&#8217;ve blown that entire period of time. But after the three weeks working in the iterative style, you&#8217;ll have a pretty good idea of where your project is going. I think you can say, &#8216;I don&#8217;t like it. Let&#8217;s cancel the project.&#8217; You&#8217;ve only wasted three weeks&#8217; worth of money. More likely, you can say, &#8216;I like where this is going, and seeing this piece of software I have, let&#8217;s do another three weeks.&#8217; It&#8217;s much more piecemeal. It&#8217;s much more controlled. It&#8217;s a lot less scary for customers to work this way because they get constant feedback, so there is less uncertainty on how it&#8217;s all going to end up.</dd>
</p>
<p><strong>Audio clip: Controlling costs in time boxes – 2:20 min</strong></p>
<dd>There&#8217;s going to be a lot more trust built up between developers and the customer. And developers are going to be a lot happier for it too, because they get to deliver real workable software very early in the process and they get to get real valuable feedback such that they can change their course before they&#8217;ve implemented everything wrong. So the techniques are to use a time box approach—a week, two week, three weeks, whatever you decide on, just schedule for that time box—one time box at a time and you can also just set a budget. So the most this project can cost me is $50,000. Well, divide that by the hours you can buy at a given rate from the developer and you&#8217;ll end up: Okay, we have six boxes of three weeks each, so I have to arrive at some usable software within the scope of six times three weeks. Well, that&#8217;s pretty cool because you can now see after you&#8217;ve spent one of these time boxes, am I getting the right way, am I liking where this is going, do I need to change the course, and you can constantly alter and adjust where the project is going. And if you&#8217;re happy after four weeks, if you like the software that you have then, fine, you just stop. If after six weeks, you realize that the original budget is spent but this software is so valuable, you&#8217;re getting so much good stuff out of it that it&#8217;s going to be worth another $50,000, you just keep on going.</dd>
<dd>It&#8217;s just to my mind it&#8217;s a lot safer way of developing software. It&#8217;s a lot more likely you&#8217;ll end up with software that you&#8217;ll actually want to use and is developing some value. But I understand that it&#8217;s scary because it&#8217;s not how most people do things and they kind of have a tendency to want to know exactly upfront what something is going to cost. That&#8217;s completely natural. The only problem is it just doesn&#8217;t work. There&#8217;s no way that you can ever pinpoint exactly what something is going to cost when you don&#8217;t know what that something is. That&#8217;s how you get into the whole functional spec thing where you get into the illusion of trying to figure out what the something is actually going to be, but it just doesn&#8217;t work.</dd>
<dt><strong>Umbaugh:</strong> Is facilitating iterative development environment part of the reason you chose to create <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a>?</dt>
<dd><strong>DHH:</strong> Oh, definitely. A big part of why this shift is happening now versus, say 15 years ago, is that the cost of software development has dropped radically. Tools have become much more productive, making it much easier to implement something of value. It&#8217;s become feasible to talk about delivering real business value within the scope of one week, or two, three weeks, or whatever your time box is.</dd>
<dd>For us, our constraints were even more extreme. When we started working on <a href="http://www.basecamphq.com/">Basecamp</a>, I was still in school. The other guys were working on client gigs. I had 10 hours per week—not per day, per week—to work on <a href="http://www.basecamphq.com/">Basecamp</a>. So I needed something that was productive enough that 10 hours of programming time would yield concrete benefits. Frankly, the other environments that I&#8217;d been working in—<a href="http://en.wikipedia.org/wiki/PHP">PHP</a> and <a href="http://en.wikipedia.org/wiki/Java_(software_platform)">Java</a>—were not giving me a good value for of my ten hours of investment.</dd>
<dd>It was really just a great realization to discover <a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a> and use tools that fit my working style and could help me deliver something useful, meaningful within the scope of just 10 hours. That&#8217;s what <a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a> is optimized for: extreme productivity under pretty harsh constraints, like having teams with a single programmer who has limited time.</dd>
<dd>Those constraints led to interesting choices in the design of that framework that just wouldn&#8217;t have arrived otherwise. I think it&#8217;s very apparent when you look at mainstream tools such as <a href="http://en.wikipedia.org/wiki/C_(programming_language)">C</a> and <a href="http://en.wikipedia.org/wiki/Java_(software_platform)">Java</a>—how they&#8217;re just not designed for resource-constrained operations, especially when the resource is a human resource. They&#8217;re designed for big teams, million-dollar budgets and year-long implementation. On the other hand, <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a> is designed for something more like this: &#8216;Hey, we want an application done in three man-months. Let&#8217;s use something that will allow us to get that done.&#8217;</dd>
<dt><strong>Umbaugh:</strong> You&#8217;ve been outspoken about how <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a> was designed to make programmers happy. Why do you think that&#8217;s an important value for a programming framework?</dt>
<dd><strong>DHH:</strong> The interesting part of <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a> was getting really high productivity. I asked myself when I am working most productively. When do I just knock out features and just get a ton of stuff done? I get a ton of stuff done when I&#8217;m really pleased with the implementation of what I&#8217;m doing, when I&#8217;m really pleased with the coherency and in some ways the beauty of the software that I&#8217;m creating. When I&#8217;m writing beautiful software, it just seems to fly off my fingers and I get a ton of stuff done.</dd>
</p>
<p><strong>Audio clip: Love the code you&#8217;re with – 2:40 min</strong></p>
<dd> I was really having a hard time writing beautiful software in <a href="http://en.wikipedia.org/wiki/Java_(software_platform)">Java</a> and <a href="http://en.wikipedia.org/wiki/PHP">PHP</a> because those languages and platforms just weren&#8217;t, let&#8217;s say, making themselves readily available for beautiful implementation—at least in the way I use them. So when I finally discovered <a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a>, I discovered a programmer language that allowed me to write these beautiful programs. And I realized that that was the number one thing that would shoot up my productivity: being motivated by beautiful software. By writing software that you like just makes you so much more productive as a programmer. Up until <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a> really made that a theme, it was somewhat neglected that the programming environments should really cater to the programmer, not the other way around. Programmers shouldn&#8217;t try to bend  themselves in those ways to programs, and I think that most other programming environments are just not optimized to the programmer first.</dd>
<dd><a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a> had it straight in its almost mission statement. <a href="http://en.wikipedia.org/wiki/Yukihiro_Matsumoto">Matz</a>, the creator from Japan, when he wrote about why he created <a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a>, he wrote that he wanted a programming language that makes the programmer happy, and that was his prime motivating goal. Well, I took exactly the same mission and applied it to just a slightly more specific field—that of <a href="http://uxmag.com/archive/web">Web</a> programming—and I tried to build a framework that would make programmers really happy about the actual code, the actual work that they&#8217;re performing. For all the feedback I get when I go to conferences, when people write emails, and so on, that&#8217;s the one I&#8217;m most proud about. People coming up to me saying, &#8216;I used to not like my job very much. I used to consider whether programming was something I wanted to do just because I wasn&#8217;t writing programs that were making me happy. I wasn&#8217;t writing implementations that were beautiful and satisfying, and now I am. I&#8217;m loving it now. I&#8217;m loving writing beautiful programs. I&#8217;m loving be a programmer,&#8217; and so forth, because that&#8217;s exactly the experience I had. I didn&#8217;t use to like programming that much. I used to like programs; I used to like having the results of what I did come to life, but I didn&#8217;t use to like the actual process that much. After I switched to <a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</a>, started working on <a href="http://uxmag.com/archive/ruby-rails">Rails</a>, I never enjoyed programming so much in my life, thus never been so productive doing programming as I&#8217;ve been since I switched.</dd>
<dt><strong>Umbaugh:</strong> So, are there business advantages to developing software that makes customers and employees happy?</dt>
<dd><strong>DHH:</strong> Oh totally. I think that making people happy is pretty much why we&#8217;re all here and why we&#8217;re all working in software or working anywhere, for that matter. Most people aren&#8217;t working in places where making their customers happy is an important factor. To me it&#8217;s very hard to make your customers happy if you&#8217;re not happy yourself. That has to start from within. You have to be happy with the work you&#8217;re doing, happy with the products that you&#8217;re producing in order to really truly make your customers happy. It&#8217;s very much a positive feedback cycle. When you like what you do, you&#8217;re going to create something that&#8217;s better than if you don&#8217;t like what you do. All things being equal, your customers are going to like you and your product a lot more. I don&#8217;t think you can separate the two, really. It&#8217;s going to be very hard for a company that doesn&#8217;t focus on having happy employees to have happy customers, and I don&#8217;t think the companies are going to do very well at all.</dd>
<dt><strong>Umbaugh:</strong> David, we have two other developers from <a href="http://www.effectiveui.com/">EffectiveUI</a> on the call, <a href="http://uxmag.com/authors/tony-hillerson">Tony Hillerson</a> and <a href="http://uxmag.com/authors/rj-owen">RJ Owen</a>. I&#8217;m going to let them ask a few questions, okay?</dt>
<dd><strong>DHH:</strong> It&#8217;s my pleasure.</dd>
<dt><strong>Tony Hillerson:</strong> Hi David, great listening in today. My question is about giving users choices. Do you think offering users more choice or less is preferable?</dt>
<dd><strong>DHH:</strong> Less choice by a very wide margin. There&#8217;s a lot of interesting research going on in this right now, actually. There&#8217;s a book called <a href="http://www.amazon.com/gp/product/0060005696?ie=UTF8&#038;tag=uxma-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0060005696"><em>The Paradox of Choice: Why More is Less</em></a> by Barry Schwartz  that discusses a number of scientific studies done in grocery stores. A typical grocery store has about 41 varieties of jams and marmalade available. The study measured how many people would go over to the wall, look at a few different types of marmalade and jam, and then actually choose to buy something and go home. Then they contrasted that to a wall with only three different kinds you could pick. I think the sales on the wall with three choices were something like 40 percent higher.</dd>
<dd>Then they analyzed all the qualitative feedback that stemmed from that interaction. People faced with a ton of choice very easily became insecure. Am I picking the right one? Is there something else that&#8217;s actually going to taste better? They highly doubted their choices and ended up not buying anything at all, afraid of being disappointed.</dd>
<dd>That research can apply directly to software, at both the infrastructure level of software like <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a> that appeals to programmers, as well as for end users. Most people just want to get stuff done. They don&#8217;t want to sit and tinker. They don&#8217;t want to spend time setting stuff up. They just want really good defaults. Again, going back to the chef metaphor, you want your dish coming out of the kitchen ready to eat.</dd>
</p>
<p><strong>Audio clip: Forget about preferences – 1:48 min</strong></p>
<dd>Actually this is one of my bits I always play out when I came here from Denmark about three years ago: one of the things I absolutely hated was the notion of the construction kit meal, which is this notion that in certain bars you&#8217;d get a burger and it comes disassembled. There&#8217;d be certain amount of lettuce, there will be some tomatoes, some onions, and so on. It was up to you to put it back together. Well screw that; I just want a meal. I want what the chef thinks is going to be a good meal, and I really don&#8217;t want to put it all back together myself. That&#8217;s I believe why I&#8217;m paying this guy to prepare food for me.</dd>
<dd>In the same sense, this is why users are paying software developers money to use their products because the software developer hopefully put some thought into how the stuff should work. So we&#8217;re really not big into having a whole lot of options. Actually one of our prime motivated design directives is to avoid preferences. Whenever we have to put in or feel that we have to put in a preference in our software, we pretty much consider that a defeat. We were not good enough. We were not good enough at coming up with a reasonable choice that most people would like most of the time. I take the same approach to designing <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a>. I really don&#8217;t want there to be a whole lot of choice when the choice itself doesn&#8217;t matter or when we think that there is a best practice that we could just follow out the gate. Why do we have to leave all these choices up to the user, again programmer, if we could just once for all make a good choice for everybody? I think it&#8217;s just such a waste of work productivity when you force everybody to go over the same considerations time and time again to make essentially the same choices.</dd>
<dd>For example, in <a href="http://www.basecamphq.com">Basecamp</a>, the Dashboard will contain five projects and the five latest things from each project. That&#8217;s a good default. You can&#8217;t change it to seven projects. You can&#8217;t change it to three projects. It&#8217;s just five, and it actually does matter. It matters in the sense that it&#8217;s a good default and it&#8217;s just something you just don&#8217;t have to worry about. If you have all these options of how many things you can see in the Dashboard, that&#8217;s just another obstacle for you to actually get to the thing that you&#8217;re trying to do, which is to use <a href="http://www.basecamphq.com">Basecamp</a> to organize your project. You&#8217;re not using <a href="http://www.basecamphq.com">Basecamp</a> for <a href="http://www.basecamphq.com">Basecamp&#8217;s</a> own sake.</dd>
<dd>That&#8217;s what I was talking about earlier. Too many programmers are using programs for their own sake. They like tinkering with programs, not necessarily using the programs to solve actual problems, but just because they like software. So it&#8217;s very natural for programmers to like to have their software as tunable and tweakable as possible. That&#8217;s just not true for the general population, and I also think it&#8217;s not really true for programmers, either. <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a> is probably the least configurable framework out there and at the same time it&#8217;s still one of the very most popular frameworks out there.</dd>
<dt><strong>Hillerson:</strong> On a slightly different topic, how did you reach the decision to release the secret sauce behind <a href="http://www.37signals.com">37signals</a>—<a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a>—to the <a href="http://uxmag.com/archive/open-source">open source</a> community?</dt>
<dd><strong>DHH:</strong> Why did we choose to do that? First of all, we don&#8217;t do infrastructure software. That&#8217;s not the business we&#8217;re in, so the secret sauce is actually not <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a>. We could be using anything else out there and we could probably still arrive at our products. Not as easily and probably not as cheaply, but the secret sauce is really the design of our products, not what we use to implement them in.</dd>
<dd>We&#8217;re not going to gain anything by keeping <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a> to ourselves. We&#8217;re also not going to gain anything or win anything by trying to sell it. There&#8217;s nobody out there short of <a href="http://uxmag.com/archive/microsoft">Microsoft</a> or <a href="http://www.ibm.com">IBM</a> who can make money anymore selling general-purpose infrastructure-level software in my mind. And it&#8217;s also not the business we&#8217;re in.</dd>
<dd>We decided that if we <a href="http://uxmag.com/archive/open-source">open-sourced</a> this framework, a lot of people would use it and hopefully implement a bunch of features that we&#8217;re probably going to need anyway, so we won&#8217;t have to implement those features ourselves. They&#8217;re probably going to find and fix many bugs that we would otherwise hit and have to fix ourselves, so we don&#8217;t have to do that. So that made good business sense for us.</dd>
<dd>Second of all, I mean for us our marketing secret is something we stole from Kathy Sierra. She writes a wonderful blog called <a href="http://headrush.typepad.com/"><em>Creating Passionate Users</em></a> and a wonderful book series called <a href="http://www.amazon.com/gp/redirect.html?ie=UTF8&#038;location=http%3A%2F%2Fwww.amazon.com%2Fs%3Fie%3DUTF8%26field-language%3D%26field-title%3Dhead%2520first%26field-binding_browse-bin%3D%26Adv-Srch-Books-Submit.y%3D15%26node%3D%26field-dateyear%3D%26field-publisher%3D%26redirect%3Dtrue%26sort%3Drelevancerank%26search-alias%3Dstripbooks%26field-isbn%3D%26ref%255F%3Dsr%255Fadv%255Fb%26unfiltered%3D1%26field-feature%255Fbrowse-bin%3D%26field-subject%3D%26Adv-Srch-Books-Submit.x%3D36%26field-datemod%3D%26field-dateop%3D%26field-keywords%3D%26field-author%3D%26url%3D&#038;tag=uxma-20&#038;linkCode=ur2&#038;camp=1789&#038;creative=390957">Head First</a>. The theory is: you can <a href="http://headrush.typepad.com/creating_passionate_users/2005/09/you_can_outspen.html">either out-spend your competition or you can out-teach your competition</a>. Well, <a href="http://www.37signals.com">37signals</a> is not going to out-spend anybody. We are 10 people. We don&#8217;t have venture funding. There are a lot of people out there who can blow more money than we can on any number of things.</dd>
<dd>But what we can do—or at least try to do—is we can out-teach the competition. We can out-share the competition. Again, I keep coming back to this cooking world, who are the famous chefs out there? They are the ones who gave away their recipes. They are the people who wrote cookbooks, wrote recipe books, went on TV, showed how they did the things that they do.</dd>
<dd>We used exactly the same strategy for our own purposes. We gave away our recipe book in the form of <a href="http://uxmag.com/archive/ruby-rails">Ruby on Rails</a>. We gave away most of ideas in the form of <a href="http://gettingreal.37signals.com/"><em>Getting Real</em></a> and we continue to give away these internal discussions and so on through our blog <a href="http://svn.37signals.com/"><em>Signal vs. Noise</em></a>. In return, we get a lot of passionate users who learn more about the company, who get inspired to do their own thing, and hopefully choose to use our software along the way.</dd>
<dd>People overestimate secret sauce in general. There&#8217;s very little secret sauce out there in terms of software that&#8217;s just so brilliant that you have to keep it for yourself. In general, I think that there&#8217;s way more value to be had by sharing the software that&#8217;s not your core business. So we&#8217;re not going to share the source code to <a href="http://www.basecamphq.com">Basecamp</a>. That wouldn&#8217;t make any sense; that is what we do. But the database driver that <a href="http://www.basecamphq.com">Basecamp</a> uses to connect to the <a href="http://www.37signals.com">37signals</a>&#8216; database, that&#8217;s not specific in any way to what we do, thus makes a perfect target for something we can share.</dd>
<dt><strong>RJ Owen:</strong> David, do you cook?</dt>
<dd><strong>DHH:</strong> I actually don&#8217;t, but I love eating at restaurants where I can just say, &#8216;Give me what the chef thinks is a good thing tonight.&#8217; I hate long menu boards and I hate construction kit food. I love giving somebody who I think I can trust free rein to do the best they can do.</dd>
<dt><strong>Hillerson:</strong> On a final note, tell our readers what you think makes a good user interface design.</dt>
<dd><strong>DHH:</strong> For me a good user interface is a simple user interface. It&#8217;s a user interface that doesn&#8217;t try to expose or reveal too many features or preferences. That&#8217;s pretty much the extent of the general-purpose ideas.</dd>
<dd>Also, a good interface should focus on context over consistency. We have a lot of interfaces that are subtly different because they have a slightly different purpose even though they could have been shoved into the same template. I think a lot of <a href="http://uxmag.com/archive/web">Web</a> development shops have a tendency to just create the overall skeleton of the site once and for all, and then just plug stuff into it from there on out. We think that&#8217;s exactly the opposite way of how you should be doing it.</dd>
<dd>When we start to design something, we don&#8217;t start with the frame, or navigation, or the search tab, or any of that stuff. We try to practice something what our people have labeled &#8216;epicenter design.&#8217; Try to start with thing itself, not the frame, but the picture. In the Messages section of <a href="http://www.basecamphq.com/">Basecamp</a>, we looked at an individual message: What should the headline look like? How should the date be formatted? How many paragraphs of text should you show before you have a &#8216;more&#8217; link?  Those are the important decisions to make, whereas the &#8216;what color should the sidebar be, or how large it should be&#8217; is like window dressing.</dd>
<dd>We have a slightly different perception of what designers are at <a href="http://www.37signals.com">37signals</a>. It is not so much about making things pretty as it is about figuring out what things should be and how they should work. That requires looking at the things themselves and not at the frame, or other elements that will fall into place naturally later. Once you have a really good message design, creating the rest in some ways is trivial.</dd>
<dt><strong>Umbaugh:</strong> It was a privilege to do this interview with you. You&#8217;ve been inspirational to my career, and to others who are reading this.</dt>
<dd><strong>DHH:</strong> Sure, it&#8217;s always fun for me to talk about these things, so entirely my pleasure.</dd>
</dl>
<p><em>This article was originally published on the User Interface Resource Center (UIRC). For more info, please see </em><a href="http://uxmag.com/uirc">http://uxmag.com/uirc</a></p>
<p>&#8220;</p>
<p>(Via <a href="http://uxmag.com/feeds/articles.rss">UX Magazine Articles</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vleerkatcreations.com/2009/12/02/less-is-better/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>40 Free Tutorials on Advanced Drawing Techniques &#8211; Vectortuts+</title>
		<link>http://www.vleerkatcreations.com/2009/10/29/40-free-tutorials-on-advanced-drawing-techniques-vectortuts/</link>
		<comments>http://www.vleerkatcreations.com/2009/10/29/40-free-tutorials-on-advanced-drawing-techniques-vectortuts/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 11:39:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Inspiration]]></category>

		<guid isPermaLink="false">http://www.vleerkatcreations.com/?p=104</guid>
		<description><![CDATA[40 Free Tutorials on Advanced Drawing Techniques &#8211; Vectortuts+: &#8221; HOMETUTORIALSARTICLESFREEBIESVIDEOSABOUTSUBSCRIBE BY RSS &#124; EMAIL &#124; OTHER HOME  \  ARTICLES  \  INSPIRATION  \  40 FREE TUTORIALS ON ADVANCED… CATEGORIES CONTESTS INSPIRATION INTERVIEWS NEWS TECHNIQUES WEB ROUNDUPS 40 Free Tutorials on Advanced Drawing Techniques Feb 19th in Inspiration by Chris Spooner The traditional form of drawing and sketching is a highly <a href="http://www.vleerkatcreations.com/2009/10/29/40-free-tutorials-on-advanced-drawing-techniques-vectortuts/"> read more <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://vector.tutsplus.com/articles/inspiration/40-free-tutorials-on-advanced-drawing-techniques/">40 Free Tutorials on Advanced Drawing Techniques &#8211; Vectortuts+</a>: &#8221;    </p>
<p>HOMETUTORIALSARTICLESFREEBIESVIDEOSABOUTSUBSCRIBE BY RSS | EMAIL | OTHER<br />
HOME  \  ARTICLES  \  INSPIRATION  \  40 FREE TUTORIALS ON ADVANCED…<br />
CATEGORIES<br />
CONTESTS<br />
INSPIRATION<br />
INTERVIEWS<br />
NEWS<br />
TECHNIQUES<br />
WEB ROUNDUPS</p>
<p>40 Free Tutorials on Advanced Drawing Techniques<br />
Feb 19th in Inspiration by Chris Spooner<br />
The traditional form of drawing and sketching is a highly sought after skill. Develop your personal drawing abilities by following this collection of 40 great tutorials on advanced drawing techniques, including general theory, useful tips, comic inspired art and some methods for transforming your creations into digital format.</p>
<p>Author: Chris Spooner<br />
Chris is a web designer, logo designer and vector illustrator. Find Chris&#8217;s portfolio and blog at SpoonGraphics.</p>
<p>1. How to Draw a Car</p>
<p>Use a range of pencil drawing techniques to create an American classic, the Corvette. This tutorial from DueysDrawings.com covers the process from roughing out the initial outline through to shading&#8221;</p>
<p>(Via <a href=""></a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vleerkatcreations.com/2009/10/29/40-free-tutorials-on-advanced-drawing-techniques-vectortuts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ivan Sutherland’s Sketchpad</title>
		<link>http://www.vleerkatcreations.com/2009/08/25/ivan-sutherland%e2%80%99s-sketchpad/</link>
		<comments>http://www.vleerkatcreations.com/2009/08/25/ivan-sutherland%e2%80%99s-sketchpad/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 06:44:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.vleerkatcreations.com/?p=90</guid>
		<description><![CDATA[Ivan Sutherland’s Sketchpad: &#8220; Mid-’80s presentation from Alan Kay showing off Sketchpad, a simply incredible vector drawing application written by Ivan Sutherland in 1963. 1963! This is astonishing. (Via Swiss Miss.)  ★  &#8220; (Via Daring Fireball.)]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.youtube.com/watch?v=mOZqRJzE8xg">Ivan Sutherland’s Sketchpad</a>: &#8220;
<p>Mid-’80s presentation from Alan Kay showing off Sketchpad, a simply incredible vector drawing application written by Ivan Sutherland in 1963. <em>1963</em>! This is astonishing. (<a href="http://www.swiss-miss.com/2009/08/illustrator-circa-1963.html">Via Swiss Miss</a>.)</p>
<div>
<a title="Permanent link to ‘Ivan Sutherland’s Sketchpad’" href="http://daringfireball.net/linked/2009/08/21/sutherland"> ★ </a>
</div>
<p>&#8220;</p>
<p>(Via <a href="http://daringfireball.net/">Daring Fireball</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vleerkatcreations.com/2009/08/25/ivan-sutherland%e2%80%99s-sketchpad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 User Interface Design Fundamentals</title>
		<link>http://www.vleerkatcreations.com/2009/08/17/10-user-interface-design-fundamentals/</link>
		<comments>http://www.vleerkatcreations.com/2009/08/17/10-user-interface-design-fundamentals/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 12:00:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.vleerkatcreations.com/?p=66</guid>
		<description><![CDATA[10 User Interface Design Fundamentals: &#8220; It’s no great mystery that truly great user interfaces are the ones that are engineered to stay out of the way. ‘Staying out of the way’ means not distracting your users. Rather, good UIs let your users complete goals. The result? A reduction in training and support costs, and <a href="http://www.vleerkatcreations.com/2009/08/17/10-user-interface-design-fundamentals/"> read more <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://feedproxy.google.com/~r/vitaminmasterfeed/~3/eJ2cRnsznPc/">10 User Interface Design Fundamentals</a>: &#8220;
<div><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fdesign%2F10-user-interface-design-fundamentals%2F"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fcarsonified.com%2Fblog%2Fdesign%2F10-user-interface-design-fundamentals%2F" height="61" width="51"></a></div>
<p><img src="http://img.skitch.com/20090817-ftkpmq5nitn2hy3ucy9sayjc2s.jpg" alt="Photo of a submarine control panel"></p>
<p>It’s no great mystery that truly great user interfaces are the ones that are engineered to stay out of the way.</p>
<p>‘Staying out of the way’ means not distracting your users. Rather, good UIs let your users complete goals. The result? A reduction in training and support costs, and happier, satisfied and highly engaged users.</p>
<p>When getting started on a new interface, make sure to remember these fundamentals …</p>
<p><em>Editor’s Note: Kyle will be talking about User Interface Design at <a href="http://events.carsonified.com/fowd/2009/nyc?utm_source=TV&#038;utm_medium=Link%2Btext&#038;utm_campaign=10%2BUser%20Interface%20Design%20Fundamentals">The Future of Web Design NYC</a>.</em></p>
<p><span></span></p>
<h3>1. Know your user</h3>
<blockquote><p>‘Obsess over customers: when given the choice between obsessing over competitors or customers, always obsess over customers. Start with customers and work backward.’ – Jeff Bezos</p>
</blockquote>
<p>Your user’s goals are your goals, so learn them. Restate them, repeat them. Then, learn about your user’s skills and experience, and what they need. Find out what interfaces they like and sit down and watch how they <em>use</em> them. Do not get carried away trying to keep up with the competition by mimicking trendy design styles or adding new features.  By focusing on your user first, you will be able to create an interface that lets them achieve their goals.</p>
<h3>2. Pay attention to patterns</h3>
<p>Users spend the majority of their time on interfaces other than your own (Facebook, MySpace, Blogger, Bank of America, school/university, news websites, etc). There is no need to reinvent the wheel. Those interfaces may solve some of the same problems that users perceive within the one you are creating. By using familiar UI patterns, you will help your users feel at home.</p>
<p><img style="border:1px solid black" src="http://img.skitch.com/20090812-1p38hhmp5j5ktekhwhp1njhbfd.png" alt="Graphic comparing an email inbox with CoTweets inbox"><br />
<a href="http://cotweet.com/?referrer=thinkvitamin">CoTweet</a> uses a familiar UI pattern found in email applications.</p>
<h3>3. Stay consistent</h3>
<blockquote><p>‘The more users’ expectations prove right, the more they will feel in control of the system and the more they will like it.’ – Jakob Nielson</p>
</blockquote>
<p>Your users <em>need</em> consistency. They need to know that once they learn to do something, they will be able to do it again. Language, layout, and design are just a few interface elements that need consistency. A consistent interface enables your users to have a better understanding of how things will work, increasing their efficiency.</p>
<h3>4. Use visual hierarchy</h3>
<blockquote><p>‘Designers can create normalcy out of chaos; they can clearly communicate ideas through the organizing and manipulating of words and pictures.’ – Jeffery Veen, <a href="http://veen.com/artsci/">The Art and Science of Web Design</a></p>
</blockquote>
<p>Design your interface in a way that allows the user to focus on what is most important. The size, color, and placement of each element work together, creating a clear path to understanding your interface. A clear hierarchy will go great lengths in reducing the appearance of complexity (even when the actions themselves are complex).</p>
<h3>5. Provide feedback</h3>
<p>Your interface should at all times speak to your user, when his/her actions are both right and wrong or misunderstood. Always inform your users of actions, changes in state and errors, or exceptions that occur. Visual cues or simple messaging can show the user whether his or her actions have led to the expected result.</p>
<p><img style="border:1px solid black" src="http://img.skitch.com/20090812-kf7yqjwsrbfaibyj9d7kh5i2fy.png" alt="Screenshot of BantamLives interface showing that it provides feedback with a loading action"><br />
<a href="http://bantamlive.com/">BantamLive</a> provides inline loading indicators for most actions within their interface.</p>
<h3>6. Be forgiving</h3>
<p>No matter how clear your design is, people will make mistakes. Your UI should allow for and tolerate user error. Design ways for users to undo actions, and be forgiving with varied inputs (no one likes to start over because he/she put in the wrong birth date format). Also, if the user does cause an error, use your messaging as a teachable situation by showing what action was wrong, and ensure that she/he knows how to prevent the error from occurring again.</p>
<p>A great example can be seen in <a href="http://carsonified.com/blog/design/how-to-increase-sign-ups-with-easier-captchas/">How to increase signups with easier captchas</a>.</p>
<h3>7. Empower your user</h3>
<p>Once a user has become experienced with your interface, reward him/her and take off the training wheels. The breakdown of complex tasks into simple steps will become cumbersome and distracting. Providing more abstract ways, like keyboard shortcuts, to accomplish tasks will allow your design to get out of the way.</p>
<h3>8. Speak their language</h3>
<blockquote><p>‘If you think every pixel, every icon, every typeface matters, then you also need to believe every letter matters. ’ – <a href="http://gettingreal.37signals.com/">Getting Real</a></p>
</blockquote>
<p>All interfaces require some level of copywriting. Keep things conversational, not sensational. Provide clear and concise labels for actions and keep your messaging simple. Your users will appreciate it, because they won’t hear you – they will hear themselves and/or their peers.</p>
<h3>9. Keep it simple</h3>
<blockquote><p>‘A modern paradox is that it’s simpler to create complex interfaces because it’s so complex to simplify them.’ – Pär Almqvist</p>
</blockquote>
<p>The best interface designs are <a href="http://www.uie.com/articles/experiencedesign">invisible</a>. They do not contain UI-bling or unnecessary elements. Instead, the necessary elements are succinct and make sense. Whenever you are thinking about adding a new feature or element to your interface, ask the question, ‘Does the user really need this?’ or ‘Why does the user want this very clever animated gif?’ Are you adding things because you like or want them? Never let your UI ego steal the show.</p>
<h3>10. Keep moving forward</h3>
<blockquote><p><strong>Grandpa Bud</strong>: If I gave up every time I failed, I would never have invented my fireproof pants!<br />
[Pants burn up, revealing his underwear]<br />
<strong>Grandpa Bud</strong>: Still working the kinks out a bit.</p>
<p>from <a href="http://www.imdb.com/title/tt0396555/">Meet the Robinsons</a></p>
</blockquote>
<p><em>Meet the Robinsons</em> is one of my all time favorite movies. Throughout the movie Lewis, the protagonist, is challenged to ‘keep moving forward.’ This is a key principle in UI design.</p>
<p>It is often said when developing interfaces that you need to fail fast, and iterate often. When creating a UI, you <em>will</em> make mistakes. Just keep moving forward, and remember to keep your UI out of the way.</p>
<p><em>Editor’s Note: Come hear Kyle speak about User Interface Design at <a href="http://events.carsonified.com/fowd/2009/nyc?utm_source=TV&#038;utm_medium=Text%2Blink&#038;utm_campaign=10%2BUser%20Interface%20Design%20Fundamentals">The Future of Web Design NYC</a>.</em></p>
<p>Photo credit: <a href="http://www.flickr.com/photos/lostamerica">flickr.com/photos/lostamerica</a></p>
<div>
<a href="http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=eJ2cRnsznPc:QegabfWnBcg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=yIl2AUoC8zA" border="0"></a> <a href="http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=eJ2cRnsznPc:QegabfWnBcg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/vitaminmasterfeed?i=eJ2cRnsznPc:QegabfWnBcg:gIN9vFwOqvQ" border="0"></a> <a href="http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=eJ2cRnsznPc:QegabfWnBcg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/vitaminmasterfeed?d=qj6IDK7rITs" border="0"></a> <a href="http://feeds.feedburner.com/~ff/vitaminmasterfeed?a=eJ2cRnsznPc:QegabfWnBcg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/vitaminmasterfeed?i=eJ2cRnsznPc:QegabfWnBcg:F7zBnMyn0Lo" border="0"></a>
</div>
<p><img src="http://feeds.feedburner.com/~r/vitaminmasterfeed/~4/eJ2cRnsznPc" height="1" width="1">&#8220;</p>
<p>(Via <a href="http://carsonified.com">Vitamin Master Feed</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vleerkatcreations.com/2009/08/17/10-user-interface-design-fundamentals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taming Advanced CSS Selectors</title>
		<link>http://www.vleerkatcreations.com/2009/08/17/taming-advanced-css-selectors/</link>
		<comments>http://www.vleerkatcreations.com/2009/08/17/taming-advanced-css-selectors/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 12:00:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.vleerkatcreations.com/?p=64</guid>
		<description><![CDATA[Taming Advanced CSS Selectors: &#8220;   CSS is one of the most powerful tools that is available to web designers (if not the most powerful). With it we can completely transform the look of a website in just a couple of minutes, and without even having to touch the markup. But despite the fact that <a href="http://www.vleerkatcreations.com/2009/08/17/taming-advanced-css-selectors/"> read more <span class="meta-nav">&#187;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/">Taming Advanced CSS Selectors</a>: &#8220;<br />
<table width="450">
<tr>
<td width="450">
<div style="width:450px">
     <img src="http://creatives.commindo-media.de/static/smashing-magazine-advertisement.gif" alt="" border="0"><br />
     <a href="http://creatives.commindo-media.de/www/delivery/ck.php?zoneid=56"><img src="http://creatives.commindo-media.de/www/delivery/avw.php?zoneid=56" border="0" alt=""></a> <a href="http://creatives.commindo-media.de/www/delivery/ck.php?zoneid=63"><img src="http://creatives.commindo-media.de/www/delivery/avw.php?zoneid=63" border="0" alt=""></a>
   </div>
</td>
</tr>
</table>
<p>CSS is <strong>one of the most powerful tools</strong> that is available to web designers (if not the most powerful). With it we can completely transform the look of a website in just a couple of minutes, and without even having to touch the markup. But despite the fact that we are all well aware of its usefulness, CSS selectors are still not used to their full potential and we sometimes have the tendency to litter our HTML with excessive and unnecessary classes and ids, divs and spans.</p>
<p>The best way to avoid these plagues spreading in your markup and keep it clean and semantic, is by using more complex CSS selectors, ones that can target specific elements without the need of a class or an id, and by doing that <strong>keep our code and our stylesheets flexible</strong>.</p>
<div style="border:1px dashed #b2b2b2;margin:15px 0;padding:5px 5px 6px 5px;width:510px">
<p style="float:left;display:inline;margin:0;padding:3px 15px 7px 9px"><a href="http://www.smashingmagazine.com/2009/08/05/the-smashing-book-pre-order-now-and-save-20/?utm_source=Smashing%2BMagazine&#038;utm_medium=editorialbox&#038;utm_content=editorialbox%2Btop&#038;utm_campaign=Smashing%2BBook"><img title="Learn more about the Smashing Book!" alt="Learn more about the Smashing Book!" src="http://media2.smashingmagazine.com/wp-content/uploads/images/fresh-beautiful-fonts/small-book.jpg" width="75" height="74"></a> </p>
<p style="margin:8px auto 0 auto">Want to learn more about CSS coding and web design? Take a look at our upcoming <a href="http://www.smashingmagazine.com/2009/08/05/the-smashing-book-pre-order-now-and-save-20/?utm_source=Smashing%2BMagazine&#038;utm_medium=editorialbox&#038;utm_content=editorialbox%2Btop&#038;utm_campaign=Smashing%2BBook">Smashing Book</a> (<span style="color:#cc0000;font-weight:bold">$23.90</span> <del><small>$29.90</small></del>, available worldwide). <a href="http://shop.smashingmagazine.com/smashingbook-dispatcher.php?utm_source=Smashing%2BMagazine&#038;utm_medium=editorialbox&#038;utm_content=editorialbox%2Btop%20to%20cart&#038;utm_campaign=Smashing%2BBook">Pre-order now with 20% discount!</a></p>
<p style="clear:both">
</div>
<h3>CSS Specificity</h3>
<p>Before delving into the realms of advanced CSS selectors, it’s important to understand how CSS specificity works, so that we know how to properly use our selectors and to avoid us spending hours debugging for a CSS issue that could be easily fixed if we had only payed attention to the specificity.</p>
<p>When we are writing our CSS we have to keep in mind that <strong>some selectors will rank higher</strong> than others in the cascade, the latest selector that we wrote will not always override the previous ones that we wrote for the same elements.</p>
<p>So how do you <strong>calculate the specificity</strong> of a particular selector? It’s fairly straightforward if you take into account that specificity will be represented as four numbers separated by commas, like: 1, 1, 1, 1 or 0, 2, 0, 1</p>
<ol>
<li>The first digit (a) is always zero, unless there is a style attribute applied to that element within the markup itself</li>
<li>The second digit (b) is the sum of the number of IDs in that selector</li>
<li>The third digit (c) is the sum of other attribute selectors and pseudo-classes in that selector. Classes (<code>.example</code>) and attribute selectors (eg. <code>li[id=red])</code> are included here.</li>
<li>The fourth digit (d) counts the elements (like <code>table</code>, <code>p</code>, <code>div</code>, etc.) and pseudo-elements (like <code>:first-line</code>)</li>
<li>The universal selector (*) has a specificity of zero</li>
<li>If two selectors have the same specificity, the one that comes last on the stylesheet will be applied</li>
</ol>
<p>Let’s take a look at a few examples, to make it easier to understand:</p>
<ul>
<li><code>#sidebar h2</code> — 0, 1, 0, 1</li>
<li><code>h2.title</code> — 0, 0, 1, 1</li>
<li><code>h2 + p</code> — 0, 0, 0, 2</li>
<li><code>#sidebar p:first-line</code> — 0, 1, 0, 2</li>
</ul>
<p>From the following selectors, the first one is the one who will be applied to the element, because it has the higher specificity:</p>
<ul>
<li><code>#sidebar p#first { color: red; }</code> — 0, 2, 0, 1</li>
<li><code>#sidebar p:first-line { color: blue; }</code> — 0, 1, 0, 2</li>
</ul>
<p>It’s important to have at least a basic understanding of how specificity works, but tools like <strong>Firebug</strong> are useful to let us know which selector is being applied to a particular element by listing all the CSS selectors in order of their specificity when you are inspecting an element.</p>
<p><img src="http://media1.smashingmagazine.com/wp-content/uploads/images/taming-css-selectors/firebug.jpg" width="535" height="256"><br />
<em>Firebug lets you easily see which selector is being applied to an element.</em></p>
<p>Useful links:</p>
<ul>
<li><a href="http://www.smashingmagazine.com/2007/07/27/css-specificity-things-you-should-know/">CSS Specificity: Things You Should Know</a></li>
<li><a href="http://meyerweb.com/eric/css/link-specificity.html">Link Specificity¯MeyerWeb</a></li>
<li><a href="http://www.stuffandnonsense.co.uk/archives/css_specificity_wars.html">CSS: Specificity Wars</a></li>
<li><a href="http://www.w3.org/TR/CSS2/cascade.html">Assigning property values, Cascading, and Inheritance—W3C</a></li>
</ul>
<h3>1. Attribute selectors</h3>
<p>Attribute selectors let you target an element based on its attributes. You can specify the element’s attribute only, so all the elements that <em>have</em> that attribute — whatever the value — within the HTML will be targeted, or be more specific and <strong>target elements that have particular values on their attributes</strong> — and this is where attribute selectors show their power.</p>
<p>There are 6 different types of attribute selectors:</p>
<ul>
<li><code>[att=value]</code><br />
The attribute has to have the exact value specified.</li>
<li><code>[att~=value]</code><br />
The attribute’s value needs to be a whitespace separated list of words (for example, class=’title featured home’), and one of the words is exactly the specified value.</li>
<li><code>[att|=value]</code><br />
The attribute’s value is exactly ‘value’ or starts with the word ‘value’ and is immediately followed by ‘-’, so it would be ‘value-’.</li>
<li><code>[att^=value]</code><br />
The attribute’s value starts with the specified value.</li>
<li><code>[att$=value]</code><br />The attribute’s value contains the specified value.</li>
<li><code>[att*=value]</code><br />
The attribute’s value ends with the specified value.</li>
</ul>
<p>For example, if you want to <strong>change the background color of all the div elements that are posts</strong> on your blog, you can use the an attribute selector that targets every <code>div</code> whose <code>class</code> attribute starts with ‘post-’:</p>
<pre name="code">div[class$='post'] {
	background-color: #333;
	}</pre>
<p>This will match all the <code>div</code> elements whose class attribute contains the words ‘posts’, in any position.</p>
<p>Another useful usage of attribute selectors is to <strong>target different types of <code>input</code> elements</strong>. For example, if you want your text inputs to have a different width from the others, you can use a simple attribute selector:</p>
<pre name="code">input[type='text'] {
	width: 200px;
	}</pre>
<p>This will target all the <code>input</code> elements whose <code>type</code> attribute is exactly ‘text’.</p>
<p>Now let’s say you want to <strong>add a different icon next to each different type of file</strong> your website is linking to, so your website’s visitors know when they’ll get an image, a PDF file, a Word document, etc. This can be done by using an attribute selector:</p>
<pre name="code">a[href*='.jpg'] {
	background: url(jpeg.gif) no-repeat left 50%;
	padding: 2px 0 2px 20px;
	}

a[href*='.pdf'] {
	background: url(pdf.gif) no-repeat left 50%;
	padding: 2px 0 2px 20px;
	}

a[href*='.doc'] {
	background: url(word.gif) no-repeat left 50%;
	padding: 2px 0 2px 20px;
	}</pre>
<p>In this example, we’ve used an attribute selector that will target all the links (<code>a</code>) whose <code>href</code> attribute ends (<code>*</code>) with .jpg, .pdf or .doc.</p>
<p><strong>Notes on browser support</strong><br />Apart from Internet Explorer 6, all major browsers support attribute selectors. This means that when you are using attribute selectors on your stylesheets, you should <strong>make sure that IE6 users will still be provided with a usable site</strong>. Take our third example: adding an icon to your links adds another level of usability to your site, but the site will still be usable if the links don’t show any icons.</p>
<h3>2. Child selector</h3>
<p>The child selector is represented by the sign ‘&gt;’. It allows you to <strong>target elements that are direct children of a particular element</strong>.</p>
<p>For example, if you want to match all the <code>h2</code> elements that are a direct child of your sidebar <code>div</code>, but not the <code>h2</code> elements that may be also within the <code>div</code>, but that are grandchildren (or later descendants) of your element, you can use this selector:</p>
<pre name="code">div#sidebar &gt; h2 {
	font-size: 20px;
	}</pre>
<p>You can also use both child and descendant selectors combined. For example, if you want to target only the <code>blockquote</code> elements that are within divs that are direct grandchildren of the <code>body</code> element (you may want to match blockquotes inside the main content <code>div</code>, but not if they are outside it):</p>
<pre name="code">body &gt; div &gt; div blockquote {
	margin-left: 30px;
	}</pre>
<p><strong>Notes on browser support</strong><br />Like the attribute selectors, the child selector is not supported by Internet Explorer 6. If the effect you are trying to achieve by using it is crucial for the website’s usability or overall aesthetics, you can consider using a class selector with it, or on a IE-only stylesheet, but that would detract from the purpose of using child selectors.</p>
<h3>3. Sibling combinators</h3>
<p>There are two types of sibling combinators: adjancent sibling combinators and general sibling combinators.</p>
<h4>Adjacent sibling combinator</h4>
<p>This selector uses the plus sign, ‘+’, to combine two sequences of simple selectors. The elements in the selector have <strong>the same parent</strong>, and <strong>the second one must come immediately after the first</strong>.</p>
<p>The adjacent sibling combinator can be very useful, for example, when <strong>dealing with text</strong>. Lets say you want to add a top margin to all the <code>h2</code> tags that follow a paragraph (you don’t need to add a top margin if the heading comes after an <code>h1</code> tag or if it’s the first element on that page):</p>
<pre name="code">p + h2 {
	margin-top: 10px;
	}</pre>
<p>You can be even more specific and say that you only want this rule applied if the elements are within a particular <code>div</code>:</p>
<pre name="code">div.post p + h2 {
	margin-top: 10px;
	}</pre>
<p>Or you can add another level of complexity: say you want the first line of the paragraphs of every page to be in small caps.</p>
<pre name="code">.post h1 + p:first-line {
	font-variant: small-caps;
	}</pre>
<p>Because you know that the first paragraph of every post immediately follows an <code>h1</code> tag, you can refer to the <code>h1</code> on your selector.</p>
<h4>General sibling combinator</h4>
<p>The general sibling combinator works pretty much the same as the adjacent sibling combinator, but with the difference that <strong>the second selector doesn’t have to immediately follow the first one</strong>.</p>
<p>So if you need to target all the <code>p</code> tags that are within a particular <code>div</code> and that follow the <code>h1</code> tag (you may want those <code>p</code> tags to be larger than the ones that come before the title of your post), you can use this selector:</p>
<pre name="code">.post h1 ~ p {
	font-size: 13px;
	}</pre>
<p><strong>Notes on browser support</strong><br />Internet Explorer 6 doesn’t understand sibling combinators, but, as for the other cases, if your audience includes a small percentage of IE6 users, and if the website’s layout isn’t broken or severely affected by its lack of support, this is a much easier way of achieving lots of cool effects without the need of cluttering your HTML with useless classes and ids.</p>
<h3>4. Pseudo-classes</h3>
<h4>Dynamic pseudo-classes</h4>
<p>These are called dynamic pseudo-classes because they actually do not exist within the HTML: they are only present <strong>when the user is or has interacted</strong> with the website.</p>
<p>There are two types of dynamic pseudo-classes: <strong>link</strong> and <strong>user action</strong> ones. The link are <code>:link</code> and <code>:visited</code>, while the user action ones are <code>:hover</code>, <code>:active</code> and <code>:focus</code>.</p>
<p>From all the CSS selectors mentioned in this post, these will probably be <strong>the ones that are most commonly used</strong>.</p>
<p>The <strong><code>:link</code></strong> pseudo-class applies to links that haven’t been visited by the user, while the <strong><code>:visited</code></strong> pseudo-class applies to links that have been visited, so they are mutually exclusive.</p>
<p>The <strong><code>:hover</code></strong> pseudo-class applies when the user moves the cursor over the element, without having to activate or click on it. The <strong><code>:active</code></strong> pseudo-class applies when the user actually clicks on the element. And finally the <strong><code>:focus</code></strong> pseudo-class applies when that element is on focus — the most common application is on form elements.</p>
<p>You can use more than one user action dynamic pseudo-class in your stylesheets, so you can have, for example, a different background color for an input field depending on whether the user’s cursor is only hovering over it or hovering over it while in focus:</p>
<pre name="code">input:focus {
	background: #D2D2D2;
	border: 1px solid #5E5E5E;
	}

input:focus:hover {
	background: #C7C7C7;
	}</pre>
<h5>Notes on browser support</h5>
<p>The dynamic pseudo-classes are supported by all modern browsers, even IE6. But bear in mind that IE6 only allows the <code>:hover</code> pseudo-class to be applied to link elements (<code>a</code>) and only IE8 accepts the <code>:active</code> state on elements other than links.</p>
<h4>:first-child</h4>
<p>The <code>:first-child</code> pseudo-class allows you to target an element that is <strong>the first child of another element</strong>. For example, if you want to add a top margin to the first <code>li</code> element of your unordered lists, you can have this:</p>
<pre name="code">ul &gt; li:first-child {
	margin-top: 10px;
	}</pre>
<p>Let’s take another example: you want all your <code>h2</code> tags in your sidebar to have a top margin, to separate them from whatever comes before them, but the first one doesn’t need a margin. You can use the following code:</p>
<pre name="code">#sidebar &gt; h2 {
	margin-top: 10px;
	}

#sidebar &gt; h2:first-child {
	margin-top: 0;
	}</pre>
<h5>Notes on browser support</h5>
<p>IE6 doesn’t support the <code>:first-child</code> pseudo-class. Depending on the design that the pseudo-class is being applied to, it may not be a major cause for concern. For example, if you are using the <code>:first-child</code> selector to remove top or bottom margins from headings or paragraphs, your layout will probably not break in IE6, it will only look sightly different. But if you are using the <code>:first-child</code> selector to remove left and right margins from, for example, a floated sequence of divs, that may cause more disruption to your designs.</p>
<h4>The language pseudo-class</h4>
<p>The language pseudo-class, <strong><code>:lang()</code></strong>, allows you to match an element based on its language.</p>
<p>For example, lets say you want a specific link on your site to have a different background color, depending on that page’s language:</p>
<pre name="code">:lang(en) &gt; a#flag {
	background-image: url(english.gif);
	}

:lang(fr) &gt; a#flag {
	background-image: url(french.gif);
	}</pre>
<p>The selectors will match that particular link if the page’s language is either equal to ‘en’ or ‘fr’ or if it starts with ‘en’ or ‘fr’ and is immediately followed by an ‘-’.</p>
<h5>Notes on browser support</h5>
<p>Not surprisingly, the only version of Internet Explorer that supports this selector is 8. All other major browsers support the language pseudo-selector.</p>
<h3>5. CSS 3 Pseudo-classes</h3>
<h4>:target</h4>
<p>When you’re <strong>using links with fragment identifiers</strong> (for example, <code>http://www.smashingmagazine.com/2009/08/02/bauhaus-ninety-years-of-inspiration/#comments</code>, where ‘#comments’ is the fragment identifier), you can style the target by using the <code>:target</code> pseudo-class.</p>
<p>For example, lets imagine you have a long page with lots of text and <code>h2</code> headings, and there is an index of those headings at the top of the page. It will be much easier for the user if, when clicking on a particular link within the index, that heading would become highlighted in some way, when the page scrolls down. Easy:</p>
<pre name="code">h2:target {
	background: #F2EBD6;
	}</pre>
<h5>Notes on browser support</h5>
<p>This time, Internet Explorer is really annoying and has no support at all for the <code>:target</code> pseudo-class. Another glitch is that Opera doesn’t support this selector when using the back and forward buttons. Other than that, it has support from the other major browsers.</p>
<h4>The UI element states pseudo-classes</h4>
<p>Some HTML elements have an enable or disabled state (for example, input fields) and checked or unchecked states (radio buttons and checkboxes). These states can be targeted by the <strong><code>:enabled</code></strong>, <strong><code>:disabled</code></strong> or <strong><code>:checked</code></strong> pseudo-classes, respectively.</p>
<p>So you can say that any <code>input</code> that is disabled should have a light grey background and dotted border:</p>
<pre name="code">input:disabled {
	border:1px dotted #999;
	background:#F2F2F2;
	}</pre>
<p>You can also say that all checkboxes that are checked should have a left margin (to be easily seen within a long list of checkboxes):</p>
<pre name="code">input[type=’checkbox’]:checked {
	margin-left: 15px;
	}</pre>
<h5>Notes on browser support</h5>
<p>All major browsers, except our usual suspect, Internet Explorer, support the UI element states pseudo-classes. If you consider that you are only <strong>adding an extra level of detail</strong> and improved usability to your visitors, this can still be an option.</p>
<h3>6. CSS 3 structural pseudo-classes</h3>
<h4>:nth-child</h4>
<p>The <code>:nth-child()</code> pseudo-class allows you to <strong>target one or more specific children of a parent element</strong>.</p>
<p>You can target a single child, by defining its value as an <strong>integer</strong>:</p>
<pre name="code">ul li:nth-child(3) {
	color: red;
	}</pre>
<p>This will turn the text on the third <code>li</code> item within the <code>ul</code> element red. Bear in mind that if a different element is inside the <code>ul</code> (not a <code>li</code>), it will also be counted as its child.</p>
<p>You can target a parent’s children <strong>using expressions</strong>. For example, the following expression will match every third <code>li</code> element starting from the fourth:</p>
<pre name="code">ul li:nth-child(3n+4) {
	color: yellow;
	}</pre>
<p>In the previous case, the first yellow <code>li</code> element will be the fourth. If you just want to start counting from the first <code>li</code> element, you can use a simpler expression:</p>
<pre name="code">ul li:nth-child(3n) {
	color: yellow;
	}</pre>
<p>In this case, the first yellow <code>li</code> element will be the third, and every other third after it. Now imagine you want to target only the first four <code>li</code> elements within the list:</p>
<pre name="code">ul li:nth-child(-n+4) {
	color: green;
	}</pre>
<p>The value of <code>:nth-child</code> can also be defined as <strong>‘even’ or ‘odd’</strong>, which are the same as using ‘2n’ (every second child) or ‘2n+1’ (every second child starting from the first), respectively.</p>
<h4>:nth-last-child</h4>
<p>The <code>:nth-last-child</code> pseudo-class works basically as the <code>:nth-child</code> pseudo-class, but it starts <strong>counting the elements from the last one</strong>.</p>
<p>Using one of the examples above:</p>
<pre name="code">ul li:nth-child(-n+4) {
	color: green;
	}</pre>
<p>Instead of matching the first four <code>li</code> elements in the list, this selector will match the <em>last</em> four elements.</p>
<p>You can also use the values ‘even’ or ‘odd’, with the difference that in this case they will count the children starting from the last one:</p>
<pre name="code">ul li:nth-last-child(odd) {
	color: grey;
	}</pre>
<h4>:nth-of-type</h4>
<p>The <code>:nth-of-type</code> pseudo-class works just like the <code>:nth-child</code>, with the difference that it <strong>only counts children that match the element</strong> in the selector.</p>
<p>This can be very useful if we want to target elements that may contain different elements within them. For example, let’s imagine we want to turn every second paragraph in a block of text blue, but we want to ignore other elements such as images or quotations:</p>
<pre name="code">p:nth-of-type(even) {
	color: blue;
	}</pre>
<p>You can use the same values as you would use for the <code>:nth-child</code> pseudo-class.</p>
<h4>:nth-last-of-type</h4>
<p>You guessed it! The <code>:nth-last-of-type</code> pseudo-class can be <strong>used exactly like the aforementioned <code>:nth-last-child</code></strong>, but this time, it will only target the elements that match our selector:</p>
<pre name="code">ul li:nth-last-of-type(-n+4) {
	color: green;
	}</pre>
<p>We can be even more clever, and <strong>combine more than one of these pseudo-classes</strong> together on a massive selector. Let’s say all images within a post <code>div</code> to be floated left, except for the first and last one (let’s image these would full width, so they shouldn’t be floated):</p>
<pre name="code">.post img:nth-of-type(n+2):nth-last-of-type(n+2) {
	float: left;
	}</pre>
<p>So in the first part of this selector, we are targeting every image starting from the second one. In the second part, we are targeting every image except for the last one. Because the selectors aren’t mutually exclusive, we can use them both on one selector thus excluding both the first and last element at once!</p>
<h4>:last-child</h4>
<p>The <code>:last-child</code> pseudo-class works just as the <code>:first-child</code> pseudo-class, but instead targets the <strong>last child of a parent element</strong>.</p>
<p>Let’s image you don’t want the last paragraph within your post <code>div</code> to have a bottom margin:</p>
<pre name="code">.post &gt; p:last-child {
	margin-bottom: 0;
	}</pre>
<p>This selector will target the last paragraph that is a direct <em>and</em> the last child of an element with the class of ‘post’.</p>
<h4>:first-of-type and :last-of-type</h4>
<p>The <code>:first-of-type</code> pseudo-class is used to target an element that is <strong>the first of its type within its parent</strong>.</p>
<p>For example, you can target the first paragraph that is a direct child of a particular <code>div</code>, and capitalize its first line:</p>
<pre name="code">.post &gt; p:first-of-type:first-line {
	font-variant: small-caps;
	}</pre>
<p>With this selector you make sure that you are targeting only paragraphs that are direct children of the ‘post’ <code>div</code>, and that are the first to match our <code>p</code> element.</p>
<p>The <code>:last-of-type</code> pseudo-class works exactly the same, but targets the <em>last</em> child of its type instead.</p>
<h4> <img src='http://www.vleerkatcreations.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly-child</h4>
<p>The <code> <img src='http://www.vleerkatcreations.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly-child</code> pseudo-class represents an element that is <strong>the only child of its parent</strong>.</p>
<p>Let’s say you have several boxes (‘news’) with paragraphs of text inside them. When you have more than one paragraph, you want the text to be smaller than when you have only one:</p>
<pre name="code">div.news &gt; p {
	font-size: 1.2em;
	}

div.news &gt; p:only-child {
	font-size: 1.5em;
	}</pre>
<p>In the first selector, we are defining the overall size of the <code>p</code> elements that are direct children of a ‘news’ <code>div</code>. On the second one, we are overriding the previous font-size by saying, if the <code>p</code> element is the only child of the ‘news’ <code>div</code>, its font size should be bigger.</p>
<h4> <img src='http://www.vleerkatcreations.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly-of-type</h4>
<p>The <code> <img src='http://www.vleerkatcreations.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly-of-type</code> pseudo-class represents an element that is <strong>the only child of its parent with the same element</strong>.</p>
<p>How can this be useful? Image you have a sequence of posts, each one represented by a <code>div</code> with the class of ‘post’. Some of them have more than one image, but others have only one image. You want the image within the later ones to be aligned to the center, while the images on posts with more than one image to be floated. That would be quite easy to accomplish with this selector:</p>
<pre name="code">.post &gt; img {
	float: left;
	}

.post &gt; img:only-of-type {
	float: none;
	margin: auto;
	}</pre>
<h4>:empty</h4>
<p>The <code>:empty</code> pseudo-class represents <strong>an element that has no content</strong> within it.</p>
<p>It can be useful in a number of ways. For example, if you have multiple boxes in your ‘sidebar’ <code>div</code>, but don’t want the empty ones to appear on the page:</p>
<pre name="code">#sidebar .box:empty {
	display: none;
	}</pre>
<p>Beware that even if there is a single space in the ‘box’ <code>div</code>, it will not be treated as empty by the CSS, and therefore will not match the selector.</p>
<p><strong>Notes on browser support</strong><br />Internet Explorer (up until version <img src='http://www.vleerkatcreations.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> has no support for structural pseudo-classes. Firefox, Safari and Opera support these pseudo-classes on their latest releases. This means that if what it’s being accomplished with these selectors is fundamental for the <strong>website’s usability and accessibility</strong>, or if the larger part of the website’s audience is using IE and you don’t want to deprive them of some design details, it’s be wise to keep using regular classes and simpler selectors to cater for those browsers. If not, you can just go crazy!</p>
<h3>7. The negation pseudo-class</h3>
<p>The negation pseudo-class, <strong><code>:not()</code></strong>, lets you target elements that <strong>do not match</strong> the selector that is represented by its argument.</p>
<p>For example, this can be useful if you need to style all the <code>input</code> elements within a form, but you don’t want your input elements with the type submit to be styled — you want them to be styled in a different way —, to look more like buttons:</p>
<pre name="code">input:not([type='submit']) {
	width: 200px;
	padding: 3px;
	border: 1px solid #000000;
	}</pre>
<p>Another example: you want all the paragraphs within your post <code>div</code> to have a larger font-size, except for the one that indicates the time and date:</p>
<pre name="code">.post p:not(.date) {
	font-size: 13px;
	}</pre>
<p>Can you image the number of possibilities this selector brings with it, and the amount of useless selectors you could strip out off your CSS files were it widely supported? </p>
<p><strong>Notes on browser support</strong><br />Internet Explorer is our usual party pooper here: no support at all, not even on IE8. This probably means that this selector will still have to wait a while before some developers lose the fear of adding them to their stylesheets.</p>
<h3>8. Pseudo-elements</h3>
<p>Pseudo-elements allow you to access <strong>elements that don’t actually exist in the HTML</strong>, like the first line of a text block or its first letter.</p>
<p>Pseudo-elements exist in CSS 2.1, but the CSS 3 specifications state that they should be used with the double colon ‘::’, to distinguish them from pseudo-classes. In CSS 2.1, they are used with only one colon, ‘:’. Browsers should be able accept both formats, except in the case of pseudo-elements that may be introduced only in CSS 3.</p>
<h4>::first-line</h4>
<p>The <code>::first-line</code> pseudo-element will match the <strong>first line of a block</strong>, inline-block, table-caption or table-cell level element.</p>
<p>This is particularly useful to <strong>add subtle typographical details</strong> to your text blocks, like, for example, transforming the first line of an article into small caps:</p>
<pre name="code">h1 + p::first-line {
	font-variant: small-caps;
	}</pre>
<p>If you’ve been paying attention, you’ll know that this means the paragraph that comes <em>immediately after</em> an <code>h1</code> tag (‘+’) should have its first line in small caps.</p>
<p>You could also refer to the first line of a particular <code>div</code>, without having to refer to the actual paragraph tag:</p>
<pre name="code">div.post p::first-line { font-variant: small-caps; }</pre>
<p>Or go one step farther and target specifically the <em>first</em> paragraph within a particular <code>div</code>:</p>
<pre name="code">div.post &gt; p:first-child::first-line {
	font-variant: small-caps;
	}</pre>
<p>Here, the ‘&gt;’ symbol indicates that you are targeting a direct child the post <code>div</code>, so if the  paragraph were to be inside a second <code>div</code>, it wouldn’t match this selector.</p>
<h4>::first-letter</h4>
<p>The <code>::first-letter</code> pseudo-element will match the <strong>first letter of a block</strong>, unless it’s preceded by some other content, like an image, on the same line.</p>
<p>Like the <code>::first-line</code> pseudo-element, <code>::first-letter</code> is commonly used to <strong>add typographical details</strong> to text elements, like drop caps or initials.</p>
<p>Here is how you could use the <code>::first-letter</code> pseudo-element to create a <strong>drop cap</strong>:</p>
<pre name="code">p {
	font-size: 12px;
	}

p::first-letter {
	font-size: 24px;
	float: left;
	}</pre>
<p>Bear in mind that if you use both <code>::first-line</code> and <code>::first-letter</code> in the same element, the <code>::first-letter</code> properties will override the same properties inherited from <code>::first-line</code>.</p>
<p>This element can sometimes produce unexpected results, if you’re not aware of the W3C specs: it’s actually the CSS selector with the longest spec! So <strong>it’s a good idea to read them carefully</strong> if you’re planning on using it (as it is for all the other selectors). </p>
<h4>::before and ::after</h4>
<p>The <code>::before</code> and <code>::after</code> pseudo-elements are used to <strong>insert content</strong> before or after an element’s content, purely via CSS.</p>
<p>These elements will inherit many of the properties of the elements that they are being attached to.</p>
<p>Image you want to the words ‘Graphic number x:’ before the descriptions of graphs and charts on your page. You could achieve this without having to write the words ‘Graphic number’, or the number itself yourself:</p>
<pre name="code">.post {
	counter-reset: image;
	}

p.description::before {
	content: 'Figure number ' counter(image) ': ';
	counter-increment: image;
	}</pre>
<p>What just happened here?</p>
<p>First, we tell the HTML to <strong>create the ‘image’ counter</strong>. We could have added this property to the body of the page, for example. Also, we can call this counter whatever name we want to, as long as we always reference it by the same name: try it for yourself!</p>
<p>Then we say that we want to add, before every paragraph with the class ‘description’, this piece of content: ‘Figure number ’ — notice that only what we wrote between quotes will be created on the page, so we need to add the spaces as well!</p>
<p>After that, we have <code>counter(image)</code>: this will pick up the property we’ve already defined in the <code>.post</code> selector. It will by default start with the number one (1).</p>
<p>The next property is there so that the counter knows that for each <code>p.description</code>, it needs to increment the image counter by 1 (<code>counter-increment: image</code>).</p>
<p>It’s not as complicated as it looks, and it can be quite useful.</p>
<p>The <code>::before</code> and <code>::after</code> pseudo-elements are often only <strong>used with the content property</strong>, to add small sentences or typographical elements, but here it’s shown how we can use it in a more powerful way in conjunction with the <code>counter-reset</code> and <code>counter-increment</code> properties.</p>
<p><strong>Fun fact:</strong> the <code>::first-line</code> and <code>::first-letter</code> pseudo-elements will match the content added by the <code>::before</code> pseudo-element, if present.</p>
<p><strong>Notes on browser support</strong><br />These pseudo-elements are supported by IE8 (not IE7 or 6), if the single colon format is used (for example, <code>:first-letter</code>, not <code>::first-letter</code>). All the other major browsers support these selectors.</p>
<h3>Conclusion</h3>
<p>Enough with the boring talk, now it’s time for <em>you</em> to grab the information on this post and go <strong>try it for yourself</strong>: start by creating an experimental page and test all of these selectors, come back here when in doubt and make sure to always refer to the W3C specs, but don’t just sit there thinking that because these selectors aren’t yet widely supported you might as well ignore them.</p>
<p>If you’re a bit more <strong>adventurous</strong>, or if you’re not afraid of letting go of the past filled with useless and non-semantic classes and ids, why not sneak one or two of these powerful CSS selectors into your next project? We promise you’ll never look back.</p>
<h3>References</h3>
<ul>
<li><a href="http://www.w3.org/TR/CSS2/selector.html">CSS 2 Selectors — W3C</a></li>
<li><a href="http://www.w3.org/TR/css3-selectors/">CSS 3 Selectors Level 3 — W3C</a></li>
<li><a href="http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28Cascading_Style_Sheets%29">Comparison of layout engines (Cascading Style Sheets) — Wikipedia</a></li>
<li><a href="http://www.w3.org/TR/CSS2/generate.html">Generated content, automatic numbering, and lists — W3C</a></li>
</ul>
<h3>Further Resources</h3>
<ul>
<li><a href="http://www.alistapart.com/articles/keepelementskidsinlinewithoffspring/">Keeping Your Elements’ Kids in Line with Offspring — A List Apart</a></li>
<li><a href="http://css.maxdesign.com.au/selectutorial/index.htm">Selectutorial &#8211; CSS selectors </a></li>
<li><a href="http://inspectelement.com/tutorials/a-look-at-some-of-the-new-selectors-introduced-in-css3/">A Look at Some of the New Selectors Introduced in CSS3</a></li>
<li>CSS 2.1 selectors, <a href="http://www.456bereastreet.com/archive/200509/css_21_selectors_part_1/">Part 1</a> and <a href="http://www.456bereastreet.com/archive/200510/css_21_selectors_part_2/">Part 2</a></li>
<li><a href="http://www.456bereastreet.com/archive/200601/css_3_selectors_explained/">CSS 3 selectors explained</a></li>
<li><a href="http://kimblim.dk/css-tests/selectors/">CSS selectors and pseudo selectors browser compatibility</a></li>
<li><a href="http://www.impressivewebs.com/10-useful-css-properties-not-supported-by-internet-explorer/">10 Useful CSS Properties Not Supported By Internet Explorer</a></li>
<li><a href="http://webdesignernotebook.com/css/styling-a-poem-with-advanced-css-selectors/">Styling a Poem with Advanced CSS Selectors</a></li>
</ul>
<h3>Related posts</h3>
<p>You may also be interested in the following articles:</p>
<ul>
<li><a href="http://www.smashingmagazine.com/2009/07/27/the-definitive-guide-to-using-negative-margins/">The Definitive Guide to Using Negative Margins</a></li>
<li><a href="http://www.smashingmagazine.com/2009/07/06/10-useful-cssjs-coding-solutions-for-web-developers/">10 Useful CSS/JS-Coding Solutions For Web-Developers</a></li>
<li><a href="http://www.smashingmagazine.com/2009/06/15/take-your-design-to-the-next-level-with-css3/">Take Your Design To The Next Level With CSS3</a></li>
<li><a href="http://www.smashingmagazine.com/2009/06/09/smart-fixes-for-fluid-layouts/">Adaptive CSS-Layouts: New Era In Fluid Layouts?</a></li>
</ul>
<div style="border:1px dashed #b2b2b2;margin:15px 0;padding:5px 5px 6px 5px;width:500px">
<p style="float:left;display:inline;margin:0;padding:3px 15px 7px 9px"><a href="http://www.smashingmagazine.com/2009/08/05/the-smashing-book-pre-order-now-and-save-20/?utm_source=Smashing%2BMagazine&#038;utm_medium=editorialbox&#038;utm_content=editorialbox%2Bbottom&#038;utm_campaign=Smashing%2BBook"><img title="Learn more about the Smashing Book!" alt="Learn more about the Smashing Book!" src="http://media1.smashingmagazine.com/wp-content/uploads/images/fresh-beautiful-fonts/small-book.jpg" width="75" height="74"></a> </p>
<p style="margin:8px auto 0 auto">Want to learn more about CSS coding and web design? Take a look at our upcoming <a href="http://www.smashingmagazine.com/2009/08/05/the-smashing-book-pre-order-now-and-save-20/?utm_source=Smashing%2BMagazine&#038;utm_medium=editorialbox&#038;utm_content=editorialbox%2Bbottom&#038;utm_campaign=Smashing%2BBook">Smashing Book</a> (<span style="color:#cc0000;font-weight:bold">$23.90</span> <del><small>$29.90</small></del>, available worldwide). <a href="http://shop.smashingmagazine.com/smashingbook-dispatcher.php?utm_source=Smashing%2BMagazine&#038;utm_medium=editorialbox&#038;utm_content=editorialbox%2Bbottom%20to%20cart&#038;utm_campaign=Smashing%2BBook">Pre-order now with 20% discount!</a></p>
<p style="clear:both">
</div>
<h3>About the author</h3>
<p><em><a href="http://yaili.com">Inayaili de León</a> is a Portuguese webdesigner. She has a true passion for webdesign and front-end coding, and loves beautiful and clean sites. She lives in London (and <a href="http://londonchronicles.com">blogs about it</a>), and enjoys pizza and ‘skyping’ her cats. You can see more of her articles at <a href="http://webdesignernotebook.com">Web Designer Notebook</a> and <a href="http://twitter.com/yaili">follow her daily ramblings on Twitter</a>.</em></p>
<hr />
<p><small>© Inayaili de Leon for <a href="http://www.smashingmagazine.com">Smashing Magazine</a>, 2009. |<br />
<a href="http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/">Permalink</a> |<br />
<a href="http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/#comments">2 comments</a> |<br />
<a title="Bookmark in del.icio.us" href="http://del.icio.us/post?url=http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/&#038;title=Taming%20Advanced%20CSS%20Selectors">Add to del.icio.us</a> | <a title="Bookmark in Digg" href="http://digg.com/submit?phase=2&#038;url=http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/">Digg this</a> | <a title="Stumble on StumbleUpon" href="http://www.stumbleupon.com/submit?url=http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/">Stumble on StumbleUpon!</a> | <a title="Tweet us!" href="http://twitter.com/home?status=@tweetmeme%20@smashingmag%20Reading%20Taming%20Advanced%20CSS%20Selectors%20http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/">Tweet it!</a> | <a title="Bookmark in Reddit" href="http://reddit.com/submit?url=http://www.smashingmagazine.com/2009/08/17/taming-advanced-css-selectors/">Submit to Reddit</a> | <a href="http://forum.smashingmagazine.com/">Forum Smashing Magazine</a></p>
<p>
Post tags: <a href="http://www.smashingmagazine.com/tag/css/" rel="tag">CSS</a>, <a href="http://www.smashingmagazine.com/tag/selectors/" rel="tag">selectors</a><br />
</small></p>
<p>&#8220;</p>
<p>(Via <a href="http://www.smashingmagazine.com/">Smashing Magazine</a>.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vleerkatcreations.com/2009/08/17/taming-advanced-css-selectors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

