<?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>Brad Czerniak | Blog</title>
  <atom:link href="http://bradczerniak.com/rss/blog/" rel="self" type="application/rss+xml" />
  <link>http://bradczerniak.com/rss/blog/index.xml</link>
  <description>Brad Czerniak is a web business problem-solver.</description>
  <lastBuildDate>Sun, 01 Dec 2024 19:24:31 UTC</lastBuildDate>
  <language>en</language>
  <sy:updatePeriod>hourly</sy:updatePeriod>
  <sy:updateFrequency>1</sy:updateFrequency>
  <generator>[Jekyll](https://github.com/mojombo/jekyll)</generator>
  
    <item>
      <title>My productivity system</title>
      <link>http://bradczerniak.com/blog/my-productivity-system/</link>
      <pubDate>Sat, 03 Aug 2024 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Businessl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/my-productivity-system/</guid>
      <description><![CDATA[Steal this content! Everything on this site is under a CC0 license, so you
can copy/paste this without guilt.

Right off the bat I think it’s worth emphasizing: this system works for me.
I’ve tried a bunch of different systems like GTD,
pomodoro, online checklist tools like Google Keep, and others, and landed on this
system for myself. I’m sharing it because maybe it will be helpful for you, but I’m
going to write it as what I do and how it works for me. If you try it there’s a
solid chance you’ll have to change it to work for you.


    
      
        
        
        
          
        
        
      
      
        
      
    
    
      This is not some revolutionary new program and I did not invent it. It is just the flavor of checklist I enjoy most.
    
  

Should you listen to me? Am I particularly successful or productive? Perhaps not.
But I am a regular dude who gets stuff done juggling work, side work, more side work,
family, friends, household tasks, personal care, creative pursuits and hobbies, and the
occasional leisure. I’d be able to do a lot of it without my system, but am confident I
get more done with it than without it.

The format

This is the simple part: it’s an index card. One index card for each week.


  At the top is the week in the format “Week of 2024-07-29”, where the date is the Monday
  Rows of 5 checkboxes (for each weekday) for daily tasks. It could be 7 boxes, but I like to not be accountable for things on the weekend
  Rows that start with a single checkbox, each something I’ve committed to doing eventually


So yes, it’s a checklist with a label. It seems like a pretty obvious system
because that’s what it is.

I like an index card because it doesn’t take up much space on my desk. I like
an index card because, unlike a planner or journal it doesn’t have all the baggage
of previous weeks, nor the threat of unknown coming weeks. It just is.

An index card is also tangible and in-your-face. In combination with the rules,
that means I can’t just write out a checklist like I can in some cloud software
and then have it be out-of-sight and out-of-mind. I’m practically forced to engage
with my list and continue it from week to week.

Mise en place

On Sunday night if I’m on top of things or think I’ll be extra busy in the coming week,
or Monday morning if I try to break away for my desk for the weekend, I grab a blank
index card (never the back side of a previous week’s card) and put the previous week’s
card next to it.

I fill out the “Week of…” line and the daily task rows, then put any tasks from the
previous week that remain unchecked after the daily tasks. This is part of “the rules”
(below), and a key part of the system underlying the index cards: the act of having to
transcribe a task to the next week is a nudge to get it done so you don’t have to keep
transcribing it week after week.

After the known tasks I take a peek at my email accounts for anything task-ish there,
plus check my clients’ various and sundry project management systems to see if I’m assigned
anything I forgot to put on the lists. Then I just think about the week and if there’s
anything for myself, my family, my friends, or my home that should get done this week.

Once all the tasks are entered on the new card:


  I put the new card on the front-right corner of my desk and put the pen on top of it. I always know where a pen is, and never have an excuse not to write a new task on the card
  I walk the old card over to a cardboard box in my closet and haphazardly place it there. The old card no longer serves a purpose but might be nice to reminisce about someday


Having a time and place for these routines, these habits is a big part of the system.
It also feels like a ceremony to some extent, like I’m ridding myself of last week and
becoming present in the new one.

Daily tasks

I really like the rows of daily tasks. They are all easy to accomplish, and even if I don’t
accomplish some big task on the list for a day or two I’m still checking things off.
That keeps momentum in the system all the time and probably does something science-y to
my neurotransmitters. These are the daily tasks that have been sticky for years now:


  Morning routine
  Morning constitutional
  Hug wife
  Work out


Morning routine is the easy one. I wake up, check my phone and get caught up on
emails and headlines before getting out of bed, use the bathroom (and always forget
to take Seth Roberts’ self-experimentation
advice and look at my face a while in the morning), get my water and coffee and optional
protein-forward breakfast going, and take my allergy medicine + vitamin D supplement +
multivitamin + lip balm. I do the lip balm last so I remember whether or not I’ve taken
my medicine. Then I make our bed, which isn’t my favorite part of the day but I have checkmarks
to make.

Morning constitutional is kind of a pain. Often I’ll sleep until nearly working hours
and then have to wrangle 10 minutes between meetings to go outside and walk a little bit.
Even if I do get up early, I don’t want to instantly go do stuff, but I chase that checkmark,
darnit! They say there’s a benefit to walking (especially in nature) in the morning. I’ve been
doing daily walks for the better part of a year and can’t say I feel a difference, but
it’s part of my ritual now. It’s kind of wild how many T’s are in the word ‘constitutional’.

Hug wife is also easy. I feel a little self-conscious that I use a productivity system
to remind myself to be affectionate with Shelby, and sometimes feel bad when there’s a busy
day and we don’t have a hug and the checkbox is unchecked, but overall I love hugging my wife
and like checking boxes, too. I’ve chosen to overcome the negative feelings and focus on the
positive.

Work out helps me embrace the un-checked boxes in this world, haha. It’s a rare occasion
that I jog two days in a row much less 5 weekdays, so I don’t think I’ve ever checked all
5 boxes in a given week. Working out is just something I’ve committed to doing. The ambiguity
of “work out” rather than having rows for lifting weights and jogging separately also means
that I can be a little loose about checking the box, and might be able to check off more
boxes if I can convince myself to do a push-up or something.

Timesheets was a daily task when I was self-employed, but I retired it when I took a
permanent full-time job. If you’ve had to submit your billable time to multiple client
time-tracking systems every week and also invoice clients without their own systems, you
know there’s no viable alternative to just staying on top of this boring admin work. Now
that I bill low single-digit hours every week outside of my main gig, time tracking just
isn’t important enough to have a scary line on my card.

The rules

Since this is a system you can make your own, please remember that these are just the rules
for myself at this time, rather than unbreakable laws of productivity:


  This week’s card should be ready before Noon Monday
  If I put something on the card, I’m committed to doing it
  Other people can cancel a task but only rarely can I decide not to do something on the list
  If a task isn’t done by the end of the week, it goes on the next week’s card
  Tasks on the list shouldn’t be fluffy filler like “Go to the bathroom”
  Tasks on the list shouldn’t be ambiguous, massive, or un-checkable
  If something should be on the list, put it on the list
  Check off tasks when a reasonable person would say they’re done
  Sometimes you have to make follow-up items for a task, but don’t try to un-check stuff
  This list is for you


The whole idea of the card and the daily tasks and the rules is to have a single little place
to keep track of what I have to do. It’s a thing that exists in time and space that begs to be
engaged with and has useful and darn-near fun  little boxes on it.

Changes to the rules should make the system more useful or engaging or should reduce the amount
of time required. You can see I’ve already written a lot about this simple system and will be
writing even more paragraphs. At core, though, the system should be quick and simple. I’ve
not had success with systems that have cycles and extra fields and complex prioritization and
reflection/meditation/journaling built in and all that jazz. Sure, meditation could be a daily
task if I decide that’s important to me, but it doesn’t belong baked into my checklist.

Nuances and variations

I think philosophically that a checklist is part of your life in a sort of narrow way, so from
time to time it’s worthwhile to consider what belongs there in the context of rules 5-7.
Some things you write down so they stop bouncing around your head, and these things tend not to belong on the card.
Other things are captured elsewhere even if you engage with them and are accountable for them,
and that’s a category worth considering.

Calendar events

If I have to be somewhere or do something at a particular time/place, I tend to put that on a
calendar that then notifies me on my phone. Since my phone/computer is doing the reminding, it’s
a lot less important for calendar things to be on the card. Sometimes I put important events on
the card, though, especially if it’s a light week otherwise.

Full-time job tasks

My full-time job duties are a series of calendar events and items in a single project-management
system for the most part. All work stuff is on its own computer and walled off from my side work
and personal tasks.

When there’s a task that’s not worth making a JIRA story for but that I intend to do, I’ll sometimes
put it on the card. Sometimes those tasks I’ll put on the back of the card if they’re immediate and
small.

I’ve had full-time contracts lasting around 6 months in the past, and for more than one of those gigs
I’d put all the tasks on the card even if they were redundant to some project management system.
Maybe the difference was that I was still doing those tasks as a business rather than as an employee,
or maybe the difference was that the gig was impermanent (or the client wasn’t very organized lol).
I don’t know for sure why I’ve made different decisions about similar tasks, but that nuance sort
of speaks to how the rules are meant to work for you rather than being ironclad.

Sidebar tasks

For a long while I had a sidebar on each card that contained topics I intended to blog about. Since
the topics were long to write out each week I’d shortened them to initialisms/acronyms like ‘WACI’ for
“What a component isn’t”. And even though the point of transcribing them on the list was to motivate
myself to write the blog posts so I’d be able to stop transcribing them every week, I was too busy to
get to blogging. Transcribing those blog topics ended up feeling like a real bummer and made me not
want to fill out my card for the coming week, so I eventually made a to-do list in Google Keep for
“Someday blog topics” and ditched the sidebar.

That’s not to say that a sidebar will never return or that there aren’t things worth transcribing for
months until they’re done. I try to be mindful of things that drag on the system, though, since I
like to enjoy the index card and checking boxes.

Notes on the back

This is both a useful part about having a scrap of paper on my desk all the time, but also something
to be careful with. If I have to take a quick note it’s great. If it turns out that note has lasting
value for more than a week, though, all of the sudden there’s multiple index cards on my desk. I try
to think of how long my scribbles will be useful beforehand, but the easy solve if I write something
with long-term value on a card is to transcribe it onto a computer somewhere so I can ditch last week’s
card.

The back of a card is a great place for really short-term sub-task lists.

Consistent pen

Writing small with a really fine-tip pen is useful for this system.

I’ve never truly considered getting a really fancy pen, but that’s the kind of thing you could do
if it would motivate you.

I’ve used a super fine-tip Sharpie-brand pen for years now. It bleeds a little more than I’d prefer
for how small I write, but I haven’t spent any time looking for a reliable fine-tip pen that doesn’t
bleed, so I just stick with what’s familiar and consistent.

Colorful cards

They sell packs of index cards in different colors. The colorful cards can be a little harder to read
because the contrast ratio with black ink is lower than with a white card, but as long as the card
isn’t super dark it’s probably not a problem.

One thing that’s kind of fun about a multi-color pack of index cards is that you can look forward to
a few weeks from now when you switch from purple to green. It’s also a bit more noticeable to have a
colorful card on a white desk.

Other markings

Sometimes when there’s a high-priority task that I should do next I circle the checkbox.

Sometimes when I’m making a card for the week and there are tasks that are related to one another I
group them inside a left-side square bracket.

Sometimes when a task is canceled (by a client per rule #3!) I mark it with an x rather than a checkmark.
This helps show the task shouldn’t make it onto next week’s list at a glance. For daily tasks I fail
to do I leave the box blank rather than marking an x, which is kind of arbitrary but it’s my system so whatever.

Daily cards

In 2021 I was really busy with a full-time contract and lot of smaller gigs, and would do a daily version
of the index card system. Considering I ended up having to walk away from that full-time contract,
I’m inclined to think if I’m tempted to do daily cards I have too much going on in my life.

Juggling multiple clients

I’ve found that having a consistent format for work tasks makes it easier to scan the card. Since most
of my clients use JIRA I’ll write something like “MKTG-123 Fix email header” as the card task, and then
I can find all the MKTG tasks at a glance. For clients without useful ticket numbers I’ll kind of fake
it like “PTS LL Refactor tabs templates”, where PTS is the client, LL is the sub-contract, and then a
short description of what I have to do in order to check off that box.

Negative tasks

So far I don’t think I’ve done a daily or other task that’s like “Don’t smoke” or something. It’s kind
of an interesting idea. Would definitely be interested in knowing if it works for somebody.

Make it your own

So that’s my system. If you don’t have a system or the one you’re using now has big disadvantages,
please give this one a try! If you do, please let me know how it goes.

And remember that it’s your system now, so tweak it how you need.
]]></description>
      <content:encoded><![CDATA[<p><strong class="color--third font-size--1p25em">Steal this content! Everything on this site is under a CC0 license, so you
can copy/paste this without guilt.</strong></p>

<p>Right off the bat I think it’s worth emphasizing: this system works for <em>me</em>.
I’ve tried a bunch of different systems like <abbr title="Getting Things Done by David Allen">GTD</abbr>,
pomodoro, online checklist tools like Google Keep, and others, and landed on this
system for myself. I’m sharing it because maybe it will be helpful for you, but I’m
going to write it as what <em>I</em> do and how it works <em>for me</em>. If you try it there’s a
solid chance you’ll have to <strong>change it to work for you</strong>.</p>

<figure class="figure figure--image figure--image--1200x630-example-index-card-jpg ">
    
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/1200x630/example-index-card.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/1200x630/example-index-card.jpg" alt="Example of one of my cards" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/1200x630/example-index-card.jpg" alt="Example of one of my cards" loading="lazy" />
      </noscript>
    
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">This is not some revolutionary new program and I did not invent it. It is just the flavor of checklist I enjoy most.</figcaption>
    
  </figure>

<p>Should you listen to me? Am I particularly successful or productive? Perhaps not.
But I am a regular dude who gets stuff done juggling work, side work, more side work,
family, friends, household tasks, personal care, creative pursuits and hobbies, and the
occasional leisure. I’d be able to do a lot of it without my system, but am confident I
get more done with it than without it.</p>

<h2 id="the-format">The format</h2>

<p>This is the simple part: it’s an index card. One index card for each week.</p>

<ol>
  <li>At the top is the week in the format “Week of 2024-07-29”, where the date is the Monday</li>
  <li>Rows of 5 checkboxes (for each weekday) for daily tasks. It <em>could</em> be 7 boxes, but I like to not be accountable for things on the weekend</li>
  <li>Rows that start with a single checkbox, each something I’ve committed to doing eventually</li>
</ol>

<p>So yes, it’s a checklist with a label. It seems like a pretty obvious system
because that’s what it is.</p>

<p>I like an index card because it doesn’t take up much space on my desk. I like
an index card because, unlike a planner or journal it doesn’t have all the baggage
of previous weeks, nor the threat of unknown coming weeks. It just <em>is</em>.</p>

<p>An index card is also tangible and in-your-face. In combination with the rules,
that means I can’t just write out a checklist like I can in some cloud software
and then have it be out-of-sight and out-of-mind. I’m practically forced to engage
with my list and continue it from week to week.</p>

<h2 id="mise-en-place"><em>Mise en place</em></h2>

<p>On Sunday night if I’m on top of things or think I’ll be extra busy in the coming week,
or Monday morning if I try to break away for my desk for the weekend, I grab a blank
index card (never the back side of a previous week’s card) and put the previous week’s
card next to it.</p>

<p>I fill out the “Week of…” line and the daily task rows, then put any tasks from the
previous week that remain unchecked after the daily tasks. This is part of “the rules”
(below), and a key part of the system underlying the index cards: the act of having to
transcribe a task to the next week is a nudge to get it done so you don’t have to keep
transcribing it week after week.</p>

<p>After the known tasks I take a peek at my email accounts for anything task-ish there,
plus check my clients’ various and sundry project management systems to see if I’m assigned
anything I forgot to put on the lists. Then I just think about the week and if there’s
anything for myself, my family, my friends, or my home that should get done this week.</p>

<p>Once all the tasks are entered on the new card:</p>

<ol>
  <li><strong>I put the new card on the front-right corner of my desk and put the pen on top of it</strong>. I always know where a pen is, and never have an excuse not to write a new task on the card</li>
  <li>I walk the old card over to a cardboard box in my closet and haphazardly place it there. The old card no longer serves a purpose but might be nice to reminisce about someday</li>
</ol>

<p>Having a time and place for these routines, these <em>habits</em> is a big part of the system.
It also feels like a ceremony to some extent, like I’m ridding myself of last week and
becoming present in the new one.</p>

<h2 id="daily-tasks">Daily tasks</h2>

<p>I really like the rows of daily tasks. They are all easy to accomplish, and even if I don’t
accomplish some big task on the list for a day or two <strong>I’m still checking things off</strong>.
That keeps momentum in the system all the time and probably does something science-y to
my neurotransmitters. These are the daily tasks that have been sticky for years now:</p>

<ul>
  <li>Morning routine</li>
  <li>Morning constitutional</li>
  <li>Hug wife</li>
  <li>Work out</li>
</ul>

<p><strong>Morning routine</strong> is the easy one. I wake up, check my phone and get caught up on
emails and headlines before getting out of bed, use the bathroom (and always forget
to take <a href="https://en.wikipedia.org/wiki/Seth_Roberts">Seth Roberts’</a> self-experimentation
advice and look at my face a while in the morning), get my water and coffee and optional
protein-forward breakfast going, and take my allergy medicine + vitamin D supplement +
multivitamin + lip balm. I do the lip balm last so I remember whether or not I’ve taken
my medicine. Then I make our bed, which isn’t my favorite part of the day but I have checkmarks
to make.</p>

<p><strong>Morning constitutional</strong> is kind of a pain. Often I’ll sleep until nearly working hours
and then have to wrangle 10 minutes between meetings to go outside and walk a little bit.
Even if I do get up early, I don’t want to instantly go do stuff, but I chase that checkmark,
darnit! They say there’s a benefit to walking (especially in nature) in the morning. I’ve been
doing daily walks for the better part of a year and can’t say I feel a difference, but
it’s part of my ritual now. It’s kind of wild how many T’s are in the word ‘constitutional’.</p>

<p><strong>Hug wife</strong> is also easy. I feel a little self-conscious that I use a productivity system
to remind myself to be affectionate with Shelby, and sometimes feel bad when there’s a busy
day and we don’t have a hug and the checkbox is unchecked, but overall I love hugging my wife
and like checking boxes, too. I’ve chosen to overcome the negative feelings and focus on the
positive.</p>

<p><strong>Work out</strong> helps me embrace the un-checked boxes in this world, haha. It’s a rare occasion
that I jog two days in a row much less 5 weekdays, so I don’t think I’ve ever checked all
5 boxes in a given week. Working out is just something I’ve committed to doing. The ambiguity
of “work out” rather than having rows for lifting weights and jogging separately also means
that I can be a little loose about checking the box, and might be able to check off more
boxes if I can convince myself to do a push-up or something.</p>

<p><strong>Timesheets</strong> was a daily task when I was self-employed, but I retired it when I took a
permanent full-time job. If you’ve had to submit your billable time to multiple client
time-tracking systems every week and also invoice clients without their own systems, you
know there’s no viable alternative to just staying on top of this boring admin work. Now
that I bill low single-digit hours every week outside of my main gig, time tracking just
isn’t important enough to have a scary line on my card.</p>

<h2 id="the-rules">The rules</h2>

<p>Since this is a system you can make your own, please remember that these are just the rules
for myself at this time, rather than unbreakable laws of productivity:</p>

<ol>
  <li>This week’s card should be ready before Noon Monday</li>
  <li>If I put something on the card, I’m committed to doing it</li>
  <li>Other people can cancel a task but only rarely can I decide not to do something on the list</li>
  <li>If a task isn’t done by the end of the week, it goes on the next week’s card</li>
  <li>Tasks on the list shouldn’t be fluffy filler like “Go to the bathroom”</li>
  <li>Tasks on the list shouldn’t be ambiguous, massive, or un-checkable</li>
  <li>If something should be on the list, put it on the list</li>
  <li>Check off tasks when a reasonable person would say they’re done</li>
  <li>Sometimes you have to make follow-up items for a task, but don’t try to un-check stuff</li>
  <li>This list is for you</li>
</ol>

<p>The whole idea of the card and the daily tasks and the rules is to have a single little place
to keep track of what I have to do. It’s a thing that exists in time and space that begs to be
engaged with and has useful and darn-near <em>fun</em>  little boxes on it.</p>

<p>Changes to the rules should make the system more useful or engaging or should reduce the amount
of time required. You can see I’ve already written a lot about this simple system and will be
writing even more paragraphs. At core, though, the <em>system</em> should be quick and simple. I’ve
not had success with systems that have cycles and extra fields and complex prioritization and
reflection/meditation/journaling built in and all that jazz. Sure, meditation could be a daily
task if I decide that’s important to me, but it doesn’t belong baked into <em>my</em> checklist.</p>

<h2 id="nuances-and-variations">Nuances and variations</h2>

<p>I think philosophically that a checklist is part of your life in a sort of narrow way, so from
time to time it’s worthwhile to consider what belongs there in the context of rules 5-7.
<strong>Some things you write down so they stop bouncing around your head, and these things tend not to belong on the card</strong>.
Other things are captured elsewhere even if you engage with them and are accountable for them,
and that’s a category worth considering.</p>

<h3 id="calendar-events">Calendar events</h3>

<p>If I have to be somewhere or do something at a particular time/place, I tend to put that on a
calendar that then notifies me on my phone. Since my phone/computer is doing the reminding, it’s
a lot less important for calendar things to be on the card. Sometimes I put important events on
the card, though, especially if it’s a light week otherwise.</p>

<h3 id="full-time-job-tasks">Full-time job tasks</h3>

<p>My full-time job duties are a series of calendar events and items in a single project-management
system for the most part. All work stuff is on its own computer and walled off from my side work
and personal tasks.</p>

<p>When there’s a task that’s not worth making a JIRA story for but that I intend to do, I’ll sometimes
put it on the card. Sometimes those tasks I’ll put on the back of the card if they’re immediate and
small.</p>

<p>I’ve had full-time contracts lasting around 6 months in the past, and for more than one of those gigs
I’d put all the tasks on the card even if they were redundant to some project management system.
Maybe the difference was that I was still doing those tasks <em>as a business</em> rather than as an employee,
or maybe the difference was that the gig was impermanent (or the client wasn’t very organized lol).
I don’t know for sure why I’ve made different decisions about similar tasks, but that nuance sort
of speaks to how the rules are meant to work for you rather than being ironclad.</p>

<h3 id="sidebar-tasks">Sidebar tasks</h3>

<p>For a long while I had a sidebar on each card that contained topics I intended to blog about. Since
the topics were long to write out each week I’d shortened them to initialisms/acronyms like ‘WACI’ for
“What a component isn’t”. And even though the point of transcribing them on the list was to motivate
myself to write the blog posts so I’d be able to stop transcribing them every week, I was too busy to
get to blogging. Transcribing those blog topics ended up feeling like a real bummer and made me not
want to fill out my card for the coming week, so I eventually made a to-do list in Google Keep for
“Someday blog topics” and ditched the sidebar.</p>

<p>That’s not to say that a sidebar will never return or that there aren’t things worth transcribing for
months until they’re done. I try to be mindful of things that drag on the system, though, since I
like to enjoy the index card and checking boxes.</p>

<h3 id="notes-on-the-back">Notes on the back</h3>

<p>This is both a useful part about having a scrap of paper on my desk all the time, but also something
to be careful with. If I have to take a quick note it’s great. If it turns out that note has lasting
value for more than a week, though, all of the sudden there’s multiple index cards on my desk. I try
to think of how long my scribbles will be useful beforehand, but the easy solve if I write something
with long-term value on a card is to transcribe it onto a computer somewhere so I can ditch last week’s
card.</p>

<p>The back of a card is a great place for really short-term sub-task lists.</p>

<h3 id="consistent-pen">Consistent pen</h3>

<p>Writing small with a really fine-tip pen is useful for this system.</p>

<p>I’ve never truly considered getting a really fancy pen, but that’s the kind of thing you could do
if it would motivate you.</p>

<p>I’ve used a super fine-tip Sharpie-brand pen for years now. It bleeds a little more than I’d prefer
for how small I write, but I haven’t spent any time looking for a reliable fine-tip pen that doesn’t
bleed, so I just stick with what’s familiar and consistent.</p>

<h3 id="colorful-cards">Colorful cards</h3>

<p>They sell packs of index cards in different colors. The colorful cards can be a little harder to read
because the contrast ratio with black ink is lower than with a white card, but as long as the card
isn’t super dark it’s probably not a problem.</p>

<p>One thing that’s kind of fun about a multi-color pack of index cards is that you can look forward to
a few weeks from now when you switch from purple to green. It’s also a bit more noticeable to have a
colorful card on a white desk.</p>

<h3 id="other-markings">Other markings</h3>

<p>Sometimes when there’s a high-priority task that I should do next I circle the checkbox.</p>

<p>Sometimes when I’m making a card for the week and there are tasks that are related to one another I
group them inside a left-side square bracket.</p>

<p>Sometimes when a task is canceled (by a client per rule #3!) I mark it with an x rather than a checkmark.
This helps show the task shouldn’t make it onto next week’s list at a glance. For daily tasks I fail
to do I leave the box blank rather than marking an x, which is kind of arbitrary but it’s <em>my</em> system so whatever.</p>

<h3 id="daily-cards">Daily cards</h3>

<p>In 2021 I was really busy with a full-time contract and lot of smaller gigs, and would do a daily version
of the index card system. Considering I ended up having to walk away from that full-time contract,
I’m inclined to think <strong>if I’m tempted to do daily cards I have too much going on in my life</strong>.</p>

<h3 id="juggling-multiple-clients">Juggling multiple clients</h3>

<p>I’ve found that having a consistent format for work tasks makes it easier to scan the card. Since most
of my clients use JIRA I’ll write something like “MKTG-123 Fix email header” as the card task, and then
I can find all the MKTG tasks at a glance. For clients without useful ticket numbers I’ll kind of fake
it like “PTS LL Refactor tabs templates”, where PTS is the client, LL is the sub-contract, and then a
short description of what I have to do in order to check off that box.</p>

<h3 id="negative-tasks">Negative tasks</h3>

<p>So far I don’t think I’ve done a daily or other task that’s like “Don’t smoke” or something. It’s kind
of an interesting idea. Would definitely be interested in knowing if it works for somebody.</p>

<h2 id="make-it-your-own">Make it your own</h2>

<p>So that’s my system. If you don’t have a system or the one you’re using now has big disadvantages,
please give this one a try! If you do, <a href="mailto:ao5357@gmail.com">please let me know how it goes</a>.</p>

<p>And remember that it’s <em>your</em> system now, so tweak it how you need.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Things I keep repeating in meetings</title>
      <link>http://bradczerniak.com/blog/corporate-maxims/</link>
      <pubDate>Thu, 04 Jul 2024 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Businessl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/corporate-maxims/</guid>
      <description><![CDATA[One of the things I really like about my friend Nick DeNardis’ newsletter
is the pithy quote on top and usually-succinct linked articles with the easy-to-understand summaries Nick provides.

As an aside, I also love the following email newsletters:


  Links I Would Gchat You If We Were Friends
  TLDR
  Garbage Day
  Today in Tabs / Today on Trail
  Bad Astronomy Newsletter
  [Citation Needed]


If you’re also the RSS-subscribing type, please reach out and I’ll post a huge list of feeds I can’t live without.

What follows is my attempt at being choosy about my favorite laws and quotes to pull out at meetings.

‘Laws’

In a recent work conversation I was trying to remember which pseudo-laws were which, and went “There’s
Betteridge’s Law of headlines,
Atwood’s is the JavaScript one,
Godwin’s is the Hitler one, but I can’t remember…”

(For the most part this section doesn’t have any laws of UX, though those
are also worth a read.)

Goodhart’s law


  “When a measure becomes a target, it ceases to be a good measure”


If you’ve read Freakonomics or accidentally took four years of Econ courses in undergrad, you’re likely quite
familiar with perverse incentive, so this law probably speaks to you.

This comes up in a corporate context because companies are always trying to measure whether they’re doing well,
who’s performing above average, and where they can improve. Measuring something is important for those purposes,
but relying on any one measure can lead to unintended consequences:


  Maximizing shareholder value can lead to layoffs and a decline in product quality
  Relying on hours estimates can lead to burnout, which can lead to instituting story points, which can lead to gaming velocity
  Having a Continuous Deployment benchmark of x deployments per week might lead to (x-1) deployments for deployment’s sake
  Targeting 99.999%+ uptimes as a department goal might bring deployments and changes to a stop, for fear of even a blip of downtime


Once you know this law you see it everywhere, but figuring out what to do about it is a different story altogether.
Some teams might try to avoid too many target measures, while others might have so many measure that the unintended
effects are spread around. It’s a mixed bag.

Conway’s law


  Organizations which design systems (in the broad sense used here) are constrained to produce designs which are copies of the communication structures of these organizations.


If you’ve ever heard “ship your org chart,” this is where that comes from.

The place I see this play out most is in Information Architecture. If you squint at any site’s main menu, there’s
a solid chance you’ll see Conway’s law at play.

That’s not to say that this law doesn’t play out in software architecture, but it’s definitely more manifest in navigation.
Perhaps you could make a case that microservices architecture or monorepos are a symptom of changing team dynamics
at big companies, though that may be a topic for another day.

Abilene paradox


  The Abilene paradox is a collective fallacy, in which a group of people collectively decide on a course of action that is counter to the preferences of most or all individuals in the group, while each individual believes it to be aligned with the preferences of most of the others.


This is less a ‘law’ than the consequence of a weird kind of groupthink, but I just had to include it. Ever since Prof. Holley
showed an old video about “The road to Abilene” in the Intro to Library Management course I took in 2007, this paradox has made
me a little paranoid during every group decision.

In my experience, very few people know about the Abilene paradox, which is a shame. If every group making a decision had
at least one person who knew about it and was willing to speak up, there might be fewer miserable groups out there.

Bonus quote


  “…it has been said that democracy is the worst form of Government except for all those other forms…”


—Winston S Churchill, 11 November 1947

No matter what you think of democracy, this is surely a clever quote. It appeals to me because lots of things are
trade-offs, and often folks don’t appreciate what they’d be giving up by switching from the status quo.

If you worked on waterfall projects in the olden days, you have the context for agile’s strengths, for instance. Not
a lot of people would say any form of agile is ideal or the best form of project management; some may say it’s the
worst form of project management, except for all the others.

Hope you liked these laws and bonus quote! Ever the optimist, I hope to post here more frequently!
]]></description>
      <content:encoded><![CDATA[<p>One of the things I really like about <a href="https://nickdenardis.substack.com/">my friend Nick DeNardis’ newsletter</a>
is the pithy quote on top and usually-succinct linked articles with the easy-to-understand summaries Nick provides.</p>

<p><em>As an aside</em>, I also love the following email newsletters:</p>

<ul>
  <li><a href="https://linksiwouldgchatyou.substack.com/">Links I Would Gchat You If We Were Friends</a></li>
  <li><a href="https://tldr.tech/">TLDR</a></li>
  <li><a href="https://www.garbageday.email/">Garbage Day</a></li>
  <li><a href="https://www.todayintabs.com/">Today in Tabs</a> / <a href="https://www.todayontrail.com/">Today on Trail</a></li>
  <li><a href="https://badastronomy.beehiiv.com/">Bad Astronomy Newsletter</a></li>
  <li><a href="https://www.citationneeded.news/">[Citation Needed]</a></li>
</ul>

<p>If you’re also the RSS-subscribing type, please reach out and I’ll post a huge list of feeds I can’t live without.</p>

<p>What follows is my attempt at being choosy about my favorite laws and quotes to pull out at meetings.</p>

<h2 id="laws">‘Laws’</h2>

<p>In a recent work conversation I was trying to remember which pseudo-laws were which, and went “There’s
<a href="https://en.wikipedia.org/wiki/Betteridge%27s_law_of_headlines">Betteridge’s Law of headlines</a>,
<a href="https://www.laws-of-software.com/laws/atwood/">Atwood’s is the JavaScript one</a>,
<a href="https://en.wikipedia.org/wiki/Godwin%27s_law">Godwin’s is the Hitler one</a>, but I can’t remember…”</p>

<p>(For the most part this section doesn’t have any <a href="/docs/user-experience/ux-principles/">laws of UX</a>, though those
are also worth a read.)</p>

<h3 id="goodharts-law"><a href="https://en.wikipedia.org/wiki/Goodhart%27s_law">Goodhart’s law</a></h3>

<blockquote>
  <p>“When a measure becomes a target, it ceases to be a good measure”</p>
</blockquote>

<p>If you’ve read <em>Freakonomics</em> or accidentally took four years of Econ courses in undergrad, you’re likely quite
familiar with perverse incentive, so this law probably speaks to you.</p>

<p>This comes up in a corporate context because companies are always trying to measure whether they’re doing well,
who’s performing above average, and where they can improve. Measuring <em>something</em> is important for those purposes,
but relying on any one measure can lead to unintended consequences:</p>

<ul>
  <li>Maximizing shareholder value can lead to layoffs and a decline in product quality</li>
  <li>Relying on hours estimates can lead to burnout, which can lead to instituting story points, which can lead to gaming velocity</li>
  <li>Having a Continuous Deployment benchmark of x deployments per week might lead to (x-1) deployments for deployment’s sake</li>
  <li>Targeting 99.999%+ uptimes as a department goal might bring deployments and changes to a stop, for fear of even a blip of downtime</li>
</ul>

<p>Once you know this law you see it everywhere, but figuring out what to do about it is a different story altogether.
Some teams might try to avoid too many target measures, while others might have so many measure that the unintended
effects are spread around. It’s a mixed bag.</p>

<h3 id="conways-law"><a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway’s law</a></h3>

<blockquote>
  <p>Organizations which design systems (in the broad sense used here) are constrained to produce designs which are copies of the communication structures of these organizations.</p>
</blockquote>

<p>If you’ve ever heard “ship your org chart,” this is where that comes from.</p>

<p>The place I see this play out most is in Information Architecture. If you squint at any site’s main menu, there’s
a solid chance you’ll see Conway’s law at play.</p>

<p>That’s not to say that this law doesn’t play out in software architecture, but it’s definitely more manifest in navigation.
Perhaps you could make a case that microservices architecture or monorepos are a symptom of changing team dynamics
at big companies, though that may be a topic for another day.</p>

<h3 id="abilene-paradox"><a href="https://en.wikipedia.org/wiki/Abilene_paradox">Abilene paradox</a></h3>

<blockquote>
  <p>The Abilene paradox is a collective fallacy, in which a group of people collectively decide on a course of action that is counter to the preferences of most or all individuals in the group, while each individual believes it to be aligned with the preferences of most of the others.</p>
</blockquote>

<p>This is less a ‘law’ than the consequence of a weird kind of groupthink, but I just had to include it. Ever since Prof. Holley
showed an old video about “The road to Abilene” in the Intro to Library Management course I took in 2007, this paradox has made
me a little paranoid during every group decision.</p>

<p>In my experience, very few people know about the Abilene paradox, which is a shame. If every group making a decision had
at least one person who knew about it and was willing to speak up, there might be fewer miserable groups out there.</p>

<h2 id="bonus-quote">Bonus quote</h2>

<blockquote>
  <p>“…it has been said that democracy is the worst form of Government except for all those other forms…”</p>
</blockquote>

<p>—<a href="https://winstonchurchill.org/resources/quotes/the-worst-form-of-government/">Winston S Churchill, 11 November 1947</a></p>

<p>No matter what you think of democracy, this is surely a clever quote. It appeals to me because lots of things are
trade-offs, and often folks don’t appreciate what they’d be giving up by switching from the status quo.</p>

<p>If you worked on waterfall projects in the olden days, you have the context for agile’s strengths, for instance. Not
a lot of people would say any form of agile is ideal or the <em>best</em> form of project management; some may say it’s the
worst form of project management, <em>except for all the others</em>.</p>

<p>Hope you liked these laws and bonus quote! Ever the optimist, I hope to post here more frequently!</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Quick pontoon rant</title>
      <link>http://bradczerniak.com/blog/quick-pontoon-rant/</link>
      <pubDate>Sun, 09 Jul 2023 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Rantsl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/quick-pontoon-rant/</guid>
      <description><![CDATA[&amp;lt;rant&amp;gt;


As a big fan of inflationary language, I have a soft spot in my heart for
words like ‘ponthreen’, where the ‘too’ sound in pontoon gets bumped up to a three, on account of rising prices, of course.

If you Google/Bing/Duck for ponthreen, though, there’s very little aside from a mention or three in reddit comments. I consider
this a travesty and injustice and all sorts of mean, nasty things, not because ponthreen is a fun word to say (though it
is!), but because a subset of pontoon boat enthusiasts and especially retailers will call a pontoon boat with three pontoons
a ‘tritoon’.

Clearly this cannot stand.

Pontoons are the tube-y bits

A “pontoon boat” is a boat made with one or more pontoons, which can interchangeably be called pontoons, floats, or tubes.
Obviously, despite the fun rhyme, you can’t call it a “float boat” because any boat that doesn’t float isn’t a very good
boat (please don’t @ me about submarines technically being boats or something). I’d assume there’s a good linguistic/marketing
reason that “tube boat” lost out to “pontoon boat”, but here’s where we are. An illustration of a stereotypical pontoon
boat:


    
      
        
        
        
          
        
        
      
      
        
      
    
    
  

If each tube/float is itself a pontoon, and ‘pon-‘ is not a Latin or Greek numeral prefix in the singular or any other number,
then you can’t chop up the word to end up with junk like:


  unitoon or monotoon
  dutoon or ditoon (which would be a standard pontoon boat as we envision them)
  tritoon
  quadritoon or tetratoon
  quinquetoon or pentatoon
  sexatoon or hexatoon


…and so on.

A “pontoon boat” is a pontoon boat, regardless of the number of pontoons that support its deck(s). This ‘tritoon’ usage
clearly must be stopped.

It might be palatable, since single-pontoon boats are exceedingly rare to my knowledge, to call a pontoon boat with two
pontoons a “pontoon boat” without qualification, and then boats with more pontoons could be prefixed (with or without a
hyphen) like so:


  tri-pontoon boat
  “quad-pontoon boat” or “four-pontoon boat”
  …or something like that


But tritoon is just wrong. Wrong wrong wrong.

If you can’t beat ‘em, join ‘em

Since both tritoon and ponthreen are equally wrong for describing a pontoon boat with three floats, and tritoon is already
more commonly-used than ponthreen, I believe the only recourse is to now spread the word, literally, and get people
calling them ponthreens.

&amp;lt;/rant&amp;gt;


(Also, not nearly enough people include an opening rant tag)

P.S. In an alternate universe, “tube boat” became common usage, and it didn’t take long for the ‘b’ sounds to compmanteau
(a portmanteau of ‘compound’ and ‘portmanteau’) themselves into ‘tuboat’. Some silly midwestern boat dealer would then,
in an insult to alternate-universe Brad, call a tuboat with three tubes a triboat. You can see this unfold in the cutscenes
of Everything Everywhere All at Once.
]]></description>
      <content:encoded><![CDATA[<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;rant&gt;</span>
</code></pre></div></div>

<p>As a big fan of <a href="https://www.youtube.com/watch?v=BEuNb0nzyvI">inflationary language</a>, I have a soft spot in my heart for
words like ‘ponthreen’, where the ‘too’ sound in pontoon gets bumped up to a three, on account of rising prices, of course.</p>

<p>If you Google/Bing/Duck for ponthreen, though, there’s very little aside from a mention or three in reddit comments. I consider
this a travesty and injustice and all sorts of mean, nasty things, not because ponthreen is a fun word to say (though it
is!), but because a subset of pontoon boat enthusiasts and especially retailers will call a pontoon boat with three pontoons
a ‘tritoon’.</p>

<p><em>Clearly this cannot stand</em>.</p>

<h2 id="pontoons-are-the-tube-y-bits">Pontoons are the tube-y bits</h2>

<p>A “pontoon boat” is a boat made with one or more pontoons, which can interchangeably be called pontoons, floats, or tubes.
Obviously, despite the fun rhyme, you can’t call it a “float boat” because any boat that doesn’t float isn’t a very good
boat (please don’t <code class="language-plaintext highlighter-rouge">@</code> me about submarines technically being boats or something). I’d assume there’s a good linguistic/marketing
reason that “tube boat” lost out to “pontoon boat”, but here’s where we are. An illustration of a stereotypical pontoon
boat:</p>

<figure class="figure figure--image figure--image--1200x630-pontoon-boat-jpg box-shadow--lifted-edges">
    
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/1200x630/pontoon-boat.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/1200x630/pontoon-boat.jpg" alt="A pontoon boat, with text overlaying to show two pontoons with a boat deck on top" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/1200x630/pontoon-boat.jpg" alt="A pontoon boat, with text overlaying to show two pontoons with a boat deck on top" loading="lazy" />
      </noscript>
    
    
  </figure>

<p>If each tube/float is itself a pontoon, and <a href="https://en.wikipedia.org/wiki/Numeral_prefix">‘pon-‘ is not a Latin or Greek numeral prefix in the singular or any other number</a>,
then you can’t chop up the word to end up with junk like:</p>

<ol>
  <li>unitoon or monotoon</li>
  <li>dutoon or ditoon (which would be a standard pontoon boat as we envision them)</li>
  <li>tritoon</li>
  <li>quadritoon or tetratoon</li>
  <li>quinquetoon or pentatoon</li>
  <li>sexatoon or hexatoon</li>
</ol>

<p>…and so on.</p>

<p>A “pontoon boat” is a pontoon boat, <strong>regardless of the number of pontoons</strong> that support its deck(s). This ‘tritoon’ usage
clearly must be stopped.</p>

<p>It might be palatable, since single-pontoon boats are exceedingly rare to my knowledge, to call a pontoon boat with two
pontoons a “pontoon boat” without qualification, and then boats with more pontoons could be prefixed (with or without a
hyphen) like so:</p>

<ul>
  <li>tri-pontoon boat</li>
  <li>“quad-pontoon boat” or “four-pontoon boat”</li>
  <li>…or something like that</li>
</ul>

<p>But <strong>tritoon is just wrong. Wrong wrong wrong</strong>.</p>

<h2 id="if-you-cant-beat-em-join-em">If you can’t beat ‘em, join ‘em</h2>

<p>Since both tritoon and ponthreen are equally wrong for describing a pontoon boat with three floats, and tritoon is already
more commonly-used than ponthreen, I believe the only recourse is to now <strong>spread the word, literally</strong>, and get people
calling them ponthreens.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;/rant&gt;</span>
</code></pre></div></div>

<p><em>(Also, not nearly enough people include an opening rant tag)</em></p>

<p>P.S. In an alternate universe, “tube boat” became common usage, and it didn’t take long for the ‘b’ sounds to <em>compmanteau</em>
(a portmanteau of ‘compound’ and ‘portmanteau’) themselves into ‘tuboat’. Some silly midwestern boat dealer would then,
in an insult to alternate-universe Brad, call a tuboat with three tubes a triboat. You can see this unfold in the cutscenes
of <em>Everything Everywhere All at Once</em>.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Day Five</title>
      <link>http://bradczerniak.com/blog/day-five/</link>
      <pubDate>Sun, 18 Jun 2023 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Daysl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/day-five/</guid>
      <description><![CDATA[The amount of blood in my stool is staying the same. Agent Checkles keeps whispering in my ear that this means I’m getting
better.
]]></description>
      <content:encoded><![CDATA[<p>The amount of blood in my stool is staying the same. Agent Checkles keeps whispering in my ear that this means I’m getting
better.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Sass considered harmful</title>
      <link>http://bradczerniak.com/blog/sass-considered-harmful/</link>
      <pubDate>Sat, 03 Jun 2023 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Metal]]></category>
      
        <category><![CDATA[CSSl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/sass-considered-harmful/</guid>
      <description><![CDATA[As I am wont to do, I expressed an opinion on reddit and started a debate
about a niche tech topic. Much like the topic, Sass (and similar CSS ‘pre/post-processors’),
the reddit thread got nested to the point of inefficiency, so here’s a bit more breathing room to really explore the topic.

If you were local to the Detroit tech scene around 2013, you know that 10 years ago Vince and I had a public debate about CSS preprocessors,
so this is not the first — but hopefully will be the last — time I’ve engaged folks on this topic.

If I were to coin a tl;dr that doesn’t appear anywhere else in these 4000 words, it would be this:
CSS preprocessors are productivity theater and
technical debt, plain and simple.

Also…

The descriptor “CSS preprocessor” is incorrect

I’m grateful to u/Scowlface for engaging with me in good faith. The one mistake
they made, in my eyes, is asking, “Okay, first, why be so pedantic?”, and then claiming:


  “And it’s not a “css generator”, it’s a CSS preprocessor.”


By golly my new acquaintance Scowlface, I have not yet begun to be pedantic!

The existence of a CSS preprocessor like Sass or a postprocessor like PostCSS implies the existence of a middle step, processing,
that is important in some manner or fashion. That’s simply not the case.

Both Sass and PostCSS do all their work before what is inevitably a CSS file getting loaded in a web browser to provide styles
for a web page. You could almost just say PostCSS is a CSS preprocessor, too, and that the processing step is the browser
parsing the CSS and applying the defined styles to the DOM, but as we’ll see shortly, that’s not technically true.

The words people use to describe CSS preprocessors (and more incorrectly, ‘postprocessors’) were made up by the people selling
the software to the development community. Uncritically parroting that terminology not only does nobody any favors, but
in the case of insisting Sass isn’t a “CSS generator” but rather a preprocessor, you’re exchanging a good descriptor for
a crummy one. Tin-pot dictators will tell you they were birthed by the gods on a mountain peak and have gotten all holes-in-one
when golfing — but saying those things do not make them so, and repeating them plays right into their hands.

Sass is not CSS, nor is the more CSS-like SCSS syntax (and the same goes for LESS, Stylus, any non-native PostCSS
plugins, tailwind @apply, etc.). These are all DSLs (Domain-Specific Languages) that are parsed and interpreted into CSS.
This distinction is important because Sass is called a “CSS Preprocessor”, which implies taking CSS, pre-processing it,
and then ending up with pre-processed CSS. But that’s not what happens. A non-CSS language is used to make CSS, hence why
it’s much more accurate to call Sass and its ilk ‘CSS generators’ because that’s what the tools do: they generate CSS from
something else (even if SCSS looks very CSS-y in many ways, the other available syntaxes show that it need not be).

This entire section isn’t important in any real sense, except that if you’re going to accuse me of both being pedantic and
saying something “patently false”, it behooves you to think about the accusations for a second or two.

A worse developer experience

The following example, like all Sass examples, is open to criticism for not being a particularly good use of the technology.
The fact that so many Sass examples show bad practices should indicate to you that perhaps something is amiss.

Let’s say you want to generate utility classes for 14 named colors, so you could put background-color--grey-light on any
element and have a light grey background, plus 13 other theme colors for the same concept.

The resulting CSS in either case will look like this:
.background-color--black {
  background-color: #000;
}
.background-color--grey-dark {
  background-color: #444;
}
.background-color--grey {
  background-color: #ccc;
}
.background-color--grey-light {
  background-color: #fafafa;
}
.background-color--white {
  background-color: #fff;
}
.background-color--main {
  background-color: #007599;
}
.background-color--main-dark {
  background-color: #002733;
}
.background-color--main-light {
  background-color: #ccf4ff;
}
.background-color--second {
  background-color: #E32416;
}
.background-color--second-dark {
  background-color: #331716;
}
.background-color--second-light {
  background-color: #ffcfcc;
}
.background-color--third {
  background-color: #00838a;
}
.background-color--third-dark {
  background-color: #003033;
}
.background-color--third-light {
  background-color: #ccfcff;
}


In Sass you might use an @each loop that would look like this:

$colors: (&quot;black&quot;: &quot;#000&quot;, &quot;grey-dark&quot;: &quot;#444&quot;, &quot;grey&quot;: &quot;#ccc&quot;, &quot;grey-light&quot;: &quot;#fafafa&quot;, &quot;white&quot;: &quot;#fff&quot;, &quot;main&quot;: &quot;#007599&quot;, &quot;main-dark&quot;: &quot;#002733&quot;, &quot;main-light&quot;: &quot;#ccf4ff&quot;, &quot;second&quot;: &quot;#E32416&quot;, &quot;second-dark&quot;: &quot;#331716&quot;, &quot;second-light&quot;: &quot;#ffcfcc&quot;, &quot;third&quot;: &quot;#00838a&quot;, &quot;third-dark&quot;: &quot;#003033&quot;, &quot;third-light&quot;: &quot;#ccfcff&quot;);

@each $name, $hex in $colors {
  .background-color--#{$name} {
    background-color: $hex
  }
}


The thing is, and this is true for darn-near anything you want to do in Sass, the toughest and most time-consuming parts
are:


  Typing out the map of names and hex codes
  Getting the syntax right for loops and stuff, effectively learning another new language


In contrast, with the same map but using regex find/replace in an editor like Sublime Text, you can make the classes one
time and get on with your life:


    
      
        
        
        
          
        
        
      
      
        
      
    
    
      This basically does what a Sass loop does, but learning regular expressions is useful way beyond CSS, and it only has to run once.
    
  

This is important because doing it the Sass way has a lot of disadvantages compared to making the classes as plain-old
CSS, even if you took the time to type them all out rather than regex-ing up a map:


  Sass introduces overhead and delays to your build process
  Sass requires you to sink time into learning its syntax(es)
  With the @each loop, if you find the background-color--black class on an element via the browser devtools, searching the codebase won’t find anything useful
  Every time you make a change to your styling, even a trivial one, Sass has to re-iterate the loop to rebuild those classes
  What happens if there’s a breaking API change at some point? You’re at the mercy of the Sass maintainers
  What happens if the site is live for 5 years and then your client wants to make a change? See the dependency hell section below
  What if you test your site and find that text just on the second-light background but not the others requires a little text-shadow?


And what’s the benefit of all this inconvenience and overhead? Some zealots might claim that the @each Sass setup lets you
quickly and easily add the 15th and nth background-color class, but, like…


  


FFS, copy and paste exists. It doesn’t matter how many items are in the map: looping is guaranteed to lose you time compared
to writing CSS. It’s just tech debt for tech debt’s sake.

Weird attitudes

Judging by all the downvotes I got in the reddit thread and posts like this one by Rob O’Leary on dev.to,
it kind of feels like there’s a cult around Sass. If you use Sass and have a good opinion of it, have you ever taken a critical
eye to it? Do you feel a sunk-cost resistance to abandoning a tool you like and a skill you spent time learning?

The thing I hear people say is something along the lines of “CSS doesn’t have certain features, but Sass adds them in. Sass
makes CSS into something more like a programming language.” You can accuse me of building up a straw man here, but I’ve
heard that exact sentiment a lot. And the problem is, it’s 100% a misconception: Sass does no such thing. Sass itself
is like a programming language, sure, but all it ever outputs is plain-old CSS. There’s no escaping that. It doesn’t add
features to CSS or make CSS more like a programming language: it just generates bloat for you.

I really don’t know where the mentality comes from, but it’s wild to me. Writing ‘vanilla’ CSS and not having to deal with
the nodejs ecosystem just to style pages is a great feeling, so if you’ve only ever done CSS by way of Sass, I
strongly encourage you to try modern CSS without the Sass crutch (and yes, clearly I’ve learned Sass and used it on
many projects throughout the years, so no hypocrisy here in asking you to try something new).

Modern CSS is better than the Sass facsimiles

The original comment by u/aguycalledmax I replied to that started the scowly
exchange said:


  “Even with nesting coming to native css I really don’t see any reason not to use scss or sass. The DRY and maintainability
benefits of your code far outweigh the imperceptible negatives of a tiny build time on your local machine.”


We’ll get into why both the DRY/maintainability and build time arguments are hogwash later, but for now I’d like to touch
on why we should wholeheartedly embrace CSS Nesting specifically (when browser support is up to snuff for your project)
and wholly abandon the same concept in CSS preprocessors.

Creating a similar example to those from a post on the Sass blog,
here is some nested CSS that’s valid in native CSS now, and is also valid SCSS nesting:

.base-class {
  padding: 20px;

  .foo {
    color: #eee;

    &amp;amp;.fighters {
      color: green;
    }
  }

  .bar {
    color: #ccc;

    &amp;amp;.fighters {
      color: red;
    }
  }

  .fizz {
    color: #fc0;

    .ylifting-drinks {
      color: #cf0;
    }
  }

  .buzz {
    color: rebeccapurple;
  }

  .fizzbuzz {
    color: #c0ffee;
  }
}


In native CSS, the nesting is interpreted with an implicit :is() wrapping the parent, keeping the selector specificity
very flat, which allows less-specific selectors if/when you need to override any selector. In contrast, all the selectors
generated by Sass in the build step have a specificity of at least 2. This isn’t a big difference for a single level of
nesting, but can make overriding a lot more pleasant for deeper levels of nesting in native CSS.

The other factor here is payload size. Even prior to minimizing, the CSS example above is 341 characters. That’s
what you’d send over the wire and the size gets no bigger. It could get smaller with minimization and compression, but not
bigger.

In contrast, the Sass build process takes the nesting above and turns it into:

.base-class {
  padding: 20px;
}

.base-class .foo {
  color: #eee;
}

.base-class .foo.fighters {
  color: green;
}

.base-class .bar {
  color: #ccc;
}

.base-class .bar.fighters {
  color: red;
}

.base-class .fizz {
  color: #fc0;
}

.base-class .fizz .ylifting-drinks {
  color: #cf0;
}

.base-class .buzz {
  color: rebeccapurple;
}

.base-class .fizzbuzz {
  color: #c0ffee;
}


The resulting CSS is 383 characters, or 12.3% larger. Yes, gzip would be very effective on those repeated base-class
strings, but this is a small, simple example. More nesting makes both the specificity and the payload size issues worse
for Sass.

Similar arguments exist for CSS custom properties, calc(), CSS Color Module Level 4,
and the whole gamut of newer CSS features that have advantages over former Sass features. In the long run
you benefit from embracing web standards over third-party tools.

Dependency hell is other people… ‘s build steps

There’s this relief you feel whenever you’ve fought with npm or yarn to install the dependencies you want, then ran your
script successfully to do what you wanted it to. It’s a familiar feeling for anyone who’s ever done computer programming.

But dependencies are introducing technical debt into your project, sometimes to a greater extent than you considered at
first. If you’ve installed Sass and got it working, then done some stylesheet work for a while, then ran into a dependency
issue later, then fixed it to get Sass working again, you may be feeling something more like Stockholm Syndrome than
actual satisfaction.

With vanilla CSS, you can make a file named styles.css or similar, put some style directives in it, then reference the
file in a &amp;lt;link&amp;gt; tag in the head of your HTML documents, and you’re off to the races. Yes, you can definitely make the
CSS building and attachment process a lot more complicated, but the minimum-viable example is pretty easy.

With Sass you have to do all the aforementioned things, but also:


  Install Sass (locally, in dev containers, on remote servers, or perhaps all three)
  Likely use nodejs and npm/nvm/yarn/whatever to bring in bundlers, frameworks, libraries, linters and analysis tools,
watchers, and gosh knows what else
  Glue all your build chain stuff together with scripts
  Learn the Sass syntax
  Run your script over your Sass files, or keep a watcher running
  Wait for Sass to build and your other build process to complete every time you make a change
  Maintain this dependency chain over the long term, including rewriting the bundler configs to support the new version
of grunt/gulp/webpack/rollup/parcel/etc. when they needlessly change their API once every two years or so
  Document how all of this works, well enough that the next person to join the team only loses a day to setting it up
  Install helpers for your text editor or IDE
  Learn the tricks for searching partial strings to find useful SCSS code, rather than whole strings in regular CSS
  Learn, and continuously navigate, the function/mixin/library/framework Sass version of callback hell where it’s not
clear how a particular CSS declaration inherits various property:value pairs because the Sass feature doing it is 3+
levels deep and probably a million directories deep in node_modules
  Keep up with both new CSS features and changes to Sass/SCSS


This is all textbook technical debt. In order for any of it to make any sense, Sass would have to save you a ton of time
and/or produce much better code in order to justify all the time lost doing all the above-listed frustrating junk over the
lifetime of your project. The thing is: there is no way you’re making the time back up. You’re gonna lose time messing
around with Sass, and your frontend stack is more brittle for the privilege.

‘Artifact’ merge unpleasantness is a perennial team issue

At least once in your project you’re gonna have to decide: should we commit build artifacts?

If you commit generated and minimized CSS output by Sass, the advantage is that you don’t have to set up your servers to
do your front-end build process. Deployment is simpler, faster, and less error-prone. However, committing your build artifacts
is effectively setting yourself up for merge conflicts way more often than with regular CSS, as a team of even two developers
would create conflicting artifacts almost every time they touch the Sass on a feature branch.

If you don’t commit build artifacts, your server will have to be set up to be just as capable as your local machine of building
CSS from your Sass source files. This, of course, is additional overhead just to get stylesheets working, and introduces
its own headaches.

Do you do frontend builds directly from a local machine? Or are you using containerization like docker-compose to have a
local simulation of a server? If you do use a container on your local, is your local dev container the same spec as containers
used for production? If not, then there’s a solid chance that you have at least two different sets of tooling with subtly-different
versions for the various constituent parts.

As frustrating as it can be for the dependencies not to install locally or for a syntax error to fail the build, it’s
even more frustrating when it works on your machine but fails on the server. Tracking down what the heck must be different
is a solid way to lose an afternoon. And to reiterate, none of this is required — you’re volunteering to use this optional
tool for some murky reason!

It ain’t gonna work later

It’s pretty common for frontend work on a particular site to go quiet for years at a time, then for the site owner to shift
focus and want updates to their existing site. With plain-old CSS you’re sure to encounter some weird old stuff, but you
can be pretty sure it’ll just work. With Sass the opposite is true: I’m comfortable claiming with 95% certainty that
you’ll spend at least an hour fixing dependency issues before you can get back to writing styles.

This comes down to both the commonly-paired-with-Sass nodejs ecosystem for build processes being brittle as eff and pretty
irresponsible with notions like backwards compatibility (and yes, I get it, the ecosystem is getting more mature, and it’s
not exactly fair to say it’s Sass’s or node’s problem if gulp changes their config format every five minutes) and with
the coin toss of whether your project was set up with the Ruby version of Sass, the C/C++ version, or the Dart one.

It’s easy to brush this concern aside, since the pain won’t be until 5 years later, but it’s something you should know before
you sign up: as surely as the Sun will rise tomorrow, you will spend a significant fraction of your Sass-ing time getting
it to work anew when you revisit an older project. It will take up a lot of your time and it will likely be unpleasant.

Death by a thousand builds

The beginning of this section already touched on how choosing Sass is signing up for more setup time, learning, and overall
difficulty than using plain CSS. One last point along those lines is the relatively-small slowdown of having your stylesheets
build whenever you make a change to your Sass source.

The site you’re reading this post on uses a static site generator, Jekyll, to put the pages together when the code is deployed
or during development when any file is modified and saved. Fully building the site can take between 10 and 30 seconds today,
with the amount of content and assets the site builder has to process (perhaps ironically, the stylesheets technically
get processed by Sass, as Jekyll kind of makes you do that, even though the SCSS file contains vanilla CSS).

20-ish seconds is a long time to wait to be able to look in my browser window and see the changes reflected on the dev site.
The thing is, most of the activities like writing a blog post take a lot of time in the text editor between reloads. With
CSS, often you’re writing a line or two and then checking your work, since the little increments and test tweaks all build
on each other. When you’re changing two or three lines over the course of 30 seconds, an extra build time for Sass to complete
of a second or two (hopefully not more!) quickly adds up.

Any one build feels imperceptible, and might be a welcome micro-break similar to the old-school trope of getting coffee
while your code compiles. But taken in the aggregate, and especially combined with the startup and maintenance costs of
using Sass, those build times turn into significant productivity loss.

Again, you’d have to see time savings in another way, or benefit significantly from code quality improvements, to justify
the kind of time lost to all this setup and waiting. Somebody please show me the benefit. Please email me with a good
example that makes this make sense!

Many Sass features encourage bad behavior

Much of what I argue in this section is predicated on one simple principle: The less CSS sent over the wire the better.
Writing CSS directly and seeing exactly what you’re serving the user is helpful toward avoiding bloat, technical debt,
and bad practices. In contrast, using Sass’s leaky abstractions more often than not means never seeing the mess it’s making
on your behalf.

One of Scowlface’s last arguments went like this:


  “If your argument is that since sass outputs css, that you can just write the css that sass would output, then yeah, sure,
obviously. But it’s not as easy, and that’s the entire purpose of sass. That’s like saying, “don’t use PHP, just write
C. Why write C when you can just do it in assembly? All these higher level languages just add bloat and slow down your
program.”


I see a few big problems with this line of reasoning:


  Why is there merit in making it easy to generate CSS that’s necessarily more bloated than if you had written it directly?
  There are absolutely times when you’d want to choose Assembly over C, and even more for C over PHP. Not every circumstance,
but when performance and executable size are important, for sure. Love and respect to developers writing in low-level languages
  Vanilla CSS vs. Sass is not an apples-to-apples comparison to C vs. PHP. CSS is a stylesheet language that only has
Turing-complete features incidentally rather than being intended as a programming language in the usual sense (please
note I’m not making a gatekeeping argument here — folks who write CSS are developers for sure. Y’all are my people!),
so Sass cannot and should not be considered a higher-level language than CSS: Sass does something entirely different
than what CSS does
  Sass is only easy if you’ve already learned it and sunk the time into setting it up, two things that are hard.
From scratch it’s a tremendous hassle compared to just writing CSS


Let’s look at Sass’s feature set with the less-is-more concept in mind, and a healthy appreciation for utility-first architecture
that keeps your project’s specificity graph nice and flat.

Flow control

See the Sass docs for an index of flow control items

Variables and conditionals, plus other primitives, all define logic that operates entirely within the Sass context rather
than the resultant CSS.

These features are all inside baseball and can give you a deceptive impression of what the tool is doing. They’re helpful,
insofar as if you’re using Sass you need these primitives to accomplish anything, but are useless outside of Sass because
they’re build-time resources rather than render-time.

To go back to an earlier example, you could use an @if to put a text shadow on just the second-light background-color
utility class. It would really ugly up that @each loop, and would require more time and effort than just pasting the
text-shadow property:value pair into the class in plain CSS. And note: no trace of the @if would show up in the CSS. Not
to sound like a broken record, but Sass features aren’t CSS features — they only exist to generate plain old CSS.

By comparison, CSS custom properties — or CSS variables as they’re commonly known — work in the render context, making
them useful and interchangeable between systems. Similarly, the calc() and other functions, plus render-time CSS flow
control structures like @supports and @media accomplish what’s needed in real-world styling.

These flow control features aren’t actively harmful like some of the following examples, but they certainly help enable
accomplishing bad things.

Nesting

See the “Modern CSS…” section above.

The entire purpose of nesting is to write something succinct that generates way more code than you wrote. It also,
by definition, is a way to chain specificity, which is also a questionable thing to do when a utility-first approach keeps
your CSS payload small and makes overriding easier. The whole feature (moreso in Sass than the new native CSS equivalent)
encourages you to do something bad.

Mixins and @extend

A blockquote earlier in this post alluded to DRY (Don’t Repeat Yourself) and maintainability benefits of using Sass over
vanilla CSS. Both @mixin and @extend illustrate how being DRY in Sass makes your CSS very… wet? Well, whatever you’d
call it, these features make it really easy to irresponsibly duplicate code in your CSS. @extend is also a good example
of how maintainability is an illusion.

In the reddit thread, I gave as an example a mixin for applying an old-school clearfix (which in the age of flexbox and
grid is far more of an edge case than years ago), which Scowlyface dismissed as a “bad example”. Keeping my pedantic streak
alive, by the GitHub search numbers I’d rebut that it’s a good example
of how Sass features are commonly used to do bad things.

Scowlyface was right that clearfix should be a utility class that gets applied in markup where needed, rather than repeating
the same property:value pairs and pseudo-elements all over the codebase. This is a classic trap, of course, since the @mixin
and @extend features are only useful for duplicating the output code while giving the illusion of not repeating yourself
if you only look at the Sass source. You simply can’t provide a good example where duplicating code in this manner would
result in a healthier CSS codebase.

When applying a clearfix class would require clicking around your IDE sidebar to find the directory holding the correct
application logic or template file and then pasting the class in the correct place, then testing that the class is applied
and the styles are working, if you’re already looking at the nested code block for the .new-container declaration and
can’t be bothered to click, copy, and paste in another file, the lazy developer will be happy to throw a

  @include clearfix;


…at the problem and call it a day. Nevermind that at best it’s making a big comma-separated list of selectors that should
all repeat the same code, and at worst is repeating the same combinations of properties and values in pseudo-elements
all over the output CSS, because it ‘saved’ the developer precious time versus doing the job correctly.

Moreover, these features are among the Sass features that obfuscate the source of style directives, requiring a loss of
time for developer to track how many mixins and functions deep you have to go and how many variables and parameters you
have to parse (being mindful of the variables’ scope, of course!) just to find where a particular line of output is coming
from. Time-savers these features are not.


    
      
        
        
        
          
        
        
      
      
        
      
    
    
  

Can you look at the example above and credibly say there’s any advantage to inserting a @mixin to make three little
classes? Isn’t the CSS on its own a lot easier to understand and work with? Why on earth would you do this to yourself
willingly?

With @extend, additionally, you’re often declaring an unenforced dependency. Let’s say you have a class,

.padded-box {
  padding: 20px;
}


and then in your SCSS later you want to make a padded box that has some more properties:

.fancy-padded-box {
  @extend .padded-box;
  background-color: #ffccff;
}


Depending on how you have your SCSS structured, .fancy-padded-box might be miles away from the original .padded-box.
If a new member of the team sees the original .padded-box declaration and searches the markup for usages, not finding
any, and decides to delete it, the .fancy-padded-box class will error out. The new developer might not even see the failure
in their terminal window until an hour or two later, and by that time they’ve made so many changes that the notion of Sass
making the stylesheets less delete-key-friendly will have turned into a lot of time lost adding the extended class back.
That’s the opposite of a maintainability benefit.

Encouragement and a narrow use case

This has been a lot of words, many of them very negative, about Sass and other CSS preprocessors. Given that, and that I
bear no ill will toward my fellow humans, I wanted to take a second to acknowledge that the folks who made Sass and have
maintained it for over a decade has done a great thing — and I don’t want to discourage either them or somebody thinking
of releasing their open-source tools in the future. The more tools the better, and for that matter the more debate the
better!

Having gone through lots of features and showing ways they can easily be misused, now might also be a good time to point
out two use cases where using Sass might be a net benefit:


  If your codebase is already using Sass: if you’re maintaining an existing front end, swapping Sass for vanilla
    CSS probably wouldn’t save you time for the remaining life of the frontend. But if you go to re-theme, all bets are off
  If your team makes lots of BEM(-like) components: personally I see this as something of an anti-pattern, given
    the utility-centric direction frontend development has gone, but big teams with big applications with lots of components
    and especially an existing Sass setup might benefit from the setup. Then again, if you’re doing a BEM or SMACSS kind
    of thing from scratch in 2023, firstly… why? And second, you might consider native CSS nesting instead


Lastly, it’s worth noting that the features of CSS preprocessors led the way to many of the CSS standards we embrace today,
so we owe a debt of gratitude to the Sass team for that.

Rebuttals welcome

Did I get something wrong? Is there something great about CSS preprocessors I missed that justifies putting up with all
the crummy things I’ve highlighted here? Am I a doodyhead with a butthole for a face? If you’ve got an opinion and an ax
to grind because this site doesn’t have a comment section, tell me all about it. There’s a solid
chance I’ll update the post with your rebuttal or link to your post.

Oh! Also, while I have you: if you any web development or strategy needs,
please check out Solve it once, my Drupal-focused web dev shop.
]]></description>
      <content:encoded><![CDATA[<p>As I am wont to do, <a href="https://www.reddit.com/r/webdev/comments/13z6amn/comment/jmqujfa/?context=3">I expressed an opinion on reddit and started a debate</a>
about a niche tech topic. Much like the topic, <a href="https://sass-lang.com/">Sass</a> (and similar CSS ‘pre/post-processors’),
the reddit thread got nested to the point of inefficiency, so here’s a bit more breathing room to really explore the topic.</p>

<p>If you were local to the Detroit tech scene around 2013, you know that <a href="https://soundcloud.com/user-788953109/css-preprocessor-debate?si=e235fbdf3a604abeb920643061ac0c56&amp;utm_source=clipboard&amp;utm_medium=text&amp;utm_campaign=social_sharing">10 years ago Vince and I had a public debate about CSS preprocessors</a>,
so this is not the first — but hopefully will be the last — time I’ve engaged folks on this topic.</p>

<p>If I were to coin a <strong>tl;dr</strong> that doesn’t appear anywhere else in these 4000 words, it would be this:
<em class="font-size--1p125em color--third">CSS preprocessors are <strong>productivity theater</strong> and
<strong>technical debt</strong>, plain and simple.</em></p>

<p>Also…</p>

<h2 id="the-descriptor-css-preprocessor-is-incorrect">The descriptor “CSS preprocessor” is incorrect</h2>

<p>I’m grateful to <a href="https://www.reddit.com/user/Scowlface/">u/Scowlface</a> for engaging with me in good faith. The one mistake
they made, in my eyes, is asking, “Okay, first, why be so pedantic?”, and then claiming:</p>

<blockquote>
  <p>“And it’s not a “css generator”, it’s a CSS preprocessor.”</p>
</blockquote>

<p>By golly my new acquaintance <em>Scowlface</em>, <strong>I have not yet begun to be <em>pedantic</em></strong>!</p>

<p>The existence of a CSS preprocessor like Sass or a postprocessor like PostCSS implies the existence of a middle step, <em>processing</em>,
that is important in some manner or fashion. That’s simply not the case.</p>

<p>Both Sass and PostCSS do all their work before what is inevitably a CSS file getting loaded in a web browser to provide styles
for a web page. You could <em>almost</em> just say PostCSS is a CSS preprocessor, too, and that the processing step is the browser
parsing the CSS and applying the defined styles to the DOM, but as we’ll see shortly, that’s not technically true.</p>

<p>The words people use to describe CSS preprocessors (and more incorrectly, ‘postprocessors’) were made up by the people selling
the software to the development community. Uncritically parroting that terminology not only does nobody any favors, but
in the case of insisting Sass isn’t a “CSS generator” but rather a preprocessor, you’re exchanging a good descriptor for
a crummy one. Tin-pot dictators will tell you they were birthed by the gods on a mountain peak and have gotten all holes-in-one
when golfing — but saying those things do not make them so, and repeating them plays right into their hands.</p>

<p>Sass is not CSS, nor is the more CSS-<em>like</em> SCSS syntax (and the same goes for LESS, Stylus, any non-native PostCSS
plugins, tailwind @apply, etc.). These are all DSLs (Domain-Specific Languages) that are parsed and interpreted <em>into</em> CSS.
This distinction is important because Sass is called a “CSS Preprocessor”, which implies taking CSS, pre-processing it,
and then ending up with pre-processed CSS. But that’s not what happens. A non-CSS language is used to make CSS, hence why
it’s much more accurate to call Sass and its ilk ‘CSS generators’ because that’s what the tools do: they generate CSS from
something else (even if SCSS looks very CSS-y in many ways, the other available syntaxes show that it need not be).</p>

<p>This entire section isn’t important in any real sense, except that if you’re going to accuse me of both being pedantic and
saying something “patently false”, it behooves you to think about the accusations for a second or two.</p>

<h2 id="a-worse-developer-experience">A <em>worse</em> developer experience</h2>

<p>The following example, <strong>like all Sass examples</strong>, is open to criticism for not being a particularly good use of the technology.
The fact that so many Sass examples show bad practices should indicate to you that perhaps something is amiss.</p>

<p>Let’s say you want to generate utility classes for 14 named colors, so you could put <code class="language-plaintext highlighter-rouge">background-color--grey-light</code> on any
element and have a light grey background, plus 13 other theme colors for the same concept.</p>

<p>The resulting CSS in either case will look like this:</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.background-color--black</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#000</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--grey-dark</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#444</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--grey</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#ccc</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--grey-light</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#fafafa</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--white</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#fff</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--main</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#007599</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--main-dark</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#002733</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--main-light</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#ccf4ff</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--second</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#E32416</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--second-dark</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#331716</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--second-light</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#ffcfcc</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--third</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#00838a</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--third-dark</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#003033</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.background-color--third-light</span> <span class="p">{</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="m">#ccfcff</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>In Sass you might use an <a href="https://sass-lang.com/documentation/at-rules/control/each">@each loop</a> that would look like this:</p>

<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$colors</span><span class="p">:</span> <span class="p">(</span><span class="s2">"black"</span><span class="o">:</span> <span class="s2">"#000"</span><span class="o">,</span> <span class="s2">"grey-dark"</span><span class="o">:</span> <span class="s2">"#444"</span><span class="o">,</span> <span class="s2">"grey"</span><span class="o">:</span> <span class="s2">"#ccc"</span><span class="o">,</span> <span class="s2">"grey-light"</span><span class="o">:</span> <span class="s2">"#fafafa"</span><span class="o">,</span> <span class="s2">"white"</span><span class="o">:</span> <span class="s2">"#fff"</span><span class="o">,</span> <span class="s2">"main"</span><span class="o">:</span> <span class="s2">"#007599"</span><span class="o">,</span> <span class="s2">"main-dark"</span><span class="o">:</span> <span class="s2">"#002733"</span><span class="o">,</span> <span class="s2">"main-light"</span><span class="o">:</span> <span class="s2">"#ccf4ff"</span><span class="o">,</span> <span class="s2">"second"</span><span class="o">:</span> <span class="s2">"#E32416"</span><span class="o">,</span> <span class="s2">"second-dark"</span><span class="o">:</span> <span class="s2">"#331716"</span><span class="o">,</span> <span class="s2">"second-light"</span><span class="o">:</span> <span class="s2">"#ffcfcc"</span><span class="o">,</span> <span class="s2">"third"</span><span class="o">:</span> <span class="s2">"#00838a"</span><span class="o">,</span> <span class="s2">"third-dark"</span><span class="o">:</span> <span class="s2">"#003033"</span><span class="o">,</span> <span class="s2">"third-light"</span><span class="o">:</span> <span class="s2">"#ccfcff"</span><span class="p">);</span>

<span class="k">@each</span> <span class="nv">$name</span><span class="o">,</span> <span class="nv">$hex</span> <span class="n">in</span> <span class="nv">$colors</span> <span class="p">{</span>
  <span class="nc">.background-color--</span><span class="si">#{</span><span class="nv">$name</span><span class="si">}</span> <span class="p">{</span>
    <span class="nl">background-color</span><span class="p">:</span> <span class="nv">$hex</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The thing is, and this is true for darn-near anything you want to do in Sass, the toughest and most time-consuming parts
are:</p>

<ol>
  <li>Typing out the map of names and hex codes</li>
  <li>Getting the syntax right for loops and stuff, effectively learning another new language</li>
</ol>

<p>In contrast, with the same map but using regex find/replace in an editor like Sublime Text, you can make the classes one
time and get on with your life:</p>

<figure class="figure figure--image figure--image--map-class-regex-png ">
    
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/map-class-regex.png.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/map-class-regex.png" alt="A Sublime Text editor window with the find/replace open to show a regex transform" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/map-class-regex.png" alt="A Sublime Text editor window with the find/replace open to show a regex transform" loading="lazy" />
      </noscript>
    
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">This basically does what a Sass loop does, but learning regular expressions is useful way beyond CSS, and it only has to run once.</figcaption>
    
  </figure>

<p>This is important because doing it the Sass way has a lot of disadvantages compared to making the classes as plain-old
CSS, <strong>even if you took the time to type them all out rather than regex-ing up a map</strong>:</p>

<ul>
  <li>Sass introduces overhead and delays to your build process</li>
  <li>Sass requires you to sink time into learning its syntax(es)</li>
  <li>With the @each loop, if you find the <code class="language-plaintext highlighter-rouge">background-color--black</code> class on an element via the browser devtools, searching the codebase won’t find anything useful</li>
  <li>Every time you make a change to your styling, <strong>even a trivial one</strong>, Sass has to re-iterate the loop to rebuild those classes</li>
  <li>What happens if there’s a breaking API change at some point? You’re at the mercy of the Sass maintainers</li>
  <li>What happens if the site is live for 5 years and then your client wants to make a change? See the dependency hell section below</li>
  <li>What if you test your site and find that text just on the <code class="language-plaintext highlighter-rouge">second-light</code> background but not the others requires a little <code class="language-plaintext highlighter-rouge">text-shadow</code>?</li>
</ul>

<p>And what’s the benefit of all this inconvenience and overhead? Some zealots might claim that the @each Sass setup lets you
quickly and easily add the 15th and <em>nth</em> background-color class, but, like…</p>

<video controls="" autoplay="" loop="" muted="" name="media" height="354" width="494">
  <source src="/assets/other/fifteenth-class.mp4" type="video/mp4" />
</video>

<p>FFS, copy and paste exists. It doesn’t matter how many items are in the map: looping is guaranteed to lose you time compared
to writing CSS. It’s just tech debt for tech debt’s sake.</p>

<h2 id="weird-attitudes">Weird attitudes</h2>

<p>Judging by all the downvotes I got in the reddit thread and <a href="https://dev.to/robole/do-not-drop-sass-for-css-1ofm">posts like this one by Rob O’Leary on dev.to</a>,
it kind of feels like there’s a cult around Sass. If you use Sass and have a good opinion of it, have you ever taken a critical
eye to it? Do you feel a sunk-cost resistance to abandoning a tool you like and a skill you spent time learning?</p>

<p>The thing I hear people say is something along the lines of “CSS doesn’t have certain features, but Sass adds them in. Sass
makes CSS into something more like a programming language.” You can accuse me of building up a straw man here, but I’ve
heard that exact sentiment a lot. And the problem is, <strong>it’s 100% a misconception: Sass does no such thing</strong>. Sass <em>itself</em>
is like a programming language, sure, but all it ever outputs is plain-old CSS. There’s no escaping that. It doesn’t add
features to CSS or make CSS more like a programming language: <strong>it just generates bloat for you</strong>.</p>

<p>I really don’t know where the mentality comes from, but it’s wild to me. Writing ‘vanilla’ CSS and not having to deal with
the nodejs ecosystem just to style pages is a great feeling, so if you’ve only ever done CSS by way of Sass, I
<strong>strongly encourage you to try modern CSS without the Sass crutch</strong> (and yes, clearly I’ve learned Sass and used it on
many projects throughout the years, so no hypocrisy here in asking you to try something new).</p>

<h2 id="modern-css-is-better-than-the-sass-facsimiles">Modern CSS is better than the Sass facsimiles</h2>

<p>The original comment by <a href="https://www.reddit.com/user/aguycalledmax/">u/aguycalledmax</a> I replied to that started the <em>scowly</em>
exchange said:</p>

<blockquote>
  <p>“Even with nesting coming to native css I really don’t see any reason not to use scss or sass. The DRY and maintainability
benefits of your code far outweigh the imperceptible negatives of a tiny build time on your local machine.”</p>
</blockquote>

<p>We’ll get into why both the DRY/maintainability <em>and</em> build time arguments are hogwash later, but for now I’d like to touch
on why we should wholeheartedly embrace <strong>CSS Nesting</strong> specifically (when browser support is up to snuff for your project)
and wholly abandon the same concept in CSS preprocessors.</p>

<p><a href="https://sass-lang.com/blog/sass-and-native-nesting">Creating a similar example to those from a post on the Sass blog</a>,
here is some nested CSS that’s valid in native CSS now, and is also valid SCSS nesting:</p>

<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.base-class</span> <span class="p">{</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">20px</span><span class="p">;</span>

  <span class="nc">.foo</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="mh">#eee</span><span class="p">;</span>

    <span class="k">&amp;</span><span class="nc">.fighters</span> <span class="p">{</span>
      <span class="nl">color</span><span class="p">:</span> <span class="no">green</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="nc">.bar</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="mh">#ccc</span><span class="p">;</span>

    <span class="k">&amp;</span><span class="nc">.fighters</span> <span class="p">{</span>
      <span class="nl">color</span><span class="p">:</span> <span class="no">red</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="nc">.fizz</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="mh">#fc0</span><span class="p">;</span>

    <span class="nc">.ylifting-drinks</span> <span class="p">{</span>
      <span class="nl">color</span><span class="p">:</span> <span class="mh">#cf0</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="nc">.buzz</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="n">rebeccapurple</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nc">.fizzbuzz</span> <span class="p">{</span>
    <span class="nl">color</span><span class="p">:</span> <span class="mh">#c0ffee</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>In native CSS, the nesting is interpreted with an implicit <code class="language-plaintext highlighter-rouge">:is()</code> wrapping the parent, keeping the selector specificity
very flat, which allows less-specific selectors if/when you need to override any selector. In contrast, all the selectors
generated by Sass in the build step have a specificity of at least 2. This isn’t a big difference for a single level of
nesting, but can <strong>make overriding a <em>lot</em> more pleasant for deeper levels of nesting in native CSS</strong>.</p>

<p>The other factor here is <strong>payload size</strong>. Even prior to minimizing, the CSS example above is <strong>341</strong> characters. That’s
what you’d send over the wire and the size gets no bigger. It could get smaller with minimization and compression, but not
bigger.</p>

<p>In contrast, the Sass build process takes the nesting above and turns it into:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.base-class</span> <span class="p">{</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">20px</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.foo</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="m">#eee</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.foo.fighters</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="no">green</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.bar</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="m">#ccc</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.bar.fighters</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="no">red</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.fizz</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="m">#fc0</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.fizz</span> <span class="nc">.ylifting-drinks</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="m">#cf0</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.buzz</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="n">rebeccapurple</span><span class="p">;</span>
<span class="p">}</span>

<span class="nc">.base-class</span> <span class="nc">.fizzbuzz</span> <span class="p">{</span>
  <span class="nl">color</span><span class="p">:</span> <span class="m">#c0ffee</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The resulting CSS is <strong>383</strong> characters, or <strong>12.3% larger</strong>. Yes, gzip would be very effective on those repeated base-class
strings, but this is a small, simple example. More nesting makes both the specificity and the payload size issues worse
for Sass.</p>

<p>Similar arguments exist for CSS custom properties, <code class="language-plaintext highlighter-rouge">calc()</code>, <a href="https://www.w3.org/TR/css-color-4/">CSS Color Module Level 4</a>,
and the whole gamut of newer CSS features that have advantages over former Sass features. In the long run
<strong>you benefit from embracing web standards over third-party tools</strong>.</p>

<h2 id="dependency-hell-is-other-people-s-build-steps">Dependency hell is other people… ‘s build steps</h2>

<p>There’s this relief you feel whenever you’ve fought with npm or yarn to install the dependencies you want, then ran your
script successfully to do what you wanted it to. It’s a familiar feeling for anyone who’s ever done computer programming.</p>

<p>But dependencies are introducing technical debt into your project, sometimes to a greater extent than you considered at
first. If you’ve installed Sass and got it working, then done some stylesheet work for a while, then ran into a dependency
issue later, then fixed it to get Sass working again, you may be feeling something more like <strong>Stockholm Syndrome</strong> than
actual satisfaction.</p>

<p>With vanilla CSS, you can make a file named <code class="language-plaintext highlighter-rouge">styles.css</code> or similar, put some style directives in it, then reference the
file in a <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> tag in the head of your HTML documents, and you’re off to the races. Yes, you can definitely make the
CSS building and attachment process a lot more complicated, but the minimum-viable example is pretty easy.</p>

<p>With Sass you have to do all the aforementioned things, but also:</p>

<ul>
  <li>Install Sass (locally, in dev containers, on remote servers, or perhaps all three)</li>
  <li>Likely use nodejs and npm/nvm/yarn/whatever to bring in bundlers, frameworks, libraries, linters and analysis tools,
watchers, and gosh knows what else</li>
  <li>Glue all your build chain stuff together with scripts</li>
  <li>Learn the Sass syntax</li>
  <li>Run your script over your Sass files, or keep a watcher running</li>
  <li>Wait for Sass to build and your other build process to complete <strong>every time you make a change</strong></li>
  <li>Maintain this dependency chain over the long term, including rewriting the bundler configs to support the new version
of grunt/gulp/webpack/rollup/parcel/etc. when they needlessly change their API once every two years or so</li>
  <li>Document how all of this works, well enough that the next person to join the team only loses a day to setting it up</li>
  <li>Install helpers for your text editor or IDE</li>
  <li>Learn the tricks for searching partial strings to find useful SCSS code, rather than whole strings in regular CSS</li>
  <li>Learn, and continuously navigate, the function/mixin/library/framework Sass version of <em>callback hell</em> where it’s not
clear how a particular CSS declaration inherits various property:value pairs because the Sass feature doing it is 3+
levels deep and probably a million directories deep in <code class="language-plaintext highlighter-rouge">node_modules</code></li>
  <li>Keep up with both new CSS features <em>and</em> changes to Sass/SCSS</li>
</ul>

<p>This is all textbook technical debt. In order for any of it to make any sense, Sass would have to save you a ton of time
and/or produce much better code in order to justify all the time lost doing all the above-listed frustrating junk over the
lifetime of your project. The thing is: <strong>there is no way you’re making the time back up</strong>. You’re gonna lose time messing
around with Sass, and your frontend stack is more brittle for the privilege.</p>

<h3 id="artifact-merge-unpleasantness-is-a-perennial-team-issue">‘Artifact’ merge unpleasantness is a perennial team issue</h3>

<p>At least once in your project you’re gonna have to decide: <strong>should we commit build artifacts?</strong></p>

<p>If you commit generated and minimized CSS output by Sass, the advantage is that you don’t have to set up your servers to
do your front-end build process. Deployment is simpler, faster, and less error-prone. However, committing your build artifacts
is effectively setting yourself up for merge conflicts way more often than with regular CSS, as a team of even two developers
would create conflicting artifacts almost every time they touch the Sass on a feature branch.</p>

<p>If you don’t commit build artifacts, your server will have to be set up to be just as capable as your local machine of building
CSS from your Sass source files. This, of course, is additional overhead just to get stylesheets working, and introduces
its own headaches.</p>

<p>Do you do frontend builds directly from a local machine? Or are you using containerization like docker-compose to have a
local simulation of a server? If you do use a container on your local, is your local dev container the same spec as containers
used for production? If not, then there’s a solid chance that you have <em>at least</em> two different sets of tooling with subtly-different
versions for the various constituent parts.</p>

<p>As frustrating as it can be for the dependencies not to install locally or for a syntax error to fail the build, it’s
<strong>even more frustrating when it works on your machine but fails on the server</strong>. Tracking down what the heck must be different
is a solid way to lose an afternoon. And to reiterate, none of this is required — you’re volunteering to use this optional
tool for some murky reason!</p>

<h3 id="it-aint-gonna-work-later">It ain’t gonna work later</h3>

<p>It’s pretty common for frontend work on a particular site to go quiet for years at a time, then for the site owner to shift
focus and want updates to their existing site. With plain-old CSS you’re sure to encounter some weird old stuff, but you
can be pretty sure it’ll just work. With Sass the opposite is true: <strong>I’m comfortable claiming with 95% certainty that
you’ll spend at least an hour fixing dependency issues before you can get back to writing styles</strong>.</p>

<p>This comes down to both the commonly-paired-with-Sass nodejs ecosystem for build processes being <em>brittle as eff</em> and pretty
irresponsible with notions like backwards compatibility (and yes, I get it, the ecosystem is getting more mature, and it’s
not exactly fair to say it’s Sass’s or node’s problem if gulp changes their config format every five minutes) <em>and</em> with
the coin toss of whether your project was set up with the Ruby version of Sass, the C/C++ version, or the Dart one.</p>

<p>It’s easy to brush this concern aside, since the pain won’t be until 5 years later, but it’s something you should know before
you sign up: as surely as the Sun will rise tomorrow, you will spend a significant fraction of your Sass-ing time getting
it to work anew when you revisit an older project. It will take up a lot of your time and it will likely be unpleasant.</p>

<h3 id="death-by-a-thousand-builds">Death by a thousand builds</h3>

<p>The beginning of this section already touched on how choosing Sass is signing up for more setup time, learning, and overall
difficulty than using plain CSS. One last point along those lines is the relatively-small slowdown of having your stylesheets
build whenever you make a change to your Sass source.</p>

<p>The site you’re reading this post on uses a static site generator, Jekyll, to put the pages together when the code is deployed
or during development when any file is modified and saved. Fully building the site can take between 10 and 30 seconds today,
with the amount of content and assets the site builder has to process (perhaps ironically, the stylesheets <em>technically</em>
get processed by Sass, as Jekyll kind of makes you do that, even though the SCSS file contains vanilla CSS).</p>

<p>20-ish seconds is a long time to wait to be able to look in my browser window and see the changes reflected on the dev site.
The thing is, most of the activities like writing a blog post take a lot of time in the text editor between reloads. With
CSS, often you’re writing a line or two and then checking your work, since the little increments and test tweaks all build
on each other. When you’re changing two or three lines over the course of 30 seconds, an extra build time for Sass to complete
of a second or two (hopefully not more!) quickly adds up.</p>

<p>Any one build feels imperceptible, and might be a <em>welcome</em> micro-break similar to the old-school trope of getting coffee
while your code compiles. But taken in the aggregate, and especially combined with the startup and maintenance costs of
using Sass, those build times turn into significant productivity loss.</p>

<p>Again, you’d have to see time savings in another way, or benefit significantly from code quality improvements, to justify
the kind of time lost to all this setup and waiting. <strong>Somebody please show me the benefit. Please email me with a good
example that makes this make sense!</strong></p>

<h2 id="many-sass-features-encourage-bad-behavior">Many Sass features encourage bad behavior</h2>

<p>Much of what I argue in this section is predicated on one simple principle: <em>The less CSS sent over the wire the better</em>.
Writing CSS directly and <strong>seeing exactly what you’re serving the user is helpful</strong> toward avoiding bloat, technical debt,
and bad practices. In contrast, using Sass’s leaky abstractions more often than not means never seeing the mess it’s making
on your behalf.</p>

<p>One of <em>Scowlface</em>’s last arguments went like this:</p>

<blockquote>
  <p>“If your argument is that since sass outputs css, that you can just write the css that sass would output, then yeah, sure,
obviously. But it’s not as easy, and that’s the entire purpose of sass. That’s like saying, “don’t use PHP, just write
C. Why write C when you can just do it in assembly? All these higher level languages just add bloat and slow down your
program.”</p>
</blockquote>

<p>I see a few big problems with this line of reasoning:</p>

<ul>
  <li>Why is there <strong>merit</strong> in making it <em>easy</em> to generate CSS that’s necessarily more bloated than if you had written it directly?</li>
  <li>There are absolutely times when you’d want to choose Assembly over C, and even more for C over PHP. Not every circumstance,
but when performance and executable size are important, for sure. Love and respect to developers writing in low-level languages</li>
  <li>Vanilla CSS vs. Sass is not an apples-to-apples comparison to C vs. PHP. CSS is a stylesheet language that only has
Turing-complete features incidentally rather than being intended as a programming language in the usual sense (please
note I’m not making a gatekeeping argument here — folks who write CSS are <em>developers</em> for sure. Y’all are my people!),
so Sass cannot and should not be considered a higher-level language than CSS: Sass does something entirely different
than what CSS does</li>
  <li>Sass is only <em>easy</em> if you’ve already learned it and sunk the time into setting it up, <strong>two things that are <em>hard</em></strong>.
From scratch it’s a tremendous hassle compared to just writing CSS</li>
</ul>

<p>Let’s look at Sass’s feature set with the less-is-more concept in mind, and a healthy appreciation for utility-first architecture
that keeps your project’s specificity graph nice and flat.</p>

<h3 id="flow-control">Flow control</h3>

<p><a href="https://sass-lang.com/documentation/syntax/structure">See the Sass docs for an index of flow control items</a></p>

<p>Variables and conditionals, plus other primitives, all define logic that operates entirely within the Sass context rather
than the resultant CSS.</p>

<p>These features are all <em>inside baseball</em> and can give you a deceptive impression of what the tool is doing. They’re helpful,
insofar as if you’re using Sass you need these primitives to accomplish anything, but are useless outside of Sass because
they’re build-time resources rather than render-time.</p>

<p>To go back to an earlier example, you could use an <code class="language-plaintext highlighter-rouge">@if</code> to put a text shadow on just the <code class="language-plaintext highlighter-rouge">second-light</code> background-color
utility class. It would really ugly up that <code class="language-plaintext highlighter-rouge">@each</code> loop, and would require more time and effort than just pasting the
text-shadow property:value pair into the class in plain CSS. And note: no trace of the <code class="language-plaintext highlighter-rouge">@if</code> would show up in the CSS. Not
to sound like a broken record, but Sass features aren’t CSS features — they only exist to generate plain old CSS.</p>

<p>By comparison, CSS custom properties — or CSS <em>variables</em> as they’re commonly known — work in the render context, making
them useful and interchangeable between systems. Similarly, the <code class="language-plaintext highlighter-rouge">calc()</code> and other functions, plus render-time CSS flow
control structures like <code class="language-plaintext highlighter-rouge">@supports</code> and <code class="language-plaintext highlighter-rouge">@media</code> accomplish what’s needed in real-world styling.</p>

<p>These flow control features aren’t actively harmful like some of the following examples, but they certainly help enable
accomplishing bad things.</p>

<h3 id="nesting">Nesting</h3>

<p>See the “Modern CSS…” section above.</p>

<p>The <strong>entire purpose</strong> of nesting is to write something succinct that generates way more code than you wrote. It also,
by definition, is a way to chain specificity, which is also a <em>questionable thing to do</em> when a utility-first approach keeps
your CSS payload small and makes overriding easier. The whole feature (moreso in Sass than the new native CSS equivalent)
encourages you to do something bad.</p>

<h3 id="mixins-and-extend">Mixins and @extend</h3>

<p>A blockquote earlier in this post alluded to DRY (Don’t Repeat Yourself) and maintainability benefits of using Sass over
vanilla CSS. Both <code class="language-plaintext highlighter-rouge">@mixin</code> and <code class="language-plaintext highlighter-rouge">@extend</code> illustrate how being DRY in Sass makes your CSS very… <em>wet?</em> Well, whatever you’d
call it, these features make it really easy to irresponsibly duplicate code in your CSS. <code class="language-plaintext highlighter-rouge">@extend</code> is also a good example
of how maintainability is an illusion.</p>

<p>In the reddit thread, I gave as an example a mixin for applying an old-school clearfix (which in the age of flexbox and
grid is far more of an edge case than years ago), which <em>Scowlyface</em> dismissed as a “bad example”. Keeping my pedantic streak
alive, <a href="https://github.com/search?q=%22%40mixin+clearfix%22++path%3A*.scss&amp;type=Code&amp;ref=advsearch&amp;l=&amp;l=">by the GitHub search numbers I’d rebut that it’s a <em>good</em> example</a>
of how Sass features are commonly used to do <em>bad</em> things.</p>

<p><em>Scowlyface</em> was right that <code class="language-plaintext highlighter-rouge">clearfix</code> should be a utility class that gets applied in markup where needed, rather than repeating
the same property:value pairs and pseudo-elements all over the codebase. This is a classic trap, of course, since the <code class="language-plaintext highlighter-rouge">@mixin</code>
and <code class="language-plaintext highlighter-rouge">@extend</code> features are <em>only</em> useful for duplicating the output code while giving the illusion of not repeating yourself
if you only look at the Sass source. You simply can’t provide a good example where duplicating code in this manner would
result in a healthier CSS codebase.</p>

<p>When applying a <code class="language-plaintext highlighter-rouge">clearfix</code> class would require clicking around your IDE sidebar to find the directory holding the correct
application logic or template file and then pasting the class in the correct place, then testing that the class is applied
and the styles are working, if you’re already looking at the nested code block for the <code class="language-plaintext highlighter-rouge">.new-container</code> declaration and
can’t be bothered to click, copy, <em>and</em> paste in another file, the lazy developer will be happy to throw a</p>

<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">@include</span> <span class="nd">clearfix</span><span class="p">;</span>
</code></pre></div></div>

<p>…at the problem and call it a day. Nevermind that at best it’s making a big comma-separated list of selectors that should
all repeat the same code, and at worst is repeating the same combinations of properties and values in pseudo-elements
all over the output CSS, because it ‘saved’ the developer precious time versus doing the job correctly.</p>

<p>Moreover, these features are among the Sass features that obfuscate the source of style directives, requiring a loss of
time for developer to track how many mixins and functions deep you have to go and how many variables and parameters you
have to parse (being mindful of the variables’ scope, of course!) just to find where a particular line of output is coming
from. Time-savers these features are not.</p>

<figure class="figure figure--image figure--image--mixin-docs-png box-shadow--lifted-edges">
    
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/mixin-docs.png.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/mixin-docs.png" alt="Screenshot of the Sass site docs for mixins" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/mixin-docs.png" alt="Screenshot of the Sass site docs for mixins" loading="lazy" />
      </noscript>
    
    
  </figure>

<p>Can you look at the example above and credibly say there’s <em>any</em> advantage to inserting a <code class="language-plaintext highlighter-rouge">@mixin</code> to make three little
classes? Isn’t the CSS on its own a lot easier to understand and work with? Why on earth would you do this to yourself
willingly?</p>

<p>With <code class="language-plaintext highlighter-rouge">@extend</code>, additionally, you’re often declaring an unenforced dependency. Let’s say you have a class,</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.padded-box</span> <span class="p">{</span>
  <span class="nl">padding</span><span class="p">:</span> <span class="m">20px</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>and then in your SCSS later you want to make a padded box that has some more properties:</p>

<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.fancy-padded-box</span> <span class="p">{</span>
  <span class="k">@extend</span> <span class="nc">.padded-box</span><span class="p">;</span>
  <span class="nl">background-color</span><span class="p">:</span> <span class="mh">#ffccff</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Depending on how you have your SCSS structured, <code class="language-plaintext highlighter-rouge">.fancy-padded-box</code> might be <em>miles</em> away from the original <code class="language-plaintext highlighter-rouge">.padded-box</code>.
If a new member of the team sees the original <code class="language-plaintext highlighter-rouge">.padded-box</code> declaration and searches the markup for usages, not finding
any, and decides to delete it, the <code class="language-plaintext highlighter-rouge">.fancy-padded-box</code> class will error out. The new developer might not even see the failure
in their terminal window until an hour or two later, and by that time they’ve made so many changes that the notion of Sass
making the stylesheets less delete-key-friendly will have turned into a lot of time lost adding the extended class back.
<strong>That’s the opposite of a maintainability benefit</strong>.</p>

<h3 id="encouragement-and-a-narrow-use-case">Encouragement and a narrow use case</h3>

<p>This has been a lot of words, many of them very negative, about Sass and other CSS preprocessors. Given that, and that I
bear no ill will toward my fellow humans, I wanted to take a second to acknowledge that the folks who made Sass and have
maintained it for over a decade has done a great thing — and I don’t want to discourage either them or somebody thinking
of releasing their open-source tools in the future. The more tools the better, and for that matter the more debate the
better!</p>

<p>Having gone through lots of features and showing ways they can easily be misused, now might also be a good time to point
out two use cases where using Sass might be a net benefit:</p>

<ol>
  <li><strong>If your codebase is already using Sass</strong>: if you’re maintaining an existing front end, swapping Sass for vanilla
    CSS probably wouldn’t save you time for the remaining life of the frontend. But if you go to re-theme, all bets are off</li>
  <li><strong>If your team makes <em>lots</em> of BEM(-like) components</strong>: personally I see this as something of an anti-pattern, given
    the utility-centric direction frontend development has gone, but big teams with big applications with lots of components
    and <em>especially</em> an existing Sass setup might benefit from the setup. Then again, if you’re doing a BEM or SMACSS kind
    of thing from scratch in 2023, firstly… why? And second, you might consider native CSS nesting instead</li>
</ol>

<p>Lastly, it’s worth noting that the features of CSS preprocessors led the way to many of the CSS standards we embrace today,
so we owe a debt of gratitude to the Sass team for that.</p>

<h2 id="rebuttals-welcome">Rebuttals welcome</h2>

<p>Did I get something wrong? Is there something great about CSS preprocessors I missed that justifies putting up with all
the crummy things I’ve highlighted here? Am I a doodyhead with a butthole for a face? If you’ve got an opinion and an ax
to grind because this site doesn’t have a comment section, <a href="mailto:ao5357@gmail.com">tell me all about it</a>. There’s a solid
chance I’ll update the post with your rebuttal or link to your post.</p>

<p><span class="color--third-dark font-size--p875em">Oh! Also, while I have you: if you any web development or strategy needs,
please check out <a href="https://solveitonce.com/">Solve it once</a>, my Drupal-focused web dev shop.</span></p>
]]></content:encoded>
    </item>
  
    <item>
      <title>3 years of Solve it once</title>
      <link>http://bradczerniak.com/blog/so1ve-anniversary/</link>
      <pubDate>Wed, 24 May 2023 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Metal]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/so1ve-anniversary/</guid>
      <description><![CDATA[In February 2020, a month ahead of the lockdowns, I left the world of paychecks, W-2s, and office commutes. At first I had
nothing planned: just take a few weeks to enjoy life and catch up on things around the house.


  














  
  
    
      
        
        
        
          
        
        
      
      
        
      
    
    
      Brad, Shelby, Ellie
    
  



  














  
  
    
      
        
        
        
          
        
        
      
      
        
      
    
    
      The beginnings of wedding invitations
    
  



  














  
  
    
      
        
        
        
          
        
        
      
      
        
      
    
    
      Wedding invitations, closer to finished
    
  



  














  
  
    
      
        
        
        
          
        
        
      
      
        
      
    
    
      Hanging top cabinets before floors and bases
    
  



  














  
  
    
      
        
        
        
          
        
        
      
      
        
      
    
    
      Clicking and locking the floor
    
  



  














  
  
    
      
        
        
        
          
        
        
      
      
        
      
    
    
      Prepping the butcher block counter before staining and install
    
  



  














  
  
    
      
        
        
        
          
        
        
      
      
        
      
    
    
      Kitchens work without trim!
    
  





It didn’t take long for friends to reach out, seeing if I could do some freelance website work, which ended up being
a lot of fun and taking up a decent chunk of April and May 2020 when I wasn’t catching up on Star Trek.

That freelancing experience made me believe I could go into business for myself, so on June 2, 2020, I filed the business
name Solve it once LLC with the State of Michigan and got started trying to drum up clients.

Highlights from 3 years of so1ve

Here are a few cool things that have happened while being my own boss the last few years:


  First client: zenput.com (now a crunchtime brand)
  First full site build: iqstrategix.com
  Did Drupal support for the former version of Bowers &amp;amp; Wilkins, a prominent pro-sumer audio brand, as a subcontract with Human Element
  Embedded full-time with the digital experience team at New York Public Library for 7 months in 2021
  Worked on numerous projects with Provisio Technology Solutions
  Did full-time subcontract work on government sites like Prince George’s County, Maryland and the US Department of Justice for Tactis
  Subcontracted with Casual Astronaut to make a cool STEM teachers site for Arizona State University
  Launched my own website, plus way too many open source projects, like frost


As the highlights show, I’ve spent a decent amount of time embedded on other teams, helping deliver big projects for big
brands. While I love this kind of work, and especially the variety that comes with it, I’m also aiming to build more sites
as Solve it once rather than on somebody else’s team.

My next big thing, outside of client work, is trying to build interest around frost,
an easy-to-use free-and-open-source head start for making excellent Drupal 10 websites:



What Solve it once does

If you or someone you know is in the market for a website or other website-related services, so1ve may be for you:


  Full Drupal (a content management system) websites
  Two-week fixed-fee web development sprints
  Affordable static ‘JAMstack’ websites that are hosted for free
  Annual support plans
  “Drop everything” emergency work
  Consultation, contracting, work by the hour, and sub-contracting


Friends, family, friends of friends, family of friends, and all other permutations can get a 10% discount buying online
using the discount code familyandfriends10 at checkout.

How to help

There are a lot of ways to help out, so I’ve categorized them below, depending on if you’re technical, if I’ve ever done
work for you before, or if you only have a minute or two. Anything you can do helps, and I want to thank you in advance!

If I’ve done work for you before

If I’ve made you a website or done web work for you in the past, you have the power to make the biggest impact to my future
business. Your honest reviews on any of the following sites (please don’t lie or leave a fake review) would be a huge boost:


  Leave a review on Google
  Review on Yelp
  Review on UpCity
  Review on Clutch
  Endorse my skills or leave a recommendation on my personal LinkedIn


If you’re into tech

It’s wild how much software is a popularity contest. Sometimes it feels really tough selling folks on free software! Every
like and share of one of the following project pages could mean the next visitor will see the project as growing in popularity,
rather than just some abandoned repository. Please like, or star, or fork, or otherwise show approval, for any of these
open source projects:


  frost on drupal.org
  frost on github
  follow Solve it once on GitHub
  Or follow my personal GitHub profile
  .github template for organization profiles and defaults
  static website starter, finished-starter
  static resume template with lots of metadata


The last two repos on the list are technically from Lower barriers, a nonprofit started by
me and a couple good friends. We’ve put LB on hiatus for the last few months, but if you’re interested in joining and
participating, please reach out to let me know your interest.

If you only have a minute or two

Likes and follows on various social media sites go a long way for showing legitimacy and juicing the algorithm (or whatever
the kids say these days). If I’ve never done work for you and you don’t know what a GitHub is, leaving a like or a follow
on any or all of these pages would be a massive, quick help.


  Solve it once LinkedIn (I mostly post about lunch and music. HEY, it’s a strategy lol)
  Brad LinkedIn
  Solve it once Facebook
  “Friends of Solve it once” Facebook group (?)
  Solve it once Twitter (abandoned-ish)
  Solve it once YouTube


If you saw this post linked on social media, you can also share it or make your own post linking to this blog, which would
be hero-level awesome.

And of course, any time someone mentions they need a website or web developer, please send them my way: for business use
brad@solveitonce.com and (313) 509-7214.

Thank you very much!
]]></description>
      <content:encoded><![CDATA[<p>In February 2020, a month ahead of the lockdowns, I left the world of paychecks, W-2s, and office commutes. At first I had
nothing planned: just take a few weeks to enjoy life and catch up on things around the house.</p>

<ul class="list-style--none layout--multiple--horizontal">
  














  
  <figure class="figure figure--image figure--image--posts-2023-05-24-so1ve-anniversary-family-jpg ">
    <a href="/assets/images/posts/2023-05-24-so1ve-anniversary/family.jpg">
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/posts/2023-05-24-so1ve-anniversary/family.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/posts/2023-05-24-so1ve-anniversary/family.jpg" alt="Three people smiling" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/posts/2023-05-24-so1ve-anniversary/family.jpg" alt="Three people smiling" loading="lazy" />
      </noscript>
    </a>
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">Brad, Shelby, Ellie</figcaption>
    
  </figure>



  














  
  <figure class="figure figure--image figure--image--posts-2023-05-24-so1ve-anniversary-papercraft-jpg ">
    <a href="/assets/images/posts/2023-05-24-so1ve-anniversary/papercraft.jpg">
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/posts/2023-05-24-so1ve-anniversary/papercraft.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/posts/2023-05-24-so1ve-anniversary/papercraft.jpg" alt="Papercrafts, the beginnings of wedding invitations, on a table" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/posts/2023-05-24-so1ve-anniversary/papercraft.jpg" alt="Papercrafts, the beginnings of wedding invitations, on a table" loading="lazy" />
      </noscript>
    </a>
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">The beginnings of wedding invitations</figcaption>
    
  </figure>



  














  
  <figure class="figure figure--image figure--image--posts-2023-05-24-so1ve-anniversary-invitation-progress-jpg ">
    <a href="/assets/images/posts/2023-05-24-so1ve-anniversary/invitation-progress.jpg">
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/posts/2023-05-24-so1ve-anniversary/invitation-progress.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/posts/2023-05-24-so1ve-anniversary/invitation-progress.jpg" alt="A larger quantity of more-complete wedding invitations on a table" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/posts/2023-05-24-so1ve-anniversary/invitation-progress.jpg" alt="A larger quantity of more-complete wedding invitations on a table" loading="lazy" />
      </noscript>
    </a>
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">Wedding invitations, closer to finished</figcaption>
    
  </figure>



  














  
  <figure class="figure figure--image figure--image--posts-2023-05-24-so1ve-anniversary-0-hanging-cabinets-jpg ">
    <a href="/assets/images/posts/2023-05-24-so1ve-anniversary/0-hanging-cabinets.jpg">
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/posts/2023-05-24-so1ve-anniversary/0-hanging-cabinets.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/posts/2023-05-24-so1ve-anniversary/0-hanging-cabinets.jpg" alt="A kitchen in construction, handing top cabinets" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/posts/2023-05-24-so1ve-anniversary/0-hanging-cabinets.jpg" alt="A kitchen in construction, handing top cabinets" loading="lazy" />
      </noscript>
    </a>
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">Hanging top cabinets before floors and bases</figcaption>
    
  </figure>



  














  
  <figure class="figure figure--image figure--image--posts-2023-05-24-so1ve-anniversary-1-floors-jpg ">
    <a href="/assets/images/posts/2023-05-24-so1ve-anniversary/1-floors.jpg">
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/posts/2023-05-24-so1ve-anniversary/1-floors.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/posts/2023-05-24-so1ve-anniversary/1-floors.jpg" alt="A click-lock laminate floor, mid-installation" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/posts/2023-05-24-so1ve-anniversary/1-floors.jpg" alt="A click-lock laminate floor, mid-installation" loading="lazy" />
      </noscript>
    </a>
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">Clicking and locking the floor</figcaption>
    
  </figure>



  














  
  <figure class="figure figure--image figure--image--posts-2023-05-24-so1ve-anniversary-2-prep-counters-jpg ">
    <a href="/assets/images/posts/2023-05-24-so1ve-anniversary/2-prep-counters.jpg">
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/posts/2023-05-24-so1ve-anniversary/2-prep-counters.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/posts/2023-05-24-so1ve-anniversary/2-prep-counters.jpg" alt="A butcher block counter with a stainless sink fitted" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/posts/2023-05-24-so1ve-anniversary/2-prep-counters.jpg" alt="A butcher block counter with a stainless sink fitted" loading="lazy" />
      </noscript>
    </a>
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">Prepping the butcher block counter before staining and install</figcaption>
    
  </figure>



  














  
  <figure class="figure figure--image figure--image--posts-2023-05-24-so1ve-anniversary-3-mostly-finished-jpg ">
    <a href="/assets/images/posts/2023-05-24-so1ve-anniversary/3-mostly-finished.jpg">
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/posts/2023-05-24-so1ve-anniversary/3-mostly-finished.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/posts/2023-05-24-so1ve-anniversary/3-mostly-finished.jpg" alt="A full kitchen, aside from trim work" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/posts/2023-05-24-so1ve-anniversary/3-mostly-finished.jpg" alt="A full kitchen, aside from trim work" loading="lazy" />
      </noscript>
    </a>
    
      <figcaption class="figcaption figure--image--figcaption position--relative z-index--1">Kitchens work without trim!</figcaption>
    
  </figure>



</ul>

<p>It didn’t take long for friends to reach out, seeing if I could do some freelance website work, which ended up being
a lot of fun and taking up a decent chunk of April and May 2020 when I wasn’t catching up on Star Trek.</p>

<p>That freelancing experience made me believe I could go into business for myself, so on June 2, 2020, I filed the business
name <a href="https://solveitonce.com/">Solve it once LLC</a> with the State of Michigan and got started trying to drum up clients.</p>

<h2 id="highlights-from-3-years-of-so1ve">Highlights from 3 years of so1ve</h2>

<p>Here are a few cool things that have happened while being my own boss the last few years:</p>

<ul>
  <li>First client: <a href="https://www.zenput.com/">zenput.com</a> (now a crunchtime brand)</li>
  <li>First full site build: <a href="https://www.iqstrategix.com/">iqstrategix.com</a></li>
  <li>Did Drupal support for the former version of <a href="https://www.bowerswilkins.com/en-us/">Bowers &amp; Wilkins</a>, a prominent pro-sumer audio brand, as a subcontract with <a href="https://www.human-element.com/">Human Element</a></li>
  <li>Embedded full-time with the digital experience team at <a href="https://nypl.org">New York Public Library</a> for 7 months in 2021</li>
  <li>Worked on numerous projects with <a href="https://provisiosolutions.com/">Provisio Technology Solutions</a></li>
  <li>Did full-time subcontract work on government sites like Prince George’s County, Maryland and the US Department of Justice for <a href="https://www.tactis.com/">Tactis</a></li>
  <li>Subcontracted with <a href="https://casualastronaut.com/">Casual Astronaut</a> to make a cool <a href="https://stemteachers.asu.edu/">STEM teachers site for Arizona State University</a></li>
  <li>Launched my own website, plus way too many open source projects, like <a href="https://www.frostdrupal.com/">frost</a></li>
</ul>

<p>As the highlights show, I’ve spent a decent amount of time embedded on other teams, helping deliver big projects for big
brands. While I love this kind of work, and especially the variety that comes with it, I’m also aiming to build more sites
as <em>Solve it once</em> rather than on somebody else’s team.</p>

<p>My next big thing, outside of client work, is <a href="https://www.frostdrupal.com/page/pitch-burgh-frost-drupal-2023">trying to build interest around frost</a>,
an easy-to-use free-and-open-source head start for making excellent Drupal 10 websites:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/CkmY1kb6vq8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<h3 id="what-solve-it-once-does">What Solve it once does</h3>

<p>If you or someone you know is in the market for a website or other website-related services, <a href="https://solveitonce.com/">so1ve may be for you</a>:</p>

<ul>
  <li>Full Drupal (a content management system) websites</li>
  <li>Two-week fixed-fee web development sprints</li>
  <li>Affordable static ‘JAMstack’ websites that are hosted for free</li>
  <li>Annual support plans</li>
  <li>“Drop everything” emergency work</li>
  <li>Consultation, contracting, work by the hour, and sub-contracting</li>
</ul>

<p>Friends, family, friends of friends, family of friends, and all other permutations can get a 10% discount buying online
using the discount code <strong>familyandfriends10</strong> at checkout.</p>

<h2 id="how-to-help">How to help</h2>

<p>There are a lot of ways to help out, so I’ve categorized them below, depending on if you’re technical, if I’ve ever done
work for you before, or if you only have a minute or two. Anything you can do helps, and I want to <strong>thank you in advance</strong>!</p>

<h3 id="if-ive-done-work-for-you-before">If I’ve done work for you before</h3>

<p>If I’ve made you a website or done web work for you in the past, you have the power to make the biggest impact to my future
business. Your honest reviews on any of the following sites (please don’t lie or leave a fake review) would be a huge boost:</p>

<ul>
  <li><a href="https://g.page/r/CQ8g-rI1v59rEAI/review">Leave a review on Google</a></li>
  <li><a href="https://yelp.com/biz/solve-it-once-lincoln-park">Review on Yelp</a></li>
  <li><a href="https://upcity.com/profiles/solve-it-once">Review on UpCity</a></li>
  <li><a href="https://clutch.co/profile/solve-it-once#summary">Review on Clutch</a></li>
  <li><a href="https://www.linkedin.com/in/bczerniak/">Endorse my skills or leave a recommendation on my personal LinkedIn</a></li>
</ul>

<h3 id="if-youre-into-tech">If you’re into tech</h3>

<p>It’s wild how much software is a popularity contest. Sometimes it feels really tough selling folks on free software! Every
like and share of one of the following project pages could mean the next visitor will see the project as growing in popularity,
rather than just some abandoned repository. <strong>Please like, or star, or fork, or otherwise show approval, for any of these
open source projects</strong>:</p>

<ul>
  <li><a href="https://www.drupal.org/project/frost">frost on drupal.org</a></li>
  <li><a href="https://github.com/solve-it-once/frost">frost on github</a></li>
  <li><a href="https://github.com/solve-it-once">follow Solve it once on GitHub</a></li>
  <li><a href="https://github.com/ao5357">Or follow my personal GitHub profile</a></li>
  <li><a href="https://github.com/solve-it-once/.github">.github template</a> for organization profiles and defaults</li>
  <li><a href="https://github.com/lowerbarriers/finished-starter">static website starter, finished-starter</a></li>
  <li><a href="https://github.com/lowerbarriers/resume">static resume template</a> with lots of metadata</li>
</ul>

<p>The last two repos on the list are technically from <a href="https://lowerbarriers.org/">Lower barriers</a>, a nonprofit started by
me and a couple good friends. We’ve put LB on hiatus for the last few months, but if you’re interested in joining and
participating, please reach out to let me know your interest.</p>

<h3 id="if-you-only-have-a-minute-or-two">If you only have a minute or two</h3>

<p>Likes and follows on various social media sites go a long way for showing legitimacy and juicing the algorithm (or whatever
the kids say these days). If I’ve never done work for you and you don’t know what a GitHub is, leaving a like or a follow
on any or all of these pages would be a massive, quick help.</p>

<ul>
  <li><a href="https://www.linkedin.com/company/solve-it-once/">Solve it once LinkedIn</a> (I mostly post about lunch and music. <strong>HEY</strong>, it’s <em>a strategy</em> lol)</li>
  <li><a href="https://www.linkedin.com/in/bczerniak/">Brad LinkedIn</a></li>
  <li><a href="https://www.facebook.com/solveitonce">Solve it once Facebook</a></li>
  <li><a href="https://www.facebook.com/groups/577465529837377">“Friends of Solve it once” Facebook group</a> (?)</li>
  <li><a href="https://twitter.com/solveitoncellc">Solve it once Twitter</a> (abandoned-ish)</li>
  <li><a href="https://www.youtube.com/@solveitonce">Solve it once YouTube</a></li>
</ul>

<p>If you saw this post linked on social media, you can also share it or make your own post linking to this blog, which would
be hero-level awesome.</p>

<p>And of course, any time someone mentions they need a website or web developer, please send them my way: for business use
<a href="mailto:brad@solveitonce.com">brad@solveitonce.com</a> and (313) 509-7214.</p>

<p><strong>Thank you very much</strong>!</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Coming soon</title>
      <link>http://bradczerniak.com/blog/coming-soon/</link>
      <pubDate>Mon, 10 Apr 2023 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Metal]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/coming-soon/</guid>
      <description><![CDATA[Things have been busy!

So busy, in fact, that despite re-platforming this site to use finished-starter
in 2020, I haven’t truly posted anything new since 2014. This post isn’t exactly a means of catching up on the last 9 years,
but is a commitment to post far more frequently.

The next post, likely in the next 2 weeks, will assuredly be an overview of my business’s website once launched, with a
call to action: to help me get the word out about our affordable Drupal 10 websites. For now, though, if you somehow still
have this feed in your reader, first: thank you! I guess this is hello.

Hi! Talk to you soon.

Btw, I’ve added an About page. It’s pretty barebones for the time being, but I’d love to know what you’d like
to see there. Hit me up at ao5357@gmail.com with suggestions.
]]></description>
      <content:encoded><![CDATA[<p>Things have been busy!</p>

<p>So busy, in fact, that despite re-platforming this site to use <a href="https://github.com/lowerbarriers/finished-starter">finished-starter</a>
in 2020, I haven’t truly posted anything new since 2014. This post isn’t exactly a means of catching up on the last 9 years,
but is a commitment to post far more frequently.</p>

<p>The next post, likely in the next 2 weeks, will assuredly be an overview of my business’s website once launched, with a
call to action: to help me get the word out about our affordable Drupal 10 websites. For now, though, if you somehow still
have this feed in your reader, first: thank you! I guess this is hello.</p>

<p>Hi! Talk to you soon.</p>

<p>Btw, I’ve added <a href="/about/">an About page</a>. It’s pretty barebones for the time being, but I’d love to know what you’d like
to see there. Hit me up at <a href="mailto:ao5357@gmail.com">ao5357@gmail.com</a> with suggestions.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Development Favicon</title>
      <link>http://bradczerniak.com/blog/development-favicon/</link>
      <pubDate>Wed, 05 Feb 2014 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Technologyl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/development-favicon/</guid>
      <description><![CDATA[Originally posted on my blog at Commercial Progression.

tl;dr


  Install the Development favicon extension in the Chrome webstore
  The code on GitHub


Or read about the extension below.

About

Here at Commercial Progression we live in a bunch of environments: our local development environment, the staging ecosystem,
the QA habitat, and of course production. It’s a pretty common thing for website developers; your setup is probably similar.

If you have a whole bunch of tabs open, it’s often difficult to tell which tabs are which. You might have three different
versions of the same site open, and the only way to tell the difference is to click into the tab and look at the address
bar.

Well that simply won’t do! There’s got to be a better way. Preferably an automated system built on an open source foundation.
That’s where Development Favicon comes in.

Style your favicons
Development favicon lets you select a color and apply one of eight effects (stripes on top, bottom, left, or right, plus
background, replace, cover, and xor-top) to the existing favicon for a given site.

You target sites using Regular Expression match patterns.

This setup lets you create patterns once, and have them apply to each new project (assuming the projects have a common
pattern). If all your local sites end in “.local”, you can add a green stripe to the top in 10 seconds and have it work
from now on. Same goes for staging. Sometimes production too.

The settings page (accessible from chrome://extensions) uses the HTML5 color picker, and features
a slick drag-and-drop interface. Your settings get saved as you enter them, and they work wherever you’re signed into
Chrome.

###Recipes

Here are some ideas for favicons you could colorize:

  MatchExample URLPattern

  Local sitehttp://example.local/.*\.local.*
  Staging sitehttp://stage.example.com/.*stage\..*
  Second Google accounthttps://www.google.com/voice/b/1.*google.*\/[bru]\/1.*
  IP Address198.168.1.1.*?\/\/[\d]{1,4}\.[\d]{1,4}\.[\d]{1,4}\.[\d]{1,4}.*


###Contribute
The source code for Development Favicon is completely open and available on GitHub.
If you’d like to contribute back to the project, we’re open to pull requests.

Looking for expert Drupal website design and development?
Learn more about Commercial Progression.
]]></description>
      <content:encoded><![CDATA[<p>Originally posted on <a href="https://www.commercialprogression.com/post/development-favicon">my blog at Commercial Progression</a>.</p>

<h3 id="tldr">tl;dr</h3>

<ul>
  <li><a href="https://chrome.google.com/webstore/detail/development-favicon/pdfbbnojibegcfdmhcccicmllbbkpeaf">Install the Development favicon extension in the Chrome webstore</a></li>
  <li><a href="https://github.com/ao5357/development_favicon">The code on GitHub</a></li>
</ul>

<p>Or read about the extension below.</p>

<h3 id="about">About</h3>

<p>Here at Commercial Progression we live in a bunch of environments: our local development environment, the staging ecosystem,
the QA habitat, and of course production. It’s a pretty common thing for website developers; your setup is probably similar.</p>

<p>If you have a whole bunch of tabs open, it’s often difficult to tell which tabs are which. You might have three different
versions of the same site open, and the only way to tell the difference is to click into the tab and look at the address
bar.</p>

<p>Well that simply won’t do! There’s got to be a better way. Preferably an automated system built on an open source foundation.
That’s where <a href="https://chrome.google.com/webstore/detail/pdfbbnojibegcfdmhcccicmllbbkpeaf">Development Favicon</a> comes in.</p>

<h3 id="style-your-favicons">Style your favicons</h3>
<p>Development favicon lets you select a color and apply one of eight effects (stripes on top, bottom, left, or right, plus
background, replace, cover, and xor-top) to the existing favicon for a given site.</p>

<p>You target sites using Regular Expression match patterns.</p>

<p>This setup lets you create patterns once, and have them apply to each new project (assuming the projects have a common
pattern). If all your local sites end in “.local”, you can add a green stripe to the top in 10 seconds and have it work
from now on. Same goes for staging. Sometimes production too.</p>

<p>The settings page (accessible from <a href="chrome://extensions">chrome://extensions</a>) uses the HTML5 color picker, and features
a slick drag-and-drop interface. Your settings get saved as you enter them, and they work wherever you’re signed into
Chrome.</p>

<p>###Recipes</p>

<p>Here are some ideas for favicons you could colorize:</p>
<table><thead>
  <tr><th>Match</th><th>Example URL</th><th>Pattern</th></tr>
</thead><tbody>
  <tr><td>Local site</td><td>http://example.local/</td><td>.*\.local.*</td></tr>
  <tr><td>Staging site</td><td>http://stage.example.com/</td><td>.*stage\..*</td></tr>
  <tr><td>Second Google account</td><td>https://www.google.com/voice/b/1</td><td>.*google.*\/[bru]\/1.*</td></tr>
  <tr><td>IP Address</td><td>198.168.1.1</td><td>.*?\/\/[\d]{1,4}\.[\d]{1,4}\.[\d]{1,4}\.[\d]{1,4}.*</td></tr>
</tbody></table>

<p>###Contribute
The source code for Development Favicon is completely open and <a href="https://github.com/ao5357/development_favicon">available on GitHub</a>.
If you’d like to contribute back to the project, we’re open to pull requests.</p>

<p>Looking for expert Drupal website design and development?
<a href="http://www.commercialprogression.com/about">Learn more about Commercial Progression</a>.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Flextures</title>
      <link>http://bradczerniak.com/blog/flextures/</link>
      <pubDate>Fri, 28 Dec 2012 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Technologyl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/flextures/</guid>
      <description><![CDATA[Flexible phones are coming soon. At first this could just mean phones will
be more comfortable in your pocket and less prone to shattering, but eventually this is bound to serve a practical purpose.

I believe the ability to flex is an affordance. In the same way that touchscreen
gestures and device orientation-detection have become UI standards, device torsion will enable new ways to interact with
a device.

Device Realities

While flexible displays are a reality, many other device components won’t be practically bendy in the near future. This
leads to two primary design decisions:

Rigid + Flexy

In this model, shown by prototypes at trade shows, one edge of the device is a solid housing for non-flexible components.
The screen emerges from this edge, being the only flexy part of the device. I see this going two ways:


  A rounded base with the screen rolling around it for storage, making a “scroll” when not in use
  Some other, terrible design


Semi-flexy

In this model, the non-flexible components are spaced out underneath the screen somewhat-evenly, and the device’s chassis
limits the amount of flex in order to prevent the non-flexible components from being damaged. This leads to a device that
can bend, but not one you can roll up or crumple.

This is the overwhelmingly better idea. It will be especially practical if the battery (the most volume and mass inside
any given device) can be made flexible. A semi-bendy device still allows for flextures and may be more resistant to damage,
while remaining a familiar and useful form factor

Flexture Types

The variety and complexity of flextures depends on the operating flexible range of a device. Early semi-flexy devices may
only have crude flexture support.

All the flexture types below can be toggled either way; bending either toward or away from the user. Where my imagination
allows, I speculate on common uses for each flexture.

Vertical Bend

If a user bends the device “hamburger style” (assuming a phone form factor that’s taller than it is wide when held the
usual way) toward themselves, this might perhaps trigger the iOS notification pane — or other tasks that might use a top
edge swipe nowadays. Maybe this could become a flexture similar to the “pull-to-refresh” pattern.

There are at least two ways to accomplish a vertical inward bend, each with its own caveats:


  Thumb pressing the center of the screen, index finger pushing the top of the back and pinky pushing the bottom
  One hand grabs the top of the device, the other grabs the other


The first method involves touching the screen, which might interfere with tapping gestures. The second method requires
two hands. Neither of these are show-stoppers necessarily (pinch-to-zoom requires two hands), but they’re an indication
of the care required to implement successful flextures.

The user can also bend the device away from themselves hamburger style. This would almost certainly require two hands. I
could see this as an alternative method to close an app, triggering a split vertical wipe animation from the center of the
screen.

Horizontal Bend

A horizontal bend inwards, especially one biased slightly to the lower end of the device, could be the most-used of all
the flextures. It’s just how you naturally hold the device, so activating this flexture is faster and more natural than
even hitting a button or tapping the screen.

For this reason, it’s important that this be the most-standardized flexture for handheld devices. It should do something
useful and significant, but not distracting in the case of false positives.

I think this flexture should toggle an app’s fly-out menu or navigate OS panes. By design standards, apps and sites will
tend toward menus that wipe in from the side. It should be encouraged by OS makers that menus be fairly static and cached
in memory, allowing them to fly in and out quickly.

A horizontal bend outward might be rare. It really depends on the bezel, use case, etc. Bending different directions likely
won’t indicate on-screen directionality, since bending one way is substantially more tough than bending the other.

Corner-to-corner Twist

If you pinch the top-left corner (with your left hand) and the bottom-right corner and twist your hands in opposite directions,
it will increment/decrement the contextually-approriate volume slider. Turning your right hand left (and left hand right)
will turn down the volume. Turning it right will crank up the volume.

If you pinch the opposite corners and perform a twist, it slides the device brightness. The increase-decrease motion is
always indicated by the bottom corner in a righty-tighty-lefty-loosie fashion.

Individual Corner Bends

Bending individual corners could also trigger certain actions. One cool action would be bending the corner opposite the
camera, thereby taking a picture. It’s cool because not only does it make taking a picture more convenient, but it also
prevents your hand from getting in the way of the lens.

Games

Up to this point I’ve talked about flextures from a conventional UI perspective. A pinch gesture does roughly the same
thing in most apps by convention, for instance, so it’s reasonable to believe there will be conventional flextures. This
isn’t necessarily what happens in games, though…

We’ve seen some pretty cool games that use device orientation: to steer a car or to orient a player in a 3d world. Flextures
can extend these movements and allow for more dimensional movements or even distortion of the virtual worlds. I’m pretty
excited about this aspect.

Torsion Detection

Along with having the ability to flex, a device that uses flextures would also need a sensor to detect the direction(s)
and intensity of the flexing that occurs. Not being an engineer, I have no idea what this would entail. But I assume it’s
something that can be done with current technology for the most part.

I believe torsion detection is a practical necessity for devices. If the device’s gyro is flexed one way, but the rest of
the device is oriented another, the software may orient the screen the wrong direction. The same reasoning also has
implications for compasses and other internals. Only by having the software be aware of flexing activity can the user
experience not be negatively affected. The potential problem is dependent on the physical locations of sensors in the
device, as well as by the overall device size.

tl;dr

It would be pretty cool if flexing your phone different ways was a type of gesture.
]]></description>
      <content:encoded><![CDATA[<p><a href="http://www.bbc.co.uk/news/technology-20526577">Flexible phones are coming soon</a>. At first this could just mean phones will
be more comfortable in your pocket and less prone to shattering, but eventually this is bound to serve a practical purpose.</p>

<p>I believe the ability to flex is an <a href="http://en.wikipedia.org/wiki/Affordance">affordance</a>. In the same way that touchscreen
gestures and device orientation-detection have become UI standards, device torsion will enable new ways to interact with
a device.</p>

<h3 id="device-realities">Device Realities</h3>

<p>While flexible displays are a reality, many other device components won’t be practically bendy in the near future. This
leads to two primary design decisions:</p>

<h4 id="rigid--flexy">Rigid + Flexy</h4>

<p>In this model, shown by prototypes at trade shows, one edge of the device is a solid housing for non-flexible components.
The screen emerges from this edge, being the only flexy part of the device. I see this going two ways:</p>

<ul>
  <li>A rounded base with the screen rolling around it for storage, making a “scroll” when not in use</li>
  <li>Some other, terrible design</li>
</ul>

<h4 id="semi-flexy">Semi-flexy</h4>

<p>In this model, the non-flexible components are spaced out underneath the screen somewhat-evenly, and the device’s chassis
limits the amount of flex in order to prevent the non-flexible components from being damaged. This leads to a device that
can bend, but not one you can roll up or crumple.</p>

<p>This is the overwhelmingly better idea. It will be especially practical if the battery (the most volume and mass inside
any given device) can be made flexible. A semi-bendy device still allows for flextures and may be more resistant to damage,
while remaining a familiar and useful form factor</p>

<h3 id="flexture-types">Flexture Types</h3>

<p>The variety and complexity of flextures depends on the operating flexible range of a device. Early semi-flexy devices may
only have crude flexture support.</p>

<p>All the flexture types below can be toggled either way; bending either toward or away from the user. Where my imagination
allows, I speculate on common uses for each flexture.</p>

<h4 id="vertical-bend">Vertical Bend</h4>

<p>If a user bends the device “hamburger style” (assuming a phone form factor that’s taller than it is wide when held the
usual way) toward themselves, this might perhaps trigger the iOS notification pane — or other tasks that might use a top
edge swipe nowadays. Maybe this could become a flexture similar to the “pull-to-refresh” pattern.</p>

<p>There are at least two ways to accomplish a vertical inward bend, each with its own caveats:</p>

<ol>
  <li>Thumb pressing the center of the screen, index finger pushing the top of the back and pinky pushing the bottom</li>
  <li>One hand grabs the top of the device, the other grabs the other</li>
</ol>

<p>The first method involves touching the screen, which might interfere with tapping gestures. The second method requires
two hands. Neither of these are show-stoppers necessarily (pinch-to-zoom requires two hands), but they’re an indication
of the care required to implement successful flextures.</p>

<p>The user can also bend the device away from themselves hamburger style. This would almost certainly require two hands. I
could see this as an alternative method to close an app, triggering a split vertical wipe animation from the center of the
screen.</p>

<h4 id="horizontal-bend">Horizontal Bend</h4>

<p>A horizontal bend inwards, especially one biased slightly to the lower end of the device, could be the most-used of all
the flextures. It’s just how you naturally hold the device, so activating this flexture is faster and more natural than
even hitting a button or tapping the screen.</p>

<p>For this reason, it’s important that this be the most-standardized flexture for handheld devices. It should do something
useful and significant, but not distracting in the case of false positives.</p>

<p>I think this flexture should toggle an app’s fly-out menu or navigate OS panes. By design standards, apps and sites will
tend toward menus that wipe in from the side. It should be encouraged by OS makers that menus be fairly static and cached
in memory, allowing them to fly in and out quickly.</p>

<p>A horizontal bend outward might be rare. It really depends on the bezel, use case, etc. Bending different directions likely
won’t indicate on-screen directionality, since bending one way is substantially more tough than bending the other.</p>

<h4 id="corner-to-corner-twist">Corner-to-corner Twist</h4>

<p>If you pinch the top-left corner (with your left hand) and the bottom-right corner and twist your hands in opposite directions,
it will increment/decrement the contextually-approriate volume slider. Turning your right hand left (and left hand right)
will turn down the volume. Turning it right will crank up the volume.</p>

<p>If you pinch the opposite corners and perform a twist, it slides the device brightness. The increase-decrease motion is
always indicated by the bottom corner in a righty-tighty-lefty-loosie fashion.</p>

<h4 id="individual-corner-bends">Individual Corner Bends</h4>

<p>Bending individual corners could also trigger certain actions. One cool action would be bending the corner opposite the
camera, thereby taking a picture. It’s cool because not only does it make taking a picture more convenient, but it also
prevents your hand from getting in the way of the lens.</p>

<h3 id="games">Games</h3>

<p>Up to this point I’ve talked about flextures from a conventional UI perspective. A pinch gesture does roughly the same
thing in most apps by convention, for instance, so it’s reasonable to believe there will be conventional flextures. This
isn’t necessarily what happens in games, though…</p>

<p>We’ve seen some pretty cool games that use device orientation: to steer a car or to orient a player in a 3d world. Flextures
can extend these movements and allow for more dimensional movements or even distortion of the virtual worlds. I’m pretty
excited about this aspect.</p>

<h3 id="torsion-detection">Torsion Detection</h3>

<p>Along with having the ability to flex, a device that uses flextures would also need a sensor to detect the direction(s)
and intensity of the flexing that occurs. Not being an engineer, I have no idea what this would entail. But I assume it’s
something that can be done with current technology for the most part.</p>

<p>I believe torsion detection is a practical necessity for devices. If the device’s gyro is flexed one way, but the rest of
the device is oriented another, the software may orient the screen the wrong direction. The same reasoning also has
implications for compasses and other internals. Only by having the software be aware of flexing activity can the user
experience not be negatively affected. The potential problem is dependent on the physical locations of sensors in the
device, as well as by the overall device size.</p>

<h3 id="tldr">tl;dr</h3>

<p>It would be pretty cool if flexing your phone different ways was a type of gesture.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Why Are We CSS-ing All Stupid?</title>
      <link>http://bradczerniak.com/blog/questioning-css-practices/</link>
      <pubDate>Thu, 27 Dec 2012 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Web Designl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/questioning-css-practices/</guid>
      <description><![CDATA[When evaluating a CSS methodology or new tool, I tend to ask questions:


  Does this create better designs?
  Does it help me work faster?
  Does it produce cross-compatible styles?
  Does it fit into my current workflow?
  Does it avoid sprawling stylesheets?
  Does it use selectors sensibly?


In keeping up with tons of CSS-related blogs, I’ve learned about techniques that seem like good ideas on the surface, but
which often fall short in the questionnaire.

OOCSS is kind of just status updates

OOCSS itself was branded “CSS Circa 2009” by its creator. In 2009, we were on the cusp of HTML5/CSS3, and perhaps a majority
of web designers still fretted over IE6 backwards-compatibility. As we approach 2013, it’s probably a good idea to revisit
both the conceptual framework and the CSS framework it spawned.

To me, the biggest takeaway of OOCSS is the media class. This is a class for a block element that tends to hold a thumbnail
along with some text. It literally came from (re-)designing the boxes in facebook’s timeline. It’s often paired with comments,
likes, or other attachments. Media-classed elements can be extended and augmented with multiple classes for particular
applications. The innards of such elements can be targeted for further customization.

The media construct stems from the OOCSS recommendation to use classes near-universally. This allows an input of type
“button” and an anchor to both take the same class and benefit from common styling. However, it also decouples the document
semantics from the stylistic semantics, leading to lots of redundant classes in the HTML rather than redundant styles in
the CSS.

What we’ve found in the mean time, from the HTML5 camp, are elements specified to enhance document semantics. Likewise,
WAI-ARIA allows us to take HTML elements and assign role-based semantics (among other cool things ARIA does). The
&amp;lt;article&amp;gt; tag, for instance, is a suitable container for design projects that require a box like the media class. When
a style convention with arguable semantics appears, it’s probably time for a new HTML element

In the OOCSS Google Group,
stubbornella explained that designing the wrapper for a site isn’t necessarily where OOCSS shines.
OOCSS, by merit of OOP principles, is most useful for reusable elements; which tend to be in the main content area of a
page. This is a perfectly-reasonable way to do your CSS, but it limits the purview of OOCSS principles.

Preprocessors are unhelpful

Look at the home pages for all the common CSS preprocessors. They all advertise auto-nesting rules. This might give you
the impression that nesting is a good or useful practice. It is not, for two reasons:


  Overly-qualified selectors aren’t necessary for inheritance in the cascade
  Nesting is an incredibly leaky abstraction


Another issue is one of workflow. If you design and tweak using Firebug or Chrome DevTools, a preprocessor’s generated
styles may not match up with the line numbers in the inspector. And if you make a change, you often have to translate it
into the new syntax before putting it in your stylesheet. By avoiding a preprocessor altogether, what you see is what you
get.

Stylus fucks with the syntax just for the fuck of it.

In most cases the right tool isn’t a preprocessor, it’s a text expander.

Bootstrap makes no sense whatsoever

If you’re prototyping but (as many claim) should restart from scratch for production, what’s the point?

Elements ship with default styles for a reason

Goes to obscene lengths to avoid semicolons in JavaScript (not a CSS thing, but is dumb)

A fool with a tool is still a fool — and it shows in the shoddy one-off sites made in bootstrap

H5BP gets it most right

Normalize, then extend

Quick note: you really only need/want 1 apple-touch-icon.png in most cases

The One-size-fits-all Answer for CSS Development

Start with a normalization stylesheet and HTML slug

With media queries for mobile-first responsiveness

With media query for print

With basic layout (role=”main” and HTML5 elements)

Take H5BP’s advice and get friendly with backspace — delete the conditional-comment head and modernizr if you’re not using
it

Implement, then fight, your layout

Layouts aren’t always easy

Remember to pad the main container for thumb scrolling on mobiles

Grids help some people, but are they truly a time-saver?

Set ‘skin’ defaults at the base tag level and try not to override

Avoid classes in favor of tags &amp;gt; roles &amp;gt; other attr

This might sound contrary to other advice, but it’s meant to make you think about semantics. Anyone who tells you classes
should be semantic isn’t really thinking about semantics at the right level

If you have fewer rules, individual selector performance is less of a concern

The cascade should be used mostly/only for special cases
]]></description>
      <content:encoded><![CDATA[<p>When evaluating a CSS methodology or new tool, I tend to ask questions:</p>

<ul>
  <li>Does this create better designs?</li>
  <li>Does it help me work faster?</li>
  <li>Does it produce cross-compatible styles?</li>
  <li>Does it fit into my current workflow?</li>
  <li>Does it avoid sprawling stylesheets?</li>
  <li>Does it use selectors sensibly?</li>
</ul>

<p>In keeping up with tons of CSS-related blogs, I’ve learned about techniques that seem like good ideas on the surface, but
which often fall short in the questionnaire.</p>

<h2 id="oocss-is-kind-of-just-status-updates">OOCSS is kind of just status updates</h2>

<p>OOCSS itself was branded “CSS Circa 2009” by its creator. In 2009, we were on the cusp of HTML5/CSS3, and perhaps a majority
of web designers still fretted over IE6 backwards-compatibility. As we approach 2013, it’s probably a good idea to revisit
both the conceptual framework and the CSS framework it spawned.</p>

<p>To me, the biggest takeaway of OOCSS is the media class. This is a class for a block element that tends to hold a thumbnail
along with some text. It literally came from (re-)designing the boxes in facebook’s timeline. It’s often paired with comments,
likes, or other attachments. Media-classed elements can be extended and augmented with multiple classes for particular
applications. The innards of such elements can be targeted for further customization.</p>

<p>The media construct stems from the OOCSS recommendation to use classes near-universally. This allows an input of type
“button” and an anchor to both take the same class and benefit from common styling. However, it also decouples the document
semantics from the stylistic semantics, leading to lots of redundant classes in the HTML rather than redundant styles in
the CSS.</p>

<p>What we’ve found in the mean time, from the HTML5 camp, are elements specified to enhance document semantics. Likewise,
WAI-ARIA allows us to take HTML elements and assign role-based semantics (among other cool things ARIA does). The
<code class="language-plaintext highlighter-rouge">&lt;article&gt;</code> tag, for instance, is a suitable container for design projects that require a box like the media class. When
a style convention with arguable semantics appears, it’s probably time for a new HTML element</p>

<p>In the OOCSS Google Group,
<a href="https://groups.google.com/d/msg/object-oriented-css/wHHQ9ul12v0/ggYjt59o9yoJ">stubbornella explained that designing the wrapper for a site isn’t necessarily where OOCSS shines</a>.
OOCSS, by merit of OOP principles, is most useful for reusable elements; which tend to be in the main content area of a
page. This is a perfectly-reasonable way to do your CSS, but it limits the purview of OOCSS principles.</p>

<h2 id="preprocessors-are-unhelpful">Preprocessors are unhelpful</h2>

<p>Look at the home pages for all the common CSS preprocessors. They all advertise auto-nesting rules. This might give you
the impression that nesting is a good or useful practice. It is not, for two reasons:</p>

<ul>
  <li>Overly-qualified selectors aren’t necessary for inheritance in the cascade</li>
  <li>Nesting is an incredibly leaky abstraction</li>
</ul>

<p>Another issue is one of workflow. If you design and tweak using Firebug or Chrome DevTools, a preprocessor’s generated
styles may not match up with the line numbers in the inspector. And if you make a change, you often have to translate it
into the new syntax before putting it in your stylesheet. By avoiding a preprocessor altogether, what you see is what you
get.</p>

<p>Stylus fucks with the syntax just for the fuck of it.</p>

<p>In most cases the right tool isn’t a preprocessor, it’s a text expander.</p>

<h2 id="bootstrap-makes-no-sense-whatsoever">Bootstrap makes no sense whatsoever</h2>

<p>If you’re prototyping but (as many claim) should restart from scratch for production, what’s the point?</p>

<p>Elements ship with default styles for a reason</p>

<p>Goes to obscene lengths to avoid semicolons in JavaScript (not a CSS thing, but is dumb)</p>

<p>A fool with a tool is still a fool — and it shows in the shoddy one-off sites made in bootstrap</p>

<h2 id="h5bp-gets-it-most-right">H5BP gets it most right</h2>

<p>Normalize, then extend</p>

<p>Quick note: you really only need/want 1 apple-touch-icon.png in most cases</p>

<h2 id="the-one-size-fits-all-answer-for-css-development">The One-size-fits-all Answer for CSS Development</h2>

<p>Start with a normalization stylesheet and HTML slug</p>

<p>With media queries for mobile-first responsiveness</p>

<p>With media query for print</p>

<p>With basic layout (role=”main” and HTML5 elements)</p>

<p>Take H5BP’s advice and get friendly with backspace — delete the conditional-comment head and modernizr if you’re not using
it</p>

<p>Implement, then fight, your layout</p>

<p>Layouts aren’t always easy</p>

<p>Remember to pad the main container for thumb scrolling on mobiles</p>

<p>Grids help some people, but are they truly a time-saver?</p>

<p>Set ‘skin’ defaults at the base tag level and try not to override</p>

<p>Avoid classes in favor of tags &gt; roles &gt; other attr</p>

<p>This might sound contrary to other advice, but it’s meant to make you think about semantics. Anyone who tells you classes
should be semantic isn’t really thinking about semantics at the right level</p>

<p>If you have fewer rules, individual selector performance is less of a concern</p>

<p>The cascade should be used mostly/only for special cases</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Your Fast Catalog</title>
      <link>http://bradczerniak.com/blog/your-fast-catalog/</link>
      <pubDate>Fri, 16 Mar 2012 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Googlel]]></category>
      
        <category><![CDATA[Librariesl]]></category>
      
        <category><![CDATA[Web Designl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/your-fast-catalog/</guid>
      <description><![CDATA[Canton Public Library’s Catalog uses a large
library application called Millennium ILS from Innovative Interfaces,
Inc. Recently, I undertook
to spruce up the images, styles, and JavaScript for our catalog, and in doing
so realized substantial speed increases catalog-wide.

Note: The speed enhancements below are mostly about optimizing files and client-side stuff. You can also speed up your
catalog on the server side with hardware and database optimization, though doing so is likely to require assistance from
Innovative.

Why

Faster-loading pages make users happier. Some speed-enhancing techniques also
increase server performance and decrease the amount of bandwidth used. Page
speed also factors into search engine rankings, though that is less of a
concern for our catalog than our website.

How

Most of the improvements came from Google Page
Speed recommendations.

Sprites

Fact I found interesting: Before I applied the catalog changes, the directory contained 682 files. It now has 49. Having
fewer files doesn’t inherently speed up the app, but it does speak to the nature of the changes.

There are two types of images in a Millennium “example set”: icons (or whole
buttons as images) and media type indicators. A typical setup, until recently,
had 145 or so button images. The most recent example set available from
Innovative has 45 icons and a couple support images for making buttons. These
images are coupled with some crufty markup to make the buttons work. The
latest set also ships with 39 media indicators (in fairness, we’d use maybe 13
of those for our library).

CPL now has one image for all the icons and one image for all the media
indicators. In total, the
catalog screens have 8 images: one is required but never used, another never
seen, and two others used
infrequently. Yes, we grab book jackets from an external service, but that’s
the extent of the catalog graphics.

An individual example icon weighs in between 600 bytes and 1.3K. Our icon
sprite is 5.44K. It can be loaded once and
cached on the user’s machine.
For pages with many buttons, this results in far fewer HTTP requests and a smaller total payload. The same
goes for media indicators.

How do we pull this off? We use two spriting techniques: ‘traditional’
sprites and 
pseudo sprites. The styles to makes these work can be found in
the catalog stylesheet.
What’s novel, and how you can pull this off in Millennium, is in carefully
crafting what’re called ‘wwwoptions’:

# pseudo sprite example
ICON_BUT_REQUEST=&amp;lt;span class=&quot;but icon request&quot;&amp;gt;Request&amp;lt;/span&amp;gt;

# traditional sprite example
IMAGE_MATTYPE3=/screens/spacer.gif&quot; class=&quot;media-icon bookmp3


As you can see, in both cases activating sprites involves appending classes to
a particular HTML element. In the case of the pseudo sprites, there’s a class
that makes anything look like a button, one that pads the left-hand side and
loads the icon sprite image into the space, and one (‘request’ above) that
stipulates where in the sprite image the request icon appears. In the
traditional sprite, the “IMAGE_MATTYPE3” option must be an image. Since
there’s no getting around that, I used a spacer gif. It’s 43 bytes — the
smallest practical image for the web. I then
circumvented the wwwoption to add the classes to the image.
Those classes set the background size and position the sprite image.

Be advised that pseudo sprites only work in standards-compliant browsers and
IE8+. If a substantial number of your users are on IE7-, you may want to wait.
Users with non-supporting browsers can still see the button style we use, but
the icons won’t appear. Sites that work for everyone but look better for
modern browsers are considered progressively-enhanced;
that’s what you can
consider these buttons.

Distrusting Bowker

We use Syndetics Plus, Librarything for
Libraries, and Google Books
previews
on our bibliographic record pages. That’s a lot of stuff to load. As part of
an overall improvement in JavaScript performance, we changed the way we pull
in those resources.

Syndetics Plus, by default, loads onto a page something like this


  Page calls widget.js directly, via a script tag
  widget.js loads jQuery from Google’s CDN
  After jQuery is loaded, widget.js loads widget_connector.js
  widget_connector.js gets ready, finds ISBNs on the page, and requests an ISBN-specific widget_response.js
  widget_response.js writes to the page and asks widget_connector.js to do stuff


This is a mess. It’s a long chain of serialized resources
that aren’t well-cached by the
browser, aren’t served minified and/or
gzipped, can’t be
served over SSL, and
that block full page rendering
until they’re complete (whether or not
there’s a result). Total payload for this process is 49K.

Librarything for Libraries is even worse (here I go
again). It goes:


  Page calls widget.php (served as javascript) directly, via a script tag
  widget.php loads connector.php
  connector.php pulls in connector_LB.css
  connector.php gets ready, finds ISBNs on the page, and requests an ISBN-specific widget_response.php
  widget_response.php writes to the page and asks connector.php to do stuff


What makes this process so awful is connector.php. It’s over 150K all by
itself, and it includes the sizzle selector library
and a bunch of other
utilities. Which makes one wonder: why not just
use jQuery? Moreover, why does a file that loads a comprehensive selector
engine need to define getElementsByClassName()? connector.php’s JavaScript is
a Frankenstein’s monster of code that pollutes the global namespace. I’m
afraid that some people might be having nightmares over
it. This
file also includes all functionality for all different ILSes (not just
Millennium, the one we’re using) and all LTfL features (a small fraction of
which we’re using). This massive file is unminified and uncompressed and is
part of a call chain that doesn’t support HTTP keep-alive. Minifying the file
wouldn’t solve all the problems, but it would be less than half the size
(mostly because their variable names are massive). Ditto on gzip compression,
which could make it less than a quarter of its heft over the wire (without
minification!).

We pull in jQuery from Google (the
old-fashioned way, so it client-side caches for just about ever) and use it
for almost all the (CPL-made)
JavaScript on the page. The
code for us to replace Syndetics Plus’s payload (25K without jQuery) is 150
bytes before compression. The nearly 200K for LTfL? Less than 1K, and I could
probably optimize further.

CPL-specific code pulls the primary ISBN from bib record pages, validates it,
then makes sure the page is served as regular HTTP. All of this occurs after
the page has already loaded. If the conditions are met, we then feed the ISBN
to the widget_response files from the two services, getting back just the
results specific to the bib record. The widget_response files handle writing
to the page all by themselves, so the service-specific code just adds things
those scripts expect to find and handles certain on-page actions. Since we do
this all asynchronously, the page loads (and feels like it loads) as quickly
as Millennium allows.

Being careful with the three widget services provided the biggest overall
improvement to payload size and page rendering speed. Google Page Speed
eliminated the warnings about redirects, uncompressed resources, request
serialization, unminified javascript, and undeferred scripts.

What’s funny about the terribleness coming from Bowker’s servers is that a big
part of improving the situation is both easy and a big sack of win. Users
would get faster pages and Bowker’d save on bandwidth and hardware specs. Some
quick apache config of mod_expires and mod_deflate is all that’s required to
pay dividends. A deployment scheme involving minification and/or a refactor of
the connector scripts would be more time-consuming, but could make the widgets
substantially faster. Serving out static scripts without query strings would
be a huge help, for instance.

More JavaScript Optimization

I was more diligent about jQuery best practices like using
fast selectors,
caching selected objects,
and delegating events to their appropriate containers.

Millennium has its own JavaScript library. It’s ordinarily served out as 3
files, but we weren’t having any of that. Our Millennium setup
prevents the default files from loading,
and instead serves a single file with all three components minified.
iii.js is just under 20K before compression, and 5.2 over the wire. That’s 2 fewer HTTP requests
and 4.4K less payload on every page.

Image Optimization

I ran all the catalog images through PNGGauntlet,
which uses PNGOUT to reduce file size —
sometimes by 25% or more. For high-use files, I also weighed the quality
reduction of making them 8-bit PNGs; the sprites, for instance, get served out
as 8-bit files, making them substantially smaller.

Web Server

I also rolled out a sprite for the site’s
layout and theme, optimized the chat widget, and
combined and minified CSS files
for use by the catalog. Our web server, in contrast to the catalog, is pretty aggressive
about caching. Files are served with far-future expires headers. APC for PHP
caches the opcode to minimize file reads; this results in faster execution
speed across the board, but not necessarily faster serving to the end user. We
have drupal caching set up, which benefits from MySQL
query caching. Apache gets some love from the OS’s buffer cache. Altogether,
the website is a layer of caches.

What’s Next

I’d like to reduce the payload of every page on our site by rolling out a new
theme. There’s a lot of extraneous markup and styling that can get cut out
pretty easily. Other possibilities:


  Optimize images as they’re uploaded
  Minify CSS and JavaScript on theme deployment
  Defer jQuery and other scripts on page loads
  Put stuff into a cache manifest
  Investigate mod_pagespeed to do some of this stuff automatically


For the catalog, a few squeaks of extra speed could come from moving static
files to our web server (which has longer cache lifetimes), combining the
(minified) catalog CSS into the site CSS, and working with Syndetics to get
book jackets from URLs without query parameters.

tl;dr

Google Page Speed.
]]></description>
      <content:encoded><![CDATA[<p><a href="http://catalog.cantonpl.org/">Canton Public Library’s Catalog</a> uses a large
library application called <a href="http://www.iii.com/products/millennium_ils.shtml">Millennium ILS from Innovative Interfaces,
Inc</a>. Recently, I undertook
to spruce up the images, styles, and JavaScript for our catalog, and in doing
so realized substantial speed increases catalog-wide.</p>

<p><strong>Note</strong>: The speed enhancements below are mostly about optimizing files and client-side stuff. You can also speed up your
catalog on the server side with hardware and database optimization, though doing so is likely to require assistance from
Innovative.</p>

<h3 id="why">Why</h3>

<p>Faster-loading pages make users happier. Some speed-enhancing techniques also
increase server performance and decrease the amount of bandwidth used. Page
speed also factors into search engine rankings, though that is less of a
concern for our catalog than our website.</p>

<h3 id="how">How</h3>

<p>Most of the improvements came from <a href="http://code.google.com/speed/page-speed/index.html">Google Page
Speed</a> recommendations.</p>

<h4 id="sprites">Sprites</h4>

<p><strong>Fact I found interesting</strong>: Before I applied the catalog changes, the directory contained 682 files. It now has 49. Having
fewer files doesn’t inherently speed up the app, but it does speak to the nature of the changes.</p>

<p>There are two types of images in a Millennium “example set”: icons (or whole
buttons as images) and media type indicators. A typical setup, until recently,
had 145 or so button images. The most recent example set available from
Innovative has 45 icons and a couple support images for making buttons. These
images are coupled with some crufty markup to make the buttons work. The
latest set also ships with 39 media indicators (in fairness, we’d use maybe 13
of those for our library).</p>

<p>CPL now has <a href="http://catalog.cantonpl.org/screens/ico-sp.png">one image for all the icons</a> and <a href="http://catalog.cantonpl.org/screens/media-sp.png">one image for all the media
indicators</a>. In total, the
catalog screens have 8 images: one is required but never used, <a href="http://www.perlmonks.org/?node_id=7974">another never
seen</a>, and two others used
infrequently. Yes, we grab book jackets from an external service, but that’s
the extent of the catalog graphics.</p>

<p>An individual example icon weighs in between 600 bytes and 1.3K. Our icon
sprite is 5.44K. It can be loaded once and
<a href="http://code.google.com/speed/page-speed/docs/caching.html#LeverageBrowserCaching">cached on the user’s machine</a>.
For pages with many buttons, this results in far fewer HTTP requests and a smaller total payload. The same
goes for media indicators.</p>

<p>How do we pull this off? We use two spriting techniques: <a href="http://css-tricks.com/css-sprites/">‘traditional’
sprites</a> and <a href="http://css-tricks.com/pseudo-spriting/">
pseudo sprites</a>. The styles to makes these work can be found in
the <a href="http://catalog.cantonpl.org/screens/styles.css">catalog stylesheet</a>.
What’s novel, and how you can pull this off in Millennium, is in carefully
crafting what’re called ‘wwwoptions’:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># pseudo sprite example
ICON_BUT_REQUEST=&lt;span class="but icon request"&gt;Request&lt;/span&gt;

# traditional sprite example
IMAGE_MATTYPE3=/screens/spacer.gif" class="media-icon bookmp3
</code></pre></div></div>

<p>As you can see, in both cases activating sprites involves appending classes to
a particular HTML element. In the case of the pseudo sprites, there’s a class
that makes anything look like a button, one that pads the left-hand side and
loads the icon sprite image into the space, and one (‘request’ above) that
stipulates where in the sprite image the request icon appears. In the
traditional sprite, the “IMAGE_MATTYPE3” option <em>must</em> be an image. Since
there’s no getting around that, I used a spacer gif. It’s 43 bytes — the
smallest practical image for the web. I then
<a href="http://google-gruyere.appspot.com/part2#2__stored_xss_via_html_attribute">circumvented the wwwoption to add the classes to the image</a>.
Those classes set the background size and position the sprite image.</p>

<p>Be advised that pseudo sprites only work in standards-compliant browsers and
IE8+. If a substantial number of your users are on IE7-, you may want to wait.
Users with non-supporting browsers can still see the button style we use, but
the icons won’t appear. Sites that work for everyone but look better for
modern browsers are considered <a href="http://www.alistapart.com/articles/understandingprogressiveenhancement">progressively-enhanced</a>;
that’s what you can
consider these buttons.</p>

<h4 id="distrusting-bowker">Distrusting Bowker</h4>

<p>We use <a href="http://www.bowker.com/en-US/products/syndetics/plus/index.html">Syndetics Plus</a>, <a href="http://www.librarything.com/forlibraries">Librarything for
Libraries</a>, and <a href="http://code.google.com/apis/books/docs/viewer/developers_guide.html">Google Books
previews</a>
on our bibliographic record pages. That’s a lot of stuff to load. As part of
an overall improvement in JavaScript performance, we changed the way we <a href="http://api.jquery.com/jQuery.getScript/">pull
in those resources</a>.</p>

<p>Syndetics Plus, by default, loads onto a page something like this</p>

<ul>
  <li>Page calls widget.js directly, via a script tag</li>
  <li>widget.js loads jQuery from Google’s CDN</li>
  <li>After jQuery is loaded, widget.js loads widget_connector.js</li>
  <li>widget_connector.js gets ready, finds ISBNs on the page, and requests an ISBN-specific widget_response.js</li>
  <li>widget_response.js writes to the page and asks widget_connector.js to do stuff</li>
</ul>

<p>This is a mess. It’s a long chain of <a href="http://code.google.com/speed/page-speed/docs/rtt.html#ParallelizeDownloads">serialized resources</a>
that aren’t well-cached by the
browser, aren’t served <a href="http://marijnhaverbeke.nl/uglifyjs">minified</a> and/or
<a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">gzipped</a>, can’t be
<a href="http://en.wikipedia.org/wiki/Transport_Layer_Security">served over SSL</a>, and
that <a href="http://code.google.com/speed/page-speed/docs/payload.html#DeferLoadingJS">block full page rendering</a>
until they’re complete (whether or not
there’s a result). Total payload for this process is 49K.</p>

<p>Librarything for Libraries is even worse (<a href="http://bradczerniak.com/2010/12/11/librarything-issues/">here I go
again</a>). It goes:</p>

<ul>
  <li>Page calls widget.php (served as javascript) directly, via a script tag</li>
  <li>widget.php loads connector.php</li>
  <li>connector.php pulls in connector_LB.css</li>
  <li>connector.php gets ready, finds ISBNs on the page, and requests an ISBN-specific widget_response.php</li>
  <li>widget_response.php writes to the page and asks connector.php to do stuff</li>
</ul>

<p>What makes this process so awful is connector.php. It’s over 150K all by
itself, and it includes the <a href="http://sizzlejs.com/">sizzle selector library</a>
and a bunch of <a href="http://robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/">other</a>
<a href="http://blog.stchur.com/2007/04/06/serializing-objects-in-javascript/">utilities</a>. Which makes one wonder: why not just
use jQuery? Moreover, why does a file that loads a comprehensive selector
engine need to define getElementsByClassName()? connector.php’s JavaScript is
a Frankenstein’s monster of code that pollutes the global namespace. I’m
afraid that <a href="https://twitter.com/librarythingtim/statuses/167130139891728384">some people might be having nightmares over
it</a>. This
file also includes all functionality for all different ILSes (not just
Millennium, the one we’re using) and all LTfL features (a small fraction of
which we’re using). This massive file is unminified and uncompressed and is
part of a call chain that doesn’t support HTTP keep-alive. Minifying the file
wouldn’t solve all the problems, but it would be less than half the size
(mostly because their variable names are massive). Ditto on gzip compression,
which could make it less than a quarter of its heft over the wire (without
minification!).</p>

<p>We <a href="http://code.google.com/apis/libraries/">pull in jQuery from Google</a> (the
old-fashioned way, so it client-side caches for just about ever) and use it
for almost all the <a href="http://catalog.cantonpl.org/screens/canton.js">(CPL-made)
JavaScript</a> on the page. The
code for us to replace Syndetics Plus’s payload (25K without jQuery) is 150
bytes before compression. The nearly 200K for LTfL? Less than 1K, and I could
probably optimize further.</p>

<p>CPL-specific code pulls the primary ISBN from bib record pages, validates it,
then makes sure the page is served as regular HTTP. All of this occurs after
the page has already loaded. If the conditions are met, we then feed the ISBN
to the widget_response files from the two services, getting back just the
results specific to the bib record. The widget_response files handle writing
to the page all by themselves, so the service-specific code just adds things
those scripts expect to find and handles certain on-page actions. Since we do
this all asynchronously, the page loads (and <em>feels</em> like it loads) as quickly
as Millennium allows.</p>

<p>Being careful with the three widget services provided the biggest overall
improvement to payload size and page rendering speed. Google Page Speed
eliminated the warnings about redirects, uncompressed resources, request
serialization, unminified javascript, and undeferred scripts.</p>

<p>What’s funny about the terribleness coming from Bowker’s servers is that a big
part of improving the situation is both easy <em>and</em> a big sack of win. Users
would get faster pages and Bowker’d save on bandwidth and hardware specs. Some
quick apache config of mod_expires and mod_deflate is all that’s required to
pay dividends. A deployment scheme involving minification and/or a refactor of
the connector scripts would be more time-consuming, but could make the widgets
substantially faster. Serving out static scripts without query strings would
be a huge help, for instance.</p>

<h4 id="more-javascript-optimization">More JavaScript Optimization</h4>

<p>I was more diligent about jQuery best practices like using
<a href="http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-think-right-to-left-with-jquery/">fast selectors</a>,
<a href="http://www.artzstudio.com/2009/04/jquery-performance-rules/#cache-jquery-objects">caching selected objects</a>,
and <a href="http://thinkvitamin.com/code/john-resig-on-advanced-javascript-to-improve-your-web-app/">delegating events to their appropriate containers</a>.</p>

<p>Millennium has its own JavaScript library. It’s ordinarily served out as 3
files, but we weren’t having any of that. Our Millennium setup
<a href="https://docs.google.com/viewer?url=http://www.rodmanlibrary.com/iug/egl2008/hackthepac.pdf">prevents the default files from loading</a>,
and instead serves <a href="http://catalog.cantonpl.org/screens/iii.js">a single file with all three components minified</a>.
iii.js is just under 20K before compression, and 5.2 over the wire. That’s 2 fewer HTTP requests
and 4.4K less payload on every page.</p>

<h4 id="image-optimization">Image Optimization</h4>

<p>I ran all the catalog images through <a href="http://pnggauntlet.com/">PNGGauntlet</a>,
which uses <a href="http://advsys.net/ken/utils.htm">PNGOUT</a> to reduce file size —
sometimes by 25% or more. For high-use files, I also weighed the quality
reduction of making them 8-bit PNGs; the sprites, for instance, get served out
as 8-bit files, making them substantially smaller.</p>

<h4 id="web-server">Web Server</h4>

<p>I also rolled out <a href="http://www.cantonpl.org/sites/all/themes/zen/cpl/sprites/site-sp-v011712r1.png">a sprite for the site</a>’s
layout and theme, optimized the chat widget, and
<a href="http://lowfatcats.com/blog/1-tutorial/18-how-to-optimize-javascript-css-linux-using-yui-compressor.html">combined and minified CSS files</a>
for use by the catalog. Our web server, in contrast to the catalog, is pretty aggressive
about caching. Files are served with far-future expires headers. APC for PHP
caches the opcode to minimize file reads; this results in faster execution
speed across the board, but not necessarily faster serving to the end user. We
have <a href="http://drupal.org/">drupal</a> caching set up, which benefits from MySQL
query caching. Apache gets some love from the OS’s buffer cache. Altogether,
the website is a layer of caches.</p>

<h3 id="whats-next">What’s Next</h3>

<p>I’d like to reduce the payload of every page on our site by rolling out a new
theme. There’s a lot of extraneous markup and styling that can get cut out
pretty easily. Other possibilities:</p>

<ul>
  <li>Optimize images as they’re uploaded</li>
  <li>Minify CSS and JavaScript on <a href="http://liquidninja.com/deploying-with-git/">theme deployment</a></li>
  <li>Defer jQuery and other <a href="https://developer.mozilla.org/En/HTML/Element/Script#Attributes">scripts</a> on page loads</li>
  <li>Put stuff into a <a href="http://www.html5rocks.com/en/tutorials/appcache/beginner/">cache manifest</a></li>
  <li>Investigate <a href="http://code.google.com/speed/page-speed/docs/module.html">mod_pagespeed</a> to do some of this stuff automatically</li>
</ul>

<p>For the catalog, a few squeaks of extra speed could come from moving static
files to our web server (which has longer cache lifetimes), combining the
(minified) catalog CSS into the site CSS, and working with Syndetics to get
book jackets from URLs without query parameters.</p>

<h3 id="tldr">tl;dr</h3>

<p><a href="http://code.google.com/speed/page-speed/index.html">Google Page Speed</a>.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Drupal and Git</title>
      <link>http://bradczerniak.com/blog/drupal-and-git/</link>
      <pubDate>Fri, 09 Dec 2011 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Web Designl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/drupal-and-git/</guid>
      <description><![CDATA[I’m honored to have been selected to present at the first-ever DrupalCamp
Michigan. The local Drupal community is super
strong: they opened registration for 50 people and it sold out so quickly they
expanded to 100. Not being a good public speaker at all, you’d think this
might be daunting. However, a combination of under-preparedness and lack of
sleep really put me in the right mindset. So, without further ado, here are
the slides and a
video of the presentation:





Notes

You’ve got the wrong guy

I originally proposed this session not because I have a ton of experience on
the topic and all the answers, but because I wanted to use presenting as an
excuse to learn about git.

If you’ve been using git for a long time and/or have memorized large portions
of the Drupal APIs, chances are you won’t be able to learn much from me.

WTF is a git!?

The word git was first a British slang word for an annoying or stupid person.
The software was named self-deprecatingly from that word. I like to think git stands for
something else though: good shit.

Git is a fast, distributed version control system.

It was originally developed by Linus Torvalds in 2005 to be used for
developing the Linux kernel

If you’ve used another version control system, you might wonder what sets git
apart.

From what I’ve gathered, the most important differences between git and other
systems are:


  Git is distributed נthis is important, because having a local copy of a repo lets you access the version history easily,
commit whenever it makes sense, and push it to one or more repositories, or remotes, based on the structure of your project
  Git reduces the pain of merging, which means that you can make lots of branches without worry


Other systems, like CVS, subversion, and others, are also considered slow for
accomplishing certain tasks. While I don’t have a great means of comparison,
git seems pretty quick to do most everything.

Drupal and Git

The Drupal project switched from CVS to git in February
2011. The changeover is a
3-phase process, of which they’re on phase 2.


  Phase 1 was a git mirror, so that people could test and develop in git without affecting the project
  Phase 2 is a centralized model based entirely in git
  Phase 3 will be a decentralized, GitHub-like model that will change the Drupal.org contribution workflow. Details are
    still being hashed out on that front


Local Tools

Locally, there are a few tools that can make routine tasks fast and can
integrate with the tools you already use.

I’m a visual, GUI guy, especially for menial tasks. So I like
TortoiseGit on Windows, along with a
Git plugin for Notepad++.
TortoiseGit makes pushing changes a job of a few clicks. The Notepad++ plugin
lets me press Ctrl+Alt+C, type a commit message, and click a button to commit
changes to one or more files. If you think vi is a pain in the butt, tools
like these are for you.

Remote Tools

It’s probably not just you doing development. Even if it is, there’s a
compelling reason to have at least one central place for your repositories,
which I’ll explain later.

But a side reason to have bare remote repositories is that you can use tools
intended for remotes, like redmine. Tools like this
add another layer for project management. You can do project planning, bug
tracking, wiki documentation, and other such tasks from a web interface,
letting either you or your team keep track of things. And if your project is
out in the open, you can leverage a much larger community using sites like
GitHub, Google
Code, or SourceForge.

Your First Repo

Let’s say you have a directory of files that you want to put under version
control at that path. You’d go there in your terminal, then initiate a new
repository. Next you’d add all the files. Those files are queued up and ready
for the first commit, which you then perform.

If you don’t use the ‘m’ option to add a commit message, the commit command
will show the log entry for the commit in vi, and you put the commit message
at the top. It’s at this point that I’d like to reiterate that vi is a pain in
the butt.

So that’s how you create a new repo from bash

Commands

These are the git commands you might use in day-to-day work

Point at commands and explain what they do
^ Learn what the commands do

These commands are used less frequently (in general), but it’s good to know
about them

bisect lets you determine where a bug began in the revision history, using a
binary search to split the possibilities in half each time.

These are also git commands, though you might not use them very often or ever.

stash is commit for wusses

Workflow

So let’s talk workflow.

At my job I’ve got two Drupal sites: “Beta,” which isn’t really the right name
for it, since at times it’s a dev box and at others it’s a beta-slash-QA
machine.

And the live site.

The design and development parts of my job revolve around creating modules and
themes to add functionality and enhance the design of just those two
properties.

I’m guessing that’s NOT what your jobs are like. I’m guessing you make lots of
sites. And those sites in various states exist in multiple places, like your
local dev machine, an internal server for testing, and external hosting that
you don’t necessarily control. I don’t envy you.

Wherein I Tell You Not To Hack the Core

A site is Drupal core, plus contrib, plus the data in your database.

Since Drupal is modular and nearly everything can be changed via hooks, it’s
really pretty rare that you have to change anything in core. And if you do,
I’ve found from experience that it’s usually for temporary debugging rather
than for permanent changes.

Do not hack core.

Avoiding Temptation

So from Do Not Hack Core we can take away that all the things on the left are
things you shouldn’t mess with, and the thing on the right is the only place
that customizations go (unless you have a weird multisite setup, which is
cool, but your workflow’s going to be different).

A repo at the whole site level is redundant, and reinforces the opposite of
the number 1 best practice of the Drupal site-building community.

Drilling Down

What about at the ‘sites’ level?

This is workable, but you might notice something immediately.

Look at the sites/all/modules directory.

You’re probably not going to be hacking contrib either! All of those modules
are version tracked in git on the drupal.org site. The vast majority of those
modules require zero coding to work exactly as expected. Putting them under
version control doesn’t accomplish much.

Then there’s sites/default

sites/default/files contains uploaded and attached files. Those files are
site-specific and are subject to database dependencies. The files also tend to
be images and other files that are unlikely to change. There are a number of
reasons why version controlling those files is impractical.

On the other hand, sites/default/settings.php is a good candidate for revision
control individually, as it’s something that you have to work on in the
development process, and some of the settings will likely have to change
depending on where the site lives. The branching model of git could be really
useful for this purpose.

.gitignore Files

One way to wrangle sites/default/files and streamline the process is with
.gitignore files. With a well-made, well-placed .gitignore file or two, you
can continue using git add . and git commit -a without adding stuff you don’t
want to your project.

.gitignore files let you choose files to omit from the versioning index, based
on wildcard notation. So instead of omitting /sites/default/files wholesale,
for instance, you could just selectively ignore boring images and junk while
preserving the directory structure wherever the repo might end up.

What You’re Controlling

Conceptually, the two components that you’re likely to work on that can most
benefit from version control are:


  Customizing the theme to the client’s needs
  Developing custom modules or modifying one or more contrib modules


If you start with a working theme, like Zen, you can clone down a repo from
Drupal.org and use the history of that particular part of the project if you
need it. You can create your own branch for your theme and develop from there.

If you code up a custom module, it might only be useful for a single site a
single time. But maybe the functionality you add is something that other
clients might want, or that can be contributed back to the Drupal community.
Modules are reusable pieces, so structuring your repository environment to
make them accessible for all sorts of projects is a plus.

Hypothetical Model

Here’s an example of what repositories on a central server might look like.

I made the directory structure here very flat, putting core, modules, themes,
and the site_projects repositories all within a single folder. This would work
well if you always use the same base theme along with a limited number of
custom modules. This particular setup plays nice with management software like
redmine, which is one reason a flat structure is attractive.

If you’re going to have lots of distinct themes and modules, it might be
helpful to create big repos called modules and themes, then use git’s
submodules functionality to manage the individual drupal modules contained
within. Thanks Ben for the submodules tip!

Now that we have a central place for all the things we’re working on related
to building our sites, we can optimize our workflow to play nice with version
control.

Leveraging Synergy

One way to do that is to set up pushing and pulling.

If you don’t already have ssh keys set up between your development box and
your repository server, setting that up will make it a lot quicker to push and
pull from git. If you want to deploy via git from the repo server to other
machines like your site testing server or even live web server, you’ll also
want to set up ssh keys between the those boxes.

On your local dev box, use the clone command to make a local version of the
repo on your server. When you do that, the source repo becomes a ‘remote’
called origin.

Make some changes to the local copy (you can branch if you want to, you can
leave master behind). When you’re done making changes and they’re ready for
other people in your shop to see/use them, use the push command to send them
back to the origin.

Drush Make and Install Profiles

Once the changes are on the server, you can pull them to your deployment
boxes, or…

You can get fancy.

It’s a common use case: you end up using the same base theme, modules,
configurations, and other tweaks on most of your projects. You might already
have an “install profile” informally; Drupal with all the stuff you use all in
one place.

The “drush make” command lets you generate makefiles that turn your informal
install profiles into the real deal. In Drupal 7 it’s easier to make profiles
that configure things on install, but technically it should be possible in D6
too. Some combination of the features, strongarm, context, and other helper
modules could let you automate some impressive stuff — like pre-built views.

Hint: it might be manual coding work, but if you install a whole bunch of
similar sites, writing a (profile name).install file could be a time-saver in
the long run. Especially if you swipe one from an existing public profile and
suit it to your needs.

You can use the drush make command to import all the dependencies for your
profile wherever you need them. Then just run the installer (which if you’re
super fancy you could get working with drush site-install) to have a
functional site in the time it takes to make a pot of coffee because your
junior dev doesn’t know proper coffee machine etiquette.

The makefiles are really flexible, so you can choose particular version
numbers of modules for compatibility, apply patch files to change modules or
core code, or grab external libraries from tarballs.

Nailing down a “holy grail” workflow for this sort of development takes time
and effort, and I certainly don’t have all the answers.

Over the next few weeks, Alex Fisher and I will be working on drush make and
workflows, and will report useful findings to our respective blogs.

You may also ask about how to go from local dev to testing to quality
assurance to live, all while easily managing your databases. You may ask that,
but I don’t have an answer. Sorry.

Pay it Forward

If you’d like to become a core developer or get involved in a contrib project,
a working knowledge of git will help.

I’m fighting the urge to give nitty-gritty details here, as the instructions
are both technical and well-documented. If you’re not a project maintainer,
contributing code involves creating patch files based on numbers from the
issue queue. If you are a project maintainer, you can interact directly with
the remote repo (albeit while following the guidelines).

One reason I’m avoiding an in-depth explanation is that the Phase 3 git
migration could very well change how things get developed on Drupal.org.

But here’s how to create a patch file, just in case.

Just one commit is the easiest for contributing back patches.

The Version Control tab on project pages gives really good instructions for
grabbing source repos and other contibution tasks, including the specific
clone command you need to grab a local copy of the repository.

So now that you’re a git expert, go out there and contribute back to the
Drupal community!

Thanks for putting up with me!
]]></description>
      <content:encoded><![CDATA[<p>I’m honored to have been selected to present at the first-ever <a href="http://drupalcampmi.org/">DrupalCamp
Michigan</a>. The local Drupal community is super
strong: they opened registration for 50 people and it sold out so quickly they
expanded to 100. Not being a good public speaker at all, you’d think this
might be daunting. However, a combination of under-preparedness and lack of
sleep really put me in the right mindset. So, without further ado, here are
the <a href="http://bit.ly/gitdrupal">slides</a> and a
<a href="http://blip.tv/drupalcampmi/how-git-fits-into-your-workflow-5802593">video of the presentation</a>:</p>

<iframe src="https://docs.google.com/presentation/embed?id=13uh9jabl4MQ_W1LVbVc8H_O2wJlQ5ptL6MEKKihzjDI&amp;start=false&amp;loop=false&amp;delayms=30000" frameborder="0" width="480" height="389"></iframe>

<iframe src="http://blip.tv/play/h9h3guKVRQI.html" width="550" height="389" frameborder="0" allowfullscreen=""></iframe>

<h2 id="notes">Notes</h2>

<h3 id="youve-got-the-wrong-guy">You’ve got the wrong guy</h3>

<p>I originally proposed this session not because I have a ton of experience on
the topic and all the answers, but because I wanted to use presenting as an
excuse to learn about <a href="http://git-scm.com/">git</a>.</p>

<p>If you’ve been using git for a long time and/or have memorized large portions
of the Drupal APIs, chances are you won’t be able to learn much from me.</p>

<h3 id="wtf-is-a-git">WTF is a git!?</h3>

<p>The word git <a href="http://en.wikipedia.org/wiki/Git_%28software%29">was first a British slang word for an annoying or stupid person</a>.
The software was named self-deprecatingly from that word. I like to think git stands for
something else though: good shit.</p>

<p>Git is a fast, distributed version control system.</p>

<p>It was originally developed by Linus Torvalds in 2005 to be used for
developing the Linux kernel</p>

<p>If you’ve used another version control system, you might wonder what sets git
apart.</p>

<p>From what I’ve gathered, the most important <a href="http://whygitisbetterthanx.com/">differences between git and other
systems</a> are:</p>

<ul>
  <li>Git is distributed נthis is important, because having a local copy of a repo lets you access the version history easily,
commit whenever it makes sense, and push it to one or more repositories, or remotes, based on the structure of your project</li>
  <li>Git reduces the pain of merging, which means that you can make lots of branches without worry</li>
</ul>

<p>Other systems, like CVS, subversion, and others, are also considered slow for
accomplishing certain tasks. While I don’t have a great means of comparison,
git seems pretty quick to do most everything.</p>

<h3 id="drupal-and-git">Drupal and Git</h3>

<p>The <a href="http://drupal.org/community-initiatives/git">Drupal project switched from CVS to git in February
2011</a>. The changeover is a
3-phase process, of which they’re on phase 2.</p>

<ol>
  <li>Phase 1 was a git mirror, so that people could test and develop in git without affecting the project</li>
  <li>Phase 2 is a centralized model based entirely in git</li>
  <li>Phase 3 will be a decentralized, GitHub-like model that will change the Drupal.org contribution workflow. Details are
    still being hashed out on that front</li>
</ol>

<h3 id="local-tools">Local Tools</h3>

<p>Locally, there are a few tools that can make routine tasks fast and can
integrate with the tools you already use.</p>

<p>I’m a visual, GUI guy, especially for menial tasks. So I like
<a href="http://code.google.com/p/tortoisegit/">TortoiseGit</a> on Windows, along with a
<a href="http://forum.lowyat.net/topic/1358320/all">Git plugin for Notepad++</a>.
TortoiseGit makes pushing changes a job of a few clicks. The Notepad++ plugin
lets me press Ctrl+Alt+C, type a commit message, and click a button to commit
changes to one or more files. If you think vi is a pain in the butt, tools
like these are for you.</p>

<h3 id="remote-tools">Remote Tools</h3>

<p>It’s probably not just you doing development. Even if it is, there’s a
compelling reason to have at least one central place for your repositories,
which I’ll explain later.</p>

<p>But a side reason to have bare remote repositories is that you can use tools
intended for remotes, like <a href="http://www.redmine.org/">redmine</a>. Tools like this
add another layer for project management. You can do project planning, bug
tracking, wiki documentation, and other such tasks from a web interface,
letting either you or your team keep track of things. And if your project is
out in the open, you can leverage a much larger community using sites like
<a href="https://github.com/ao5357">GitHub</a>, <a href="http://code.google.com/u/ao5357/">Google
Code</a>, or SourceForge.</p>

<h3 id="your-first-repo">Your First Repo</h3>

<p>Let’s say you have a directory of files that you want to put under version
control at that path. You’d go there in your terminal, then initiate a new
repository. Next you’d add all the files. Those files are queued up and ready
for the first commit, which you then perform.</p>

<p>If you don’t use the ‘m’ option to add a commit message, the commit command
will show the log entry for the commit in vi, and you put the commit message
at the top. It’s at this point that I’d like to reiterate that vi is a pain in
the butt.</p>

<p>So that’s how you create a new repo from bash</p>

<h3 id="commands">Commands</h3>

<p>These are the git commands you might use in day-to-day work</p>

<p><em>Point at commands and explain what they do</em>
^ Learn what the commands do</p>

<p>These commands are used less frequently (in general), but it’s good to know
about them</p>

<p>bisect lets you determine where a bug began in the revision history, using a
binary search to split the possibilities in half each time.</p>

<p>These are also git commands, though you might not use them very often or ever.</p>

<p>stash is commit for wusses</p>

<h3 id="workflow">Workflow</h3>

<p>So let’s talk workflow.</p>

<p>At my job I’ve got two Drupal sites: “Beta,” which isn’t really the right name
for it, since at times it’s a dev box and at others it’s a beta-slash-QA
machine.</p>

<p>And the live site.</p>

<p>The design and development parts of my job revolve around creating modules and
themes to add functionality and enhance the design of just those two
properties.</p>

<p>I’m guessing that’s NOT what your jobs are like. I’m guessing you make lots of
sites. And those sites in various states exist in multiple places, like your
local dev machine, an internal server for testing, and external hosting that
you don’t necessarily control. I don’t envy you.</p>

<h3 id="wherein-i-tell-you-not-to-hack-the-core">Wherein I Tell You Not To Hack the Core</h3>

<p>A site is Drupal core, plus contrib, plus the data in your database.</p>

<p>Since Drupal is modular and nearly everything can be changed via hooks, it’s
really pretty rare that you have to change anything in core. And if you do,
I’ve found from experience that it’s usually for temporary debugging rather
than for permanent changes.</p>

<p>Do not hack core.</p>

<h3 id="avoiding-temptation">Avoiding Temptation</h3>

<p>So from Do Not Hack Core we can take away that all the things on the left are
things you shouldn’t mess with, and the thing on the right is the only place
that customizations go (unless you have a weird multisite setup, which is
cool, but your workflow’s going to be different).</p>

<p>A repo at the whole site level is redundant, and reinforces the opposite of
the number 1 best practice of the Drupal site-building community.</p>

<h3 id="drilling-down">Drilling Down</h3>

<p>What about at the ‘sites’ level?</p>

<p>This is workable, but you might notice something immediately.</p>

<p>Look at the sites/all/modules directory.</p>

<p>You’re probably not going to be hacking contrib either! All of those modules
are version tracked in git on the drupal.org site. The vast majority of those
modules require zero coding to work exactly as expected. Putting them under
version control doesn’t accomplish much.</p>

<p>Then there’s sites/default</p>

<p>sites/default/files contains uploaded and attached files. Those files are
site-specific and are subject to database dependencies. The files also tend to
be images and other files that are unlikely to change. There are a number of
reasons why version controlling those files is impractical.</p>

<p>On the other hand, sites/default/settings.php is a good candidate for revision
control individually, as it’s something that you have to work on in the
development process, and some of the settings will likely have to change
depending on where the site lives. The branching model of git could be really
useful for this purpose.</p>

<h3 id="gitignore-files">.gitignore Files</h3>

<p>One way to wrangle sites/default/files and streamline the process is with
.gitignore files. With a well-made, well-placed .gitignore file or two, you
can continue using git add . and git commit -a without adding stuff you don’t
want to your project.</p>

<p>.gitignore files let you choose files to omit from the versioning index, based
on wildcard notation. So instead of omitting /sites/default/files wholesale,
for instance, you could just selectively ignore boring images and junk while
preserving the directory structure wherever the repo might end up.</p>

<h3 id="what-youre-controlling">What You’re Controlling</h3>

<p>Conceptually, the two components that you’re likely to work on that can most
benefit from version control are:</p>

<ol>
  <li>Customizing the theme to the client’s needs</li>
  <li>Developing custom modules or modifying one or more contrib modules</li>
</ol>

<p>If you start with a working theme, like Zen, you can clone down a repo from
Drupal.org and use the history of that particular part of the project if you
need it. You can create your own branch for your theme and develop from there.</p>

<p>If you code up a custom module, it might only be useful for a single site a
single time. But maybe the functionality you add is something that other
clients might want, or that can be contributed back to the Drupal community.
Modules are reusable pieces, so structuring your repository environment to
make them accessible for all sorts of projects is a plus.</p>

<h3 id="hypothetical-model">Hypothetical Model</h3>

<p>Here’s an example of what repositories on a central server might look like.</p>

<p>I made the directory structure here very flat, putting core, modules, themes,
and the site_projects repositories all within a single folder. This would work
well if you always use the same base theme along with a limited number of
custom modules. This particular setup plays nice with management software like
redmine, which is one reason a flat structure is attractive.</p>

<p>If you’re going to have lots of distinct themes and modules, it might be
helpful to create big repos called modules and themes, then use git’s
submodules functionality to manage the individual drupal modules contained
within. Thanks Ben for the submodules tip!</p>

<p>Now that we have a central place for all the things we’re working on related
to building our sites, we can optimize our workflow to play nice with version
control.</p>

<h3 id="leveraging-synergy">Leveraging Synergy</h3>

<p>One way to do that is to set up pushing and pulling.</p>

<p>If you don’t already have ssh keys set up between your development box and
your repository server, setting that up will make it a lot quicker to push and
pull from git. If you want to deploy via git from the repo server to other
machines like your site testing server or even live web server, you’ll also
want to set up ssh keys between the those boxes.</p>

<p>On your local dev box, use the clone command to make a local version of the
repo on your server. When you do that, the source repo becomes a ‘remote’
called origin.</p>

<p>Make some changes to the local copy (you can branch if you want to, you can
leave master behind). When you’re done making changes and they’re ready for
other people in your shop to see/use them, use the push command to send them
back to the origin.</p>

<h3 id="drush-make-and-install-profiles">Drush Make and Install Profiles</h3>

<p>Once the changes are on the server, you can pull them to your deployment
boxes, or…</p>

<p>You can get fancy.</p>

<p>It’s a common use case: you end up using the same base theme, modules,
configurations, and other tweaks on most of your projects. You might already
have an “install profile” informally; Drupal with all the stuff you use all in
one place.</p>

<p>The “drush make” command lets you generate makefiles that turn your informal
install profiles into the real deal. In Drupal 7 it’s easier to make profiles
that configure things on install, but technically it should be possible in D6
too. Some combination of the features, strongarm, context, and other helper
modules could let you automate some impressive stuff — like pre-built views.</p>

<p>Hint: it might be manual coding work, but if you install a whole bunch of
similar sites, writing a (profile name).install file could be a time-saver in
the long run. Especially if you swipe one from an existing public profile and
suit it to your needs.</p>

<p>You can use the drush make command to import all the dependencies for your
profile wherever you need them. Then just run the installer (which if you’re
super fancy you could get working with drush site-install) to have a
functional site in the time it takes to make a pot of coffee because your
junior dev doesn’t know proper coffee machine etiquette.</p>

<p>The makefiles are really flexible, so you can choose particular version
numbers of modules for compatibility, apply patch files to change modules or
core code, or grab external libraries from tarballs.</p>

<p>Nailing down a “holy grail” workflow for this sort of development takes time
and effort, and I certainly don’t have all the answers.</p>

<p>Over the next few weeks, Alex Fisher and I will be working on drush make and
workflows, and will report useful findings to our respective blogs.</p>

<p>You may also ask about how to go from local dev to testing to quality
assurance to live, all while easily managing your databases. You may ask that,
but I don’t have an answer. Sorry.</p>

<h3 id="pay-it-forward">Pay it Forward</h3>

<p>If you’d like to become a core developer or get involved in a contrib project,
a working knowledge of git will help.</p>

<p>I’m fighting the urge to give nitty-gritty details here, as the instructions
are both technical and well-documented. If you’re not a project maintainer,
contributing code involves creating patch files based on numbers from the
issue queue. If you are a project maintainer, you can interact directly with
the remote repo (albeit while following the guidelines).</p>

<p>One reason I’m avoiding an in-depth explanation is that the Phase 3 git
migration could very well change how things get developed on Drupal.org.</p>

<p>But here’s how to create a patch file, just in case.</p>

<p>Just one commit is the easiest for contributing back patches.</p>

<p>The Version Control tab on project pages gives really good instructions for
grabbing source repos and other contibution tasks, including the specific
clone command you need to grab a local copy of the repository.</p>

<p>So now that you’re a git expert, go out there and contribute back to the
Drupal community!</p>

<p>Thanks for putting up with me!</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Whiteboard Backlog</title>
      <link>http://bradczerniak.com/blog/whiteboard-backlog/</link>
      <pubDate>Sat, 25 Jun 2011 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[artl]]></category>
      
        <category><![CDATA[dry erasel]]></category>
      
        <category><![CDATA[Generall]]></category>
      
        <category><![CDATA[whiteboardl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/whiteboard-backlog/</guid>
      <description><![CDATA[My apartment is covered in dry erase boards. I like to use them. Here are some examples:


    
      
        
        
        
          
        
        
      
      
        
      
    
    
  


    
      
        
        
        
          
        
        
      
      
        
      
    
    
  

This tendency has led to me using them for my slide presentations. I’ve had two in the hopper that I presented at the
Michigan Library Association’s Tech Escape workshop in May. As is always the case with my presos, be forewarned that they
contain a lot of salty language:  If you have any dry erase board art requests, please leave them in the comments and I
will try my best.




]]></description>
      <content:encoded><![CDATA[<p>My apartment is covered in dry erase boards. I like to use them. Here are some examples:</p>

<figure class="figure figure--image figure--image--nyan-cat-jpg ">
    
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/nyan_cat.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/nyan_cat.jpg" alt="Nyan cat in whiteboard drawing style" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/nyan_cat.jpg" alt="Nyan cat in whiteboard drawing style" loading="lazy" />
      </noscript>
    
    
  </figure>

<figure class="figure figure--image figure--image--the-letter-that-johnnie-walker-read-jpg ">
    
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/the_letter_that_johnnie_walker_read.jpg.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/the_letter_that_johnnie_walker_read.jpg" alt="The letter that Johnnie Walker read" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/the_letter_that_johnnie_walker_read.jpg" alt="The letter that Johnnie Walker read" loading="lazy" />
      </noscript>
    
    
  </figure>

<p>This tendency has led to me using them for my slide presentations. I’ve had two in the hopper that I presented at the
Michigan Library Association’s Tech Escape workshop in May. As is always the case with my presos, be forewarned that they
contain a lot of salty language:  If you have any dry erase board art requests, please leave them in the comments and I
will try my best.</p>

<iframe src="https://docs.google.com/present/embed?id=dhsbt2xj_530zwf4ntfh" frameborder="0" width="410" height="342"></iframe>

<iframe src="https://docs.google.com/present/embed?id=dhsbt2xj_531gpxhnphj" frameborder="0" width="410" height="342"></iframe>
]]></content:encoded>
    </item>
  
    <item>
      <title>A Year of Transliteracy: Call to Action</title>
      <link>http://bradczerniak.com/blog/a-year-of-transliteracy-call-to-action/</link>
      <pubDate>Tue, 31 May 2011 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Transliteracyl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/a-year-of-transliteracy-call-to-action/</guid>
      <description><![CDATA[It was one year ago today that I first posted about transliteracy.
A few days earlier, I had complained on twitter that transliteracy was
“a bullshit made-up term for the same old stuff.” Since it’s always been my policy on this blog to offer solutions whenever
I identify a problem, it took a few days of thought before I posted the beginnings of the language model.

Over the last year, I’ve done some other transliteracy-related stuff that might interest you:


  Further attempted to explain the usage of the word ‘language’ in the context of the model
  Asked for feedback on a draft of
Redefining Transliteracy and
stirred a cauldron of nastiness
  Demonstrated how badly the word ‘medium’ is misused
in writings about transliteracy
  Put the “Blueberry Smoothie video”
into a language model context to show a
practical application
  Showed that the term Information Literacy is a
dumb name for the good stuff done under that umbrella
  Really drove home that
talking about media rather than language is distracting as hell
  Started a community bibliography of transliteracy-related links on reddit


Starting out, and despite my first tweet calling transliteracy bullshit, I was conciliatory and downright friendly. After
putting some positive work out there and being ignored, I chose to approach the topic differently and talk about the
controversy. The L&amp;amp;T librarians told me that
I had gone too far, so before
publishing Redefining Transliteracy I scaled back and was
only semi-controversial (if you consider pedantically listing problems with a definition controversial).

Thing is, that post was probably the most popular of the whole lot. It was even the
subject of an assignment for a Digital Media Communication class at Rider University
(co-instructed by the truly inspirational John LeMasney). I hope most of the post’s appeal
was that it offered a compelling case for the adoption of a model for transliteracy that people find useful. I suspect that
part of the appeal was the oh-no-you-didn’t out-calling of the PART definition. So screw it, this stuff’s been bugging me…

PART of the Problem

If the original “working definition” of transliteracy were claimed to be proprietary, it wouldn’t be a big deal that my
criticisms (let’s call them “bug reports”) and suggested improvements (‘patches’) have fallen on deaf ears. But the
seminal First Monday paper on
transliteracy refers to it as open source thinking. Professor Thomas calls
transliteracy an open source concept in a well-circulated video:


  We see it as an open source concept, and we offer it up for you to think about, develop, write about, go to Wikipedia
and argue about the definition…


One immediate problem is that Wikipedia is a bad place to argue about the definition, since it’s a place for things notable
outside of itself, not original research or discussion leading to development of new ideas. While it might be acceptable
to have a discussion of wording on an article’s talk page to some extent,
arguing about the definition using Wikipedia as the sounding board will generally lead to
NOR,
NPOV, and/or
CoI issues. It’s precisely why I haven’t
personally made any edits to the transliteracy page. If you don’t already have your hat in the ring, I encourage you to
edit on the language model’s behalf.

Calling transliteracy open source is really quite hollow. Is the transliteracy blog really all the source? Where’s a clear
explanation of licensure for applicable source, besides a CC icon on the First Monday article? Where’s the mechanism for
reporting bugs and submitting patches? The fact of the matter is that there is very little open source about PART’s work
on transliteracy. It’s a buzzword in a sea of buzzwords.

Call to Action

PART, if you do not wish to explicitly put the transliteracy concept under an
open source or
open creative license, release source material in the same manner, and ideally
explain the mechanism
by which the community can contribute to the project,
you should publicly clarify that transliteracy is actually a proprietary concept.

Neither PART nor
Libraries and Transliteracy have posted about the language model. Since
I’m certain that prominent posters of both those blogs have read
Redefining Transliteracy, it’s curious to me that they
haven’t talked at all about the language model on their respective blogs. To me that’s a lie of omission, or worse yet a
faith-based lapse of intellectual honesty. After all, they’ve been presented with evidence to the contrary of their claims:


  The things listed in the definition (signing, orality, handwriting, etc.) aren’t established to be platforms, tools,
    or media either individually or as a group
  The property of platforms, tools, and media that allows a literate person to go across or between them is not explained
    (and I contend, _cannot be explained _– a single unit is necessary for comparison)
  All other criticisms aside, the order of the list is nonsensical, yet easy enough to change to chronological, alphabetical,
    or to delete altogether
  Interaction is just a series of reading and writing acts as it applies to literacies, so including it is redundant
  Talking about literacy as a function of platforms, tools, and media is akin to telling an auto mechanic over the phone
    that your car is yellow. Sure, color is an important attribute of a car, but the mechanic is more concerned with the
    make, model, and mechanical attributes of the vehicle. Literacy is about reading/writing stuff (ie. messages in languages),
    not where the stuff’s written (ie. medium)


Unless there is some means of reconciliation to which I’ve not been made privy, believing transliteracy can operate under
the PART definition requires faith: belief in the absence of (or in the face of contradictory) evidence. That’s not a leap
I’m willing to make. I’ve proposed a patch for a definition based instead on language (with thorough explanation of what
language means in that context) that eliminates all 5 of those problems. Of course, if there were problems with the language
model, I’d be interested in exploring those as well.

Maybe the silence on those blogs is because of personality conflicts with me. But that only goes so far; at some point
pointing at me and saying I’m being arrogant or condescending just ends up being a distracting
Argumentum ad hominem. If you think I’m an asshole and don’t want
to subject your readers to my douchitude, just don’t mention me by name or link to my blog. I don’t care – all I care about
is furthering the discussion of transliteracy by putting ideas out there. If you’re unwilling to tell your readers about
ideas because they conflict with your pre-formed assumptions, who’s the real asshole?
]]></description>
      <content:encoded><![CDATA[<p>It was one year ago today that I <a href="http://bradczerniak.com/2010/05/31/on-transliteracy/">first posted about transliteracy</a>.
A few days earlier, I had <a href="http://twitter.com/ao5357/status/14842494520">complained on twitter</a> that transliteracy was
“a bullshit made-up term for the same old stuff.” Since it’s always been my policy on this blog to offer solutions whenever
I identify a problem, it took a few days of thought before I posted the beginnings of the language model.</p>

<p>Over the last year, I’ve done some other transliteracy-related stuff that might interest you:</p>

<ul>
  <li>Further attempted to <a href="http://bradczerniak.com/2010/06/18/speaking-the-same-language/">explain the usage of the word ‘language’ in the context of the model</a></li>
  <li>Asked for feedback on a draft of
<a href="http://bradczerniak.com/2010/11/12/redefining-transliteracy/">Redefining Transliteracy</a> and
<a href="https://groups.google.com/d/topic/librariesandtransliteracy/ue3rnwF8j9g/discussion">stirred a cauldron of nastiness</a></li>
  <li><a href="http://bradczerniak.com/2010/12/05/further-refining-transliteracy/">Demonstrated how badly the word ‘medium’ is misused</a>
in writings about transliteracy</li>
  <li>Put the “Blueberry Smoothie video”
<a href="http://bradczerniak.com/2010/12/27/languages-of-a-blueberry-smoothie/">into a language model context</a> to show a
practical application</li>
  <li>Showed that the term Information Literacy is a
<a href="http://bradczerniak.com/2010/12/30/il-communication/">dumb name for the good stuff</a> done under that umbrella</li>
  <li>Really drove home that
<a href="http://bradczerniak.com/2011/03/30/matters-of-media/">talking about media rather than language is distracting as hell</a></li>
  <li>Started a <a href="http://www.reddit.com/r/transliteracy">community bibliography of transliteracy-related links on reddit</a></li>
</ul>

<p>Starting out, and despite my first tweet calling transliteracy bullshit, I was conciliatory and downright friendly. After
putting some positive work out there and being ignored, I chose to approach the topic differently and talk about the
controversy. The <a href="http://librariesandtransliteracy.wordpress.com/">L&amp;T librarians</a> told me that
<a href="https://groups.google.com/d/topic/librariesandtransliteracy/ue3rnwF8j9g/discussion">I had gone too far</a>, so before
publishing <a href="http://bradczerniak.com/2010/11/12/redefining-transliteracy/">Redefining Transliteracy</a> I scaled back and was
only semi-controversial (if you consider pedantically listing problems with a definition <em>controversial</em>).</p>

<p>Thing is, that post was probably the most popular of the whole lot. It was even the
<a href="http://comm563.wordpress.com/">subject of an assignment for a Digital Media Communication class</a> at Rider University
(co-instructed by the truly inspirational <a href="http://twitter.com/lemasney">John LeMasney</a>). I hope most of the post’s appeal
was that it offered a compelling case for the adoption of a model for transliteracy that people find useful. I suspect that
part of the appeal was the oh-no-you-didn’t out-calling of the PART definition. So screw it, this stuff’s been bugging me…</p>

<h2 id="part-of-the-problem">PART of the Problem</h2>

<p>If the original “working definition” of transliteracy were claimed to be proprietary, it wouldn’t be a big deal that my
criticisms (let’s call them “bug reports”) and suggested improvements (‘patches’) have fallen on deaf ears. But the
<a href="http://firstmonday.org/htbin/cgiwrap/bin/ojs/index.php/fm/article/viewArticle/2060/1908">seminal First Monday paper</a> on
transliteracy refers to it as <a href="http://en.wikipedia.org/wiki/Open_source">open source</a> thinking. Professor Thomas calls
transliteracy an open source concept in <a href="http://vimeo.com/2831405">a well-circulated video</a>:</p>

<blockquote>
  <p>We see it as an open source concept, and we offer it up for you to think about, develop, write about, go to Wikipedia
and argue about the definition…</p>
</blockquote>

<p>One immediate problem is that Wikipedia is a bad place to argue about the definition, since it’s a place for things notable
outside of itself, not original research or discussion leading to development of new ideas. While it might be acceptable
to have a discussion of wording on <a href="http://en.wikipedia.org/wiki/Talk:Transliteracy">an article’s talk page</a> to some extent,
arguing about the definition using Wikipedia as the sounding board will generally lead to
<a href="http://en.wikipedia.org/wiki/Wikipedia:No_original_research">NOR</a>,
<a href="http://en.wikipedia.org/wiki/Wikipedia:Neutral_point_of_view">NPOV</a>, and/or
<a href="http://en.wikipedia.org/wiki/Wikipedia:Conflict_of_interest#Citing_oneself">CoI</a> issues. It’s precisely why I haven’t
personally made any edits to the transliteracy page. If you don’t already have your hat in the ring, I encourage you to
<a href="http://en.wikipedia.org/wiki/Transliteracy">edit on the language model’s behalf</a>.</p>

<p>Calling transliteracy open source is really quite hollow. Is the transliteracy blog really all the source? Where’s a clear
explanation of licensure for applicable source, besides a CC icon on the First Monday article? Where’s the mechanism for
reporting bugs and submitting patches? The fact of the matter is that <strong>there is very little open source about PART’s work
on transliteracy</strong>. It’s a buzzword in a sea of buzzwords.</p>

<h3 id="call-to-action">Call to Action</h3>

<p>PART, if you do not wish to explicitly put the transliteracy concept under an
<a href="http://en.wikipedia.org/wiki/Comparison_of_free_software_licenses">open source</a> or
<a href="http://creativecommons.org/licenses/">open creative</a> license, release source material in the same manner, and ideally
explain the <a href="http://en.wikipedia.org/wiki/Comparison_of_revision_control_software">mechanism</a>
<a href="http://en.wikipedia.org/wiki/Comparison_of_issue_tracking_systems">by which</a> the community can contribute to the project,
you should <strong>publicly clarify</strong> that transliteracy is actually a proprietary concept.</p>

<p>Neither <a href="http://nlabnetworks.typepad.com/transliteracy/">PART</a> nor
<a href="http://librariesandtransliteracy.wordpress.com/">Libraries and Transliteracy</a> have posted about the language model. Since
I’m certain that prominent posters of both those blogs have read
<a href="http://bradczerniak.com/2010/11/12/redefining-transliteracy/">Redefining Transliteracy</a>, it’s curious to me that they
haven’t talked at all about the language model on their respective blogs. To me that’s a lie of omission, or worse yet a
faith-based lapse of intellectual honesty. After all, they’ve been presented with evidence to the contrary of their claims:</p>

<ol>
  <li>The things listed in the definition (signing, orality, handwriting, etc.) aren’t established to be platforms, tools,
    or media either individually or as a group</li>
  <li>The property of platforms, tools, and media that allows a literate person to go across or between them is not explained
    (and I contend, _cannot be explained _– a single unit is necessary for comparison)</li>
  <li>All other criticisms aside, the order of the list is nonsensical, yet easy enough to change to chronological, alphabetical,
    or to delete altogether</li>
  <li>Interaction is just a series of reading and writing acts as it applies to literacies, so including it is redundant</li>
  <li>Talking about literacy as a function of platforms, tools, and media is akin to telling an auto mechanic over the phone
    that your car is yellow. Sure, color is an important attribute of a car, but the mechanic is more concerned with the
    make, model, and mechanical attributes of the vehicle. Literacy is about reading/writing stuff (ie. messages in languages),
    not where the stuff’s written (ie. medium)</li>
</ol>

<p>Unless there is some means of reconciliation to which I’ve not been made privy, believing transliteracy can operate under
the PART definition requires faith: belief in the absence of (or in the face of contradictory) evidence. That’s not a leap
I’m willing to make. I’ve proposed a patch for a definition based instead on language (with thorough explanation of what
language means in that context) that eliminates all 5 of those problems. Of course, if there were problems with the language
model, I’d be interested in exploring those as well.</p>

<p>Maybe the silence on those blogs is because of personality conflicts with me. But that only goes so far; at some point
pointing at me and saying I’m being arrogant or condescending just ends up being a distracting
<a href="http://en.wikipedia.org/wiki/Argumentum_ad_hominem">Argumentum ad hominem</a>. If you think I’m an asshole and don’t want
to subject your readers to my douchitude, just don’t mention me by name or link to my blog. I don’t care – all I care about
is furthering the discussion of transliteracy by putting ideas out there. If you’re unwilling to tell your readers about
ideas because they conflict with your pre-formed assumptions, who’s the real asshole?</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Another Responsive Data Tables Approach</title>
      <link>http://bradczerniak.com/blog/another-responsive-data-tables-approach/</link>
      <pubDate>Wed, 27 Apr 2011 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Generall]]></category>
      
        <category><![CDATA[Web Designl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/another-responsive-data-tables-approach/</guid>
      <description><![CDATA[Chris Coyier posted a nice, working
solution to a real problem over at CSS-Tricks. Basically, CSS lets you
style your website to look and work well on mobile devices
by over-writing the styles of your full-size website. There
are performance drawbacks to this approach, but for the most part it’s the best-of-all-possible-worlds solution.

One thorny problem, though, is over-riding the style of certain elements that use the width of the screen liberally by
default. One such element is the venerable data table.

Coyier’s solution is great in that each table cell is labeled. However, doing this requires either writing CSS manually
for every data table on the site (which is near-impossible for large sites) or having the same thing done with scripting
on either the server or client side:


    
      
        
        
        
          
        
        
      
      
        
      
    
    
  

I propose a generalized solution that requires no scripting whatsoever. The drawback of this method, though, is that the
cells are not individually labeled. The example is also more compact, but this aspect can be tweaked by marrying the two
methods:

@media screen and (max-width: 720px) {
  table {
    display: block;
  }

  td,
  thead th {
    border-color: #444;
    border-style: solid;
    border-width: 0 2px 0 0;
    display: inline;
    float: left;
  }

  td:last-child,
  th:last-child {
    border-right: 0 none;
  }

  thead th {
    background: transparent;
    font-size: 1.1em;
  }

  tr {
    display: block;
    float: left;
    clear: left;
    padding: 6px 0;
    width: 100%;
  }

  thead tr {
    border-bottom: 4px solid #444;
    margin: 0 0 .3em 0;
    padding: 0 0 .2em 0;
  }

  tbody tr:nth-child(even) {
    background: #ddd;
  }

  td:nth-child(5n+1),
  th:nth-child(5n+1) {
    background: #FFD8D8;
  }

  td:nth-child(5n+2),
  th:nth-child(5n+2) {
    background: #FFE8D8;
  }

  td:nth-child(5n+3),
  th:nth-child(5n+3) {
    background: #FFF8D8;
  }

  td:nth-child(5n+4),
  th:nth-child(5n+4) {
    background: #D8FFD8;
  }

  td:nth-child(5n+5),
  th:nth-child(5n+5) {
    background: #D8D8FF;
  }
}


Open the working demo and resize your window to under 720 pixels wide to see
the effect. I call this approach the “Rainbow Tables” method :-)

Thanks to Chris Coyier for posting a thoughtful working solution, and thereby motivating
me to post about my approach after sitting on it (in production no less!) for almost a year.
]]></description>
      <content:encoded><![CDATA[<p><a href="http://chriscoyier.net/">Chris Coyier</a> posted a nice, working
<a href="http://css-tricks.com/responsive-data-tables/">solution to a real problem over at CSS-Tricks</a>. Basically, CSS lets you
style your website to look and work well on mobile devices
<a href="http://www.alistapart.com/articles/responsive-web-design/">by over-writing the styles of your full-size website</a>. There
are performance drawbacks to this approach, but for the most part it’s the best-of-all-possible-worlds solution.</p>

<p>One thorny problem, though, is over-riding the style of certain elements that use the width of the screen liberally by
default. One such element is the venerable <a href="http://www.w3schools.com/tags/tag_table.asp">data table</a>.</p>

<p>Coyier’s solution is great in that each table cell is labeled. However, doing this requires either writing CSS manually
for every data table on the site (which is near-impossible for large sites) or having the same thing done with scripting
on either the server or client side:</p>

<figure class="figure figure--image figure--image--tables-content-in-css-png ">
    
      <picture class="picture picture--lazy-load layout--hide--no-javascript" itemprop="image">
        
        
        
          <source srcset="/assets/images/required/s.webp" data-srcset="/assets/images/tables_content_in_css.png.webp" type="image/webp" />
        
        <img src="/assets/images/required/s.gif" data-src="/assets/images/tables_content_in_css.png" alt="Table content in CSS" loading="lazy" />
      </picture>
      <noscript>
        <img src="/assets/images/tables_content_in_css.png" alt="Table content in CSS" loading="lazy" />
      </noscript>
    
    
  </figure>

<p>I propose a generalized solution that requires no scripting whatsoever. The drawback of this method, though, is that the
cells are not individually labeled. The example is also more compact, but this aspect can be tweaked by marrying the two
methods:</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">@media</span> <span class="n">screen</span> <span class="n">and</span> <span class="p">(</span><span class="n">max-width</span><span class="p">:</span> <span class="m">720px</span><span class="p">)</span> <span class="p">{</span>
  <span class="nt">table</span> <span class="p">{</span>
    <span class="nl">display</span><span class="p">:</span> <span class="nb">block</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">td</span><span class="o">,</span>
  <span class="nt">thead</span> <span class="nt">th</span> <span class="p">{</span>
    <span class="nl">border-color</span><span class="p">:</span> <span class="m">#444</span><span class="p">;</span>
    <span class="nl">border-style</span><span class="p">:</span> <span class="nb">solid</span><span class="p">;</span>
    <span class="nl">border-width</span><span class="p">:</span> <span class="m">0</span> <span class="m">2px</span> <span class="m">0</span> <span class="m">0</span><span class="p">;</span>
    <span class="nl">display</span><span class="p">:</span> <span class="nb">inline</span><span class="p">;</span>
    <span class="nl">float</span><span class="p">:</span> <span class="nb">left</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">td</span><span class="nd">:last-child</span><span class="o">,</span>
  <span class="nt">th</span><span class="nd">:last-child</span> <span class="p">{</span>
    <span class="nl">border-right</span><span class="p">:</span> <span class="m">0</span> <span class="nb">none</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">thead</span> <span class="nt">th</span> <span class="p">{</span>
    <span class="nl">background</span><span class="p">:</span> <span class="nb">transparent</span><span class="p">;</span>
    <span class="nl">font-size</span><span class="p">:</span> <span class="m">1.1em</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">tr</span> <span class="p">{</span>
    <span class="nl">display</span><span class="p">:</span> <span class="nb">block</span><span class="p">;</span>
    <span class="nl">float</span><span class="p">:</span> <span class="nb">left</span><span class="p">;</span>
    <span class="nl">clear</span><span class="p">:</span> <span class="nb">left</span><span class="p">;</span>
    <span class="nl">padding</span><span class="p">:</span> <span class="m">6px</span> <span class="m">0</span><span class="p">;</span>
    <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">thead</span> <span class="nt">tr</span> <span class="p">{</span>
    <span class="nl">border-bottom</span><span class="p">:</span> <span class="m">4px</span> <span class="nb">solid</span> <span class="m">#444</span><span class="p">;</span>
    <span class="nl">margin</span><span class="p">:</span> <span class="m">0</span> <span class="m">0</span> <span class="m">.3em</span> <span class="m">0</span><span class="p">;</span>
    <span class="nl">padding</span><span class="p">:</span> <span class="m">0</span> <span class="m">0</span> <span class="m">.2em</span> <span class="m">0</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">tbody</span> <span class="nt">tr</span><span class="nd">:nth-child</span><span class="o">(</span><span class="nt">even</span><span class="o">)</span> <span class="p">{</span>
    <span class="nl">background</span><span class="p">:</span> <span class="m">#ddd</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">td</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">1</span><span class="o">),</span>
  <span class="nt">th</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">1</span><span class="o">)</span> <span class="p">{</span>
    <span class="nl">background</span><span class="p">:</span> <span class="m">#FFD8D8</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">td</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">2</span><span class="o">),</span>
  <span class="nt">th</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">2</span><span class="o">)</span> <span class="p">{</span>
    <span class="nl">background</span><span class="p">:</span> <span class="m">#FFE8D8</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">td</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">3</span><span class="o">),</span>
  <span class="nt">th</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">3</span><span class="o">)</span> <span class="p">{</span>
    <span class="nl">background</span><span class="p">:</span> <span class="m">#FFF8D8</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">td</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">4</span><span class="o">),</span>
  <span class="nt">th</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">4</span><span class="o">)</span> <span class="p">{</span>
    <span class="nl">background</span><span class="p">:</span> <span class="m">#D8FFD8</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nt">td</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">5</span><span class="o">),</span>
  <span class="nt">th</span><span class="nd">:nth-child</span><span class="o">(</span><span class="err">5</span><span class="nt">n</span><span class="o">+</span><span class="err">5</span><span class="o">)</span> <span class="p">{</span>
    <span class="nl">background</span><span class="p">:</span> <span class="m">#D8D8FF</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><a href="http://bradczerniak.com/responsivetables/">Open the working demo</a> and resize your window to under 720 pixels wide to see
the effect. I call this approach the “<a href="http://en.wikipedia.org/wiki/Rainbow_table">Rainbow Tables</a>” method :-)</p>

<p>Thanks to <a href="https://twitter.com/chriscoyier">Chris Coyier</a> for posting a thoughtful working solution, and thereby motivating
me to post about my approach after <a href="http://twitpic.com/21a4do">sitting on it (in production no less!) for almost a year</a>.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Personal Transparency</title>
      <link>http://bradczerniak.com/blog/personal-transparency/</link>
      <pubDate>Mon, 18 Apr 2011 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Generall]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/personal-transparency/</guid>
      <description><![CDATA[For 2011, my New Year’s resolution was three words: exploration, patience, transparency. It’s been a goal of mine to
assess the documents in my Google Docs, share as appropriate, and disseminate the information once available.

It’s with that goal in mind that I’m
releasing these 65+ documents.
This release makes up only a fraction of the electronic documents that could tentatively be shared, but it’s a start.
There’s some good stuff in there; also, some pretty useless stuff.

I look forward to continuing this exercise as the year goes on.
]]></description>
      <content:encoded><![CDATA[<p>For 2011, my New Year’s resolution was three words: exploration, patience, <strong>transparency</strong>. It’s been a goal of mine to
assess the documents in my Google Docs, share as appropriate, and disseminate the information once available.</p>

<p>It’s with that goal in mind that I’m
<a href="https://docs.google.com/leaf?id=0BwO-tzjW6IxxMzFkMWEyOTUtMDc4Ni00ZWFjLThiZGEtNGQyYjkzNTVkY2Vj&amp;sort=name&amp;layout=list&amp;num=100">releasing these 65+ documents</a>.
This release makes up only a fraction of the electronic documents that could tentatively be shared, but it’s a start.
There’s <strong>some good stuff in there</strong>; also, some pretty useless stuff.</p>

<p>I look forward to continuing this exercise as the year goes on.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Matters of Media</title>
      <link>http://bradczerniak.com/blog/matters-of-media/</link>
      <pubDate>Wed, 30 Mar 2011 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Transliteracyl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/matters-of-media/</guid>
      <description><![CDATA[At the end of last year, my library school classmate Lane Wilkinson and I had this great
email conversation. I had just posted Redefining Transliteracy, and he and I
discussed the various implications of it. What I found most awesome were Lane’s questions
regarding definitions of words used in the language-based transliteracy definition: “What do you mean by language?”, “What
does encoding and decoding mean in this context?”, etc.

Given that turnabout is fair play, and that Lane specifically requested feedback, I have a definition-based question
regarding his recent post:



What definition of medium is used in this context?

Mean Medium? Mode?

To me, a medium is a go-between over time and space used to convey information:


  An artist’s medium might be oil on canvas
  A telegraph’s medium is electricity over wire
  At the endpoint of a telegraph (or phone, or radio) is another medium — waves of sound over air


Medium can inform us about a lot of things. It can also confuse the issue. The reason I’ve pushed so hard for literacies
to be defined as language skills is that many languages are relatively medium-agnostic. A letter written in ink on paper
and one written in marker on posterboard are different in many ways, including both medium and aspects of visual language;
but if the textual content of both is the same, the written language of both is equivalent. If that same text is on a
computer screen or a television or a tattoo, the written language portion remains congruent.

In usage, people also tend to conflate medium with mode (semiotic modality). Modality is nearly a sensory means of
categorization. Except it’s not.

Whether medium or modality, questions arise:


  Is there any difference between watching a video on television or on YouTube? Is it the video that’s different? The
screen? Or is it the non-video stuff that surrounds a YouTube video?
  What about a watching a film on an old CRT and a new HD LCD? Different literacies?
  Isn’t print literacy a visual literacy? If medium or mode is important, what is the necessity of the distinction?
  If someone reads text on a computer, is it print literacy or computer literacy or both? Why?
  If both the medium and the mode of spoken word and of music is the same, in a medium-or-mode-literacy world can they
be considered the same literacy?


Languages

Language requires a medium. Communicating (over time and space) constitutes information being encoded into signs and symbols
and sent over a channel, then decoded by the receiver(s) to be interpreted. Often, though, changing the channel has little
effect on the integrity of the semiotics. McLuhan’s stickiest mind-virus, “the medium is the message,” is widely misunderstood,
and is dead wrong much more often than it is right.

Since literacies are abilities for a sender to write and a receiver to read a message, rather than abilities of either
party to grok a medium, it makes more sense from a literacy taxonomy standpoint to define and
categorize literacies by linguistic properties
rather than media.

Also, I think the literacy ecosystem would be a lot cleaner if we could agree that, whether “information literacy” is actually
a literacy or literacies or not, its name is a really crappy mistake.

Otherwise, the diagram is fantastic. It’s especially astute because it shows how literacies named and in common use can
be grouped, even if those named literacies are themselves problematic. Literacy sucks indeed.
]]></description>
      <content:encoded><![CDATA[<p>At the end of last year, my library school classmate <a href="http://senseandref.blogspot.com/">Lane Wilkinson</a> and I had this great
email conversation. I had just posted <a href="/2010/11/12/redefining-transliteracy/">Redefining Transliteracy</a>, and he and I
discussed the various implications of it. What I found most awesome were <a href="https://twitter.com/librarianwilk">Lane</a>’s questions
regarding definitions of words used in the language-based transliteracy definition: “What do you mean by language?”, “What
does encoding and decoding mean in this context?”, etc.</p>

<p>Given that turnabout is fair play, and that Lane specifically requested feedback, I have a definition-based question
regarding <a href="http://senseandref.blogspot.com/2011/03/literacy-sucks.html">his recent post</a>:</p>

<p><a href="http://senseandref.blogspot.com/2011/03/literacy-sucks.html"><img src="http://1.bp.blogspot.com/-bL1qlenTQJY/TZK42djJswI/AAAAAAAAHqs/iTblwmSxSdA/s1600/A+Taxonomy+of+Literacies.JPG" alt="" /></a></p>

<p>What definition of <em>medium</em> is used in this context?</p>

<h2 id="mean-medium-mode">Mean Medium? Mode?</h2>

<p>To me, a medium is a go-between over time and space used to convey information:</p>

<ul>
  <li>An artist’s medium might be oil on canvas</li>
  <li>A telegraph’s medium is electricity over wire</li>
  <li>At the endpoint of a telegraph (or phone, or radio) is another medium — waves of sound over air</li>
</ul>

<p>Medium can inform us about a lot of things. It can also confuse the issue. The reason I’ve pushed so hard for literacies
to be defined as language skills is that <strong>many languages are relatively medium-agnostic</strong>. A letter written in ink on paper
and one written in marker on posterboard are different in many ways, including both medium and aspects of visual language;
but if the textual content of both is the same, the written language of both is equivalent. If that same text is on a
computer screen or a television or a tattoo, the written language portion remains congruent.</p>

<p>In usage, people also tend to conflate medium with mode (semiotic modality). Modality is nearly a sensory means of
categorization. Except it’s not.</p>

<p>Whether medium or modality, questions arise:</p>

<ul>
  <li>Is there any difference between watching a video on television or on YouTube? Is it the video that’s different? The
screen? Or is it the non-video stuff that surrounds a YouTube video?</li>
  <li>What about a watching a film on an old CRT and a new HD LCD? Different literacies?</li>
  <li>Isn’t print literacy a visual literacy? If medium or mode is important, what is the necessity of the distinction?</li>
  <li>If someone reads text on a computer, is it print literacy or computer literacy or both? Why?</li>
  <li>If both the medium and the mode of spoken word and of music is the same, in a medium-or-mode-literacy world can they
be considered the same literacy?</li>
</ul>

<h2 id="languages">Languages</h2>

<p>Language requires a medium. Communicating (over time and space) constitutes information being encoded into signs and symbols
and sent over a channel, then decoded by the receiver(s) to be interpreted. Often, though, changing the channel has little
effect on the integrity of the semiotics. McLuhan’s stickiest mind-virus, “the medium is the message,” is widely misunderstood,
and is <strong>dead wrong</strong> much more often than it is right.</p>

<p>Since literacies are abilities for a sender to write and a receiver to read a <strong>message</strong>, rather than abilities of either
party to grok a <strong>medium</strong>, it makes more sense from a literacy taxonomy standpoint to define and
<a href="http://senseandref.blogspot.com/2011/01/transliteracy-leftovers.html">categorize literacies by linguistic properties</a>
rather than media.</p>

<p>Also, I think the literacy ecosystem would be a lot cleaner if we could agree that, whether “information literacy” is actually
a literacy or literacies or not, <a href="http://bradczerniak.com/2010/12/30/il-communication/">its name is a really crappy mistake</a>.</p>

<p>Otherwise, the diagram is fantastic. It’s especially astute because it shows how literacies named and in common use can
be grouped, even if those named literacies are themselves problematic. Literacy sucks indeed.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Resist That Advice </title>
      <link>http://bradczerniak.com/blog/resist-that-advice/</link>
      <pubDate>Thu, 03 Mar 2011 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Librariesl]]></category>
      
        <category><![CDATA[Web Designl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/resist-that-advice/</guid>
      <description><![CDATA[I’d like to touch briefly on a widely-circulated LJ post by Aaron Schmidt entitled
Resist That Redesign.
It is generally good advice – using iterative website design rather than relying on complete redesigns. However, I think
the advice needs better context.

For one thing, most library websites are really outdated and bad. Comparing the design/development workflows of Apple and
Google (nice!) or Amazon and Netflix (not exactly gems of design) to how libraries maintain their sites is apples-to-oranges.
If a library has a flat-file website (Not a straw man: this is common in libraries!), performing a complete
redesign/redevelopment is probably advisable. A “slowly evolved” CMS developed in-house at a library is likely to be
slapdash, and there are tons of available CMSes that are well-designed, secure, free, and supported.

What’s not mentioned in the original post is that redesigns don’t have to be long, painstaking processes. Bad redesign
processes are that way, but a sufficiently-experienced and talented designer can ease those woes. The solution for doing
a good redesign is to have a good designer.

Likewise, iterative design isn’t always a breezy process, and it often isn’t design. Design needs control; website creative
control is often lacking in library environments. What often ends up happening under the guise of “iterative design” is
actually a patchwork; sometimes from having too many cooks in the kitchen, sometimes from having one crummy cook. We’ve
all seen these websites; they start out clean and freshly-designed. Then someone pastes in a widget and it clashes with
the design. Then comes more widgets ad nauseum until the site looks and works awful. As such, the solution for doing good
iterative design is to have a good designer.

Library folks: don’t resist redesigns. If a well-designed website is important to you, hire a good web designer. Trust
their judgment to decide whether the best course of action is to iteratively improve your site or to do a full redesign.
]]></description>
      <content:encoded><![CDATA[<p>I’d like to touch briefly on a widely-circulated LJ post by <a href="http://twitter.com/walkingpaper">Aaron Schmidt</a> entitled
<a href="http://www.libraryjournal.com/lj/communityopinion/889081-274/resist_that_redesign__the.html.csp">Resist That Redesign</a>.
It is generally good advice – using iterative website design rather than relying on complete redesigns. However, I think
the advice needs better context.</p>

<p>For one thing, most library websites are really outdated and bad. Comparing the design/development workflows of Apple and
Google (nice!) or Amazon and Netflix (not exactly gems of design) to how libraries maintain their sites is apples-to-oranges.
If a library has a flat-file website (Not a straw man: this is common in libraries!), performing a complete
redesign/redevelopment is probably advisable. <strong>A “slowly evolved” CMS developed in-house at a library is likely to be
slapdash</strong>, and there are tons of <a href="http://drupal.org/">available CMSes</a> that are well-designed, secure, free, and supported.</p>

<p>What’s not mentioned in the original post is that redesigns don’t have to be long, painstaking processes. <em>Bad</em> redesign
processes are that way, but a sufficiently-experienced and talented designer can ease those woes. <strong>The solution for doing
a good redesign is to have a good designer</strong>.</p>

<p>Likewise, iterative design isn’t always a breezy process, and it often isn’t design. Design needs control; website creative
control is often lacking in library environments. What often ends up happening under the guise of “iterative design” is
actually a patchwork; sometimes from having too many cooks in the kitchen, sometimes from having one crummy cook. We’ve
all seen these websites; they start out clean and freshly-designed. Then someone pastes in a widget and it clashes with
the design. Then comes more widgets ad nauseum until the site looks and works awful. As such, <strong>the solution for doing good
iterative design is to have a good designer</strong>.</p>

<p>Library folks: don’t resist redesigns. <strong>If a well-designed website is important to you, hire a good web designer</strong>. Trust
their judgment to decide whether the best course of action is to iteratively improve your site or to do a full redesign.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>IL Communication</title>
      <link>http://bradczerniak.com/blog/il-communication/</link>
      <pubDate>Thu, 30 Dec 2010 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Librariesl]]></category>
      
        <category><![CDATA[Transliteracyl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/il-communication/</guid>
      <description><![CDATA[Last week, David Rothman posted
Commensurable Nonsense (Transliteracy), a post
critical of transliteracy from an Information Literacy perspective. David’s arguments were plausible-sounding fallacies,
leading to some serious confusion.

tl;dr

Information Literacy is a bad name for really good concepts. Let’s change the name (again!) to avoid confusion.

Plausible Fallacies

Rothman’s post starts with the two most common definitions of literacy:


  an ability to read and write
  knowledge of a specific subject


Nothing wrong there. However, it’s implied that for the purposes of transliteracy the second definition is the important
one. I don’t see how one would reach that conclusion, given that the definition of transliteracy quoted later in the post
starts “Transliteracy is the ability to read, write and interact…,” pointing to the first definition rather than the
second. Transliteracy is about reading and writing (or their equivalents in other senses/contexts); working from some
different assumption is a straw man.

The second problem is that Information Literacy is not a literacy per his own criteria. If a literacy is an ability
to read and write or knowledge of a particular subject, where does “Information Literacy is the set of skills needed to
find, retrieve, analyze, and use information”  fit? The common definitions of IL as critical skills are incompatible with
the extended-but- conventional literacies of transliteracy. As such, comparing IL to transliteracy in such a manner has
no bearing.

Implications

This framing of transliteracy as a subset of Information Literacy was implied by Lane Wilkinson’s post
Transliteracy and Incommensurability,
further implied by Rothman’s, and
elaborated upon by Meredith
Farkas, Lane
Wilkinson, and
others.

The second problem I mentioned — that Information Literacy isn’t a literacy — underlies the growing misconception. IL
requires conventional literacies, but is not encompassing of them by definition. IL advocates apparently consider IL
to be all- encompassing, but that’s a difficult-to-defend position. As such, the topics important to transliteracy, at
least before last week, are distinct from IL.

The ensuing discussion has led to confusion over the practical boundaries of these terms. For instance, it isn’t clear how
big transliteracy’s domain is per this newly-thin-air-pulled definition. In
Why Transliteracy?, Lane insinuates
transliteracy encompasses the Venn diagram of IL:


  For me, transliteracy is the bridge between isolated spheres of information literacy,…


But on his personal blog, he writes:


  I’m only using transliteracy as a catch-all for one particular slice of information literacy that I haven’t seen before.


This leads me to wonder: is transliteracy an umbrella over Information Literacy and other literacies as most everyone seemed
to agree prior to last week, or just some small sliver of IL?

Call to Deprecate

It’s neither, of course! Information Literacy is the notable exception to the transliteracy umbrella. I hinted at this in
my Redefining Transliteracy post and
a smidge on twitter; here are the charges against IL’s compatibility
with transliteracy:


  Transliteracy is an ability to read and write across things (which I frame as languages, while others prefer platforms,
    tools, and media for some unknown reason), whereas IL is an ability to find and critique information
  From a reading/writing lens, or any lens for that matter, all literacies are information literacies. IL as a term is
    redundant and overly-broad
  However an information literate entity interacts with information, that interaction is indirect, as information does
    not exist in any raw form. IL as a term is non-specific to the point of triviality


I cite these charges as more than just a reason not to compare Information Literacy and transliteracy directly; I also
contend that it’s reason to deprecate Information Literacy and call its skills something else.

We’ve done this before. As a field of study, Library and Information Science effectively deprecated the term “Bibliographic
Instruction” in favor of “Information Literacy.” The reasons behind this switch, it appears to me, were fourfold:


  Proponents of Bibliographic Instruction became entrenched in out-moded concepts and techniques, and were unwilling
    to adapt BI to new technologies and methods
  The word ‘Bibliographic’ itself implies books. Library-ish instruction is about much more than books
  Information Literacy as a term focuses on the skills of the learner, whereas Bibliographic Instruction as a term was
    about teaching those skills
  Information Literacy sounds really frickin’ good


If David Rothman is correct about anything, librarians are pedants of language
. As such, clarity in the terminology we use for our core principles should be paramount. Additionally, re-re-coining this
set of skills might cure what many seem to agree is cyclical entrenchment (per #1).

Here’s what I’m proposing: From some point in the near future on, people talking about the useful, respectable principles
currently referred to erroneously as “Information Literacy” should instead use the term (insert term here). Previous
references to Bibliographic Instruction, Information Literacy, and other less-than-ideal terms should be considered
(insert term here) by implication.

Conclusion

I think transliteracy and Information Literacy are like peanut butter and jelly. You can have one without the
other, but they’re usually better together. If we can remove the myth that IL is a literacy of comparison (through deprecation
or social agreement), we can more effectively work to develop a helpful instructional ecosystem for our patrons. We can
look at transliteracy for all the different ways people encode and decode information, and Information Literacy
for the critical skills associated with that information parsing.
]]></description>
      <content:encoded><![CDATA[<p>Last week, David Rothman posted
<a href="http://davidrothman.net/2010/12/19/commensurable-nonsense-transliteracy/">Commensurable Nonsense (Transliteracy)</a>, a post
critical of transliteracy from an Information Literacy perspective. David’s arguments were plausible-sounding fallacies,
leading to some serious confusion.</p>

<h2 id="tldr">tl;dr</h2>

<p>Information Literacy is a <strong>bad name for really good concepts</strong>. Let’s change the name (again!) to avoid confusion.</p>

<h2 id="plausible-fallacies">Plausible Fallacies</h2>

<p>Rothman’s post starts with the two most common definitions of literacy:</p>

<ul>
  <li>an ability to read and write</li>
  <li>knowledge of a specific subject</li>
</ul>

<p>Nothing wrong there. However, it’s implied that for the purposes of transliteracy the second definition is the important
one. I don’t see how one would reach that conclusion, given that the definition of transliteracy quoted later in the post
starts “<em>Transliteracy is the ability to read, write and interact…,</em>” pointing to the first definition rather than the
second. <strong>Transliteracy is about reading and writing</strong> (or their equivalents in other senses/contexts); working from some
different assumption is a straw man.</p>

<p>The second problem is that <strong>Information Literacy is not a literacy per his own criteria</strong>. If a literacy is an ability
to read and write or knowledge of a particular subject, where does “<em>Information Literacy is the set of skills needed to
find, retrieve, analyze, and use information</em>”  fit? The common definitions of IL as critical skills are incompatible with
the extended-but- conventional literacies of transliteracy. As such, comparing IL to transliteracy in such a manner has
no bearing.</p>

<h2 id="implications">Implications</h2>

<p>This framing of transliteracy as a subset of Information Literacy was implied by Lane Wilkinson’s post
<a href="http://librariesandtransliteracy.wordpress.com/2010/12/10/transliteracy-and-incommensurability/">Transliteracy and Incommensurability</a>,
further implied by Rothman’s, and
<a href="http://meredith.wolfwater.com/wordpress/2010/12/21/transliteracy-from-the-perspective-of-an-information-literacy-advocate/">elaborated upon by Meredith</a>
Farkas, <a href="http://senseandref.blogspot.com/2010/12/final-thoughts-on-transliteracy.html">Lane</a>
<a href="http://librariesandtransliteracy.wordpress.com/2010/12/20/why-transliteracy/">Wilkinson</a>, and
<a href="http://inkandvellum.com/blog/2010/12/more-transliteracy-talk-metaphors-and-metonyms/">others</a>.</p>

<p>The second problem I mentioned — that Information Literacy isn’t a literacy — underlies the growing misconception. IL
<em>requires</em> conventional literacies, but is <em>not encompassing of them</em> by definition. IL advocates apparently consider IL
to be all- encompassing, but that’s a difficult-to-defend position. As such, the topics important to transliteracy, at
least before last week, are distinct from IL.</p>

<p>The ensuing discussion has led to confusion over the practical boundaries of these terms. For instance, it isn’t clear how
big transliteracy’s domain is per this newly-thin-air-pulled definition. In
<a href="http://librariesandtransliteracy.wordpress.com/2010/12/20/why-transliteracy/">Why Transliteracy?</a>, Lane insinuates
transliteracy encompasses the Venn diagram of IL:</p>

<blockquote>
  <p>For me, transliteracy is the bridge between isolated spheres of information literacy,…</p>
</blockquote>

<p>But on his personal blog, <a href="http://senseandref.blogspot.com/2010/12/final-thoughts-on-transliteracy.html">he writes</a>:</p>

<blockquote>
  <p>I’m only using transliteracy as a catch-all for one particular slice of information literacy that I haven’t seen before.</p>
</blockquote>

<p>This leads me to wonder: is transliteracy an umbrella over Information Literacy and other literacies as most everyone seemed
to agree prior to last week, or just some small sliver of IL?</p>

<h2 id="call-to-deprecate">Call to Deprecate</h2>

<p>It’s neither, of course! Information Literacy is the notable exception to the transliteracy umbrella. I hinted at this in
my <a href="/2010/11/12/redefining-transliteracy/">Redefining Transliteracy</a> post and
<a href="http://twitter.com/ao5357/status/17012153634525184">a smidge on twitter</a>; here are the charges against IL’s compatibility
with transliteracy:</p>

<ol>
  <li>Transliteracy is an ability to read and write across things (which I frame as languages, while others prefer platforms,
    tools, and media for some unknown reason), whereas <strong>IL is an ability to find and critique information</strong></li>
  <li>From a reading/writing lens, or any lens for that matter, all literacies are information literacies. IL as a term is
    redundant and overly-broad</li>
  <li>However an information literate entity interacts with information, that interaction is indirect, as information does
    not exist in any raw form. IL as a term is non-specific to the point of triviality</li>
</ol>

<p>I cite these charges as more than just a reason not to compare Information Literacy and transliteracy directly; I also
contend that it’s <strong>reason to deprecate Information Literacy and call its skills something else</strong>.</p>

<p>We’ve done this before. As a field of study, Library and Information Science effectively deprecated the term “Bibliographic
Instruction” in favor of “Information Literacy.” The reasons behind this switch, it appears to me, were fourfold:</p>

<ol>
  <li>Proponents of Bibliographic Instruction became entrenched in out-moded concepts and techniques, and were unwilling
    to adapt BI to new technologies and methods</li>
  <li>The word ‘Bibliographic’ itself implies books. Library-ish instruction is about much more than books</li>
  <li>Information Literacy as a term focuses on the skills of the learner, whereas Bibliographic Instruction as a term was
    about teaching those skills</li>
  <li>Information Literacy <em>sounds</em> really frickin’ good</li>
</ol>

<p>If <a href="http://davidrothman.net/2010/12/22/pedantic-liquor-for-librarians/">David Rothman is correct about anything, librarians are pedants of language</a>
. As such, clarity in the terminology we use for our core principles should be paramount. Additionally, re-re-coining this
set of skills might cure what many seem to agree is cyclical entrenchment (per #1).</p>

<p>Here’s what I’m proposing: From some point in the near future on, people talking about the <strong>useful, respectable principles</strong>
currently referred to erroneously as “Information Literacy” should instead use the term (insert term here). Previous
references to Bibliographic Instruction, Information Literacy, and other less-than-ideal terms should be considered
(insert term here) by implication.</p>

<h2 id="conclusion">Conclusion</h2>

<p>I think transliteracy and <del>Information Literacy</del> are like peanut butter and jelly. You can have one without the
other, but they’re usually better together. If we can remove the myth that IL is a literacy of comparison (through deprecation
or social agreement), we can more effectively work to develop a helpful instructional ecosystem for our patrons. We can
look at transliteracy for all the different ways people encode and decode information, and <del>Information Literacy</del>
for the critical skills associated with that information parsing.</p>
]]></content:encoded>
    </item>
  
    <item>
      <title>Languages of a Blueberry Smoothie</title>
      <link>http://bradczerniak.com/blog/languages-of-a-blueberry-smoothie/</link>
      <pubDate>Mon, 27 Dec 2010 00:00:00 UTC</pubDate>
      
        
        <dc:creator>Brad Czerniak</dc:creator>
      
      
      
        <category><![CDATA[Generall]]></category>
      
        <category><![CDATA[Librariesl]]></category>
      
        <category><![CDATA[Transliteracyl]]></category>
      
      <guid isPermaLink="true">http://bradczerniak.com/blog/languages-of-a-blueberry-smoothie/</guid>
      <description><![CDATA[At the end of May I quoted Voltaire in my
first transliteracy-related post: “Define your terms, you will
permit me again to say, or we shall never understand one another.” It’s been a long process, but I feel I’ve
defined a language model of transliteracy to a satisfactory
extent. So before I demolish IL in the
Information Literacy vs.
transliteracy debate, I figured it would
be fun to offer a practical example of the language model.

One thing came to mind when thinking of examples: Brian Hulsey’s
Everyday Transliteracy video. It’s known as the “blueberry smoothie” video
to many; it shows how someone might communicate the same message (a blueberry smoothie recipe) using different websites
and other forms of communication, and all in a concise, friendly manner.



Let’s look at the examples through a linguistic lens.

Written Language

Most examples involve some form of written language. In many cases, though, communication via a particular website or other
form requires subtle changes of dialect or language variant.

Email

In many ways, the language used in email is most like that of a written letter from perhaps a century ago. If a writer
wished to ignore clear, concise business style, he or she could write an email of flowery prose or any other style you might
otherwise encounter in written language. To me, the written language of an email is something of a baseline for comparison
to other language usage.

Twitter

Linguistically, twitter is an interesting variant. Where you might devote a whole paragraph in an email for a stand-alone
idea, the standard on twitter is for one tweet (at 140 characters or fewer) to do the same. As such, someone familiar with
the letter/email baseline might develop a workflow for converting their verbose ideas to tweet-appropriate length:


  Write a sentence or two. See that it’s a number of characters over the limit
  Shorten any URLs (more on that later) to preserve space
  Use common abbreviations
  Go over entire text looking for places to re-word, perhaps with chat/SMS lingo
  Start removing things like pronouns and the vowels from certain words
  Remove punctuation that isn’t absolutely necessary
  Begin to question whether the idea(s) might require multiple tweets


There’s more to it, such as @replies, but the above workflow is the gist. It’s interesting, anecdotally at least, that
tweets and text messages diverge somewhat in linguistic usage, despite their similarity in imposed length restrictions.
Whereas it’s common to use instant message-type lingo (lol, brb, stfu, etc.) in an SMS message, it’s at least somewhat
less common on twitter. It’s also more accepted to go over the character limit in text messaging, while quite impractical
on twitter.

Facebook

Facebook doesn’t formally impose stringent length limits like twitter. A savvy facebook user, however, knows that a long
status update will get cut off at a certain length; and the cut off text is only viewable after clicking a “read more” link.
This leads to a subtly different usage than twitter. Facebook users are more likely to use full words in full sentences.

The combination of “read more” links and quoting the first three or so words of comments on profile pages means that effective
facebook users avoid “burying the lead.” Such users communicate
in pithy, concise posts, with their thesis statement within the first few words.

Facebook users may sometimes forgo leading personal pronouns since their name is displayed before their status. This is
a less-likely occurrence on twitter, where users are represented by short usernames rather than their actual names.

Blog

Blogs are similar to emails from a written language perspective. There are nuances, of course, but it’s long-form writing
with the optional addition of hypertext elements, just like rich email.

Telephone (or face-to-face)

Talking on the phone obviously isn’t written language. However, I think it’s a great basic example of transliteracy. Brian,
in the video, reads the necessary amount of orange juice aloud off the screen. This is him reading (decoding) written language
and speaking (writing, encoding) the same message into oral language. This is a basic transliteracy that many of us possess
that we often take for granted.

A Post-It Note

Similar to long-form written language. For a message longer than originally intended, someone writing a post-it message
might employ chat lingo and abbreviations, or might start writing smaller near the end of the message.

Other Languages

URLs

URLs are a written language construct all their own. I learned what URLs
looked like, how they worked, and the intricacies of their syntax and semantics from using them, rather than by any formal
instruction. However, an internet user can gain a lot from being instructed in URLs.

For instance, Brian was 100% correct to shorten the URL for the recipe before posting it to twitter, as that’s common practice.
On the other hand, he didn’t show how he used the full URL for the resource in facebook. It’s knowing usage rules like
these that make URLs an important language literacy.

Hypertext

Written language is a special subset of visual language. Hypertext is where, on the web, written language and what we
usually consider visual language intersect. Hypertext elements have default styles per user agent stylesheets in the browser,
making them visual elements. They are also semantically- defined markup elements per their SGML syntax. So bold text or
italic text or a link or a heading appear different from text not wrapped with any markup; the elements’ semantics
precede their appearance.

A web user who doesn’t know how to identify the common appearance and function of hypertext elements would be at a great
disadvantage. Often the appearance of form elements, for instance, are derived from similar UI elements from the base
operating system’s toolkit. However, sites will often style or re-implement elements like buttons, so the** essence of
button-like symbols is a useful** and transferable visual language skill.

Note that in the video, Gmail, twitter, facebook, and Wordpress all have similar, but at least somewhat-different,
representations of buttons, text fields, text areas, rich text boxes, etc. I think it’s in the subtleties of hypertext visual
language that it’s most practical to use the language model instead of the platforms/tools/media model.

Visual Language

Each site uses layout conventions involving columns, proportion, color, contrast, and other precepts of visual language.
How they are similar and different is a teachable thing for those we might instruct. Knowing basic visual language of
websites is a transferable skill.

Besides site layout, another interesting form of visual language are symbols, often used as icons.
The Noun Project is a cool resource for exploring this aspect of visual language.

Conclusion

I’ve written a lot about a little, and have still managed to leave out a lot! The literacies at play when doing
seemingly-simple things are often complex and varied.

What I wanted to demonstrate more than anything else is that the language model allows us to talk about all the same
transliteracy things, but in a way that actually gets to the core literacies.

I think these language literacies allow us to work from a common set of terminology. They let us proceed quicker to
developing more-universal and more useful curricula for instruction.

A point to ponder: Brian’s video, many (myself included) contend, is a wonderful example of transliteracy. It does not,
however, focus in any way on the critical abilities normally associated with Information Literacy.
]]></description>
      <content:encoded><![CDATA[<p>At the end of May I quoted Voltaire in my
<a href="http://bradczerniak.com/2010/05/31/on-transliteracy/">first transliteracy-related post</a>: “Define your terms, you will
permit me again to say, or we shall never understand one another.” It’s been a long process, but I feel I’ve
<a href="http://bradczerniak.com/2010/11/12/redefining-transliteracy/">defined a language model of transliteracy</a> to a satisfactory
extent. So before I demolish IL in the
<a href="http://davidrothman.net/2010/12/19/commensurable-nonsense-transliteracy/">Information Literacy</a> vs.
<a href="http://librariesandtransliteracy.wordpress.com/2010/12/20/why-transliteracy/">transliteracy</a> debate, I figured it would
be fun to offer a practical example of the language model.</p>

<p>One thing came to mind when thinking of examples: <a href="http://strangedichotomy.wordpress.com/">Brian Hulsey</a>’s
<a href="http://www.youtube.com/watch?v=h06FZryyQM4">Everyday Transliteracy</a> video. It’s known as the “blueberry smoothie” video
to many; it shows how someone might communicate the same message (a blueberry smoothie recipe) using different websites
and other forms of communication, and all in a concise, friendly manner.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/h06FZryyQM4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>Let’s look at the examples through a linguistic lens.</p>

<h2 id="written-language">Written Language</h2>

<p>Most examples involve some form of written language. In many cases, though, communication via a particular website or other
form requires subtle changes of dialect or language variant.</p>

<h3 id="email">Email</h3>

<p>In many ways, the language used in email is most like that of a written letter from perhaps a century ago. If a writer
wished to ignore clear, concise business style, he or she could write an email of flowery prose or any other style you might
otherwise encounter in written language. To me, the written language of an email is something of a baseline for comparison
to other language usage.</p>

<h3 id="twitter">Twitter</h3>

<p>Linguistically, twitter is an interesting variant. Where you might devote a whole paragraph in an email for a stand-alone
idea, the standard on twitter is for one tweet (at 140 characters or fewer) to do the same. As such, someone familiar with
the letter/email baseline might develop a workflow for converting their verbose ideas to tweet-appropriate length:</p>

<ol>
  <li>Write a sentence or two. See that it’s a number of characters over the limit</li>
  <li>Shorten any URLs (more on that later) to preserve space</li>
  <li>Use common abbreviations</li>
  <li>Go over entire text looking for places to re-word, perhaps with chat/SMS lingo</li>
  <li>Start removing things like pronouns and the vowels from certain words</li>
  <li>Remove punctuation that isn’t absolutely necessary</li>
  <li>Begin to question whether the idea(s) might require multiple tweets</li>
</ol>

<p>There’s more to it, such as @replies, but the above workflow is the gist. It’s interesting, anecdotally at least, that
tweets and text messages diverge somewhat in linguistic usage, despite their similarity in imposed length restrictions.
Whereas it’s common to use instant message-type lingo (lol, brb, stfu, etc.) in an SMS message, it’s at least somewhat
less common on twitter. It’s also more accepted to go over the character limit in text messaging, while quite impractical
on twitter.</p>

<h3 id="facebook">Facebook</h3>

<p>Facebook doesn’t formally impose stringent length limits like twitter. A savvy facebook user, however, knows that a long
status update will get cut off at a certain length; and the cut off text is only viewable after clicking a “read more” link.
This leads to a subtly different usage than twitter. Facebook users are more likely to use full words in full sentences.</p>

<p>The combination of “read more” links and quoting the first three or so words of comments on profile pages means that effective
facebook users avoid “<a href="http://en.wikipedia.org/wiki/Lead_paragraph#Types_of_leads">burying the lead</a>.” Such users communicate
in pithy, concise posts, with their thesis statement within the first few words.</p>

<p>Facebook users may sometimes forgo leading personal pronouns since their name is displayed before their status. This is
a less-likely occurrence on twitter, where users are represented by short usernames rather than their actual names.</p>

<h3 id="blog">Blog</h3>

<p>Blogs are similar to emails from a written language perspective. There are nuances, of course, but it’s long-form writing
with the optional addition of hypertext elements, just like rich email.</p>

<h3 id="telephone-or-face-to-face">Telephone (or face-to-face)</h3>

<p>Talking on the phone obviously isn’t written language. However, I think it’s a great basic example of transliteracy. Brian,
in the video, reads the necessary amount of orange juice aloud off the screen. This is him reading (decoding) written language
and speaking (writing, encoding) the same message into oral language. This is a basic transliteracy that many of us possess
that we often take for granted.</p>

<h3 id="a-post-it-note">A Post-It Note</h3>

<p>Similar to long-form written language. For a message longer than originally intended, someone writing a post-it message
might employ chat lingo and abbreviations, or might start writing smaller near the end of the message.</p>

<h2 id="other-languages">Other Languages</h2>

<h3 id="urls">URLs</h3>

<p>URLs are a written <a href="http://www.w3.org/Addressing/URL/url- spec.txt">language construct</a> all their own. I learned what URLs
looked like, how they worked, and the intricacies of their syntax and semantics from using them, rather than by any formal
instruction. However, an internet user can gain a lot from being instructed in URLs.</p>

<p>For instance, Brian was 100% correct to shorten the URL for the recipe before posting it to twitter, as that’s common practice.
On the other hand, he didn’t show how he used the full URL for the resource in facebook. It’s knowing usage rules like
these that make URLs an important language literacy.</p>

<h3 id="hypertext">Hypertext</h3>

<p>Written language is a special subset of visual language. Hypertext is where, on the web, written language and what we
usually consider visual language intersect. Hypertext elements have default styles per user agent stylesheets in the browser,
making them visual elements. They are also semantically- defined markup elements per their SGML syntax. So bold text or
italic text or a link or a heading appear different from text not wrapped with any markup; the elements’ semantics
<a href="http://meyerweb.com/eric/tools/css/reset/">precede their appearance</a>.</p>

<p>A web user who doesn’t know how to identify the common appearance and function of hypertext elements would be at a great
disadvantage. Often the appearance of form elements, for instance, are derived from similar UI elements from the base
operating system’s toolkit. However, sites will often style or re-implement elements like buttons, so the** essence of
button-like symbols is a useful** and transferable visual language skill.</p>

<p>Note that in the video, Gmail, twitter, facebook, and Wordpress all have similar, but at least somewhat-different,
representations of buttons, text fields, text areas, rich text boxes, etc. I think it’s in the subtleties of hypertext visual
language that it’s most practical to use the language model instead of the platforms/tools/media model.</p>

<h3 id="visual-language">Visual Language</h3>

<p>Each site uses layout conventions involving columns, proportion, color, contrast, and other precepts of visual language.
How they are similar and different is a teachable thing for those we might instruct. Knowing basic visual language of
websites is a transferable skill.</p>

<p>Besides site layout, another interesting form of visual language are symbols, often used as icons.
<a href="http://www.thenounproject.com/">The Noun Project</a> is a cool resource for exploring this aspect of visual language.</p>

<h2 id="conclusion">Conclusion</h2>

<p>I’ve written a lot about a little, and have still managed to leave out a lot! The literacies at play when doing
seemingly-simple things are often complex and varied.</p>

<p>What I wanted to demonstrate more than anything else is that <strong>the language model allows us to talk about all the same
transliteracy things, but in a way that actually gets to the core literacies</strong>.</p>

<p>I think these language literacies allow us to work from a common set of terminology. They let us proceed quicker to
developing more-universal and more useful curricula for instruction.</p>

<p>A point to ponder: Brian’s video, many (myself included) contend, is a wonderful example of transliteracy. It does not,
however, focus in any way on the <em>critical</em> abilities normally associated with Information Literacy.</p>
]]></content:encoded>
    </item>
  
</channel>
</rss>
