<?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>Stubbornella</title>
	<atom:link href="http://www.stubbornella.org/content/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.stubbornella.org/content</link>
	<description>A Term of Endearment</description>
	<lastBuildDate>Tue, 06 Sep 2011 18:30:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Don&#8217;t Style Headings Using HTML5 Sections</title>
		<link>http://www.stubbornella.org/content/2011/09/06/style-headings-using-html5-sections/</link>
		<comments>http://www.stubbornella.org/content/2011/09/06/style-headings-using-html5-sections/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 09:43:37 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[oocss]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[XHTML / HTML]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=827</guid>
		<description><![CDATA[Styling headings is either a deceptively complex problem, or maybe the design of CSS made it appear complex when it need not have done. 

When styling headings (or really anything) we want three big goals to be met:

<ol>
	<li>DRY - Do not repeat yourself. We want to set headings once and never (ok, rarely!) repeat those font styles or selectors. This will make our site easier to maintain.</li>
	<li>Predictable - The heading should look the same no matter where on the page it is placed. This will make creating new pages and content easier.</li>
	<li>Keep specificity low and selectors as simple as possible. This will help with performance and keep the site from growing more and more tangled over time.</li>
</ol>

The html5 section tag is weird. It dramatically changes the way we use headings in the HTML. It also changes the way browsers and assistive technologies are meant to interpret those headings. For that reason, we've got to revisit how we style headings. The old way simply won't work anymore! 

It is a subtle difference, but section elements are meant to help the browser figure out what level the heading really is, but not necessarily to decide how to style it. By tying styles to browser heading level interpretation, developers (trying to implement html5 from the spec) are ending up with selectors that look like this:

<pre>
h1{font-size: 36px}
section h1{font-size: 28px}
section section h1{font-size: 22px}
section section section h1{font-size: 18px}
section section section section h1{font-size: 16px}
section section section section section h1{font-size: 14px}
section section section section section section h1{font-size: 13px}
section section section section section section section h1{font-size: 11px}
</pre>

<a href="http://www.stubbornella.org/content/?p=827">Learn how this can go awry and a better way of styling headings</a>.]]></description>
			<content:encoded><![CDATA[<p>Styling headings is either a deceptively complex problem, or maybe the design of CSS made it appear complex when it need not have done. </p>
<p>When styling headings (or really anything) we want three big goals to be met:</p>
<ol>
<li><strong>DRY</strong> &#8211; Do not repeat yourself. We want to set headings once and never (ok, rarely!) repeat those font styles or selectors. This will make our site easier to maintain.</li>
<li><strong>Predictable</strong> &#8211; The heading should look the same no matter where on the page it is placed. This will make creating new pages and content easier.</li>
<li><strong>Keep specificity low and selectors as simple as possible</strong>. This will help with performance and keep the site from growing more and more tangled over time.</li>
</ol>
<p>The html5 section tag is weird. It dramatically changes the way we use headings. It also changes the way browsers and assistive technologies are meant to interpret those headings. The spec says:</p>
<blockquote><p>&#8220;The section element represents a generic section of a document or application. A section, in this context, is a thematic grouping of content, typically with a heading.&#8221;<br />
<cite class="author"><a href="http://www.whatwg.org/specs/web-apps/current-work/#the-section-element">The HTML5 Spec</a></cite>
</p></blockquote>
<p>The spec goes on to warn us that sections are not really meant to be used just because you want to attach a style a particular piece of content:</p>
<blockquote id="secondQuote"><p>&#8220;The section element is not a generic container element. When an element is needed for styling purposes or as a convenience for scripting, authors are encouraged to use the div element instead. A general rule is that the section element is appropriate only if the element&#8217;s contents would be listed explicitly in the document&#8217;s outline.&#8221;<br />
<cite class="author"><a href="http://www.whatwg.org/specs/web-apps/current-work/#the-section-element">The HTML5 Spec</a></cite>
</p></blockquote>
<p>People seem to have blocked out this last (very important) bit, so I&#8217;ll reiterate. Sections aren&#8217;t really meant to be used by CSS for style purposes (at least not *only* for styles). So, if sections aren&#8217;t meant to be used to make my headings purty, why do they exist? They change the way the browser and assistive technologies interpret the importance of a heading relative to the other headings on the page. To understand this, you need to know a bit about the pitfalls of the way headings have been written up until now.</p>
<h3>HTML Headings</h3>
<p>Think back to the outlines you wrote for term papers in high school. Each bit of a website is meant to be like that, each heading corresponds to a piece of that outline, and you know when you go up or down a level by the heading level chosen. H2 is down one level from H1. And h6 is down four levels from H2.</p>
<pre>
THE TITLE IS THE H1
I. Big roman numerals are the H2s
   A. This is an h3
   B. This is also and h3
      i. Now we have an h4
      ii. And another h4
II. Big roman numerals are the H2s
III. Big roman numerals are the H2s
IV. Big roman numerals are the H2s
</pre>
<p>The trouble is, on a modern website or web app, this model isn&#8217;t a really natural fit. Especially if a site &#8220;mashes up&#8221; content from sources they don&#8217;t control (say for example adding a twitter feed to a blog), they may not be able to set the heading levels used by the mashup content. In this case, most developers, just include the new content, and the outline gets a little murkier. </p>
<p>A murky outline may be somewhat normal, because I&#8217;d take it a step further and say that, on most modern websites, the idea that the site has much in common with a high school term paper outline is a bit of a stretch &#8212; The section element tries to bridge the gap between the w3c&#8217;s outline view of the web and the way developers are really building sites. The <em>section element</em> essentially reorders the heading tree so that whatever headings are used, if they are wrapped in a section element, they will be made to fit in with other content on the page. They need only be internally consistent within each section.</p>
<pre>&lt;h2&gt;Me on the web...&lt;/h2&gt;
&lt;h1&gt;My Twitter Feed&lt;/h1&gt;
&lt;ul class=&quot;tweets&quot;&gt;
 &lt;li&gt;Mmmm, cornflakes.&lt;/li&gt;
 &lt;li&gt;Something inane...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;more.html&quot;&gt;More stuff on the web&lt;/a&gt;&lt;/p&gt;
</pre>
<h3>HTML5 Headings &#038; Section Elements</h3>
<p>If you wrap it in a section, the browser will interpret it as one level down from it&#8217;s parent heading. </p>
<pre>&lt;h2&gt;Me on the web...&lt;/h2&gt;
<strong>&lt;section&gt;</strong>
&lt;h1&gt;My Twitter Feed&lt;/h1&gt;
&lt;ul class=&quot;tweets&quot;&gt;
 &lt;li&gt;Mmmm, cornflakes.&lt;/li&gt;
 &lt;li&gt;Something inane...&lt;/li&gt;
&lt;/ul&gt;
<strong>&lt;/section&gt;</strong>
&lt;p&gt;&lt;a href=&quot;more.html&quot;&gt;More stuff on the web&lt;/a&gt;&lt;/p&gt;</pre>
<p>The section element also makes it clear that the list of tweets belongs to the Twitter feed, and the more link does not. This makes content more portable, which is okay &#8212; even if it maybe isn&#8217;t that important. However, it does seem to be confusing people about how they should <strong>style</strong> their headings. I think this bit of the spec might be confusing people:</p>
<blockquote><p>Notice how the use of section means that the author can use h1 elements throughout, without having to worry about whether a particular section is at the top level, the second level, the third level, and so on.<br />
<cite class="author"><a href="http://www.whatwg.org/specs/web-apps/current-work/#the-section-element">The HTML5 Spec</a></cite>
</p></blockquote>
<p>This has lead people to think that they should only ever use h1s (which, is a fair interpretation of the working group&#8217;s note). However, lots of people have taken it a little too far because they didn&#8217;t read the second quote <a href="#secondQuote">[1]</a>, where it says additional section elements shouldn&#8217;t really be used only to apply CSS styles. Admittedly a subtle difference, but important! Section elements are meant to help the browser figure out what level the heading really is, but not necessarily to decide how to style it. By tying styles to browser heading level interpretation, developers (trying to implement html5 from the spec) are ending up with selectors that look like this:</p>
<pre>
h1{font-size: 36px}
section h1{font-size: 28px}
section section h1{font-size: 22px}
section section section h1{font-size: 18px}
section section section section h1{font-size: 16px}
section section section section section h1{font-size: 14px}
section section section section section section h1{font-size: 13px}
section section section section section section section h1{font-size: 11px}
</pre>
<p>(Note: This is vastly simplified as I&#8217;ve only included sections and not the other sectioning elements like <code>articles</code> or <code>asides</code>. <a href="https://github.com/cboone/hypsometric-css/blob/master/html5/html5-defaults.css#L426">This is a more realistic, real life code sample</a>.)</p>
<h3>Let&#8217;s see how well this meets our goals:</h3>
<h4>Q: What if, semantically speaking, you need to add an additional section to a bit of html? </h4>
<p>It will unintentionally change the way your headings look. If it is high enough on the document tree it could change your entire page. That seems badly unpredictable.</p>
<h4>Q: What happens if the design calls for a 14px heading in a part of the site that is only nested two sectioning contents deep?</h4>
<p>To make it work with the existing code, you would need to add additional unnecessary section elements. The spec pretty clearly states that section elements are not meant to be added just to change styles. Plus, that is just kind of gross.</p>
<h4>Q: What if we create another rule that duplicates the 14px property value pair?</h4>
<pre>
section.special section h1 {font-size:14px}
</pre>
<p>This clearly isn&#8217;t DRY. We&#8217;re repeating the code to set the font-size to 14px, and our specificity is starting to get weird. If we want a normal two-section deep heading (22px) we now can&#8217;t have it in the special section. We also can&#8217;t reuse the new rule anywhere else. Continue in this direction for a while on a project and you can end up with hundreds or even thousands of heading declarations. Eek! This isn&#8217;t meeting our stated goals at all.</p>
<p>(For more info about how this can get out of control, check out this <a href="http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/">video on how our current methods for styling headings are leading to bad outcomes</a>.)</p>
<h3>So, how do we style headings in an HTML5 world?</h3>
<p>The answer is right there in the spec, next to the place where we learned to use only H1s. <strong>We shouldn&#8217;t use sectioning elements for styling.</strong> We should let them do the job they were designed for, which is sorting out the document tree, and solve styling issues another way that meets our goals better: with simple reusable class names that can be applied to any of our headings no matter how deep they may be in the sectioning content.</p>
<p>I recommend abstracting site wide headings into classes because then they are portable, predictable, and dry. You can call them anything you like. Jeremy Keith recommends something like: </p>
<pre>
.Alpha {}
.Beta {}
.Gamma {}
.Delta {}
.Epsilon {}
.Zeta {}
</pre>
<p>or </p>
<pre>
.tera {}
.giga {}
.mega {}
.kilo {}
.hecto {}
.deca {}
.deci {}
.centi {}
.milli {}
.micro {}
.nano {}
.pico {}
</pre>
<p>I keep it simple with: </p>
<pre>
.h1{}
.h2{}
.h3{}
.h4{}
.h5{}
.h6{}
</pre>
<p>It doesn&#8217;t really matter what <a href="https://github.com/stubbornella/oocss/blob/master/core/heading/heading.css">system</a> you choose as long as it is something easy for your team to remember. Then, no matter how many section levels deep your heading is nested, you can make it look just how you want:</p>
<pre>&lt;h1 class=&quot;<strong>giga</strong>&quot;&gt;Me on the web...&lt;/h1&gt;
&lt;section&gt;
  &lt;h1 class=&quot;<strong>kilo</strong>&quot;&gt;My Twitter Feed&lt;/h1&gt;
  &lt;ul class=&quot;tweets&quot;&gt;
    &lt;li&gt;Mmmm, cornflakes.&lt;/li&gt;
    &lt;li&gt;Something inane...&lt;/li&gt;
  &lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;&lt;a href=&quot;more.html&quot;&gt;More stuff on the web&lt;/a&gt;&lt;/p&gt;</pre>
<p>So now, your twitter feed, from the previous example, can be in the sidebar on an article page, or in the footer of your homepage, and it will still look the way it was designed to. Whether you are using html5 sections or not, you don&#8217;t want to repeat code or have it be unpredictable, so I think separating styles from how the browser generates the page outline is just sensible. </p>
<p>UPDATE 9/6: If you truly cannot change the HTML, even to add class names, then the only way to style that bit is to put a wrapper around it with a unique class and use descendent selectors to force the style you want. This should be the exception, not the rule! (Thanks Simon for pointing out that I wasn&#8217;t addressing one of the use cases I had talked about above)</p>
<pre>&lt;h1 class=&quot;giga&quot;&gt;Me on the web...&lt;/h1&gt;
&lt;section<strong> class="tweetfeed"&gt;</strong>
  &lt;h1&gt;My Twitter Feed&lt;/h1&gt;
  &lt;ul class=&quot;tweets&quot;&gt;
    &lt;li&gt;Mmmm, cornflakes.&lt;/li&gt;
    &lt;li&gt;Something inane...&lt;/li&gt;
  &lt;/ul&gt;
&lt;/section&gt;
&lt;p&gt;&lt;a href=&quot;more.html&quot;&gt;More stuff on the web&lt;/a&gt;&lt;/p&gt;</pre>
<p>If you would like a far more eloquent walk through all the new html5 elements, get <a href="http://adactio.com">Jeremy Keith&#8217;s</a> book <a href="http://www.abookapart.com/products/html5-for-web-designers">HTML5 For Web Designers</a>.</p>
<p>Thanks to Alex Kessinger and Josh for helping me solidify my thoughts around this by <a href="http://groups.google.com/group/css-lint/browse_thread/thread/dc33aaa950765efb?hl=en_US">bringing up good questions</a> on the <a href="http://csslint.net">CSS Lint</a> Google Group.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2011/09/06/style-headings-using-html5-sections/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>CSS Lint open sourced</title>
		<link>http://www.stubbornella.org/content/2011/06/15/css-lint-open-sourced/</link>
		<comments>http://www.stubbornella.org/content/2011/06/15/css-lint-open-sourced/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 22:06:53 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Image]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[oocss]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=820</guid>
		<description><![CDATA[<a href="http://nczonline.net">Nicholas Zakas</a> and I spoke at Velocity a few minutes ago. First we talked about CSS 3 and it's impact on performance, then we demoed and open sourced <a href="http://csslint.net">CSS Lint</a>! I really couldn't be more excited (or relieved, I was super duper nervous before this presentation).

CSS Lint is a tool to help point out problems with your CSS code. It does basic syntax checking as well as applying a set of rules to the code that look for problematic patterns or signs of inefficiency. The rules are all pluggable, so you can easily write your own or omit ones you don't want.]]></description>
			<content:encoded><![CDATA[<p><a href="http://nczonline.net">Nicholas Zakas</a> and I spoke at Velocity a few minutes ago. First we talked about CSS 3 and it&#8217;s impact on performance, then we demoed and open sourced <a href="http://csslint.net">CSS Lint</a>! I really couldn&#8217;t be more excited (or relieved, I was super duper nervous before this presentation).</p>
<p>CSS Lint is a tool to help point out problems with your CSS code. It does basic syntax checking as well as applying a set of rules to the code that look for problematic patterns or signs of inefficiency. The rules are all pluggable, so you can easily write your own or omit ones you don&#8217;t want.</p>
<h3>Rules currently tested </h3>
<ul class="basicList">
<li>Parsing errors should be fixed
</li>
<li>Don&#8217;t use adjoining classes
</li>
<li>Remove empty rules
</li>
<li>Use correct properties for a display
</li>
<li>Don&#8217;t use too many floats
</li>
<li>Don&#8217;t use too many web fonts
</li>
<li>Don&#8217;t use too may font-size declarations
</li>
<li>Don&#8217;t use IDs in selectors
</li>
<li>Don&#8217;t qualify headings
</li>
<li>Heading elements should have a consistent appearance across a site.
</li>
<li>Heading styles should only be defined once
</li>
<li>Be careful using width: 100%
</li>
<li>Zero values don&#8217;t need units
</li>
<li>Vendor prefixed properties should also have the standard
</li>
<li>CSS gradients require all browser prefixes
</li>
<li>Avoid selectors that look like regular expressions
</li>
<li>Beware of broken box models</li>
</ul>
<p>(We&#8217;ll allow you to turn off rules that hurt your feelings soon!)</p>
<h3>Contribute</h3>
<p>Many people have expressed an interest in contributing to the CSS Lint project. We were waiting to have a solid plugable architecture and API before taking contributions. The exciting news is that we are now ready! There are several ways you can contribute:</p>
<ol class="enumlist">
<li>If you are comfortable with CSS, <a href="https://github.com/stubbornella/csslint/issues">submit rule ideas</a>. You must provide the rule name, a human readable explanation, browsers affected, and a test case.</li>
<li>If you are comfortable in JavaScript, <a href="https://github.com/stubbornella/csslint">fork the github project</a>, code up a rule, and submit a pull request. You&#8217;ll need to provide all the same documentation requsted in item 1.</li>
<li>If you are comfortable with Node, <a href="https://github.com/stubbornella/csslint/tree/master/src/node">test out the command line version</a>, submit feature requests.</li>
</ol>
<h2 id="node">CSS Lint for Node.js</h2>
<p>If you&#8217;d like a command line version of CSS Lint, you can install CSS Lint for Node.js using <a href="http://npmjs.org">npm</a> using the following:</p>
<pre><code>sudo npm install -g csslint</code></pre>
<p>Once installed, you can pass in any number of CSS files or directories containing CSS files to see the results. For example:</p>
<pre><code>csslint test.css dir_of_css/ test2.css</code></pre>
<p>You&#8217;ll receive the same errors and warnings as you would with the web interface.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2011/06/15/css-lint-open-sourced/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Welcoming Nicholas Zakas to the Team</title>
		<link>http://www.stubbornella.org/content/2011/06/03/welcoming-nicholas-zakas-to-the-team/</link>
		<comments>http://www.stubbornella.org/content/2011/06/03/welcoming-nicholas-zakas-to-the-team/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 15:30:11 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Latest Happenings]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=806</guid>
		<description><![CDATA[I am so very pleased to announce that <a href="http://www.nczonline.net/blog/2011/06/03/on-leaving-yahoo-and-whats-next/">Nicholas Zakas and I are joining forces</a> to form a consulting duo. Nicholas has spent the last five years defining what it meant to to be a client-side engineer at Yahoo!. He consistently raised the client-side glass ceiling with his commitment to good code and practical solutions. He also literally wrote the book on <a href="http://www.amazon.com/gp/product/059680279X/ref=as_li_ss_tl?ie=UTF8&#038;tag=nicolsulli-20&#038;linkCode=as2&#038;camp=217153&#038;creative=399349&#038;creativeASIN=059680279X">JavaScript Performance</a><img src="http://www.assoc-amazon.com/e/ir?t=&#038;l=as2&#038;o=1&#038;a=059680279X&#038;camp=217153&#038;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />. Like me, Nicholas cares deeply about performance and scalability. And, most importantly, we share a love of finding elegant solutions to hard problems, which we feel makes us a good match. 

I'll let Nicholas speak for himself:

<blockquote>I’ll be ... teaming up with my friend (and former Yahoo) Nicole Sullivan to do consulting work. Nicole and I have talked off and on about working together on outside projects after having fun working together on a couple of projects at Yahoo!. Between the two of us, we hope to provide a wide range of front-end consulting services including performance evaluations, general architecture, and of course, JavaScript and CSS. If you’re interested in hiring us, please email projects (at) stubbornella.org.
<cite class="author">Nicholas Zakas</cite>
</blockquote>


Please come see us at <a href="http://velocityconf.com/velocity2011">Velocity Conference</a> on June 14.  ]]></description>
			<content:encoded><![CDATA[<p>I am so very pleased to announce that <a href="http://www.nczonline.net/blog/2011/06/03/on-leaving-yahoo-and-whats-next/">Nicholas Zakas and I are joining forces</a> to form a consulting duo. Nicholas has spent the last five years defining what it meant to to be a client-side engineer at Yahoo!. He consistently raised the client-side glass ceiling with his commitment to good code and practical solutions. He also literally wrote the book on <a href="http://www.amazon.com/gp/product/059680279X/ref=as_li_ss_tl?ie=UTF8&#038;tag=nicolsulli-20&#038;linkCode=as2&#038;camp=217153&#038;creative=399349&#038;creativeASIN=059680279X">JavaScript Performance</a><img src="http://www.assoc-amazon.com/e/ir?t=&#038;l=as2&#038;o=1&#038;a=059680279X&#038;camp=217153&#038;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />. Like me, Nicholas cares deeply about performance and scalability. And, most importantly, we share a love of finding elegant solutions to hard problems, which we feel makes us a good match. </p>
<p>I&#8217;ll let Nicholas speak for himself:</p>
<blockquote><p>I’ll be &#8230; teaming up with my friend (and former Yahoo) Nicole Sullivan to do consulting work. Nicole and I have talked off and on about working together on outside projects after having fun working together on a couple of projects at Yahoo!. Between the two of us, we hope to provide a wide range of front-end consulting services including performance evaluations, general architecture, and of course, JavaScript and CSS. If you’re interested in hiring us, please email projects (at) stubbornella.org.<br />
<cite class="author">Nicholas Zakas</cite>
</p></blockquote>
<p>Please come see us at <a href="http://velocityconf.com/velocity2011">Velocity Conference</a> on June 14.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2011/06/03/welcoming-nicholas-zakas-to-the-team/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Our (CSS) Best Practices Are Killing US</title>
		<link>http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/</link>
		<comments>http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 17:09:18 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[oocss]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[XHTML / HTML]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=785</guid>
		<description><![CDATA[I was prepping to speak at <a href="http://www.webstock.org.nz/">Webstock</a> this year when I realized I didn't want to give the talk I had proposed. I didn't want to talk about the <em>Mistakes of Massive CSS</em>, because I realized it went deeper than that. In fact, in most cases, the things we considered best practices were <strong>leading to the bad outcomes</strong> we sought to avoid. I realized (unpopular though it might be), that we couldn't make it work out well by <strong>trying harder</strong>. Each time we start a new project, we think "this time, I'm going to keep the code clean. This time the project will be a shining example of what can be done with CSS." And without fail, over time, as more content and features are added to the site, the code becomes a spaghetti tangle of duplication and unpredictability. 

It is time to let ourselves off the hook. There is nothing we could have done by trying harder. There is no magic juju that some other developer has that we don't. Following our beloved best practices leads to bad outcomes every. single. time.

What are those flawed best practices?

<ul class="basicList">
	<li>Classitis!</li>
	<li>Never add an non-semantic element </li>
	<li>Or, a non-semantic class</li>
	<li>Use descendant selectors exclusively</li>
</ul>

<a href="http://www.stubbornella.org/content/?p=785">Here is the video of my talk at Webstock 2011</a>.]]></description>
			<content:encoded><![CDATA[<p>Another day, another melodramatic blog post title. <img src='http://www.stubbornella.org/content/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>I was prepping to speak at <a href="http://www.webstock.org.nz/">Webstock</a> this year when I realized I didn&#8217;t want to give the talk I had proposed. I didn&#8217;t want to talk about the <em>Mistakes of Massive CSS</em>, because I realized it went deeper than that. In fact, in most cases, the things we considered best practices were <strong>leading to the bad outcomes</strong> we sought to avoid. I realized (unpopular though it might be), that we couldn&#8217;t make it work out well by <strong>trying harder</strong>. Each time we start a new project, we think &#8220;this time, I&#8217;m going to keep the code clean. This time the project will be a shining example of what can be done with CSS.&#8221; And without fail, over time, as more content and features are added to the site, the code becomes a spaghetti tangle of duplication and unpredictability. </p>
<p>It is time to let ourselves off the hook. There is nothing we could have done by trying harder. There is no magic juju that some other developer has that we don&#8217;t. Following our beloved best practices leads to bad outcomes every. single. time.</p>
<p>What are those flawed best practices?</p>
<ul class="basicList">
<li>Classitis!</li>
<li>Never add an non-semantic element </li>
<li>Or, a non-semantic class</li>
<li>Use descendant selectors exclusively</li>
<li>Sites need to look exactly the same in every browser</li>
</ul>
<p>Here is the video of my talk at Webstock 2011:</p>
<p><a href="http://www.webstock.org.nz/talks/speakers/nicole-sullivan/css-tools-massive-websites/"><img src="http://www.stubbornella.org/content/wp-content/uploads/2011/04/webstock1.jpg" alt="" title="webstock" width="500" height="330" class="alignnone size-full wp-image-801" /></a></p>
<h3>Classitis!</h3>
<p>How in the world did we even get the idea that some aspects of CSS were good and others evil? Who decided and what data did they use to judge? Did their goals fit our goals? There is nothing wrong with using classes. In almost every case, classes work well and have fewer unintended consequences than either IDs or element selectors. </p>
<p>You should style almost everything with classes. The goal is to find a balance between classes that are too broad and include everything and the kitchen sink and classes that are too narrow. Generally speaking, you don&#8217;t want your classes to be so narrow that each one applies a single property value pair. It becomes extremely hard to evolve your design if every item is composed of mini-mixins. </p>
<p>On the other hand, if classes are too broad, you will have duplication. Try to find the middle ground where all the repeating visual patterns can be abstracted. This is hard, but very worthwhile. If you do it, your code will stay clean. You will finally see results from trying harder.</p>
<p>Classes are our friends. Seeing a lot of IDs is actually very bad. Run from this kind of code:</p>
<pre>
#sidebar #accounts #accountDetails h3{}
</pre>
<h3>Never add non semantic elements</h3>
<p>We don&#8217;t want to have unnecessarily heavy HTML with a lot of extra elements. On the other hand, adding an extra element can often provide a buffer between two sets of classes that weren&#8217;t necessarily coded to interact with one another. For example, I prefer to have the decorative elements of a container completely separated from its content. </p>
<p>Using a paragraph that happens to be inside a rounded corner box to make a corner decoration means that the container can never hold content other than a paragraph. If you want to include a <code>UL</code> you will need to duplicate all those styles. This doesn&#8217;t work.</p>
<p>You want your content to be marked up in beautiful HTML that uses a diverse set of tags like <code>P, UL, OL, LI, H1-6, strong, em</code>. Add a few extra wrapper elements to keep your content nicely cordoned off from your containers or separate out decorative flourishes! Your HTML will be clean and your CSS predictable.</p>
<h3>Never add non-semantic classes</h3>
<p>We absolutely don&#8217;t ever want to use classes like &#8220;bigRedHeading&#8221;, not because it is non-semantic, but because it isn&#8217;t future proof. As the design evolves, the CSS needs to keep pace. On the other hand, CSS needs <strong>abstractions</strong>. We need to be able to solve a particular problem really well, and then allow people to go on using that solution long afterward. Grids for example solve the layout problem. Once they have been implemented on a site, developers can spend time on more important features and stop re-implementing a layout solution over and over. Abstract solutions are <em>necessarily</em> disconnected from the content they happen to contain. This is something we should look for in a solution, not condemn.</p>
<p>The semantics debate has really gone too far. It is useful as a general principal, but often I see standards aware developers trying to stuff in semantics that never existed in the design. If the design didn&#8217;t make a distinction between two things visually, why add additional complexity?  Classes work much better when we use them to represent visual semantics, rather than keeping them tied to content. </p>
<p>One more point on the topic. Screen readers don&#8217;t read class names. It is not an accessibility issue. (Thanks to John Foliot for confirming)</p>
<h3>Use descendant selectors exclusively</h3>
<p>Never has more terrible advice been given (ok, ok, I exaggerate, but for CSS, this is as bad as it gets). The descendent selector is *only* appropriate between multiple nodes of the same object (say, a tab container and its&#8217; tabs), and even then, only when you are absolutely certain that there will never be any markup changes. Very hard to guarantee, no?</p>
<p>I have had a designer give me a tab container that had one group of tabs to the left and another grouping (usually more simply styled) to the right. In which case, if you had styled the UL using the descendant selector, you would be stuck overriding a bunch of styles you no longer needed. Classes are much much better and can be used in combination with the descendant selector when the nodes belong to the same object.</p>
<p>I guess the only time I use the descendant selector with elements is to style LI, and even then, I often get bitten when someone wants to nest those lists. Better support for the child selector will make that issue easier to fix. Ideally, we don&#8217;t want any styles flowing from container to content.</p>
<p>Even with the media block, you might consider putting a class on the media block which sets the styles of the image. It sounds reasonable until you realize that the image is actually its own object. You might have multiple nested media blocks and you will get very weird interactions unless you apply the image style class directly to the image itself. </p>
<p>In the middle layer, you might decide to create one display objects for each of the different types, and that would probably make the objects easier to use, but in the CSS layer, you don&#8217;t want to tie it all together like that.</p>
<h3>Sites need to look exactly the same in every browser</h3>
<p>Forking your design is bad, it makes testing even more complicated, but that doesn&#8217;t mean that pixel for pixel a site needs to be exactly the same in every browser. If you try to force the complexities of a modern design onto users of IE6, their user experience will suffer. The site will load slower and reflows and repaints will make the javascript sluggish. IE6 users need a reasonably fast user experience, they do not *need* rounded corners. </p>
<p>Anyway, enough ranting. Please do checkout the slides and video. I hope you find them useful.</p>
<div style="width:425px" id="__ss_7451831"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/stubbornella/our-best-practices-are-killing-us" title="Our Best Practices Are Killing Us">Our Best Practices Are Killing Us</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/7451831" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/stubbornella">Nicole Sullivan</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2011/04/28/our-best-practices-are-killing-us/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>Automating CSS 3 Gradients</title>
		<link>http://www.stubbornella.org/content/2011/04/25/css-3-gradients/</link>
		<comments>http://www.stubbornella.org/content/2011/04/25/css-3-gradients/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 23:04:25 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[oocss]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=771</guid>
		<description><![CDATA[CSS 3 is full of ways to reduce our dependence on background images, one of which is pure CSS gradients. They have several features, which I'm sure designers are salivating over, like multiple color stops, and angled, radial, and linear gradients. Many people had built cool designer-focused tools to make interacting with a somewhat confusing gradient syntax a little easier. The issue for me has been that I'm not a designer. I generally work off of photoshop comps or (when doing big re-architecture projects) the site itself, as if the old version were a design. This means that, for the most part, I was trying desperately to match CSS gradients to an image with zero information about how that image would have been created. Because of my focus on fixing old and broken CSS, the original designer may not even still work at the company.

If you don't know what I mean, picture me with a color picker going pixel by pixel to try to figure out by hand where the color stops should be and what colors I should use versus extrapolate. Then, for each version, making an image of the gradient I've created, blowing it up so I can compare it to the image of the original. Rinse, repeat until I've come up with something that kinda, sorta approximates the original. Oh yeah, painful. ]]></description>
			<content:encoded><![CDATA[<p>CSS 3 is full of ways to reduce our dependence on background images, one of which is pure CSS gradients. They have several features, which I&#8217;m sure designers are salivating over, like multiple color stops, and angled, radial, and linear gradients. Many people had built cool designer-focused tools to make interacting with a somewhat confusing gradient syntax a little easier. The issue for me has been that I&#8217;m not a designer. I generally work off of photoshop comps or (when doing big re-architecture projects) the site itself, as if the old version were a design. This means that, for the most part, I was trying desperately to match CSS gradients to an image with zero information about how that image would have been created. Because of my focus on fixing old and broken CSS, the original designer may not even still work at the company.</p>
<p>If you don&#8217;t know what I mean, picture me with a color picker going pixel by pixel to try to figure out by hand where the color stops should be and what colors I should use versus extrapolate. Then, for each version, making an image of the gradient I&#8217;ve created, blowing it up so I can compare it to the image of the original. Rinse, repeat until I&#8217;ve come up with something that kinda, sorta approximates the original. Oh yeah, painful. </p>
<p><span id="more-771"></span></p>
<p>Which lead me to tweet the following:</p>
<p><a href="https://twitter.com/#!/stubbornella/status/61499795801505792"><img alt=" I need a tool where I upload an image of a gradient and it spits out the CSS required to create that gradient... exists?" src="https://img.skitch.com/20110423-dh9axwes4t8d8srfcsw1n774i4.png" class="alignnone" width="632" height="344" /></a></p>
<p>There was a lot of response, many people re-tweeted saying that if I found such a tool, they wanted to know about it! Several others said it was interesting, but that the more complex cases would be difficult to navigate. Twelve hours later, Philip Tellis had gone from not knowing what a CSS 3 gradient was, to writing an <a href="https://github.com/bluesmoon/pngtocss">open source command line tool to convert png to CSS</a>. It solved for linear gradients, which is exactly what I needed to fix the performance of sites whose that had gotten sloggy. Most of these sites used linear gradients as images, which are notoriously difficult to sprite.</p>
<p><a href="https://github.com/bluesmoon/pngtocss"><img src="http://www.stubbornella.org/content/wp-content/uploads/2011/04/philipstool.png" alt="@bluesmoon Philip Tellis @stubbornella ok, I just wrote a tool to do that. here: https://github.com/bluesmoon/pngtocss it&#039;s command line only" title="philipstool" width="585" height="285" class="alignnone size-full wp-image-772" /></a></p>
<p>I was excited, to give it a try, and also, a little nervous to once again meet my nemesis, the command line. Then, before I could blink Zoompf took Philip&#8217;s BSD licensed code and created a hosted version (w00t! hosted version!):</p>
<p><a href="http://zoompf.com/grad2css.html"><img src="http://www.stubbornella.org/content/wp-content/uploads/2011/04/zoompf.png" alt="Hosted ported @bluesmoon&#039;s png2css Create CSS for background imgs w/ gradients. http://zoompf.com/grad2css.html /cc: @webinista @nimbuin" title="zoompf" width="513" height="294" class="alignnone size-full wp-image-774" /></a></p>
<p>In the mean time, Colorzilla, creators of several fab tools for designers, had also gotten word about my plea for a conversion tool, and they thought it would be a great addition to their own functionality. A couple days later they tweeted that they had a prototype up:</p>
<p><a href="http://bit.ly/bY6lSb"><img src="http://www.stubbornella.org/content/wp-content/uploads/2011/04/colorzilla.png" alt="@stubbornella &#039;import gradient from image&#039; is now live! supports multi-stop gradients. Check it out - http://bit.ly/bY6lSb :)" title="colorzilla" width="510" height="256" class="alignnone size-full wp-image-775" /></a></p>
<p>Perhaps I&#8217;m being a little too Californian, but I have a warm fuzzy feeling about our community. I think one of the biggest challenges we are going to face is the lack of tools we have relative to other communities. So when we can come together to build tools that will save loads of developer time, I kind of love it. Even better, Philip&#8217;s choice to open source his work meant that others were free to expand upon it.</p>
<p>Is anyone else doing something really cool with CSS 3 gradients? I&#8217;d love to hear more about it. The <a href="http://leaverou.me/css3patterns/">CSS 3 Pattern Gallery</a> kind of blew my mind. With every example, the boundaries of what is possible expand.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2011/04/25/css-3-gradients/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Performance Double Whammy Hits New Zealand at Webstock</title>
		<link>http://www.stubbornella.org/content/2011/02/07/performance-double-whammy-hits-new-zealand-at-webstock/</link>
		<comments>http://www.stubbornella.org/content/2011/02/07/performance-double-whammy-hits-new-zealand-at-webstock/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 17:37:56 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[oocss]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[XHTML / HTML]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=757</guid>
		<description><![CDATA[Interested in Performance and scaling sites to a large number of visitors or pages? I just realized <strong>both</strong> Steve Souders and I will be giving talks at Webstock <em>next week</em>! This is a pretty amazing opportunity to massively increase your Performance mojo in one go. :)

I'm going to be hosting a workshop in which you will learn to <a href="http://www.webstock.org.nz/11/programme/workshops.php#sullivan">build your own site using OOCSS techniques</a>. By the time you leave you will have the skills necessary to write efficient, scalable CSS. You'll understand the joy and pain of CSS3 and HTML5, and be ready to go build the next generation of websites and web apps.

<a href="http://www.webstock.org.nz/11/programme/workshops.php#souders">Steve's workshop is filled with Mobile yummy goodness</a>. How do you figure out that your mobile app is slow <strong>before</strong> your clients start complaining? What's even going on in there? In his workshop, Steve is going to open up the mobile black-box and teach you to take a peek inside.

I am super excited about Webstock, even more so now that I found out it will be a perf-geek-meet-up. New Zealand here I come! 

]]></description>
			<content:encoded><![CDATA[<p>Interested in Performance and scaling sites to a large number of visitors or pages? I just realized <strong>both</strong> Steve Souders and I will be giving talks at Webstock <em>next week</em>! This is a pretty amazing opportunity to massively increase your Performance mojo in one go. <img src='http://www.stubbornella.org/content/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I&#8217;m going to be hosting a workshop in which you will learn to <a href="http://www.webstock.org.nz/11/programme/workshops.php#sullivan">build your own site using OOCSS techniques</a>. By the time you leave you will have the skills necessary to write efficient, scalable CSS. You&#8217;ll understand the joy and pain of CSS3 and HTML5, and be ready to go build the next generation of websites and web apps.</p>
<p><a href="http://www.webstock.org.nz/11/programme/workshops.php#souders">Steve&#8217;s workshop is filled with Mobile yummy goodness</a>. How do you figure out that your mobile app is slow <strong>before</strong> your clients start complaining? What&#8217;s even going on in there? In his workshop, Steve is going to open up the mobile black-box and teach you to take a peek inside.</p>
<p>I am super excited about Webstock, even more so now that I found out it will be a perf-geek-meet-up. New Zealand here I come! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2011/02/07/performance-double-whammy-hits-new-zealand-at-webstock/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Grids improve site performance</title>
		<link>http://www.stubbornella.org/content/2011/01/22/grids-improve-site-performance/</link>
		<comments>http://www.stubbornella.org/content/2011/01/22/grids-improve-site-performance/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 23:29:47 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[XHTML / HTML]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=96</guid>
		<description><![CDATA[CSS grids can improve performance?  How so?

<h3>The Importance of Page Weight</h3> 

The weightier your page the slower the user experience.  There are a few notable ways you can ease this correlation, but for the most part keeping your pages snappy is about being absolutely relentless when reducing and optimizing code.  CSS is no exception.

On the other hand, a blank white page with unstyled black text and blue links would be very fast -- but no one would care to visit.  When we accept that we want sites which are both graphically interesting <em>and</em> fast we can begin to find ways to achieve what I think of as a <strong>one to many</strong> relationship between the amount of CSS we write and the potential layouts we can achieve.

<h3>The cure for bloat</h3>

Finding common denominators in our site will allow us to standardize the way we group related content, and the classes we use to style that content.  You can think of these common denominators as the semantic building blocks of a high performance website. On a basic level that means that most sites have a particular way of displaying, for instance, a product.  Perhaps with an image of the product to the left and a description of the product to the right.  If that configuration appears throughout the site it should not be rewritten each time or we'll have a 1:1 correlation between the size of the CSS and the complexity or number of pages in the site.  These are the kind of sites that might start off fast but over the course of their lifetime become slower and slower. Once clean CSS becomes bloated with unnecessary recoding of semantically and visually identical elements.]]></description>
			<content:encoded><![CDATA[<p>CSS grids can improve performance?  How so?</p>
<h3>The Importance of Page Weight</h3>
<p>The weightier your page the slower the user experience.  There are a few notable ways you can ease this correlation, but for the most part keeping your pages snappy is about being absolutely relentless when reducing and optimizing code.  CSS is no exception.</p>
<p>On the other hand, a blank white page with unstyled black text and blue links would be very fast &#8212; but no one would care to visit.  When we accept that we want sites which are both graphically interesting <em>and</em> fast we can begin to find ways to achieve what I think of as a <strong>one to many</strong> relationship between the amount of CSS we write and the potential layouts we can achieve.</p>
<h3>The cure for bloat</h3>
<p>Finding common denominators in our site will allow us to standardize the way we group related content, and the classes we use to style that content.  You can think of these common denominators as the semantic building blocks of a high performance website. On a basic level that means that most sites have a particular way of displaying, for instance, a product.  Perhaps with an image of the product to the left and a description of the product to the right.  If that configuration appears throughout the site it should not be rewritten each time or we&#8217;ll have a 1:1 correlation between the size of the CSS and the complexity or number of pages in the site.  These are the kind of sites that might start off fast but over the course of their lifetime become slower and slower. Once clean CSS becomes bloated with unnecessary recoding of semantically and visually identical elements.</p>
<h3>Where do grids fit into the mix? </h3>
<p>Grids are one of the simplest examples (to see, not to code) of patterns that can be abstracted across a site.  The same basic three unit pattern which divides grouped content into three semantically linked chunks can be seen inside the main column content and also inside a module, defining different groups of content. In the next two pictures, I&#8217;ve outlined in orange the same grid being used two ways. Not coding this again and again is a huge performance win when multiplied over all the components and pages of a large site.</p>
<p>Image 1: Grids can be used to define the structure of the main column of a page.<br />
<img src="http://www.stubbornella.org/content/wp-content/uploads/2007/12/grids_macro.png" alt="Grids Macro" /></p>
<p>Image 2: The same grids being used to break up the content within the body of a module.<br />
<img src="http://www.stubbornella.org/content/wp-content/uploads/2007/12/grids_micro.png" alt="Grids Micro" /></p>
<p>It&#8217;s easy to see each piece of your site as a one-off, unique, something which will never vary &#8212; but performance dictates that we take a more sage approach. We need to abstract objects, the simple building blocks of your pages.  The objects can then be combined to create pages and the pages combined to create entire sites.  </p>
<h3>Do not reinvent the wheel, grasshopper (at least not for a major client)</h3>
<p>You may be tempted to write your own grids framework rather than use one that is already out there.  The <em>not invented here</em> mentality is really hard to get around.  If you really can&#8217;t resist the urge to write your own grids, do it for your blog, not a major international company. It&#8217;s a fun exercise, but the pitfalls are treacherous.</p>
<h3>The Requirements &#038; Constraints</h3>
<ul class="basicList">
<li>Grids and units can be nested inside each other to achieve complex layouts.  The logic is very simple; <strong>any grid can be nested inside any other</strong>.  Keeping constraints low simplifies CMS development. You should not need to write any additional CSS to make this possible or you start getting n! css rules. Yes, this is bad.
	</li>
<li>Each unit controls it’s own destiny, uh, width that is.  In CMS design, one of the most costly operations is when you need to make changes elsewhere in the DOM in order to generate display or behavior in the current location.  <strong>Keep all the classes necessary for the unit to function on the unit itself</strong>. This will make page building much quicker and code easier to navigate.
	</li>
<li><strong>Unit width can be any fraction of the total width</strong>. Generally I create fractions up to fifths, more than that is probably overkill.
	</li>
<li><strong>Fewer templates</strong>.  Templates are unique starting points for building pages.  They complicate using a CMS because generally they aren’t designed so that you can go from one to another easily.  Developers love to create new templates, while CMS users hate them.  Try to refrain.
</li>
<li><strong>No JS required</strong>. Using JS for basic layout is wasteful. We need JS to do other important things, thus we need to solve layout problems with CSS.</li>
</ul>
<h3>Redefining the template</h3>
<p>Traditionally, a new template is created for each page type.  Separate templates might be defined for one column, two column, and three column layouts, as well as home pages, main product pages, etc.  Grids allow you to base all of these pages on the same template, which might include only the basic frame, header, body and footer.  The template stays simple because grids allow you to break up any one of these regions into convenient units of content.  You should then include a “save as a template” option.  Your users can then define templates as they build pages in your CMS, saving at convenient points from which they can build pages.  Having a common starting point, or one single base template will mean that users can undo any choice they’ve made. </p>
<p>More about templates in another article.</p>
<h3>Grids solutions </h3>
<p>So now that you know a bit more about how to choose a grids solution, go check out these frameworks to find the one that will work for you:</p>
<div class="data">
<table>
<tr>
<th></th>
<th>nest</th>
<th>Size (kb)</th>
<th>fixed or liquid</th>
<th>columns</th>
<th>units</th>
<th>License</th>
<th>gutter</th>
</tr>
<tr>
<th><a href="http://www.blueprintcss.org/">Blueprint</a></th>
<td>No</td>
<td align=right>7.2</td>
<td>fixed</td>
<td align=right>24</td>
<td>30px</td>
<td>GPL</td>
<td>10px</td>
</tr>
<tr>
<th><a href="http://960.gs/">960s</a></th>
<td>No</td>
<td align=right>5.4</td>
<td>fixed</td>
<td>12 &amp; 16</td>
<td>40 &amp; 60px</td>
<td>GPL</td>
<td>20px</td>
</tr>
<tr>
<th><a href="http://developer.yahoo.com/yui/grids/">YUI2</a></th>
<td>No</td>
<td align=right>2.8</td>
<td>liquid</td>
<td>1 to 3</td>
<td>1/2 1/3</td>
<td>BSD</td>
<td>1-4%</td>
</tr>
<tr>
<th><a href="https://github.com/stubbornella/oocss/wiki/Grids">OOCSS</a></th>
<td>Yes</td>
<td align=right>0.7</td>
<td>liquid</td>
<td>1 to 5</td>
<td>1/2 1/3 1/4 1/5</td>
<td>BSD</td>
<td>0px</td>
</tr>
<tr>
<th><a href="http://developer.yahoo.com/yui/3/cssgrids/">YUI3</a></th>
<td>Yes</td>
<td align=right>1.5</td>
<td>liquid</td>
<td>1 to 24</td>
<td>1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/12 1/24 </td>
<td>BSD</td>
<td>10px*</td>
</tr>
</table>
</div>
<p>* YUI3 requires an extra sub-node wrapper for the gutter.</p>
<p>Any other grids frameworks I should have included? </p>
<p class="note">Note: I wrote most of this article years ago, but never got around to publishing it because it wasn&#8217;t &#8220;perfect&#8221;. (Oh how annoying it can be to be me). If you notice anything out-of-date, please do bring it to my attention.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2011/01/22/grids-improve-site-performance/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>The hacktastic zoom fix</title>
		<link>http://www.stubbornella.org/content/2010/12/09/the-hacktastic-zoom-fix/</link>
		<comments>http://www.stubbornella.org/content/2010/12/09/the-hacktastic-zoom-fix/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 09:58:38 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[oocss]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=726</guid>
		<description><![CDATA[Everyone keeps asking me what is with all the "x" in the OOCSS grids... so I finally wrote an article. The short answer is that it isn't just a clearfix (it does that too), but it also causes the element to stretch wide, even when it has very little content. It is a bit of magic that allows us to use display table-cell to create a new formatting context in all browsers. It also allows us to solve sub-pixel rounding errors without resorting to fixed widths. (This has all kinds of great perf benefits because the grids are nestable and stackable).

<pre>
  content:" x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x ";
}
</pre>]]></description>
			<content:encoded><![CDATA[<p>Everyone keeps asking me what is with all the &#8220;x&#8221; in the OOCSS grids&#8230; so I finally wrote an article. The short answer is that it isn&#8217;t just a clearfix (it does that too), but it also causes the element to stretch wide, even when it has very little content. It is a bit of magic that allows us to use display table-cell to create a new formatting context in all browsers. It also allows us to solve sub-pixel rounding errors without resorting to fixed widths. (This has all kinds of great perf benefits because the grids are nestable and stackable).</p>
<pre>
  content:" x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x ";
}
</pre>
<p>I wrote a while back about <a href="http://www.stubbornella.org/content/2009/07/23/overflow-a-secret-benefit/">creating new formatting contexts</a> with <code>overflow: hidden</code>. A new formatting context is desirable because it tells an element not to wrap around nearby floats, and to clear any floats it contains. Essentially a new formatting context makes an element behave like a column. Anyone who has tried to create a grids system or multi-column layout knows that that is no easy feat. </p>
<h3>Zoom Baby</h3>
<p>This is one case where Internet Explorer gets it right. Zoom triggers hasLayout, which creates a new formatting context, clears floats, and prevents float wrapping with none of the drawbacks of the standard solutions.</p>
<pre>
.lastUnit{
  zoom:1;
}
</pre>
<p>I wish we had a simple property value pair that would do the same thing in standards-based browsers. </p>
<pre>
.lastUnit {
  formatting-context: new; /* please! */
}
</pre>
<p>There are several ways of achieving the same thing in Safari, Firefox, Chrome, and Opera, but they each have drawbacks. For example:</p>
<h3>Overflow Hidden Hides Stuff</h3>
<p>Overflow hidden creates a new formatting context with very few side effects, and for many websites, it will still be the right answer, however it does have one major drawback. If any content within the element overflows its boundaries, it will be cropped. Normally, if you don’t specify a height (you shouldn’t need to), the element grows to the size of it’s content. </p>
<pre>
 .lastUnit {
  overflow: hidden;
}
</pre>
<p>However, on a complex site like facebook (and most applications), popovers, fancy buttons, and menus were cropped off because they were outside of the normal document flow and didn’t influence the height of the parent node. This forced me to look for another solution. </p>
<h3>Table Cells Create a New Formatting Context</h3>
<p>In the specification, several property value pairs create a <a href="http://www.w3.org/TR/CSS2/visuren.html#block-formatting">new formatting context</a> including; <code>overflow</code> (other than visible), <code>table-cell</code>, <code>inline-block</code>, and <code>float</code>. I set out to try them all. Other variations of overflow triggered a scroll bar that didn’t make me happy, and one of them (sorry, it was a year ago, I can’t remember) caused issues in RTL.</p>
<p>I began to test <code>display: table-cell</code>. I used the <a href="http://oocss.org/grids_all.html">OOCSS grids test page</a> in which each grid contains a heading and a paragraph filled with lorem ipsum text. To my astonishment, display table cell worked. </p>
<pre>
.lastUnit {
  display: table-cell;
}
</pre>
<p>The HTML of the last unit.</p>
<pre>
&lt;div class=&quot;unit size1of5 lastUnit&quot;&gt;
  &lt;h3&gt;1/5&lt;/h3&gt;
  &lt;p&gt;i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i &lt;/p&gt;
&lt;/div&gt;
</pre>
<p>I was very pleased with myself, until I looked at <a href="http://oocss.org/mod.html">the modules page</a>. All of the modules in the last column were shrink-wrapped to the text. I began to explore what was different about my working grids and my broken modules. You can see the same issue on the facebook comments page. Notice how the comment box is far too narrow.</p>
<div id="attachment_733" class="wp-caption alignnone" style="width: 479px"><a href="http://www.stubbornella.org/content/wp-content/uploads/2010/12/table-cell-not-expanded.png"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/12/table-cell-not-expanded.png" alt=" " title="Comment box should be full width, but display table cell is shrink wrapping content." width="469" height="321" class="size-full wp-image-733" /></a><p class="wp-caption-text">Comment box should be full width, but display table cell is shrink wrapping content.</p></div>
<p>I discovered that display table cell shrinks or grows to fit the content (much like a floated element). On my <a href="http://oocss.org/grids.html">grids test page</a>, the lorem ipsum dummy text was actually pushing the last column open to take all the remaining space on the line. I was getting the behavior I wanted, but it was triggered by the content, which is unacceptable for OOCSS, because OOCSS requires a strict separation of container and content. I couldn’t require text in the grids, in fact, I have no idea how people will use them.</p>
<h3>Generated Content FTW</h3>
<p>I realized that generated content was the only way to insert this text without requiring developers to muck up their HTML. As a bonus, generated content is not a part of the DOM, so it should be ignored by screen readers.  I took a look at the specification and used the YUI clearfix implementation as a starting point for my solution (This is where things get a little bit crazy). My column, <code>lastUnit</code>, is still set to display <code>table-cell</code>, but we also add the following code:</p>
<pre>
.lastUnit {
  display: table-cell;
}
.lastUnit:after {
  clear: both;
  display: block;
  visibility: hidden;
  overflow: hidden;
  height: 0 !important;
  line-height: 0;
  font-size: xx-large;
  content: " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ";
}
</pre>
<p>Crazy, right? So let me show you what I’m doing here.</p>
<h3>Understanding the Code</h3>
<p>First, open the <a href="https://github.com/stubbornella/oocss/blob/master/core/module/mod_doc.html">module test page in Firefox with Firebug enabled</a>. The modules are inside thirds grids, which use the technique. Change visibility so that you can see how it works.</p>
<pre>visibility: visible;</pre>
<p>The generated text pushes my lastUnit open in much the same way the lorem ipsum dummy text did in the grids test page. They convince the browser that this element needs all of the space left after the width of floated siblings has been calculated. </p>
<p>Lets go through it piece by piece:</p>
<pre>
.lastUnit {
  zoom: 1;
  display: table-cell;
}
</pre>
<p>First, we create a new formatting context so that floats are not wrapped, margins do not collapse, etc. Display table cell is not well supported in older versions of IE, but it doesn&#8217;t matter because zoom does the trick. None of the rest of the code applies to IE.</p>
<pre>
.lastUnit:after {
</pre>
<p>We&#8217;re using the <code>:after</code> pseudo class so we can insert generated content (text) as the last node inside the <code>lastUnit</code>.</p>
<pre>
  clear: both;
</pre>
<p>Makes the generated content clear any non-generated sibling elements.</p>
<pre>
  display: block;
</pre>
<p>We want the element to expand to the full width.</p>
<pre>
  visibility: hidden;
</pre>
<p>Makes the generated content invisible and allows clicks and interaction with any content that might be below.</p>
<pre>
  overflow: hidden;
</pre>
<p>Makes sure height is respected by the browser, even in browsers that expand containers (an IE bug).</p>
<pre>
  height:0 !important;
</pre>
<p>We don’t want generated content changing the layout.</p>
<pre>
  line-height: 0;
</pre>
<p>Again, generated content shouldn’t change the layout. We&#8217;re covering all our bases.</p>
<pre>
  font-size: xx-large;
</pre>
<p>Large text means we’ll need less generated content.</p>
<pre>
  content:" x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x ";
}
</pre>
<p>The faux text does the heavy lifting by opening to full width the element which is in display table-cell.</p>
<h3>Finally, An Opera Bug</h3>
<p>Someone on the google group <a href="http://groups.google.com/group/object-oriented-css/browse_thread/thread/dddb6e5896cfdd00/195f149dcd05bf17?lnk=gst&#038;q=opera+.+.+.+bug#195f149dcd05bf17">noticed that Opera was choking on this method</a>. It seems that Opera cannot wrap a series of “. . .” as if it were normal text (a bug report was submitted, so this may have been corrected already). Simply changing all of the dots to “x” resolved the issue. Any text will work, Easter egg anyone?<br />
We changed that line to:</p>
<pre>
content:" x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x ";
</pre>
<h3>Drawbacks</h3>
<p>Table-cells interact with each other in weird ways. Unlike other elements, which only interact with siblings and parent nodes when they change dimensions, table cells are weird and hard to calculate because the browser does a lot of fudging to make them line up and layout nicely. This
<link to my perf article>fudging has proven to be expensive, so I do wonder about the performance impacts of this approach. Perhaps it is possible to set the display to fixed as Jenny Han Donnelly of YUI suggested &#8212; something to test another day.<br />
Generally I avoid table cell whenever possible, but in this case I had tried all of the other methods for generating a new formatting context. Ultimately, browser vendors should allow a trigger that doesn’t have side effects.</p>
<h3>Avoiding Pseudo-Bugs</h3>
<p>It might be tempting to try to position our last column without creating a new formatting context, for instance, modern browsers are much better at calculating percentage widths. OTOH, zoom creates a new formatting context for IE and it is important to keep the flow as similar as possible across browsers to avoid unintended consequences. </p>
<p>It’s all about working with CSS rather than against it. That means that if you have a new formatting context in one browser you should have it in all of them.
</link>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2010/12/09/the-hacktastic-zoom-fix/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>Congratulations Justin &amp; Kelly</title>
		<link>http://www.stubbornella.org/content/2010/12/07/congratulations-justin-kelly/</link>
		<comments>http://www.stubbornella.org/content/2010/12/07/congratulations-justin-kelly/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 17:49:58 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[Family & Friends]]></category>
		<category><![CDATA[Friends]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[love]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=713</guid>
		<description><![CDATA[Two of my dear friends just got married and their ceremony was as beautiful as it was fun. (of course you should replace the rehearsal dinner with a retro party!) ;)

<a href="http://www.erinleppo.com/"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/11/75709_468892729520_302084419520_5284157_5024944_n.jpg" alt="" title="75709_468892729520_302084419520_5284157_5024944_n" width="484"  class="alignnone size-full wp-image-714" /></a>

They had a quote on their site which really struck me and made me feel lucky to have my friends.

<blockquote>
<p>Oh, the comfort - the inexpressible comfort of feeling safe with a person - having neither to weigh thoughts nor measure words, but pouring them all right out, just as they are, chaff and grain together; certain that a faithful hand will take and sift them, keep what is worth keeping, and then with the breath of kindness blow the rest away.</p>
 <cite>~Dinah Craik, A Life for a Life, 1859</cite>
</blockquote>]]></description>
			<content:encoded><![CDATA[<p>Two of my dear friends just got married and their ceremony was as beautiful as it was fun. (of course you should replace the rehearsal dinner with a retro party!) <img src='http://www.stubbornella.org/content/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>They had a quote on their site which really struck me and made me feel lucky to have my friends.</p>
<blockquote>
<p>Oh, the comfort &#8211; the inexpressible comfort of feeling safe with a person &#8211; having neither to weigh thoughts nor measure words, but pouring them all right out, just as they are, chaff and grain together; certain that a faithful hand will take and sift them, keep what is worth keeping, and then with the breath of kindness blow the rest away.</p>
<p> <cite>~Dinah Craik, A Life for a Life, 1859</cite>
</p></blockquote>
<p><a href="http://www.erinleppo.com/"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/11/75709_468892729520_302084419520_5284157_5024944_n.jpg" alt="" title="75709_468892729520_302084419520_5284157_5024944_n" width="670"  class="alignnone size-full wp-image-714" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2010/12/07/congratulations-justin-kelly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Woman in technology</title>
		<link>http://www.stubbornella.org/content/2010/07/26/woman-in-technology/</link>
		<comments>http://www.stubbornella.org/content/2010/07/26/woman-in-technology/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 04:43:34 +0000</pubDate>
		<dc:creator>Nicole Sullivan</dc:creator>
				<category><![CDATA[Geek]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[grrlgeek]]></category>

		<guid isPermaLink="false">http://www.stubbornella.org/content/?p=641</guid>
		<description><![CDATA[Usually I avoid topics like women in technology because (1) it is a can of worms, and (2) I can really only speak for myself. For the most part, I'd rather be seen as a person in technology than a woman, but this weekend the twitterverse erupted with opinions about <a href="http://jsconf.eu/2010/google_jsconfeu_2010_conferenc.html">Google sponsoring female students to attend JSConf</a>. As a woman who is often the only-woman-in-the-room, I want people to know it isn't always easy. I was a bit shocked by the blatant failure to empathize.

After conducting a <a href="http://web.mit.edu/fnl/women/women.html">thorough study on the status of female researchers at MIT</a>. The Dean said: 

<blockquote>The heart and soul of discrimination, the last refuge of the bigot, is to say that those who are discriminated against deserve it because they are less good.
<cite>Dean Robert J. Birgeneau, Dean of Science at MIT</cite>
</blockquote>

He says it beautifully. Discrimination now rarely takes the form of some guy saying "hey little lady, shouldn't you let a man handle that?" It is much more subtle, but just as ugly. These days, bright, thoughtful, enlightened people assume that the absence of women in certain fields results from women being unable to compete on merit. The assumption that, if someone creates a scholarship for women, it is because otherwise, women can't hack it. 

I would argue that <a href="https://twitter.com/#list/stubbornella/grrlgeeks">there are female developers who are just as good as men</a>, if not better, but despite that, they are less likely to stay in school, stick with engineering jobs, speak at or even attend conferences, and be recognized for their contributions. The problem compounds itself as women see no role-models for how to be a woman in this field, and only the very thick-skinned manage to stay in engineering and web development. 

<h3>Why is computer science a sausage fest?</h3>

<strong> I believe CS and Web Development currently select for certain masculine qualities that are largely unrelated to someone's prowess as a coder</strong>. ]]></description>
			<content:encoded><![CDATA[<p>Usually I avoid topics like women in technology because (1) it is a can of worms, and (2) I can really only speak for myself. For the most part, I&#8217;d rather be seen as a person in technology than a woman, but this weekend the twitterverse erupted with opinions about <a href="http://jsconf.eu/2010/google_jsconfeu_2010_conferenc.html">Google sponsoring female students to attend JSConf</a>. As a woman who is often the only-woman-in-the-room, I want people to know it isn&#8217;t always easy. I was a bit shocked by the blatant failure to empathize.</p>
<p>On the Big Web Show, <a href="http://5by5.tv/bigwebshow/11">I talked about being a women in a male dominated field (min 7:12)</a>. &#8220;I was a carpenter before I got into web stuff, so you guys can&#8217;t really compete with the carpenters, no matter how unruly you get.&#8221; </p>
<p>That is true, but a simplification. Zeldman threw me a chance to speak openly about being a woman in technology, and out of nervousness, I punted. Perhaps I was also afraid to sound strident? Anyway, I&#8217;m going to share some of the things that have happened to me, in hopes that it helps people realize that I was lucky to be <em>successful and a woman</em>. I mean, just take a look at the <a href="http://www.forbes.com/2010/07/19/fastest-growing-jobs-women-leadership-forbeswoman-work_slide_2.html">fastest growing careers for women</a>. We are veterinary technicians not veterinarians, dental assistants not dentists, medical assistants not doctors. We like to believe we have evolved, but the data speaks to something else. Being a home heath aide is dirty work with bad hours and heavy lifting &#8212; but it is a career women can imagine, whereas, right now, they clearly can&#8217;t imagine themselves coding. I want to understand why not&#8230;</p>
<p>After conducting a <a href="http://web.mit.edu/fnl/women/women.html">thorough study on the status of female researchers at MIT</a>. The Dean said: </p>
<blockquote><p>The heart and soul of discrimination, the last refuge of the bigot, is to say that those who are discriminated against deserve it because they are less good.<br />
<cite>Dean Robert J. Birgeneau, Dean of Science at MIT</cite>
</p></blockquote>
<p>He says it beautifully. Discrimination now rarely takes the form of some guy saying &#8220;hey little lady, shouldn&#8217;t you let a man handle that?&#8221; It is much more subtle, but just as ugly. These days, bright, thoughtful, enlightened people assume that the absence of women in certain fields results from women being unable to compete on merit. The assumption that, if someone creates a scholarship for women, it is because otherwise, women can&#8217;t hack it. </p>
<p>I would argue that <a href="https://twitter.com/#list/stubbornella/grrlgeeks">there are female developers who are just as good as men</a>, if not better, but despite that, they are less likely to stay in school, stick with engineering jobs, speak at or even attend conferences, and be recognized for their contributions. The problem compounds itself as women see no role-models for how to be a woman in this field, and only the very thick-skinned manage to stay in engineering and web development. </p>
<h3>Why is computer science a sausage fest?</h3>
<p><strong> I believe CS and Web Development currently select for certain masculine qualities that are largely unrelated to someone&#8217;s prowess as a coder</strong>. I believe it is these tangential <em>code-cowboy</em> qualities women are unable or unwilling to emulate, and <strong>not</strong> their skill or capacity for abstraction, problem solving, creative thinking, or communication &#8212; All of which actually make them better developers. In fairness, I think a lot of men would rather not live like code-cowboys, but the unspoken judgement is adapt-or-you-must-not-be-smart-enough-for-CS. The vibe is a competitive rather than collaborative, and leaves many women feeling invisible.</p>
<h3>Affirmative action</h3>
<blockquote class="callout"><p>People mistakenly assume that affirmative action is about granting minorities undeserved privileges. In it&#8217;s purist form, affirmative action is about allowing minorities natural talents to flourish by removing artificial, unfair barriers and decoupling the true skills required to succeed in a profession from the cultural baggage that builds naturally within an insular community.</p></blockquote>
<p>If we separate the criteria that makes someone a code-cowboy from the criteria that makes them a solid developer, I think we would find that <strong>women can and do compete despite significant discrimination</strong>. Scholarships like the one Google proposes aren&#8217;t meant to give women of lower merit something they don&#8217;t deserve, they are meant to circumvent the discrimination that extremely talented women still face. If you assume that a scholarship for women exists because women are inherently inferior, rather than because they are simply underrepresented, it might be time to soul-search and ask yourself if there is a bigot inside. </p>
<h3>I (don&#8217;t) wanna be a cowboy, baby</h3>
<div class="line">
<div class="unit size1of2">
<h4>The code cowboy</h4>
<ul class="basicList">
<li>Stays up all night recoding the entire code base, documents nothing, and forbids anyone to touch it because they aren&#8217;t good enough to understand his level of code.</li>
<li>Refuses meetings, chats, or any other form of communication.</li>
<li>Cares more about being perceived as the brilliant-uber-genius than he does about his team working well together.</li>
<li>Gets into silly pissing contests which boil down to &#8220;hehe, my brain is bigger than yours&#8221;.</li>
<li>Finds complex solutions to problems, thus proving his brilliance.</li>
<li>Makes a lot of mistakes due to lack of sleep, overcaffination, and ego &#8212; but thank god he is around to save the day when the bug is discovered.</li>
<li>Is fairly certain clients, PMs, designers, and really anyone he has to deal with on a daily basis is at least three standard deviations below his IQ.</li>
<li>Jumps to say &#8220;me, me, me!&#8221; when credit or rewards for accomplishments are offered.</li>
<li>Jumps to say &#8220;me, me, me!&#8221; when opportunities to attend or speak at conferences arise.</li>
</ul></div>
<div class="unit size1of2 lastUnit">
<h4>The good developer</h4>
<ul class="basicList">
<li>Digs the fact that he is making products <em>for people</em>. Likes people and enjoys communicating with them and understanding how they think. Can put him or herself in other people&#8217;s shoes and reliably imagine how they might react to different parts of the UI.</li>
<li>An excellent problem solver who takes into account all aspects of a challenge when designing a solution  &#8211; including human elements like maintainability and usability.</li>
<li>Shares credit with the entire team or entire internets. Recognizes that no solution evolves in a vacuum. </li>
<li>Applies consistent effort and recognizes that working in a way that promotes long term productivity will yield better results.</li>
<li>Respects the members of his team, including those who aren&#8217;t engineers.</li>
<li>Manages projects so they don&#8217;t require super human feats of sleeplessness to meet deadlines.</li>
<li>Has a life outside of work, other interests, friends, and family &#8212; they love code, but they love lots of other things too. If you don&#8217;t understand how this makes them a better developer, see item #1.</li>
<li>Amazing capacity for abstraction and creative thinking.</li>
</ul></div>
</div>
<h3>The Twit-storm</h3>
<p>Women may be less likely to be a code-cowboy, but they can be amazing developers. We are not trying to give anything to anyone that doesn&#8217;t deserve it, but instead, to counteract the subtle prejudices that leave women feeling invisible, excluded, and unrecognized for their accomplishments. Now, with that in mind, let&#8217;s look at the twit-storm I found after leaving a seven hour mediation session on Saturday. I&#8217;ll put my comments inline since I was unavailable to tweet that day.</p>
<h4>The doofus that started it all:</h4>
<blockquote><p>RT @googlestudents Google grants for female computer scientists to attend JSConf 2010 // this is disgusting.. i hope there is one for guys.<br />
<cite><a href="https://twitter.com/fringley/status/19436886858">fringley</a></cite>
</p></blockquote>
<p>This stinks of jealousy. Why not be happy for the female students? Why rain on someone else&#8217;s parade? Something good happening to someone else seems to disgust fringley. Frankly, it comes off as childish.</p>
<p>Moving on&#8230; this is when the storm began to brew.</p>
<p><a href="http://twitter.com/voodootikigod/status/19439473801"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/2.png" alt="hProof that no good deed goes unstoned http://j.mp/c37Dev what a d-bag #jsconf" title="voodootikigod 2" width="400" height="67" class="alignnone size-full wp-image-642" /></a></p>
<p>Voodootikigod has the longest twitter name in the universe, and he makes a good point, we should remember that Google has good intentions and perhaps not be quite so disgusted. Fringley, I&#8217;m talking to you.</p>
<h4>Special treatment for women with no merit?</h4>
<p><a href="http://twitter.com/jdalton/status/19443182071"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/3.png" alt="@voodootikigod maybe they think that giving special treatmeant to someone based on sex, color, age, ect instead of merit/randomness is wrong" title="jdalton 3" width="400" height="98" class="alignnone size-full wp-image-643" /></a></p>
<p>Jdalton makes a good point. No one wants to feel like they got where they are because of what is in their pants. On the other hand, he assumes those women didn&#8217;t deserve to be sent to JSConf. Why should he assume that? In fact, the website says quite the opposite, the women must &#8220;have a strong academic background with demonstrated leadership ability.&#8221;</p>
<p>I resent the notion that women are inferior and that is why they are getting grants. Google is correcting for women being less likely to stand up and say &#8220;me, me, me!&#8221;, not for their technical skills or development prowess.</p>
<p>Thinking that I got where I am because I&#8217;m a woman and got special treatment (rather than on my own merit) is a painful and insidious form of discrimination. You have to be thick skinned to make it in a field where this kind of thing happens frequently. YES. It happens frequently.</p>
<p>What I&#8217;m trying to say is that women face a special challenge in tech because their male counterparts, when feeling jealous, will tend to pin female geek&#8217;s success on their gender. We face another problem, when we begin to wonder ourselves, and doubt our own abilities. This is the last refuge of the bigot indeed.</p>
<h4>How can we attract more women to the field?</h4>
<p><a href="http://twitter.com/voodootikigod/status/19444500405"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/4.png" alt="@jdalton would love to hear a better way to increase diversity so conversely the CS profession is not dominated by a single gender?" title="voodootikigod" width="400" height="83" class="alignnone size-full wp-image-644" /></a></p>
<p>Yay! I like what voodootikigod says here. I saw Maria Klawe speak at Yahoo! about &#8220;Gender, Lies and Video Games: the Truth about Females and Computing&#8221;. She said that CS is the only science where the participation of women is getting worse not better. We have a problem. We&#8217;re geeks (supposed to be good at problem solving). So let&#8217;s figure it out!</p>
<p>I think we should look at:</p>
<ul class="basicList">
<li>Video games are largely made by and for men. We need to be willing to rethink the genre completely, bust things wide open to make video games appeal more to girls.</li>
<li>CS education works best for people who already know how to code before they begin. CS teaches the theory behind a practice in which they assume you already have some skill. Women are less likely to already know, because they don&#8217;t play video games as much. In addition, code-cowboys among their classmates are likely to judge them harshly for being a beginner. Are psychology majors expected to already know how to psychoanalyze patients before their first semester?</li>
<li>CS education also focuses a lot of effort on puzzles and very abstract concepts when practical applications where you can see the why and how might work better for women (and a hell of a lot of men). I like yummy algorithms, but we could make CS education more accessible by putting them in context.</li>
<li>Women are less likely to jump up and say &#8220;me! me! me!&#8221; They are far more likely to wait to be asked to participate. <strong>We don&#8217;t need women to be different than they are, we just need to invite them in a way that works</strong>. Hell, I spent 8 years coding CSS before I ever spoke about it to anyone. The first time I spoke at a conference, John Allsopp contacted me to ask if I would do it. I never would have submitted a proposal. You might say that I should have, but I would counter that I shouldn&#8217;t need to act like a dude to get respect.</li>
<li>Women don&#8217;t have female role models. Now, I don&#8217;t mean that we need to have deep tear-filled conversations about the perils-of-being-women-in-technology. I would like to talk to geek women about geeky stuff, not about being a woman.</li>
<li>At <a href="http://en.oreilly.com/velocity2010">Velocity Conference</a> this year, they had a girl-geek lunch. It was awesome! Just a note, they also had tons of women speakers and lots of female attendees. For a deep-geek conference, I was very impressed. <strong>Actively seeking female speakers does not mean accepting lower caliber. It means accepting that women might not submit proposals, but they might agree to speak if you ask them nicely. They might not be *famous*, but they may well be amazing innovators, skilled at what they do.</strong></li>
<li>Could we do something like MIT did? They commisioned a giant study, measured <strong>everything</strong>, and found that <a href="http://web.mit.edu/fnl/women/women.html">women were in fact being discriminated against</a>. Their offices were smaller and had fewer windows, their pensions unpaid, they had unequal access to MIT resources. The study painted a grim picture, but then, with true MIT efficiency, they then set out to correct it. Well worth a read, especially if you think we are all just being sensitive. For the record, the ones that stay in the field are absolutely *not* being sensitive. <img src='http://www.stubbornella.org/content/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li>Recognize the need for work-life balance. Most women still have primary responsibility for children and home. Women need to be equals at home first, but perhaps companies can make it easier for them to get access to awesome childcare and flex time.</li>
<li>We need affirmative action to correct the problem. However, other developers need to recognize that the benefits of affirmative action go to <strong>women of merit</strong>. Not just people who happen to have a vagina.</li>
</ul>
<h4>Problem? What problem?</h4>
<p><a href="http://twitter.com/jdalton/status/19447928816"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/5.png" alt="@voodootikigod as long as there are no barriers for them, and I can&#039;t think of one, I don&#039;t see a problem." title="jdalton 5" width="400" height="85" class="alignnone size-full wp-image-645" /></a></p>
<p>Um, dude, if your site was loading in 18 seconds but you couldn&#8217;t think of any reason for it, would you decide you didn&#8217;t have a performance problem? </p>
<h4>My experiences with sexism</h4>
<p>I don&#8217;t usually share this stuff, because I&#8217;m not thinking about it most of the time, but these things happened to me:</p>
<ul class="basicList">
<li>I had a manager tell me I should stop writing code and focus on powerpoint and management, areas he found to be more in line with my talents. Was it because I&#8217;m a woman? I don&#8217;t know, but it does make me wonder how many women get pushed into management too soon, before they&#8217;ve had a chance to prove their technical chops.</li>
<li>At one company, I had to change desks because people kept asking to schedule appointments with a VP who sat nearby. Even after changing, they would walk past two guys to ask me. Someone suggested hanging a sign, &#8220;I&#8217;m not a secretary.&#8221; I was in a new job and I just wanted to fit in and code cool stuff not hang signs announcing things. There were only three women out of hundreds of engineers on my floor.</li>
<li>A guy whose opinions I usually trust said to me that he believes women&#8217;s brains are fundamentally different and that we aren&#8217;t wired to understand code. He then said I&#8217;m an exception because I&#8217;m smart, but I&#8217;m still doing something which is against my nature.</li>
<li>I once had someone tell me:<br />
<blockquote><p>That guy only wants to work with you because he wants to sleep with you. None of your ideas are that interesting, I&#8217;m just saying, don&#8217;t get mad, it is the only possible explanation.</p></blockquote>
<p>Ow. I might never get over that one. It still stings a year later. I don&#8217;t want special privileges, but on the other hand, it is easy to see how I&#8217;m facing a special kind of discrimination that probably wouldn&#8217;t happen to a man. No one is going to assume that a man is on stage because he looks good in a skirt.</p>
<p>Did the guy want to sleep with me? Maybe, we&#8217;re human and those sorts of things can come up. It isn&#8217;t a big deal. What bothers me is the notion that if he wants to sleep with me, he is completely incapable of evaluating the merit of my ideas. Thus, even if I am granted the privilege of working with him, it says nothing about my skill, intelligence, or capacity for original thought. It is all about my sexuality. </li>
<li>All the ridiculous, but potent, self-doubt that goes along with being a woman-in-tech. I really am my own worst enemy. Maria Klawe calls it &#8220;impostor syndrome&#8221;.</li>
<li>A client asked to have a male coworker on a call with me, though he was several years my junior.</li>
<li>I was asked to speak at a conference. A guy whose talk was rejected said &#8220;you&#8217;re so famous, I wish I was a hot girl.&#8221;</li>
</ul>
<h4>Where have all the women gone?</h4>
<p><a href="http://twitter.com/rmurphey/status/19448234683"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/6.png" alt="@jdalton having to like dick jokes, having no peers, having ppl make sexist jokes &amp; grope you .. definitely not barriers, nope." title="rmurphy 6" width="400" height="82" class="alignnone size-full wp-image-646" /></a></p>
<p>I&#8217;m so sorry that rmurphey went through these things, and I&#8217;m very glad she stayed in the field because we are all better for it.</p>
<p>Maria Klawe also said that even the best women in a CS program are far more likely to drop out than the worst guys. When asked how they think they compare, these women consistently rank themselves far below their actual skill level. This means women aren&#8217;t good at judging their actual skill level or comparing themselves to others. They need mentors and a leg up, to help them do it. Women are also less likely to pester their boss until she finally relents to send them to a conference. Again, we need to <strong>actively invite talented women</strong>. </p>
<p>When Harvey Mudd changed their CS program admission criteria to accept a broader range of people, and stop selecting for the socially-challenged-uber-nerd, they found that <em>everyone&#8217;s grades improved</em>. It benefits everyone to have a diverse group of people in our field.</p>
<p><a href="http://twitter.com/jdalton/status/19448459421"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/7.png" alt="@rmurphey last time I checked right click view source didn&#039;t ask your gender." title="jdalton" width="400" height="68" class="alignnone size-full wp-image-647" /></a></p>
<p>Jdalton, you had made some good points, but at this point I&#8217;m less impressed. Are you really claiming that gender discrimination doesn&#8217;t happen? What we have here is a complete failure to empathize. </p>
<p><a href="http://twitter.com/rmurphey/status/19448554524"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/8.png" alt="@jdalton and your point is? my point is: attending &amp; fully enjoying a conf as a woman is weird &amp; i don’t blame some for needing incentive." title="rmurphy" width="400" height="84" class="alignnone size-full wp-image-648" /></a></p>
<p>And this is part of why it is great to meet Rebecca and other girl geeks. It is tiring to feel weird and stand out all the time. Ultimately, what we want is to stand out for the quality of our work. In order to do that, we need to eliminate some of the obvious gender inequities and find ways to rebalance the flow of new engineers. I believe this will make our products better, our work life better, and our conferences better. We have to be willing to really change things to make CS fit women better&#8230; it shouldn&#8217;t only be the women we are trying to change.</p>
<p><a href="http://twitter.com/getify/status/19448781158"><img src="http://www.stubbornella.org/content/wp-content/uploads/2010/07/9.png" alt=".@rmurphey women like you @stubbornella &amp; @amyhoy are well respected in the dev community. is respect not enough for acceptance?" title="getify" width="400" height="111" class="alignnone size-full wp-image-649" /></a></p>
<p>Getify, it sure helps, but it is only one small piece of a larger puzzle. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.stubbornella.org/content/2010/07/26/woman-in-technology/feed/</wfw:commentRss>
		<slash:comments>205</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.stubbornella.org @ 2012-02-03 19:39:16 -->
