<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2012-03-19:1579314</id>
  <title>The Disparate Musings of Pixie</title>
  <subtitle>pinterface</subtitle>
  <author>
    <name>pinterface</name>
  </author>
  <link rel="alternate" type="text/html" href="https://pinterface.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://pinterface.dreamwidth.org/data/atom"/>
  <updated>2016-07-03T20:58:57Z</updated>
  <dw:journal username="pinterface" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2012-03-19:1579314:4734</id>
    <link rel="alternate" type="text/html" href="https://pinterface.dreamwidth.org/4734.html"/>
    <link rel="self" type="text/xml" href="https://pinterface.dreamwidth.org/data/atom/?itemid=4734"/>
    <title>Backend Developers are Great at UX</title>
    <published>2016-07-03T20:49:15Z</published>
    <updated>2016-07-03T20:58:57Z</updated>
    <category term="web"/>
    <category term="development"/>
    <category term="ux"/>
    <category term="design"/>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;That's kind of a provocative title, so let me just get this out of the way: No, no they are not.  And I am not crazy enough to attempt to convince you otherwise.  That said, they aren't nearly as bad as they're given credit for.&lt;/p&gt;

&lt;p&gt;Let's do this by way of example.  Suppose you have a list, and users need to be able to sort it, alter the items in the list, and delete items.  All your front-end developers are busy, and so are the UX people, so it's up to that backend developer to bang something out.  What are they going to give you?  Something, I suspect, an awful lot like this:&lt;/p&gt;

&lt;form&gt;
&lt;table border="2" cellspacing="0" cellpadding="6"&gt;

&lt;colgroup&gt;&lt;col /&gt;&lt;col /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col"&gt;Sort&lt;/th&gt;
&lt;th scope="col"&gt;Item&lt;/th&gt;
&lt;th scope="col"&gt;Delete?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;input type="text" value="1"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Apples"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="text" value="2"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Oranges"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="text" value="3"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Des pommes"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="text" value="4"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="L&amp;#39;orange"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox" checked="checked"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td colspan="3"&gt;&lt;input type="submit"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;/table&gt;
&lt;/form&gt;

&lt;p&gt;In other words, a &amp;lt;table&amp;gt; that closely mimics the underlying database structure.  Yeah, I can hear the internal screams of the UX people from here.  But let's consider this for a moment.  Is this going to be fun to use?  No.  Definitely not.  But in its straightforward simplicity, it gives us something that's kind of amazing: &lt;i&gt;anybody&lt;/i&gt; can use this form.  No matter how spotty your network connectivity, if you managed to load this form, you can submit it.  If all you have is a text-only browser, you can use this form.  No mouse?  That's okay,
this form is keyboard-accessible.  Do you interact with your computer via voice command?  This form will be serviceable.&lt;/p&gt;

&lt;p&gt; For the vast majority of your users, this is not great UX.  But it is
&lt;em&gt;Universal&lt;/em&gt; UX.  Anybody―everybody―can use it!  The web is universally accessible &lt;em&gt;by default&lt;/em&gt;, and by staying away from the fancy stuff, by building something that would be at home in 1994, our backend developer managed to preserve that.&lt;/p&gt;

&lt;p&gt;We definitely don't want to stop here, but it's a pretty great jumping-off point.  So let's put our UX hat on and start making some improvements.&lt;/p&gt;

&lt;form&gt;
&lt;table border="2" cellspacing="0" cellpadding="6"&gt;

&lt;colgroup&gt;&lt;col /&gt;&lt;col /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col"&gt;Sort&lt;/th&gt;
&lt;th scope="col"&gt;Item&lt;/th&gt;
&lt;th scope="col"&gt;Delete?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="10" size="5"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Apples"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="20" size="5"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Oranges"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="30" size="5"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Des pommes"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="40" size="5"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="L&amp;#39;orange"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox" checked="checked"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td colspan="3"&gt;&lt;input type="submit" value="Update List"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;/table&gt;
&lt;/form&gt;

&lt;p&gt;Some quick wins are simply to adjust the sort values to make rearranging easier, and adjusting the text of the button.  Not terribly complicated, even the backend developer can manage it.&lt;/p&gt;

&lt;form&gt;
&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;

&lt;colgroup&gt;&lt;col /&gt;&lt;col /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col"&gt;Sort&lt;/th&gt;
&lt;th scope="col"&gt;Item&lt;/th&gt;
&lt;th scope="col"&gt;Delete?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="10" size="5" style="display: none"&gt;&lt;button disabled="disabled"&gt;▲&lt;/button&gt; &lt;button&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Apples"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="20" size="5" style="display: none"&gt;&lt;button&gt;▲&lt;/button&gt; &lt;button&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Oranges"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="30" size="5" style="display: none"&gt;&lt;button&gt;▲&lt;/button&gt; &lt;button&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Des pommes"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;&lt;input type="number" value="40" size="5" style="display: none"&gt;&lt;button&gt;▲&lt;/button&gt; &lt;button disabled="disabled"&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="L&amp;#39;orange"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox" checked="checked"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td colspan="3"&gt;&lt;input type="submit" value="Update List" style="width: 100%; padding: 0.5em"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;/table&gt;
&lt;/form&gt;

&lt;p&gt;But of course, manually entering the sort weight is awful, so maybe we add some buttons to adjust the list sorting, so users can click a button, rather than type in sort values, and hide the numeric input with a little CSS.  We'll leave it in the DOM both for text-only browsers, and to give a place for our buttons to store the sort order (assuming they function via JavaScript).&lt;/p&gt;

&lt;form&gt;
&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;

&lt;colgroup&gt;
&lt;col /&gt;
&lt;col /&gt;
&lt;col /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" style="display:none;"&gt;Sort&lt;/th&gt;
&lt;th scope="col"&gt;Item&lt;/th&gt;
&lt;th scope="col"&gt;Delete?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="display:none;"&gt;&lt;input type="number" value="10" size="5" style="display: none"&gt;&lt;button disabled="disabled"&gt;▲&lt;/button&gt; &lt;button&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Apples"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td style="display:none;"&gt;&lt;input type="number" value="20" size="5" style="display: none"&gt;&lt;button&gt;▲&lt;/button&gt; &lt;button&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Oranges"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td style="display:none;"&gt;&lt;input type="number" value="30" size="5" style="display: none"&gt;&lt;button&gt;▲&lt;/button&gt; &lt;button&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="Des pommes"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox"&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr style="opacity: 0.8;"&gt;
&lt;td style="display:none;"&gt;&lt;input type="number" value="40" size="5" style="display: none"&gt;&lt;button&gt;▲&lt;/button&gt; &lt;button disabled="disabled"&gt;▼&lt;/button&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" value="L&amp;#39;orange" style="text-decoration: line-through"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="checkbox" checked="checked"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tfoot&gt;
&lt;tr&gt;
&lt;td colspan="3"&gt;&lt;input type="submit" value="Update List" style="width: 100%; padding: 0.5em;"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;/table&gt;
&lt;/form&gt;

&lt;p&gt;And as we get fancier, maybe we dim or strike-through the to-be-deleted rows, to make it obvious they're going to go away.  We add a little JavaScript to enable drag-and-drop of the rows, for really simple sorting.  Maybe we even add some keypress handlers so people can move things in the list by pressing &lt;tt&gt;C-x C-t&lt;/tt&gt; or whatever seems appropriate.  And if those scripts load successfully and work in the user's browser, maybe we even hide the explicit sort buttons from visual users, to avoid clutter.  You do run the risk of excluding a small contingent of users that way―if you can only interact with a computer through eye-movements, visible buttons might be kind of handy―but for
all I know they may have other ways of handling that, so if you've got the
budget, maybe test that sort of thing and report back to the rest of us.  I'd certainly love to know.&lt;/p&gt;

&lt;p&gt;But in the end, what we end up with is a lot closer to what you might have designed as a visually-oriented UX person, but because we built it in stages, because we started with the basics and layered things on top, it's usable in far more scenarios than it might otherwise be had we started with a Photoshop mockup of the end result.&lt;/p&gt;

&lt;p style="font-size: smaller;"&gt;NB: As you may have noticed, there is no JS attached, and there isn't much in the way of styling.  That's partly due to platform limitations, but mostly because this isn't really meant to be about how-to-build it, but more about what-to-consider in the design.  It just so happens that if you build it in a certain order, those considerations naturally reveal themselves.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=pinterface&amp;ditemid=4734" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
